@copilotkit/aimock 1.44.0 → 1.45.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +31 -0
- package/README.md +6 -0
- package/dist/agui-types.d.ts.map +1 -1
- package/dist/aimock-cli.cjs +31 -5
- package/dist/aimock-cli.cjs.map +1 -1
- package/dist/aimock-cli.d.cts.map +1 -1
- package/dist/aimock-cli.d.ts.map +1 -1
- package/dist/aimock-cli.js +31 -5
- package/dist/aimock-cli.js.map +1 -1
- package/dist/bedrock-converse.cjs +312 -39
- package/dist/bedrock-converse.cjs.map +1 -1
- package/dist/bedrock-converse.d.cts.map +1 -1
- package/dist/bedrock-converse.d.ts.map +1 -1
- package/dist/bedrock-converse.js +313 -40
- package/dist/bedrock-converse.js.map +1 -1
- package/dist/bedrock.cjs +195 -42
- package/dist/bedrock.cjs.map +1 -1
- package/dist/bedrock.d.cts.map +1 -1
- package/dist/bedrock.d.ts.map +1 -1
- package/dist/bedrock.js +196 -43
- package/dist/bedrock.js.map +1 -1
- package/dist/chaos.cjs +1 -0
- package/dist/chaos.js +1 -1
- package/dist/cli.cjs +152 -5
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +155 -8
- package/dist/cli.js.map +1 -1
- package/dist/cohere.cjs +132 -71
- package/dist/cohere.cjs.map +1 -1
- package/dist/cohere.d.cts.map +1 -1
- package/dist/cohere.d.ts.map +1 -1
- package/dist/cohere.js +133 -72
- package/dist/cohere.js.map +1 -1
- package/dist/config-loader.cjs +62 -4
- package/dist/config-loader.cjs.map +1 -1
- package/dist/config-loader.d.cts +37 -4
- package/dist/config-loader.d.cts.map +1 -1
- package/dist/config-loader.d.ts +37 -4
- package/dist/config-loader.d.ts.map +1 -1
- package/dist/config-loader.js +62 -4
- package/dist/config-loader.js.map +1 -1
- package/dist/fakes-plugin.cjs +131 -0
- package/dist/fakes-plugin.cjs.map +1 -0
- package/dist/fakes-plugin.d.cts +23 -0
- package/dist/fakes-plugin.d.cts.map +1 -0
- package/dist/fakes-plugin.d.ts +23 -0
- package/dist/fakes-plugin.d.ts.map +1 -0
- package/dist/fakes-plugin.js +127 -0
- package/dist/fakes-plugin.js.map +1 -0
- package/dist/fixture-loader-services.cjs +1 -1
- package/dist/fixture-loader-services.cjs.map +1 -1
- package/dist/fixture-loader-services.js +1 -1
- package/dist/fixture-loader-services.js.map +1 -1
- package/dist/fixture-loader.cjs +389 -27
- package/dist/fixture-loader.cjs.map +1 -1
- package/dist/fixture-loader.d.cts +47 -3
- package/dist/fixture-loader.d.cts.map +1 -1
- package/dist/fixture-loader.d.ts +47 -3
- package/dist/fixture-loader.d.ts.map +1 -1
- package/dist/fixture-loader.js +384 -29
- package/dist/fixture-loader.js.map +1 -1
- package/dist/gemini-interactions.cjs +250 -52
- package/dist/gemini-interactions.cjs.map +1 -1
- package/dist/gemini-interactions.d.cts.map +1 -1
- package/dist/gemini-interactions.d.ts.map +1 -1
- package/dist/gemini-interactions.js +251 -53
- package/dist/gemini-interactions.js.map +1 -1
- package/dist/gemini.cjs +226 -37
- package/dist/gemini.cjs.map +1 -1
- package/dist/gemini.d.cts.map +1 -1
- package/dist/gemini.d.ts.map +1 -1
- package/dist/gemini.js +227 -38
- package/dist/gemini.js.map +1 -1
- package/dist/helpers.cjs +881 -7
- package/dist/helpers.cjs.map +1 -1
- package/dist/helpers.d.cts +85 -4
- package/dist/helpers.d.cts.map +1 -1
- package/dist/helpers.d.ts +85 -4
- package/dist/helpers.d.ts.map +1 -1
- package/dist/helpers.js +839 -8
- package/dist/helpers.js.map +1 -1
- package/dist/index.cjs +9 -0
- package/dist/index.d.cts +7 -5
- package/dist/index.d.ts +7 -5
- package/dist/index.js +4 -3
- package/dist/jest.cjs +31 -7
- package/dist/jest.cjs.map +1 -1
- package/dist/jest.d.cts +43 -3
- package/dist/jest.d.cts.map +1 -1
- package/dist/jest.d.ts +43 -3
- package/dist/jest.d.ts.map +1 -1
- package/dist/jest.js +33 -9
- package/dist/jest.js.map +1 -1
- package/dist/journal.cjs +135 -13
- package/dist/journal.cjs.map +1 -1
- package/dist/journal.d.cts +38 -4
- package/dist/journal.d.cts.map +1 -1
- package/dist/journal.d.ts +38 -4
- package/dist/journal.d.ts.map +1 -1
- package/dist/journal.js +135 -13
- package/dist/journal.js.map +1 -1
- package/dist/live-sanitize.cjs +4 -32
- package/dist/live-sanitize.cjs.map +1 -1
- package/dist/live-sanitize.js +4 -32
- package/dist/live-sanitize.js.map +1 -1
- package/dist/llmock.cjs +123 -30
- package/dist/llmock.cjs.map +1 -1
- package/dist/llmock.d.cts +16 -1
- package/dist/llmock.d.cts.map +1 -1
- package/dist/llmock.d.ts +16 -1
- package/dist/llmock.d.ts.map +1 -1
- package/dist/llmock.js +125 -32
- package/dist/llmock.js.map +1 -1
- package/dist/mcp-fakes-mount.cjs +1 -0
- package/dist/mcp-fakes-mount.cjs.map +1 -1
- package/dist/mcp-fakes-mount.js +1 -0
- package/dist/mcp-fakes-mount.js.map +1 -1
- package/dist/mcp-fakes-report.cjs +111 -0
- package/dist/mcp-fakes-report.cjs.map +1 -0
- package/dist/mcp-fakes-report.d.cts +40 -0
- package/dist/mcp-fakes-report.d.cts.map +1 -0
- package/dist/mcp-fakes-report.d.ts +40 -0
- package/dist/mcp-fakes-report.d.ts.map +1 -0
- package/dist/mcp-fakes-report.js +107 -0
- package/dist/mcp-fakes-report.js.map +1 -0
- package/dist/mcp-fakes.cjs +331 -8
- package/dist/mcp-fakes.cjs.map +1 -1
- package/dist/mcp-fakes.d.cts +406 -3
- package/dist/mcp-fakes.d.cts.map +1 -1
- package/dist/mcp-fakes.d.ts +406 -3
- package/dist/mcp-fakes.d.ts.map +1 -1
- package/dist/mcp-fakes.js +331 -8
- package/dist/mcp-fakes.js.map +1 -1
- package/dist/mcp-handler.cjs +209 -16
- package/dist/mcp-handler.cjs.map +1 -1
- package/dist/mcp-handler.d.cts +49 -0
- package/dist/mcp-handler.d.cts.map +1 -0
- package/dist/mcp-handler.d.ts +49 -0
- package/dist/mcp-handler.d.ts.map +1 -0
- package/dist/mcp-handler.js +207 -17
- package/dist/mcp-handler.js.map +1 -1
- package/dist/mcp-mock.cjs +112 -1
- package/dist/mcp-mock.cjs.map +1 -1
- package/dist/mcp-mock.d.cts +33 -2
- package/dist/mcp-mock.d.cts.map +1 -1
- package/dist/mcp-mock.d.ts +33 -2
- package/dist/mcp-mock.d.ts.map +1 -1
- package/dist/mcp-mock.js +112 -1
- package/dist/mcp-mock.js.map +1 -1
- package/dist/mcp-recorder.cjs +1224 -0
- package/dist/mcp-recorder.cjs.map +1 -0
- package/dist/mcp-recorder.d.cts +108 -0
- package/dist/mcp-recorder.d.cts.map +1 -0
- package/dist/mcp-recorder.d.ts +108 -0
- package/dist/mcp-recorder.d.ts.map +1 -0
- package/dist/mcp-recorder.js +1215 -0
- package/dist/mcp-recorder.js.map +1 -0
- package/dist/messages.cjs +362 -56
- package/dist/messages.cjs.map +1 -1
- package/dist/messages.d.cts.map +1 -1
- package/dist/messages.d.ts.map +1 -1
- package/dist/messages.js +363 -58
- package/dist/messages.js.map +1 -1
- package/dist/misbehavior.cjs +1523 -0
- package/dist/misbehavior.cjs.map +1 -0
- package/dist/misbehavior.d.cts +43 -0
- package/dist/misbehavior.d.cts.map +1 -0
- package/dist/misbehavior.d.ts +43 -0
- package/dist/misbehavior.d.ts.map +1 -0
- package/dist/misbehavior.js +1511 -0
- package/dist/misbehavior.js.map +1 -0
- package/dist/ollama.cjs +310 -112
- package/dist/ollama.cjs.map +1 -1
- package/dist/ollama.d.cts.map +1 -1
- package/dist/ollama.d.ts.map +1 -1
- package/dist/ollama.js +311 -113
- package/dist/ollama.js.map +1 -1
- package/dist/record-sanitize.cjs +231 -0
- package/dist/record-sanitize.cjs.map +1 -0
- package/dist/record-sanitize.js +224 -0
- package/dist/record-sanitize.js.map +1 -0
- package/dist/recorder.cjs +106 -5
- package/dist/recorder.cjs.map +1 -1
- package/dist/recorder.d.cts +2 -1
- package/dist/recorder.d.cts.map +1 -1
- package/dist/recorder.d.ts +2 -1
- package/dist/recorder.d.ts.map +1 -1
- package/dist/recorder.js +107 -7
- package/dist/recorder.js.map +1 -1
- package/dist/responses.cjs +667 -171
- package/dist/responses.cjs.map +1 -1
- package/dist/responses.d.cts +5 -13
- package/dist/responses.d.cts.map +1 -1
- package/dist/responses.d.ts +5 -13
- package/dist/responses.d.ts.map +1 -1
- package/dist/responses.js +665 -174
- package/dist/responses.js.map +1 -1
- package/dist/router.cjs +24 -2
- package/dist/router.cjs.map +1 -1
- package/dist/router.d.cts.map +1 -1
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +25 -4
- package/dist/router.js.map +1 -1
- package/dist/server.cjs +572 -76
- package/dist/server.cjs.map +1 -1
- package/dist/server.d.cts.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +574 -78
- package/dist/server.js.map +1 -1
- package/dist/stream-collapse.cjs +236 -34
- package/dist/stream-collapse.cjs.map +1 -1
- package/dist/stream-collapse.d.cts +39 -4
- package/dist/stream-collapse.d.cts.map +1 -1
- package/dist/stream-collapse.d.ts +39 -4
- package/dist/stream-collapse.d.ts.map +1 -1
- package/dist/stream-collapse.js +235 -35
- package/dist/stream-collapse.js.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +315 -4
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.ts +315 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/validate-cli.cjs +36 -4
- package/dist/validate-cli.cjs.map +1 -1
- package/dist/validate-cli.js +37 -5
- package/dist/validate-cli.js.map +1 -1
- package/dist/vector-types.d.ts.map +1 -1
- package/dist/version.cjs +45 -0
- package/dist/version.cjs.map +1 -0
- package/dist/version.js +44 -0
- package/dist/version.js.map +1 -0
- package/dist/vitest.cjs +66 -10
- package/dist/vitest.cjs.map +1 -1
- package/dist/vitest.d.cts +35 -4
- package/dist/vitest.d.cts.map +1 -1
- package/dist/vitest.d.ts +35 -4
- package/dist/vitest.d.ts.map +1 -1
- package/dist/vitest.js +67 -11
- package/dist/vitest.js.map +1 -1
- package/dist/watcher.cjs +6 -2
- package/dist/watcher.cjs.map +1 -1
- package/dist/watcher.js +6 -2
- package/dist/watcher.js.map +1 -1
- package/dist/ws-gemini-live.cjs +210 -101
- package/dist/ws-gemini-live.cjs.map +1 -1
- package/dist/ws-gemini-live.d.cts +9 -3
- package/dist/ws-gemini-live.d.cts.map +1 -1
- package/dist/ws-gemini-live.d.ts +9 -3
- package/dist/ws-gemini-live.d.ts.map +1 -1
- package/dist/ws-gemini-live.js +211 -102
- package/dist/ws-gemini-live.js.map +1 -1
- package/dist/ws-realtime.cjs +175 -62
- package/dist/ws-realtime.cjs.map +1 -1
- package/dist/ws-realtime.d.cts +8 -3
- package/dist/ws-realtime.d.cts.map +1 -1
- package/dist/ws-realtime.d.ts +8 -3
- package/dist/ws-realtime.d.ts.map +1 -1
- package/dist/ws-realtime.js +176 -63
- package/dist/ws-realtime.js.map +1 -1
- package/dist/ws-responses.cjs +109 -16
- package/dist/ws-responses.cjs.map +1 -1
- package/dist/ws-responses.d.cts +8 -12
- package/dist/ws-responses.d.cts.map +1 -1
- package/dist/ws-responses.d.ts +8 -12
- package/dist/ws-responses.d.ts.map +1 -1
- package/dist/ws-responses.js +111 -18
- package/dist/ws-responses.js.map +1 -1
- package/package.json +10 -2
- package/skills/write-fixtures/SKILL.md +179 -21
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"misbehavior.js","names":[],"sources":["../src/misbehavior.ts"],"sourcesContent":["import {\n assertCustomToolCalls,\n assertResponsesToolCalls,\n isCombinedFixtureResponse,\n isErrorResponse,\n isTextResponse,\n isToolCallResponse,\n rebuildOrderedBlocks,\n requireEmittedFunctionToolCalls,\n resolveFixtureBlocks,\n resolveServedBlockOutcome,\n servedToolCalls,\n toolCallFixtureBlock,\n withServedToolCalls,\n resolveTestId,\n toolArgsForWire,\n strictToolArgumentsEnabled,\n keepAuthoredToolArguments,\n} from \"./helpers.js\";\nimport { parseChaosNumber } from \"./chaos.js\";\nimport type {\n ChatCompletionRequest,\n ContentWithToolCallsResponse,\n Fixture,\n FixtureResponse,\n FixtureToolCall,\n ResponsesFixtureBlock,\n HandlerDefaults,\n JournalEntry,\n MisbehaviorConfig,\n MisbehaviorFault,\n MisbehaviorFaultId,\n ToolCall,\n WireId,\n} from \"./types.js\";\n\n/** Internal preparation contract; selection and firing belong to the planner. */\nexport interface MisbehaviorCandidateContext {\n wire: WireId;\n response: FixtureResponse;\n request: ChatCompletionRequest;\n stream: boolean;\n /** Actual selected output mode capability; required by K4 preparation. */\n emitsToolCallIds?: boolean;\n /** Current normal output emits only nonempty authored IDs, evaluated per target. */\n toolCallIdMode?: \"authored-nonempty\";\n}\n\nexport interface MisbehaviorCandidate {\n response: FixtureResponse;\n stop?: \"tool_calls\" | \"stop\" | \"length\" | \"content_filter\" | \"refusal\";\n target?: { tool: string; index: number };\n detail?: string;\n refusal?: string;\n refusalCategory?: string | null;\n reasoning?: string;\n duplicateId?: { sourceIndex: number; destinationIndex: number };\n}\n\nexport type MisbehaviorCandidateResult =\n | { kind: \"ready\"; candidate: MisbehaviorCandidate }\n | { kind: \"not-applicable\"; detail: string };\n\n/** Direct constraints only; refs and applicators are deliberately not evaluated. */\nexport interface DirectToolSchema {\n properties: Record<string, unknown>;\n required: readonly string[];\n additionalProperties?: unknown;\n patternProperties?: Record<string, unknown>;\n}\n\nfunction normalizeDirectConstraints(schema: unknown): DirectToolSchema | undefined {\n if (!isObject(schema)) return undefined;\n if (schema.properties !== undefined && !isObject(schema.properties)) return undefined;\n if (\n schema.required !== undefined &&\n (!Array.isArray(schema.required) || !schema.required.every((name) => typeof name === \"string\"))\n )\n return undefined;\n if (schema.patternProperties !== undefined && !isObject(schema.patternProperties))\n return undefined;\n return {\n properties: schema.properties ?? {},\n required: schema.required ?? [],\n ...(Object.hasOwn(schema, \"additionalProperties\")\n ? { additionalProperties: schema.additionalProperties }\n : {}),\n ...(schema.patternProperties !== undefined\n ? { patternProperties: schema.patternProperties }\n : {}),\n };\n}\n\ninterface MisbehaviorSchemaInput {\n readonly tools?: readonly unknown[];\n}\n\n/**\n * Private tools-only input also permits native Cohere definitions before adaptation.\n * With `scope`, a function tool matches only when its `namespace` equals\n * `scope.namespace` (an absent namespace matches only un-namespaced tools), so\n * an OpenAI Responses call never takes another namespace's same-named schema.\n */\nexport function normalizeDirectToolSchema(\n request: MisbehaviorSchemaInput,\n toolName: string,\n scope?: { namespace: string | undefined },\n): DirectToolSchema | undefined {\n for (const tool of request.tools ?? []) {\n if (!isObject(tool)) continue;\n if (tool.type === \"function\" && isObject(tool.function) && tool.function.name === toolName) {\n if (scope && tool.namespace !== scope.namespace) continue;\n return normalizeDirectConstraints(tool.function.parameters);\n }\n if (tool.name !== toolName || !Object.hasOwn(tool, \"parameter_definitions\")) continue;\n const definitions = tool.parameter_definitions;\n if (!isObject(definitions)) return undefined;\n const required: string[] = [];\n for (const [name, definition] of Object.entries(definitions)) {\n if (!isObject(definition)) return undefined;\n if (definition.required !== undefined && typeof definition.required !== \"boolean\")\n return undefined;\n if (definition.required === true) required.push(name);\n }\n return { properties: definitions, required };\n }\n return undefined;\n}\n\n/**\n * The schema of a fault's target call. Only OpenAI Responses serves a call's\n * `namespace`, so only there does the lookup resolve (namespace, name).\n */\nfunction targetToolSchema(\n context: MisbehaviorCandidateContext,\n target: ToolCall,\n): DirectToolSchema | undefined {\n return context.wire === \"openai-responses\"\n ? normalizeDirectToolSchema(context.request, target.name, { namespace: target.namespace })\n : normalizeDirectToolSchema(context.request, target.name);\n}\n\nexport type DirectJSONType =\n | \"string\"\n | \"number\"\n | \"integer\"\n | \"boolean\"\n | \"array\"\n | \"object\"\n | \"null\";\n\nfunction normalizeDirectType(value: unknown): DirectJSONType | undefined {\n if (typeof value !== \"string\") return undefined;\n const type = value.toLowerCase();\n switch (type) {\n case \"string\":\n case \"number\":\n case \"integer\":\n case \"boolean\":\n case \"array\":\n case \"object\":\n case \"null\":\n return type;\n default:\n return undefined;\n }\n}\n\nexport function directPropertyTypes(\n propertySchema: unknown,\n): readonly DirectJSONType[] | undefined {\n if (!isObject(propertySchema)) return undefined;\n const rawTypes = Array.isArray(propertySchema.type) ? propertySchema.type : [propertySchema.type];\n if (rawTypes.length === 0) return undefined;\n const types: DirectJSONType[] = [];\n for (const rawType of rawTypes) {\n const type = normalizeDirectType(rawType);\n // Dropping an unknown union member could incorrectly prove a value invalid.\n if (type === undefined) return undefined;\n types.push(type);\n }\n return types;\n}\n\nexport function acceptsDirectType(value: unknown, type: DirectJSONType): boolean {\n switch (type) {\n case \"null\":\n return value === null;\n case \"array\":\n return Array.isArray(value);\n case \"object\":\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n case \"integer\":\n return typeof value === \"number\" && Number.isInteger(value);\n case \"number\":\n return typeof value === \"number\" && Number.isFinite(value);\n default:\n return typeof value === type;\n }\n}\n\nfunction invalidJsonArguments(\n canonical: string,\n style: NonNullable<Extract<MisbehaviorFault, { fault: \"tool-args-invalid-json\" }>[\"style\"]>,\n): string | undefined {\n let candidate = canonical;\n if (style === \"truncated\")\n candidate = canonical.slice(0, Math.max(1, Math.floor(canonical.length / 2)));\n else if (style === \"trailing-comma\" && canonical.endsWith(\"}\"))\n candidate = `${canonical.slice(0, -1)},}`;\n else if (style === \"single-quotes\") {\n // Consume escape pairs before delimiters, preserving quoted string content.\n candidate = canonical.replace(/\\\\[\\s\\S]|\"/g, (token) => (token === '\"' ? \"'\" : token));\n }\n if (candidate === canonical) return undefined;\n try {\n JSON.parse(candidate);\n return undefined;\n } catch {\n return candidate;\n }\n}\n\n/**\n * The ordered blocks a fault sees. Custom tool calls and namespaces are kept so\n * an OpenAI Responses rewrite serves them unchanged; the planner never reaches\n * here with a custom call on any other wire.\n */\nfunction faultBlockOutcome(response: FixtureResponse) {\n return isCombinedFixtureResponse(response) ? resolveServedBlockOutcome(response) : undefined;\n}\n\n/**\n * Index of a tool fault's target: the first function call, or the first one\n * named `tool`. A custom tool call has no JSON arguments, so it is never a\n * fault target; -1 when no function call qualifies.\n */\nfunction faultTargetIndex(calls: readonly FixtureToolCall[], tool: string | undefined): number {\n return calls.findIndex(\n (call) => call.type !== \"custom\" && (tool === undefined || call.name === tool),\n );\n}\n\n/** The function call at `index`, or undefined when absent or custom. */\nfunction functionCallAt(calls: readonly FixtureToolCall[], index: number): ToolCall | undefined {\n const call = calls[index];\n return call !== undefined && call.type !== \"custom\" ? call : undefined;\n}\n\n/** Replace a response's tool calls one-for-one, rebuilding ordered blocks when present. */\nfunction rewriteFaultToolCalls(\n response: FixtureResponse,\n outcome: ReturnType<typeof faultBlockOutcome>,\n toolCalls: FixtureToolCall[],\n): FixtureResponse {\n if (!outcome) return withServedToolCalls(response, toolCalls);\n return withServedToolCalls(\n { ...response, content: outcome.content },\n toolCalls,\n rebuildOrderedBlocks(outcome.ordered, toolCalls),\n );\n}\n\n/** Prepare K1 without selecting a fault, spending counters, or mutating input. */\nexport function prepareInvalidJsonCandidate(\n context: MisbehaviorCandidateContext,\n fault: Extract<MisbehaviorFault, { fault: \"tool-args-invalid-json\" }>,\n): MisbehaviorCandidateResult {\n const response = context.response;\n const combined = isCombinedFixtureResponse(response);\n if (isErrorResponse(response) || !(combined || isToolCallResponse(response)))\n return { kind: \"not-applicable\", detail: \"Response has no tool calls\" };\n const outcome = faultBlockOutcome(response);\n const calls = outcome?.toolCalls ?? servedToolCalls(response);\n const index = faultTargetIndex(calls, fault.tool);\n const target = functionCallAt(calls, index);\n if (!target) return { kind: \"not-applicable\", detail: \"Target tool call is absent\" };\n const args = toolArgsForWire(target);\n const canonical = args.kind === \"parsed\" ? args.text : args.raw;\n const style = fault.style ?? MISBEHAVIOR_CATALOG[fault.fault].defaults.style;\n const argumentsText = invalidJsonArguments(canonical, style);\n if (argumentsText === undefined)\n return { kind: \"not-applicable\", detail: `${style} cannot produce changed invalid JSON` };\n const toolCalls = calls.map((call, callIndex) =>\n callIndex === index && call.type !== \"custom\"\n ? { ...call, arguments: argumentsText }\n : { ...call },\n );\n const rewritten = rewriteFaultToolCalls(response, outcome, toolCalls);\n return {\n kind: \"ready\",\n candidate: { response: rewritten, target: { tool: target.name, index }, detail: style },\n };\n}\n\n/** Prepare K2 missing-required without selecting a fault or spending counters. */\nexport function prepareMissingRequiredCandidate(\n context: MisbehaviorCandidateContext,\n fault: Extract<MisbehaviorFault, { fault: \"tool-args-schema-violation\" }>,\n): MisbehaviorCandidateResult {\n const response = context.response;\n const combined = isCombinedFixtureResponse(response);\n if (isErrorResponse(response) || !(combined || isToolCallResponse(response)))\n return { kind: \"not-applicable\", detail: \"Response has no tool calls\" };\n const outcome = faultBlockOutcome(response);\n const calls = outcome?.toolCalls ?? servedToolCalls(response);\n const index = faultTargetIndex(calls, fault.tool);\n const target = functionCallAt(calls, index);\n if (!target) return { kind: \"not-applicable\", detail: \"Target tool call is absent\" };\n const args = toolArgsForWire(target);\n if (args.kind !== \"parsed\" || !isObject(args.value))\n return { kind: \"not-applicable\", detail: \"Arguments must parse to an object\" };\n const value = args.value;\n const schema = targetToolSchema(context, target);\n if (!schema) return { kind: \"not-applicable\", detail: \"Target tool has no direct schema\" };\n const property = fault.property ?? schema.required.find((name) => Object.hasOwn(value, name));\n if (\n property === undefined ||\n !schema.required.includes(property) ||\n !Object.hasOwn(value, property)\n )\n return { kind: \"not-applicable\", detail: \"No present required property can be removed\" };\n const copied = { ...value };\n delete copied[property];\n const argumentsText = JSON.stringify(copied);\n const toolCalls = calls.map((call, callIndex) =>\n callIndex === index && call.type !== \"custom\"\n ? { ...call, arguments: argumentsText }\n : { ...call },\n );\n const rewritten = rewriteFaultToolCalls(response, outcome, toolCalls);\n return {\n kind: \"ready\",\n candidate: {\n response: rewritten,\n target: { tool: target.name, index },\n detail: \"missing-required\",\n },\n };\n}\n\nfunction wrongTypeReplacement(type: DirectJSONType): unknown {\n switch (type) {\n case \"string\":\n case \"null\":\n return 12345;\n case \"number\":\n case \"integer\":\n return \"not-a-number\";\n case \"boolean\":\n return \"true\";\n case \"array\":\n return {};\n case \"object\":\n return \"[object]\";\n }\n}\n\n/** Prepare K2 wrong-type without selecting a fault or spending counters. */\nexport function prepareWrongTypeCandidate(\n context: MisbehaviorCandidateContext,\n fault: Extract<MisbehaviorFault, { fault: \"tool-args-schema-violation\" }>,\n): MisbehaviorCandidateResult {\n const response = context.response;\n const combined = isCombinedFixtureResponse(response);\n if (isErrorResponse(response) || !(combined || isToolCallResponse(response)))\n return { kind: \"not-applicable\", detail: \"Response has no tool calls\" };\n const outcome = faultBlockOutcome(response);\n const calls = outcome?.toolCalls ?? servedToolCalls(response);\n const index = faultTargetIndex(calls, fault.tool);\n const target = functionCallAt(calls, index);\n if (!target) return { kind: \"not-applicable\", detail: \"Target tool call is absent\" };\n const args = toolArgsForWire(target);\n if (args.kind !== \"parsed\" || !isObject(args.value))\n return { kind: \"not-applicable\", detail: \"Arguments must parse to an object\" };\n const value = args.value;\n const schema = targetToolSchema(context, target);\n if (!schema) return { kind: \"not-applicable\", detail: \"Target tool has no direct schema\" };\n const names = fault.property === undefined ? Object.keys(schema.properties) : [fault.property];\n let mutation: { property: string; replacement: unknown } | undefined;\n for (const property of names) {\n if (!Object.hasOwn(value, property) || !Object.hasOwn(schema.properties, property)) continue;\n const propertySchema = schema.properties[property];\n const types = directPropertyTypes(propertySchema);\n if (!types) continue;\n // Scalar types keep their named replacement; unions use catalog order.\n const replacements: unknown[] = !(\n isObject(propertySchema) && Array.isArray(propertySchema.type)\n )\n ? [wrongTypeReplacement(types[0])]\n : [12345, \"not-a-number\", \"true\", {}, \"[object]\", null];\n const replacement = replacements.find((candidate) =>\n types.every((type) => !acceptsDirectType(candidate, type)),\n );\n if (\n replacement === undefined ||\n JSON.stringify(replacement) === JSON.stringify(value[property])\n )\n continue;\n mutation = { property, replacement };\n break;\n }\n if (!mutation)\n return {\n kind: \"not-applicable\",\n detail: \"No present declared property has a provably wrong replacement\",\n };\n const argumentsText = JSON.stringify({ ...value, [mutation.property]: mutation.replacement });\n const toolCalls = calls.map((call, callIndex) =>\n callIndex === index && call.type !== \"custom\"\n ? { ...call, arguments: argumentsText }\n : { ...call },\n );\n const rewritten = rewriteFaultToolCalls(response, outcome, toolCalls);\n return {\n kind: \"ready\",\n candidate: {\n response: rewritten,\n target: { tool: target.name, index },\n detail: \"wrong-type\",\n },\n };\n}\n\n/** Prepare K2 extra-property only when direct constraints prove the addition invalid. */\nexport function prepareExtraPropertyCandidate(\n context: MisbehaviorCandidateContext,\n fault: Extract<MisbehaviorFault, { fault: \"tool-args-schema-violation\" }>,\n): MisbehaviorCandidateResult {\n const response = context.response;\n const combined = isCombinedFixtureResponse(response);\n if (isErrorResponse(response) || !(combined || isToolCallResponse(response)))\n return { kind: \"not-applicable\", detail: \"Response has no tool calls\" };\n const outcome = faultBlockOutcome(response);\n const calls = outcome?.toolCalls ?? servedToolCalls(response);\n const index = faultTargetIndex(calls, fault.tool);\n const target = functionCallAt(calls, index);\n if (!target) return { kind: \"not-applicable\", detail: \"Target tool call is absent\" };\n const args = toolArgsForWire(target);\n if (args.kind !== \"parsed\" || !isObject(args.value))\n return { kind: \"not-applicable\", detail: \"Arguments must parse to an object\" };\n const value = args.value;\n const schema = targetToolSchema(context, target);\n if (!schema || schema.additionalProperties !== false)\n return {\n kind: \"not-applicable\",\n detail: \"Target schema does not forbid additional properties\",\n };\n const property = fault.property ?? \"__aimock_extra\";\n if (Object.hasOwn(schema.properties, property) || Object.hasOwn(value, property))\n return { kind: \"not-applicable\", detail: \"Extra property name is already declared or present\" };\n for (const [pattern, patternSchema] of Object.entries(schema.patternProperties ?? {})) {\n try {\n // A literal-false pattern directly forbids the value; other matching schemas remain unproven.\n if (new RegExp(pattern).test(property) && patternSchema !== false)\n return { kind: \"not-applicable\", detail: \"A pattern covers the extra property name\" };\n } catch {\n return { kind: \"not-applicable\", detail: \"A property pattern cannot be evaluated\" };\n }\n }\n const argumentsText = JSON.stringify({ ...value, [property]: true });\n const toolCalls = calls.map((call, callIndex) =>\n callIndex === index && call.type !== \"custom\"\n ? { ...call, arguments: argumentsText }\n : { ...call },\n );\n const rewritten = rewriteFaultToolCalls(response, outcome, toolCalls);\n return {\n kind: \"ready\",\n candidate: {\n response: rewritten,\n target: { tool: target.name, index },\n detail: \"extra-property\",\n },\n };\n}\n\n/** Prepare K2 enum-mismatch without selecting a fault or spending counters. */\nexport function prepareEnumMismatchCandidate(\n context: MisbehaviorCandidateContext,\n fault: Extract<MisbehaviorFault, { fault: \"tool-args-schema-violation\" }>,\n): MisbehaviorCandidateResult {\n const response = context.response;\n const combined = isCombinedFixtureResponse(response);\n if (isErrorResponse(response) || !(combined || isToolCallResponse(response)))\n return { kind: \"not-applicable\", detail: \"Response has no tool calls\" };\n const outcome = faultBlockOutcome(response);\n const calls = outcome?.toolCalls ?? servedToolCalls(response);\n const index = faultTargetIndex(calls, fault.tool);\n const target = functionCallAt(calls, index);\n if (!target) return { kind: \"not-applicable\", detail: \"Target tool call is absent\" };\n const args = toolArgsForWire(target);\n if (args.kind !== \"parsed\" || !isObject(args.value))\n return { kind: \"not-applicable\", detail: \"Arguments must parse to an object\" };\n const value = args.value;\n const schema = targetToolSchema(context, target);\n if (!schema) return { kind: \"not-applicable\", detail: \"Target tool has no direct schema\" };\n const names = fault.property === undefined ? Object.keys(schema.properties) : [fault.property];\n let mutation: { property: string; replacement: unknown } | undefined;\n for (const property of names) {\n if (!Object.hasOwn(value, property) || !Object.hasOwn(schema.properties, property)) continue;\n const propertySchema = schema.properties[property];\n if (!isObject(propertySchema) || !Array.isArray(propertySchema.enum)) continue;\n let replacement = \"__aimock_not_in_enum\";\n let suffix = 2;\n while (propertySchema.enum.includes(replacement)) {\n replacement = `__aimock_not_in_enum_${suffix++}`;\n }\n if (replacement === value[property]) continue;\n mutation = { property, replacement };\n break;\n }\n if (!mutation)\n return {\n kind: \"not-applicable\",\n detail: \"No present declared enum property has a changed out-of-enum replacement\",\n };\n const argumentsText = JSON.stringify({ ...value, [mutation.property]: mutation.replacement });\n const toolCalls = calls.map((call, callIndex) =>\n callIndex === index && call.type !== \"custom\"\n ? { ...call, arguments: argumentsText }\n : { ...call },\n );\n const rewritten = rewriteFaultToolCalls(response, outcome, toolCalls);\n return {\n kind: \"ready\",\n candidate: {\n response: rewritten,\n target: { tool: target.name, index },\n detail: \"enum-mismatch\",\n },\n };\n}\n\n/** Prepare K2 not-object without selecting a fault or spending counters. */\nexport function prepareNotObjectCandidate(\n context: MisbehaviorCandidateContext,\n fault: Extract<MisbehaviorFault, { fault: \"tool-args-schema-violation\" }>,\n): MisbehaviorCandidateResult {\n if (!supportsMisbehavior(context.wire, { ...fault, violation: \"not-object\" }, context.stream))\n return { kind: \"not-applicable\", detail: \"not-object is unsupported on this wire/output mode\" };\n const response = context.response;\n const combined = isCombinedFixtureResponse(response);\n if (isErrorResponse(response) || !(combined || isToolCallResponse(response)))\n return { kind: \"not-applicable\", detail: \"Response has no tool calls\" };\n const outcome = faultBlockOutcome(response);\n const calls = outcome?.toolCalls ?? servedToolCalls(response);\n const index = faultTargetIndex(calls, fault.tool);\n const target = functionCallAt(calls, index);\n if (!target) return { kind: \"not-applicable\", detail: \"Target tool call is absent\" };\n const args = toolArgsForWire(target);\n if (args.kind !== \"parsed\" || !isObject(args.value))\n return { kind: \"not-applicable\", detail: \"Arguments must parse to an object\" };\n const argumentsText = JSON.stringify(args.text);\n const toolCalls = calls.map((call, callIndex) =>\n callIndex === index && call.type !== \"custom\"\n ? { ...call, arguments: argumentsText }\n : { ...call },\n );\n const rewritten = rewriteFaultToolCalls(response, outcome, toolCalls);\n return {\n kind: \"ready\",\n candidate: {\n response: rewritten,\n target: { tool: target.name, index },\n detail: \"not-object\",\n },\n };\n}\n\nconst fixtureMisbehaviorPositions = new WeakMap<Fixture, string>();\n\nexport function setFixtureMisbehaviorPosition(fixture: Fixture, position: string): void {\n fixtureMisbehaviorPositions.set(fixture, position);\n}\n\nexport function getFixtureMisbehaviorPosition(fixture: Fixture): string | undefined {\n return fixtureMisbehaviorPositions.get(fixture);\n}\n\nexport function copyFixtureMisbehaviorPosition(from: Fixture, to: Fixture): void {\n const position = getFixtureMisbehaviorPosition(from);\n if (position !== undefined) setFixtureMisbehaviorPosition(to, position);\n}\n\n/** Shared by fixture identity and the seeded planner; hash UTF-8 bytes, not UTF-16 units. */\nfunction fnv1a32(text: string): number {\n let hash = 0x811c9dc5;\n for (const byte of new TextEncoder().encode(text)) {\n hash = Math.imul(hash ^ byte, 0x01000193);\n }\n return hash >>> 0;\n}\n\n/** Canonicalize the declared match/config domain without shortening strings or arrays. */\nfunction canonicalIdentityValue(value: unknown): unknown {\n if (value instanceof RegExp) return { $regexp: value.toString() };\n if (typeof value === \"function\") return \"fn\";\n if (Array.isArray(value)) return value.map(canonicalIdentityValue);\n if (value !== null && typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value)\n .sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0))\n .map(([key, child]) => [key, canonicalIdentityValue(child)]),\n );\n }\n return value;\n}\n\n/** Ingress must assign a logical load/addition position before planning a fixture fault. */\nexport function fixtureMisbehaviorSourceKey(fixture: Fixture, config: MisbehaviorConfig): string {\n const position = getFixtureMisbehaviorPosition(fixture);\n if (!position) throw new Error(\"Missing fixture misbehavior position: internal invariant\");\n const canonicalMatch = JSON.stringify(canonicalIdentityValue(fixture.match));\n const seedlessConfig = Object.fromEntries(\n Object.entries(config).filter(([key]) => key !== \"seed\"),\n );\n const canonicalConfig = JSON.stringify(canonicalIdentityValue(seedlessConfig));\n return `fixture:${fnv1a32(`${canonicalMatch}|${canonicalConfig}|${position}`)}`;\n}\n\nexport type MisbehaviorRule =\n | \"misbehavior/unknown-key\"\n | \"misbehavior/bad-value\"\n | \"misbehavior/not-applicable\"\n | \"misbehavior/unsupported-on-wire\";\nexport interface MisbehaviorIssue {\n rule: MisbehaviorRule;\n path: string;\n value: unknown;\n message: string;\n}\nexport type MisbehaviorParseResult =\n | { ok: true; config: MisbehaviorConfig }\n | { ok: false; issue: MisbehaviorIssue };\n\ntype ValueCheck = (value: unknown) => boolean;\nconst string: ValueCheck = (value) => typeof value === \"string\";\nconst finite: ValueCheck = (value) => typeof value === \"number\" && Number.isFinite(value);\nconst choices =\n (...values: string[]): ValueCheck =>\n (value) =>\n typeof value === \"string\" && values.includes(value);\n\n/** Single catalog for accepted parameters and their defaults. Defaults are applied by the planner. */\nexport const MISBEHAVIOR_CATALOG = {\n \"tool-args-invalid-json\": {\n parameters: { style: choices(\"truncated\", \"trailing-comma\", \"single-quotes\") },\n defaults: { style: \"truncated\" },\n },\n \"tool-args-schema-violation\": {\n parameters: {\n violation: choices(\n \"missing-required\",\n \"wrong-type\",\n \"extra-property\",\n \"enum-mismatch\",\n \"not-object\",\n ),\n property: string,\n },\n defaults: { violation: \"missing-required\" },\n },\n \"tool-unknown-name\": { parameters: { name: string }, defaults: {} },\n \"tool-call-id-duplicate\": { parameters: {}, defaults: {} },\n \"stop-length-mid-tool\": {\n parameters: { at: (v: unknown) => typeof v === \"number\" && finite(v) && v > 0 && v < 1 },\n defaults: { at: 0.5 },\n },\n \"empty-response\": { parameters: {}, defaults: {} },\n refusal: {\n parameters: { message: string, category: (v: unknown) => v === null || string(v) },\n defaults: { message: \"I can't help with that.\", category: null },\n },\n \"content-filter\": { parameters: {}, defaults: {} },\n \"reasoning-only\": { parameters: { reasoning: string }, defaults: {} },\n} as const satisfies Record<\n MisbehaviorFaultId,\n { parameters: Record<string, ValueCheck>; defaults: object }\n>;\n\ntype FaultSupport = \"yes\" | \"stream-only\" | \"n/a\";\ninterface WireSupport {\n faults: Readonly<Record<MisbehaviorFaultId, FaultSupport>>;\n /** Explicit parameter restrictions even when the base fault is supported. */\n refusalCategory: boolean;\n notObject: { stream: boolean; nonstream: boolean };\n}\n/** Engine stage: all nine faults are supported only on OpenAI Chat. */\nexport const WIRE_SUPPORT: Readonly<Record<WireId, Readonly<WireSupport>>> = {\n \"openai-chat\": {\n faults: {\n \"tool-args-invalid-json\": \"yes\",\n \"tool-args-schema-violation\": \"yes\",\n \"tool-unknown-name\": \"yes\",\n \"tool-call-id-duplicate\": \"yes\",\n \"stop-length-mid-tool\": \"yes\",\n \"empty-response\": \"yes\",\n refusal: \"yes\",\n \"content-filter\": \"yes\",\n \"reasoning-only\": \"yes\",\n },\n refusalCategory: false,\n notObject: { stream: true, nonstream: true },\n },\n \"openai-responses\": {\n faults: {\n \"tool-args-invalid-json\": \"yes\",\n \"tool-args-schema-violation\": \"yes\",\n \"tool-unknown-name\": \"yes\",\n \"tool-call-id-duplicate\": \"yes\",\n \"stop-length-mid-tool\": \"yes\",\n \"empty-response\": \"yes\",\n refusal: \"yes\",\n \"content-filter\": \"yes\",\n \"reasoning-only\": \"yes\",\n },\n refusalCategory: false,\n notObject: { stream: true, nonstream: true },\n },\n \"openai-realtime\": {\n faults: {\n \"tool-args-invalid-json\": \"yes\",\n \"tool-args-schema-violation\": \"yes\",\n \"tool-unknown-name\": \"yes\",\n \"tool-call-id-duplicate\": \"yes\",\n \"stop-length-mid-tool\": \"yes\",\n \"empty-response\": \"yes\",\n refusal: \"n/a\",\n \"content-filter\": \"yes\",\n \"reasoning-only\": \"n/a\",\n },\n refusalCategory: false,\n notObject: { stream: true, nonstream: true },\n },\n anthropic: {\n faults: {\n \"tool-args-invalid-json\": \"stream-only\",\n \"tool-args-schema-violation\": \"yes\",\n \"tool-unknown-name\": \"yes\",\n \"tool-call-id-duplicate\": \"yes\",\n \"stop-length-mid-tool\": \"yes\",\n \"empty-response\": \"yes\",\n refusal: \"yes\",\n \"content-filter\": \"n/a\",\n \"reasoning-only\": \"yes\",\n },\n refusalCategory: true,\n notObject: { stream: true, nonstream: false },\n },\n \"bedrock-invoke\": {\n faults: {\n \"tool-args-invalid-json\": \"stream-only\",\n \"tool-args-schema-violation\": \"yes\",\n \"tool-unknown-name\": \"yes\",\n \"tool-call-id-duplicate\": \"yes\",\n \"stop-length-mid-tool\": \"yes\",\n \"empty-response\": \"yes\",\n refusal: \"yes\",\n \"content-filter\": \"n/a\",\n \"reasoning-only\": \"yes\",\n },\n refusalCategory: true,\n notObject: { stream: true, nonstream: false },\n },\n \"bedrock-converse\": {\n faults: {\n \"tool-args-invalid-json\": \"yes\",\n \"tool-args-schema-violation\": \"yes\",\n \"tool-unknown-name\": \"yes\",\n \"tool-call-id-duplicate\": \"yes\",\n \"stop-length-mid-tool\": \"yes\",\n \"empty-response\": \"yes\",\n refusal: \"n/a\",\n \"content-filter\": \"yes\",\n \"reasoning-only\": \"yes\",\n },\n refusalCategory: false,\n notObject: { stream: true, nonstream: false },\n },\n gemini: {\n faults: {\n \"tool-args-invalid-json\": \"yes\",\n \"tool-args-schema-violation\": \"yes\",\n \"tool-unknown-name\": \"yes\",\n \"tool-call-id-duplicate\": \"yes\",\n \"stop-length-mid-tool\": \"yes\",\n \"empty-response\": \"yes\",\n refusal: \"n/a\",\n \"content-filter\": \"yes\",\n \"reasoning-only\": \"yes\",\n },\n refusalCategory: false,\n notObject: { stream: false, nonstream: false },\n },\n \"gemini-live\": {\n faults: {\n \"tool-args-invalid-json\": \"yes\",\n \"tool-args-schema-violation\": \"yes\",\n \"tool-unknown-name\": \"yes\",\n \"tool-call-id-duplicate\": \"yes\",\n \"stop-length-mid-tool\": \"n/a\",\n \"empty-response\": \"yes\",\n refusal: \"n/a\",\n \"content-filter\": \"n/a\",\n \"reasoning-only\": \"n/a\",\n },\n refusalCategory: false,\n notObject: { stream: false, nonstream: false },\n },\n \"gemini-interactions\": {\n faults: {\n \"tool-args-invalid-json\": \"stream-only\",\n \"tool-args-schema-violation\": \"yes\",\n \"tool-unknown-name\": \"yes\",\n \"tool-call-id-duplicate\": \"yes\",\n \"stop-length-mid-tool\": \"yes\",\n \"empty-response\": \"yes\",\n refusal: \"n/a\",\n \"content-filter\": \"n/a\",\n \"reasoning-only\": \"yes\",\n },\n refusalCategory: false,\n notObject: { stream: true, nonstream: false },\n },\n cohere: {\n faults: {\n \"tool-args-invalid-json\": \"yes\",\n \"tool-args-schema-violation\": \"yes\",\n \"tool-unknown-name\": \"yes\",\n \"tool-call-id-duplicate\": \"yes\",\n \"stop-length-mid-tool\": \"yes\",\n \"empty-response\": \"yes\",\n refusal: \"n/a\",\n \"content-filter\": \"n/a\",\n \"reasoning-only\": \"n/a\",\n },\n refusalCategory: false,\n notObject: { stream: true, nonstream: true },\n },\n ollama: {\n faults: {\n \"tool-args-invalid-json\": \"yes\",\n \"tool-args-schema-violation\": \"yes\",\n \"tool-unknown-name\": \"yes\",\n \"tool-call-id-duplicate\": \"n/a\",\n \"stop-length-mid-tool\": \"n/a\",\n \"empty-response\": \"yes\",\n refusal: \"n/a\",\n \"content-filter\": \"n/a\",\n \"reasoning-only\": \"yes\",\n },\n refusalCategory: false,\n notObject: { stream: false, nonstream: false },\n },\n};\n\nexport function supportsMisbehavior(\n wire: string,\n fault: MisbehaviorFault,\n stream: boolean,\n): boolean {\n if (!isWireId(wire)) return false;\n const support = WIRE_SUPPORT[wire];\n const mode = stream ? \"stream\" : \"nonstream\";\n const base = support.faults[fault.fault];\n if (base === \"n/a\" || (base === \"stream-only\" && !stream)) return false;\n if (fault.fault === \"refusal\" && Object.hasOwn(fault, \"category\") && !support.refusalCategory)\n return false;\n return (\n fault.fault !== \"tool-args-schema-violation\" ||\n fault.violation !== \"not-object\" ||\n support.notObject[mode]\n );\n}\n\nfunction isWireId(value: unknown): value is WireId {\n return typeof value === \"string\" && Object.hasOwn(WIRE_SUPPORT, value);\n}\nfunction isFaultId(value: unknown): value is MisbehaviorFaultId {\n return typeof value === \"string\" && Object.hasOwn(MISBEHAVIOR_CATALOG, value);\n}\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n (Object.getPrototypeOf(value) === Object.prototype || Object.getPrototypeOf(value) === null)\n );\n}\n/** Error reporting must not invoke user-authored primitive conversion hooks. */\nfunction describeInvalidValue(value: unknown): string {\n try {\n const text = JSON.stringify(value) ?? typeof value;\n return text.length > 200 ? `${text.slice(0, 200)}…` : text;\n } catch {\n return \"[unserializable value]\";\n }\n}\nfunction failure(rule: MisbehaviorRule, path: string, value: unknown): MisbehaviorParseResult {\n return {\n ok: false,\n issue: {\n rule,\n path,\n value,\n message: `${rule} at ${path}: invalid value ${describeInvalidValue(value)}`,\n },\n };\n}\nconst common: Record<string, ValueCheck> = {\n rate: (v) => parseChaosNumber(v, 1) !== undefined,\n times: (v) => typeof v === \"number\" && Number.isInteger(v) && v > 0,\n tool: string,\n providers: (v) => Array.isArray(v),\n};\n\n/** Strict object/shorthand parser; wire applicability is evaluated after scope/provider selection. */\nexport function parseMisbehavior(input: unknown, path = \"misbehavior\"): MisbehaviorParseResult {\n if (typeof input === \"string\") {\n return isFaultId(input)\n ? { ok: true, config: { faults: [{ fault: input }] } }\n : failure(\"misbehavior/bad-value\", path, input);\n }\n if (!isObject(input)) return failure(\"misbehavior/bad-value\", path, input);\n for (const key of Object.keys(input)) {\n if (key !== \"seed\" && key !== \"faults\")\n return failure(\"misbehavior/unknown-key\", `${path}.${key}`, input[key]);\n }\n if (\n Object.hasOwn(input, \"seed\") &&\n input.seed !== \"random\" &&\n !(typeof input.seed === \"number\" && Number.isInteger(input.seed))\n ) {\n return failure(\"misbehavior/bad-value\", `${path}.seed`, input.seed);\n }\n if (!Array.isArray(input.faults))\n return failure(\"misbehavior/bad-value\", `${path}.faults`, input.faults);\n const faults: MisbehaviorFault[] = [];\n for (let index = 0; index < input.faults.length; index++) {\n const entry: unknown = input.faults[index];\n const entryPath = `${path}.faults[${index}]`;\n if (!isObject(entry)) return failure(\"misbehavior/bad-value\", entryPath, entry);\n if (!isFaultId(entry.fault))\n return failure(\"misbehavior/bad-value\", `${entryPath}.fault`, entry.fault);\n const parameters: Readonly<Record<string, ValueCheck>> =\n MISBEHAVIOR_CATALOG[entry.fault].parameters;\n for (const key of Object.keys(entry)) {\n if (key === \"fault\") continue;\n const check = Object.hasOwn(common, key)\n ? common[key]\n : Object.hasOwn(parameters, key)\n ? parameters[key]\n : undefined;\n if (!check) return failure(\"misbehavior/unknown-key\", `${entryPath}.${key}`, entry[key]);\n if (!check(entry[key]))\n return failure(\"misbehavior/bad-value\", `${entryPath}.${key}`, entry[key]);\n }\n if (Array.isArray(entry.providers)) {\n for (let i = 0; i < entry.providers.length; i++) {\n if (!isWireId(entry.providers[i]))\n return failure(\n \"misbehavior/bad-value\",\n `${entryPath}.providers[${i}]`,\n entry.providers[i],\n );\n }\n }\n // Every own field and discriminant has been checked against the catalog above.\n // TypeScript cannot derive a discriminated union from that data-driven validation.\n faults.push({\n ...entry,\n ...(Object.hasOwn(entry, \"rate\") ? { rate: parseChaosNumber(entry.rate, 1) } : {}),\n ...(Array.isArray(entry.providers) ? { providers: [...entry.providers] } : {}),\n } as MisbehaviorFault);\n }\n return {\n ok: true,\n config: {\n ...(typeof input.seed === \"number\" || input.seed === \"random\" ? { seed: input.seed } : {}),\n faults,\n },\n };\n}\n\n/**\n * One fault followed by semicolon-delimited scalar key=value pairs. Values are\n * literal text: the first equals sign separates the key, with no unquoting.\n * Node's repeated-header comma joining must still parse as one whole grammar.\n */\nexport function parseMisbehaviorHeader(\n value: string | string[] | undefined,\n): MisbehaviorParseResult | undefined {\n if (value === undefined) return undefined;\n const path = \"headers.x-aimock-misbehavior\";\n const text = Array.isArray(value) ? value.join(\", \") : value;\n const [fault, ...pairs] = text.split(\";\").map((part) => part.trim());\n if (!isFaultId(fault)) return failure(\"misbehavior/bad-value\", path, value);\n const entry: Record<string, unknown> = { fault };\n for (const pair of pairs) {\n const separator = pair.indexOf(\"=\");\n const key = pair.slice(0, separator).trim();\n if (separator < 0 || !key) return failure(\"misbehavior/bad-value\", path, pair);\n const fieldPath = `${path}.faults[0].${key}`;\n if (key === \"fault\" || key === \"times\" || key === \"providers\")\n return failure(\"misbehavior/unknown-key\", fieldPath, pair);\n if (Object.hasOwn(entry, key)) return failure(\"misbehavior/bad-value\", fieldPath, pair);\n const scalar = pair.slice(separator + 1).trim();\n // Only `at` needs conversion here; the shared config parser normalizes rate.\n // An invalid numeric spelling stays invalid, including an empty string.\n const parsed = key === \"at\" ? (parseChaosNumber(scalar, 1) ?? scalar) : scalar;\n Object.defineProperty(entry, key, { value: parsed, enumerable: true });\n }\n return parseMisbehavior({ faults: [entry] }, path);\n}\n\n/** Only statically decidable S3/S4 checks; no factories or request schemas are evaluated. */\nexport function validateFixtureMisbehavior(\n fixture: Fixture,\n path = \"misbehavior\",\n): MisbehaviorIssue | undefined {\n if (fixture.misbehavior === undefined) return undefined;\n const parsed = parseMisbehavior(fixture.misbehavior, path);\n if (!parsed.ok) return parsed.issue;\n const endpoint = fixture.match.endpoint;\n const wires = Object.keys(WIRE_SUPPORT)\n .filter(isWireId)\n .filter((wire) =>\n endpoint === \"realtime\"\n ? wire === \"openai-realtime\"\n : endpoint === \"chat\"\n ? wire !== \"openai-realtime\"\n : true,\n );\n const nonchat = endpoint !== undefined && endpoint !== \"chat\" && endpoint !== \"realtime\";\n const response = fixture.response;\n for (const [index, fault] of parsed.config.faults.entries()) {\n const possible = wires.filter(\n (wire) => fault.providers === undefined || fault.providers.includes(wire),\n );\n if (possible.length === 0) continue;\n let reason: MisbehaviorRule | undefined;\n if (nonchat) reason = \"misbehavior/not-applicable\";\n else if (typeof response !== \"function\") {\n const combined = isCombinedFixtureResponse(response);\n if (\n isErrorResponse(response) ||\n !(combined || isTextResponse(response) || isToolCallResponse(response))\n ) {\n reason = \"misbehavior/not-applicable\";\n } else {\n const calls =\n (combined ? resolveServedBlockOutcome(response)?.toolCalls : undefined) ??\n (\"toolCalls\" in response ? servedToolCalls(response) : []);\n const toolFault = fault.fault.startsWith(\"tool-\") || fault.fault === \"stop-length-mid-tool\";\n // Tool faults target function calls only; other faults may scope to any non-custom call.\n const target = toolFault\n ? functionCallAt(calls, faultTargetIndex(calls, fault.tool))\n : undefined;\n if (toolFault && !target) reason = \"misbehavior/not-applicable\";\n else if (\n fault.tool !== undefined &&\n !calls.some((call) => call.name === fault.tool && call.type !== \"custom\")\n )\n reason = \"misbehavior/not-applicable\";\n else if (target) {\n const args = toolArgsForWire(target);\n const canonical = args.kind === \"parsed\" ? args.text : args.raw;\n if (fault.fault === \"tool-args-schema-violation\") {\n if (\n args.kind !== \"parsed\" ||\n args.value === null ||\n typeof args.value !== \"object\" ||\n Array.isArray(args.value)\n ) {\n reason = \"misbehavior/not-applicable\";\n } else {\n const violation =\n fault.violation ?? MISBEHAVIOR_CATALOG[fault.fault].defaults.violation;\n // These prerequisites depend only on arguments. Schema eligibility stays request-time.\n if (violation === \"extra-property\") {\n if (Object.hasOwn(args.value, fault.property ?? \"__aimock_extra\")) {\n reason = \"misbehavior/not-applicable\";\n }\n } else if (violation !== \"not-object\") {\n const hasTarget =\n fault.property === undefined\n ? Object.keys(args.value).length > 0\n : Object.hasOwn(args.value, fault.property);\n if (!hasTarget) reason = \"misbehavior/not-applicable\";\n }\n }\n } else if (fault.fault === \"stop-length-mid-tool\") {\n const cut = Math.max(\n 1,\n Math.floor(\n canonical.length * (fault.at ?? MISBEHAVIOR_CATALOG[fault.fault].defaults.at),\n ),\n );\n if (cut >= canonical.length) reason = \"misbehavior/not-applicable\";\n } else if (fault.fault === \"tool-args-invalid-json\") {\n const style = fault.style ?? MISBEHAVIOR_CATALOG[fault.fault].defaults.style;\n if (invalidJsonArguments(canonical, style) === undefined)\n reason = \"misbehavior/not-applicable\";\n }\n }\n }\n }\n if (\n !reason &&\n !possible.some(\n (wire) => supportsMisbehavior(wire, fault, false) || supportsMisbehavior(wire, fault, true),\n )\n ) {\n reason = \"misbehavior/unsupported-on-wire\";\n }\n if (reason) {\n const entryPath = `${path}.faults[${index}]`;\n return {\n rule: reason,\n path: entryPath,\n value: fault,\n message: `${reason} at ${entryPath}: ${fault.fault} cannot apply to this fixture`,\n };\n }\n }\n return undefined;\n}\n\n/** Prepare K3 without selecting a fault, spending counters, or mutating input. */\nexport function prepareUnknownNameCandidate(\n context: MisbehaviorCandidateContext,\n fault: Extract<MisbehaviorFault, { fault: \"tool-unknown-name\" }>,\n): MisbehaviorCandidateResult {\n const response = context.response;\n const combined = isCombinedFixtureResponse(response);\n if (isErrorResponse(response) || !(combined || isToolCallResponse(response)))\n return { kind: \"not-applicable\", detail: \"Response has no tool calls\" };\n const outcome = faultBlockOutcome(response);\n const calls = outcome?.toolCalls ?? servedToolCalls(response);\n const index = faultTargetIndex(calls, fault.tool);\n const target = functionCallAt(calls, index);\n if (!target) return { kind: \"not-applicable\", detail: \"Target tool call is absent\" };\n // The renamed call keeps its namespace, so on OpenAI Responses a name is\n // \"declared\" only within the target's own namespace (top-level tools for an\n // un-namespaced call): the same (namespace, name) rule as targetToolSchema.\n const inScope = (tool: { namespace?: string }) =>\n context.wire !== \"openai-responses\" || tool.namespace === target.namespace;\n const declared = new Set(\n (context.request.tools ?? []).filter(inScope).map((tool) => tool.function.name),\n );\n let name = fault.name ?? `${target.name}_v2`;\n if (fault.name !== undefined && declared.has(name))\n return {\n kind: \"not-applicable\",\n detail: \"Explicit replacement tool name is declared in the request\",\n };\n if (fault.name === undefined) {\n const base = name;\n for (let suffix = 2; declared.has(name); suffix++) name = `${base}_${suffix}`;\n }\n if (name === target.name)\n return { kind: \"not-applicable\", detail: \"Replacement tool name is unchanged\" };\n const toolCalls = calls.map((call, callIndex) =>\n callIndex === index ? { ...call, name } : { ...call },\n );\n const rewritten = rewriteFaultToolCalls(response, outcome, toolCalls);\n return {\n kind: \"ready\",\n candidate: { response: rewritten, target: { tool: target.name, index }, detail: name },\n };\n}\n\n/** Prepare shared identity without allocating the renderer's opaque call IDs. */\nexport function prepareDuplicateIdCandidate(\n context: MisbehaviorCandidateContext &\n ({ emitsToolCallIds: boolean } | { toolCallIdMode: \"authored-nonempty\" }),\n fault: Extract<MisbehaviorFault, { fault: \"tool-call-id-duplicate\" }>,\n): MisbehaviorCandidateResult {\n if (\n context.toolCallIdMode !== \"authored-nonempty\" &&\n typeof context.emitsToolCallIds !== \"boolean\"\n )\n throw new TypeError(\n \"K4 preparation requires the selected output mode's emitsToolCallIds capability\",\n );\n if (context.toolCallIdMode === undefined && !context.emitsToolCallIds)\n return { kind: \"not-applicable\", detail: \"Current output mode does not emit tool call IDs\" };\n const response = context.response;\n const combined = isCombinedFixtureResponse(response);\n if (isErrorResponse(response) || !(combined || isToolCallResponse(response)))\n return { kind: \"not-applicable\", detail: \"Response has no tool calls\" };\n const outcome = faultBlockOutcome(response);\n const calls = outcome?.toolCalls ?? servedToolCalls(response);\n const sourceIndex = faultTargetIndex(calls, fault.tool);\n const source = functionCallAt(calls, sourceIndex);\n if (!source) return { kind: \"not-applicable\", detail: \"Target tool call is absent\" };\n if (context.toolCallIdMode === \"authored-nonempty\") {\n const emitsToolCallIds = Boolean(source.id);\n if (context.emitsToolCallIds !== undefined && context.emitsToolCallIds !== emitsToolCallIds)\n throw new Error(\"Conflicting current output ID capabilities: internal invariant\");\n if (!emitsToolCallIds)\n return {\n kind: \"not-applicable\",\n detail: \"Current output mode does not emit target tool call ID\",\n };\n }\n // The destination is the next function call after the source, wrapping. A\n // custom tool call is never a destination: it passes through unchanged. With\n // no other function call, a copy of the source is inserted right after it.\n let destinationIndex = -1;\n for (let step = 1; step < calls.length && destinationIndex === -1; step++) {\n if (functionCallAt(calls, (sourceIndex + step) % calls.length))\n destinationIndex = (sourceIndex + step) % calls.length;\n }\n const inserted = destinationIndex === -1;\n const toolCalls = calls.map((call) => ({ ...call }));\n if (inserted) {\n destinationIndex = sourceIndex + 1;\n toolCalls.splice(destinationIndex, 0, { ...source });\n }\n if (source.id === undefined) delete toolCalls[destinationIndex].id;\n else toolCalls[destinationIndex].id = source.id;\n let rewritten: FixtureResponse = withServedToolCalls(response, toolCalls);\n if (outcome) {\n let callIndex = 0;\n const blocks = outcome.ordered.flatMap<ResponsesFixtureBlock>((block) => {\n if (block.type === \"text\") return [{ ...block }];\n const isSource = callIndex === sourceIndex;\n const rewrittenBlock = toolCallFixtureBlock(toolCalls[callIndex++]);\n if (!(inserted && isSource)) return [rewrittenBlock];\n return [rewrittenBlock, toolCallFixtureBlock(toolCalls[callIndex++])];\n });\n rewritten = withServedToolCalls({ ...response, content: outcome.content }, toolCalls, blocks);\n }\n return {\n kind: \"ready\",\n candidate: {\n response: rewritten,\n target: { tool: source.name, index: sourceIndex },\n duplicateId: { sourceIndex, destinationIndex },\n },\n };\n}\n\n/** Prepare a strict argument prefix without selecting a fault or spending counters. */\nexport function prepareLengthCandidate(\n context: MisbehaviorCandidateContext,\n fault: Extract<MisbehaviorFault, { fault: \"stop-length-mid-tool\" }>,\n): MisbehaviorCandidateResult {\n const response = context.response;\n const combined = isCombinedFixtureResponse(response);\n if (isErrorResponse(response) || !(combined || isToolCallResponse(response)))\n return { kind: \"not-applicable\", detail: \"Response has no tool calls\" };\n const outcome = faultBlockOutcome(response);\n const calls = outcome?.toolCalls ?? servedToolCalls(response);\n const index = faultTargetIndex(calls, fault.tool);\n const target = functionCallAt(calls, index);\n if (!target) return { kind: \"not-applicable\", detail: \"Target tool call is absent\" };\n const args = toolArgsForWire(target);\n const canonical = args.kind === \"parsed\" ? args.text : args.raw;\n const at = fault.at ?? MISBEHAVIOR_CATALOG[fault.fault].defaults.at;\n const cut = Math.max(1, Math.floor(canonical.length * at));\n if (canonical.length < 2 || !(cut < canonical.length))\n return { kind: \"not-applicable\", detail: \"Arguments have no strict nonempty proper prefix\" };\n const toolCalls = calls\n .slice(0, index + 1)\n .map((call, callIndex) =>\n callIndex === index && call.type !== \"custom\"\n ? { ...call, arguments: canonical.slice(0, cut) }\n : { ...call },\n );\n let rewritten: FixtureResponse = withServedToolCalls(response, toolCalls);\n if (outcome) {\n const blocks: ResponsesFixtureBlock[] = [];\n let callIndex = 0;\n let content = \"\";\n for (const block of outcome.ordered) {\n if (block.type === \"text\") {\n content += block.text;\n blocks.push({ ...block });\n } else {\n blocks.push(toolCallFixtureBlock(toolCalls[callIndex]));\n if (callIndex++ === index) break;\n }\n }\n rewritten = withServedToolCalls({ ...response, content }, toolCalls, blocks);\n }\n return {\n kind: \"ready\",\n candidate: { response: rewritten, stop: \"length\", target: { tool: target.name, index } },\n };\n}\n\n/** Remove all chat output channels while preserving response metadata. */\nfunction clearChatOutput(response: ContentWithToolCallsResponse): ContentWithToolCallsResponse {\n const cleared = { ...response, content: \"\" };\n delete cleared.blocks;\n delete cleared.responsesBlocks;\n delete cleared.toolCalls;\n delete cleared.customToolCalls;\n delete cleared.reasoning;\n delete cleared.reasoningSignature;\n delete cleared.redactedThinking;\n delete cleared.webSearches;\n delete cleared.finishReason;\n delete cleared.nativeFinishReason;\n return cleared;\n}\n\n/** Prepare an empty normal completion without mutating the resolved response. */\nexport function prepareEmptyCandidate(\n context: MisbehaviorCandidateContext,\n fault: Extract<MisbehaviorFault, { fault: \"empty-response\" }>,\n): MisbehaviorCandidateResult {\n const response = context.response;\n if (\n isErrorResponse(response) ||\n !(\n isCombinedFixtureResponse(response) ||\n isTextResponse(response) ||\n isToolCallResponse(response)\n )\n )\n return { kind: \"not-applicable\", detail: \"Response is not a chat response\" };\n if (fault.tool !== undefined) {\n const calls =\n (isCombinedFixtureResponse(response)\n ? resolveServedBlockOutcome(response)?.toolCalls\n : undefined) ?? (\"toolCalls\" in response ? servedToolCalls(response) : []);\n // A custom tool call is never a fault target: naming one selects nothing.\n if (!calls.some((call) => call.name === fault.tool && call.type !== \"custom\"))\n return {\n kind: \"not-applicable\",\n detail: calls.some((call) => call.name === fault.tool)\n ? \"Target tool call is a custom tool call\"\n : \"Target tool call is absent\",\n };\n }\n return { kind: \"ready\", candidate: { response: clearChatOutput(response), stop: \"stop\" } };\n}\n\n/** Prepare structured refusal data; the planner checks support on the original fault. */\nexport function prepareRefusalCandidate(\n context: MisbehaviorCandidateContext,\n fault: Extract<MisbehaviorFault, { fault: \"refusal\" }>,\n): MisbehaviorCandidateResult {\n const empty = prepareEmptyCandidate(context, { fault: \"empty-response\", tool: fault.tool });\n if (empty.kind !== \"ready\") return empty;\n return {\n kind: \"ready\",\n candidate: {\n response: empty.candidate.response,\n stop: \"refusal\",\n refusal: fault.message ?? MISBEHAVIOR_CATALOG.refusal.defaults.message,\n refusalCategory: fault.category ?? MISBEHAVIOR_CATALOG.refusal.defaults.category,\n },\n };\n}\n\n/** Prepare withheld output; the planner checks support on the original fault. */\nexport function prepareContentFilterCandidate(\n context: MisbehaviorCandidateContext,\n fault: Extract<MisbehaviorFault, { fault: \"content-filter\" }>,\n): MisbehaviorCandidateResult {\n const empty = prepareEmptyCandidate(context, { fault: \"empty-response\", tool: fault.tool });\n if (empty.kind !== \"ready\") return empty;\n return {\n kind: \"ready\",\n candidate: { response: empty.candidate.response, stop: \"content_filter\" },\n };\n}\n\n/** Prepare reasoning-only output; the planner checks support on the original fault. */\nexport function prepareReasoningOnlyCandidate(\n context: MisbehaviorCandidateContext,\n fault: Extract<MisbehaviorFault, { fault: \"reasoning-only\" }>,\n): MisbehaviorCandidateResult {\n const empty = prepareEmptyCandidate(context, { fault: \"empty-response\", tool: fault.tool });\n if (empty.kind !== \"ready\") return empty;\n const fixtureReasoning = \"reasoning\" in context.response ? context.response.reasoning : undefined;\n return {\n kind: \"ready\",\n candidate: {\n response: empty.candidate.response,\n stop: \"length\",\n reasoning: fault.reasoning ?? fixtureReasoning ?? \"Thinking...\",\n },\n };\n}\n\n/** Dispatch only after the planner has checked authored parameter/wire support. */\nexport function prepareMisbehaviorCandidate(\n context: MisbehaviorCandidateContext,\n fault: MisbehaviorFault,\n): MisbehaviorCandidateResult {\n switch (fault.fault) {\n case \"tool-args-invalid-json\":\n return prepareInvalidJsonCandidate(context, fault);\n case \"tool-args-schema-violation\": {\n const violation = fault.violation ?? \"missing-required\";\n switch (violation) {\n case \"missing-required\":\n return prepareMissingRequiredCandidate(context, fault);\n case \"wrong-type\":\n return prepareWrongTypeCandidate(context, fault);\n case \"extra-property\":\n return prepareExtraPropertyCandidate(context, fault);\n case \"enum-mismatch\":\n return prepareEnumMismatchCandidate(context, fault);\n case \"not-object\":\n return prepareNotObjectCandidate(context, fault);\n default:\n return assertUnreachableMisbehavior(violation);\n }\n }\n case \"tool-unknown-name\":\n return prepareUnknownNameCandidate(context, fault);\n case \"tool-call-id-duplicate\": {\n if (context.toolCallIdMode === \"authored-nonempty\")\n return prepareDuplicateIdCandidate(\n { ...context, toolCallIdMode: context.toolCallIdMode },\n fault,\n );\n // OpenAI Chat's normal builders always emit IDs, including generated ones.\n const emitsToolCallIds = context.wire === \"openai-chat\" ? true : context.emitsToolCallIds;\n if (emitsToolCallIds === undefined)\n throw new Error(\"Missing current output ID capability: internal invariant\");\n return prepareDuplicateIdCandidate({ ...context, emitsToolCallIds }, fault);\n }\n case \"stop-length-mid-tool\":\n return prepareLengthCandidate(context, fault);\n case \"empty-response\":\n return prepareEmptyCandidate(context, fault);\n case \"refusal\":\n return prepareRefusalCandidate(context, fault);\n case \"content-filter\":\n return prepareContentFilterCandidate(context, fault);\n case \"reasoning-only\":\n return prepareReasoningOnlyCandidate(context, fault);\n default:\n return assertUnreachableMisbehavior(fault);\n }\n}\n\nfunction assertUnreachableMisbehavior(value: never): never {\n throw new Error(`Unknown misbehavior candidate: ${String(value)}`);\n}\n\nexport interface MisbehaviorEvaluation {\n entryIndex: number;\n fault: MisbehaviorFaultId;\n outcome: \"applied\" | \"skipped\" | \"error\";\n reason?:\n | \"provider-excluded\"\n | \"not-applicable\"\n | \"unsupported-on-wire\"\n | \"times-exhausted\"\n | \"not-rolled\";\n ordinal?: number;\n}\nexport interface ServedMisbehaviorToolCall {\n /**\n * `\"custom\"` marks an OpenAI Responses custom tool call; its free-text\n * `input` is carried in `arguments`, as in a `ToolCallMessage`.\n */\n type?: \"custom\";\n name: string;\n arguments: string;\n id?: string;\n /** OpenAI Responses namespace, recorded only when the call had one. */\n namespace?: string;\n}\nexport interface MisbehaviorSummary {\n applied: boolean;\n evaluations: MisbehaviorEvaluation[];\n source?: \"header\" | \"fixture\" | \"scope\" | \"server\";\n wire?: WireId;\n fault?: MisbehaviorFaultId;\n target?: { tool: string; index: number };\n detail?: string;\n ordinal?: number;\n reason?: MisbehaviorEvaluation[\"reason\"] | \"disabled\" | \"proxied\" | \"chaos-fired\";\n /** Provider preparation must supply actual served calls before journaling an applied plan. */\n servedToolCalls?: ServedMisbehaviorToolCall[];\n}\nexport interface MisbehaviorPlan extends MisbehaviorCandidate {\n kind: \"applied\";\n summary: MisbehaviorSummary;\n}\nexport interface MisbehaviorSkip {\n kind: \"skipped\";\n summary?: MisbehaviorSummary;\n}\nexport interface MisbehaviorError {\n kind: \"error\";\n status: 400 | 501;\n code:\n | \"aimock_misbehavior_invalid\"\n | \"aimock_misbehavior_not_applicable\"\n | \"aimock_misbehavior_unsupported\";\n message: string;\n summary?: MisbehaviorSummary;\n}\n\nlet processMisbehaviorSeed: number | undefined;\n/** Shared with config inspection so a random run can be replayed with this numeric seed. */\nexport function resolveMisbehaviorSeed(\n seed: MisbehaviorConfig[\"seed\"],\n logger: HandlerDefaults[\"logger\"],\n): number {\n if (seed !== \"random\") return seed ?? 0;\n if (processMisbehaviorSeed === undefined) {\n processMisbehaviorSeed = Math.floor(Math.random() * 0x100000000);\n logger.info(`Misbehavior random seed: ${processMisbehaviorSeed}`);\n }\n return processMisbehaviorSeed;\n}\n\nfunction misbehaviorRoll(seed: number): number {\n let value = seed + 0x6d2b79f5;\n value = Math.imul(value ^ (value >>> 15), value | 1);\n value ^= value + Math.imul(value ^ (value >>> 7), value | 61);\n return ((value ^ (value >>> 14)) >>> 0) / 4294967296;\n}\n\n/**\n * Whether the wire's normal path would serve this response's blocks and tool\n * calls, or reject the fixture. Mirrors that path: non-empty ordered `blocks`\n * are authoritative (the legacy `toolCalls` is then never read), only the\n * OpenAI Responses API may carry a custom tool call, and every entry must be\n * well formed. A wire that carries arguments as an object also rejects a\n * function call whose `arguments` are not valid JSON (see\n * {@link rejectsInvalidToolArguments}). A rejection is either a coded fixture\n * tool-call error or the plain Error for a malformed text block or an unknown\n * block type; all of them mean the wire cannot serve the fixture.\n */\nfunction servesFixture(wire: WireId, stream: boolean, response: FixtureResponse): boolean {\n if (typeof response !== \"object\" || response === null) return true;\n const blocks = \"blocks\" in response ? response.blocks : undefined;\n let functionCalls: Pick<ToolCall, \"name\" | \"arguments\">[] = [];\n try {\n if (wire === \"openai-responses\") {\n if (!resolveServedBlockOutcome(response) && \"toolCalls\" in response) {\n assertCustomToolCalls(response);\n assertResponsesToolCalls(servedToolCalls(response));\n }\n } else if (\"toolCalls\" in response || \"blocks\" in response || \"responsesBlocks\" in response) {\n functionCalls = requireEmittedFunctionToolCalls(response, wire);\n if (Array.isArray(blocks) && blocks.length > 0) {\n functionCalls = resolveFixtureBlocks(blocks).filter((block) => block.type === \"toolCall\");\n }\n }\n } catch {\n return false;\n }\n const normalPathReplaces = strictToolArgumentsEnabled()\n ? rejectsInvalidToolArguments(wire, stream)\n : replacesInvalidToolArguments(wire);\n return (\n !normalPathReplaces || functionCalls.every((call) => toolArgsForWire(call).kind === \"parsed\")\n );\n}\n\n/**\n * Whether the normal path of this wire serves invalid-JSON `arguments` as\n * `{}` / `\"{}\"` (the default, as in 1.44.0) instead of the authored text. The\n * OpenAI wires pass the authored text through unchanged.\n */\nfunction replacesInvalidToolArguments(wire: WireId): boolean {\n return rejectsInvalidToolArguments(wire, false) || wire === \"cohere\";\n}\n\n/**\n * Whether this wire and output mode carry tool arguments as an object, so the\n * normal path must parse a fixture's string `arguments` and, under\n * `strictToolArguments`, answers aimock_invalid_tool_arguments when they are\n * not valid JSON. The other modes\n * pass the authored string through unchanged (the OpenAI wires, Cohere, and\n * the streaming Anthropic, Bedrock and Gemini Interactions paths, which send\n * arguments as a JSON-string fragment).\n */\nfunction rejectsInvalidToolArguments(wire: WireId, stream: boolean): boolean {\n switch (wire) {\n case \"gemini\":\n case \"gemini-live\":\n case \"ollama\":\n return true;\n case \"anthropic\":\n case \"bedrock-invoke\":\n case \"bedrock-converse\":\n case \"gemini-interactions\":\n return !stream;\n default:\n return false;\n }\n}\n\n/** Complete preparation precedes selection; every candidate sees the original response. */\nexport function planMisbehavior(input: {\n wire: WireId;\n fixture: Fixture;\n response: FixtureResponse;\n request: ChatCompletionRequest;\n stream: boolean;\n emitsToolCallIds?: boolean;\n toolCallIdMode?: \"authored-nonempty\";\n /** False when this endpoint has no renderer for otherwise supported wire faults. */\n faultRenderingAvailable?: boolean;\n defaults: HandlerDefaults;\n rawHeaders: import(\"node:http\").IncomingHttpHeaders;\n url: string | undefined;\n}): MisbehaviorPlan | MisbehaviorSkip | MisbehaviorError {\n const { wire, fixture, defaults } = input;\n // Misbehavior not enabled: the header and fixture keys are ignored (1.44.0).\n if (!defaults.misbehavior) return { kind: \"skipped\" };\n const testId = resolveTestId(input.rawHeaders, input.url);\n let source: NonNullable<MisbehaviorSummary[\"source\"]>;\n let parsed = parseMisbehaviorHeader(input.rawHeaders[\"x-aimock-misbehavior\"]);\n if (parsed !== undefined) source = \"header\";\n else if (fixture.misbehavior !== undefined) {\n source = \"fixture\";\n parsed = parseMisbehavior(fixture.misbehavior);\n } else if (defaults.misbehavior?.byTestId.has(testId)) {\n source = \"scope\";\n parsed = parseMisbehavior(defaults.misbehavior.byTestId.get(testId));\n } else if (defaults.misbehavior?.baseline !== undefined) {\n source = \"server\";\n parsed = parseMisbehavior(defaults.misbehavior.baseline);\n } else return { kind: \"skipped\" };\n if (!parsed.ok)\n return {\n kind: \"error\",\n status: source === \"header\" ? 400 : 501,\n code:\n source === \"header\" ? \"aimock_misbehavior_invalid\" : \"aimock_misbehavior_not_applicable\",\n message: `${wire}: ${parsed.issue.message}`,\n summary: { applied: false, source, wire, evaluations: [] },\n };\n // A fixture this wire cannot serve (a custom tool call off the OpenAI\n // Responses API, a malformed tool call, invalid JSON arguments that the\n // normal path replaces or rejects, a malformed text block or an unknown\n // block type) is never faulted and never throws here: the request takes the\n // normal path exactly as with no misbehavior config, which journals it and\n // answers the coded fixture tool-call error (aimock_unsupported_tool_call,\n // aimock_invalid_fixture_tool_call or, under strictToolArguments,\n // aimock_invalid_tool_arguments), the plain block error, or `{}` arguments.\n if (!servesFixture(wire, input.stream, input.response)) return { kind: \"skipped\" };\n const config = parsed.config;\n const explicit = source === \"header\" || source === \"fixture\";\n const evaluations: MisbehaviorEvaluation[] = [];\n const candidates = new Map<number, MisbehaviorCandidate>();\n const details = new Map<number, string>();\n const summaryFor = (row?: MisbehaviorEvaluation): MisbehaviorSummary => ({\n applied: row?.outcome === \"applied\",\n source,\n wire,\n evaluations: [...evaluations].sort((a, b) => a.entryIndex - b.entryIndex),\n ...(row\n ? {\n fault: row.fault,\n ...(row.reason !== undefined ? { reason: row.reason } : {}),\n ...(row.ordinal !== undefined ? { ordinal: row.ordinal } : {}),\n ...(details.has(row.entryIndex) ? { detail: details.get(row.entryIndex) } : {}),\n }\n : { reason: \"disabled\" }),\n });\n for (const [entryIndex, fault] of config.faults.entries()) {\n if (fault.providers !== undefined && !fault.providers.includes(wire)) {\n evaluations.push({\n entryIndex,\n fault: fault.fault,\n outcome: \"skipped\",\n reason: \"provider-excluded\",\n });\n continue;\n }\n let reason: MisbehaviorEvaluation[\"reason\"];\n let detail: string | undefined;\n const response = input.response;\n const combined = isCombinedFixtureResponse(response);\n if (\n isErrorResponse(response) ||\n !(combined || isTextResponse(response) || isToolCallResponse(response))\n ) {\n reason = \"not-applicable\";\n detail = \"Response is not a chat response\";\n } else if (\n input.faultRenderingAvailable === false ||\n !supportsMisbehavior(wire, fault, input.stream)\n ) {\n reason = \"unsupported-on-wire\";\n detail = \"Fault or authored parameter is unsupported in this wire/output mode\";\n } else {\n const prepared = prepareMisbehaviorCandidate(input, fault);\n if (prepared.kind === \"ready\") candidates.set(entryIndex, prepared.candidate);\n else {\n reason = \"not-applicable\";\n detail = prepared.detail;\n }\n }\n if (reason) {\n if (detail !== undefined) details.set(entryIndex, detail);\n const row: MisbehaviorEvaluation = {\n entryIndex,\n fault: fault.fault,\n outcome: explicit ? \"error\" : \"skipped\",\n reason,\n };\n evaluations.push(row);\n if (explicit)\n return {\n kind: \"error\",\n status: 501,\n code:\n reason === \"unsupported-on-wire\"\n ? \"aimock_misbehavior_unsupported\"\n : \"aimock_misbehavior_not_applicable\",\n message: `${fault.fault} on ${wire}: ${reason}: ${detail}`,\n summary: summaryFor(row),\n };\n }\n }\n if (candidates.size > 0) {\n const counters = defaults.misbehaviorCounters;\n if (!counters) throw new Error(\"Missing misbehavior journal counters: internal invariant\");\n const sourceKey =\n source === \"fixture\"\n ? fixtureMisbehaviorSourceKey(fixture, config)\n : source === \"scope\"\n ? `scope:${testId}`\n : source;\n const seed = resolveMisbehaviorSeed(config.seed, defaults.logger);\n for (const [entryIndex, candidate] of candidates) {\n const fault = config.faults[entryIndex];\n const key = { testId, sourceKey, entryIndex };\n if (fault.times !== undefined && counters.getFiringCount(key) >= fault.times) {\n evaluations.push({\n entryIndex,\n fault: fault.fault,\n outcome: \"skipped\",\n reason: \"times-exhausted\",\n });\n continue;\n }\n const ordinal = counters.nextOrdinal(key);\n const roll = misbehaviorRoll(\n fnv1a32(`${seed}|${testId}|${sourceKey}|${entryIndex}|${ordinal}`),\n );\n if (roll >= (fault.rate ?? 1)) {\n evaluations.push({\n entryIndex,\n fault: fault.fault,\n outcome: \"skipped\",\n reason: \"not-rolled\",\n ordinal,\n });\n continue;\n }\n counters.recordFiring(key);\n const row: MisbehaviorEvaluation = {\n entryIndex,\n fault: fault.fault,\n outcome: \"applied\",\n ordinal,\n };\n evaluations.push(row);\n // The fault's own malformed arguments (tool-args-invalid-json) must reach\n // the wire as authored, never the `{}` default of the normal path.\n keepAuthoredToolArguments();\n return {\n kind: \"applied\",\n ...candidate,\n summary: {\n ...summaryFor(row),\n ...(candidate.target !== undefined ? { target: candidate.target } : {}),\n ...(candidate.detail !== undefined ? { detail: candidate.detail } : {}),\n },\n };\n }\n }\n const last = [...evaluations].sort((a, b) => a.entryIndex - b.entryIndex).at(-1);\n return { kind: \"skipped\", summary: summaryFor(last) };\n}\n\n// Entry identity, rather than request/test IDs, prevents duplicate observations\n// when more than one response-finalization path sees the same request.\nconst recordedMisbehaviorEntries = new WeakSet<JournalEntry>();\nconst warnedUnsupportedMisbehavior = new WeakMap<HandlerDefaults[\"logger\"], Set<string>>();\n\n/** Record prepared output on the existing request; this is not a delivery receipt. */\nexport function recordMisbehaviorOutcome({\n entry,\n summary,\n defaults,\n testId,\n}: {\n entry: JournalEntry;\n summary: MisbehaviorSummary | undefined;\n defaults: HandlerDefaults;\n testId: string;\n}): void {\n if (!summary || recordedMisbehaviorEntries.has(entry)) return;\n if (summary.applied && !Array.isArray(summary.servedToolCalls)) {\n throw new Error(\"Applied misbehavior requires prepared servedToolCalls before journaling\");\n }\n if (summary.evaluations.length > 0 && summary.wire === undefined) {\n throw new Error(\"Misbehavior evaluations require a wire before journaling\");\n }\n\n entry.response.misbehavior = summary;\n recordedMisbehaviorEntries.add(entry);\n for (const evaluation of summary.evaluations) {\n // A wire is required only for evaluated rows; short circuits have none.\n if (summary.wire === undefined) continue;\n const outcome = evaluation.reason\n ? `${evaluation.outcome}:${evaluation.reason}`\n : evaluation.outcome;\n defaults.registry?.incrementCounter(\"aimock_misbehavior_total\", {\n fault: evaluation.fault,\n wire: summary.wire,\n outcome,\n });\n const message = `[misbehavior] ${evaluation.fault} ${outcome} on ${summary.wire} (testId=${testId})`;\n if (evaluation.outcome === \"error\") {\n defaults.logger.error(message);\n } else if (evaluation.outcome === \"applied\") {\n defaults.logger.info(message);\n } else if (evaluation.reason === \"unsupported-on-wire\") {\n let warned = warnedUnsupportedMisbehavior.get(defaults.logger);\n if (!warned) {\n warned = new Set();\n warnedUnsupportedMisbehavior.set(defaults.logger, warned);\n }\n const key = JSON.stringify([testId, evaluation.fault, summary.wire]);\n if (!warned.has(key)) {\n warned.add(key);\n defaults.logger.warn(message);\n }\n } else {\n defaults.logger.debug(message);\n }\n }\n}\n\n/** Resolve configuration presence only; request boundaries validate headers before bypassing. */\nexport function resolveMisbehaviorShortCircuit(input: {\n wire: WireId;\n fixture?: Fixture;\n defaults: HandlerDefaults;\n rawHeaders: import(\"node:http\").IncomingHttpHeaders;\n url: string | undefined;\n reason: \"proxied\" | \"chaos-fired\";\n}): MisbehaviorSummary | undefined {\n const { wire, fixture, defaults, rawHeaders, url, reason } = input;\n if (!defaults.misbehavior) return undefined;\n const testId = resolveTestId(rawHeaders, url);\n let source: NonNullable<MisbehaviorSummary[\"source\"]>;\n if (rawHeaders[\"x-aimock-misbehavior\"] !== undefined) source = \"header\";\n else if (fixture?.misbehavior !== undefined) source = \"fixture\";\n else if (defaults.misbehavior?.byTestId.has(testId)) source = \"scope\";\n else if (defaults.misbehavior?.baseline !== undefined) source = \"server\";\n else return undefined;\n return { applied: false, source, wire, reason, evaluations: [] };\n}\n"],"mappings":"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"}
|