@copilotkit/aimock 1.46.0 → 1.47.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.
Files changed (183) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +12 -1
  4. package/README.md +4 -1
  5. package/dist/aws-event-stream.cjs +20 -23
  6. package/dist/aws-event-stream.cjs.map +1 -1
  7. package/dist/aws-event-stream.d.cts +0 -1
  8. package/dist/aws-event-stream.d.ts +0 -1
  9. package/dist/aws-event-stream.js +20 -24
  10. package/dist/aws-event-stream.js.map +1 -1
  11. package/dist/bedrock-converse.cjs +79 -82
  12. package/dist/bedrock-converse.cjs.map +1 -1
  13. package/dist/bedrock-converse.d.cts.map +1 -1
  14. package/dist/bedrock-converse.d.ts.map +1 -1
  15. package/dist/bedrock-converse.js +80 -83
  16. package/dist/bedrock-converse.js.map +1 -1
  17. package/dist/bedrock.cjs +112 -121
  18. package/dist/bedrock.cjs.map +1 -1
  19. package/dist/bedrock.d.cts.map +1 -1
  20. package/dist/bedrock.d.ts.map +1 -1
  21. package/dist/bedrock.js +113 -122
  22. package/dist/bedrock.js.map +1 -1
  23. package/dist/cohere.cjs +58 -106
  24. package/dist/cohere.cjs.map +1 -1
  25. package/dist/cohere.d.cts.map +1 -1
  26. package/dist/cohere.d.ts.map +1 -1
  27. package/dist/cohere.js +60 -108
  28. package/dist/cohere.js.map +1 -1
  29. package/dist/config-loader.d.cts.map +1 -1
  30. package/dist/config-loader.d.ts.map +1 -1
  31. package/dist/fixture-loader.cjs +103 -2
  32. package/dist/fixture-loader.cjs.map +1 -1
  33. package/dist/fixture-loader.d.cts.map +1 -1
  34. package/dist/fixture-loader.d.ts.map +1 -1
  35. package/dist/fixture-loader.js +104 -4
  36. package/dist/fixture-loader.js.map +1 -1
  37. package/dist/gemini-interactions.cjs +63 -121
  38. package/dist/gemini-interactions.cjs.map +1 -1
  39. package/dist/gemini-interactions.d.cts.map +1 -1
  40. package/dist/gemini-interactions.d.ts.map +1 -1
  41. package/dist/gemini-interactions.js +65 -123
  42. package/dist/gemini-interactions.js.map +1 -1
  43. package/dist/gemini.cjs +242 -155
  44. package/dist/gemini.cjs.map +1 -1
  45. package/dist/gemini.d.cts.map +1 -1
  46. package/dist/gemini.d.ts.map +1 -1
  47. package/dist/gemini.js +244 -157
  48. package/dist/gemini.js.map +1 -1
  49. package/dist/helpers.cjs +400 -7
  50. package/dist/helpers.cjs.map +1 -1
  51. package/dist/helpers.d.cts +51 -1
  52. package/dist/helpers.d.cts.map +1 -1
  53. package/dist/helpers.d.ts +51 -1
  54. package/dist/helpers.d.ts.map +1 -1
  55. package/dist/helpers.js +391 -8
  56. package/dist/helpers.js.map +1 -1
  57. package/dist/index.cjs +4 -2
  58. package/dist/index.d.cts +4 -4
  59. package/dist/index.d.ts +4 -4
  60. package/dist/index.js +4 -4
  61. package/dist/mcp-fakes.d.cts.map +1 -1
  62. package/dist/messages.cjs +159 -141
  63. package/dist/messages.cjs.map +1 -1
  64. package/dist/messages.d.cts.map +1 -1
  65. package/dist/messages.d.ts.map +1 -1
  66. package/dist/messages.js +161 -143
  67. package/dist/messages.js.map +1 -1
  68. package/dist/misbehavior.cjs +62 -3
  69. package/dist/misbehavior.cjs.map +1 -1
  70. package/dist/misbehavior.d.cts.map +1 -1
  71. package/dist/misbehavior.d.ts.map +1 -1
  72. package/dist/misbehavior.js +63 -4
  73. package/dist/misbehavior.js.map +1 -1
  74. package/dist/ndjson-writer.cjs +21 -23
  75. package/dist/ndjson-writer.cjs.map +1 -1
  76. package/dist/ndjson-writer.d.cts +0 -1
  77. package/dist/ndjson-writer.d.cts.map +1 -1
  78. package/dist/ndjson-writer.d.ts +0 -1
  79. package/dist/ndjson-writer.d.ts.map +1 -1
  80. package/dist/ndjson-writer.js +21 -24
  81. package/dist/ndjson-writer.js.map +1 -1
  82. package/dist/ollama.cjs +153 -147
  83. package/dist/ollama.cjs.map +1 -1
  84. package/dist/ollama.d.cts.map +1 -1
  85. package/dist/ollama.d.ts.map +1 -1
  86. package/dist/ollama.js +155 -149
  87. package/dist/ollama.js.map +1 -1
  88. package/dist/openrouter-chat.cjs +1 -1
  89. package/dist/openrouter-chat.js +1 -1
  90. package/dist/raw-validation.cjs +177 -0
  91. package/dist/raw-validation.cjs.map +1 -0
  92. package/dist/raw-validation.js +176 -0
  93. package/dist/raw-validation.js.map +1 -0
  94. package/dist/response/deliver.cjs +144 -0
  95. package/dist/response/deliver.cjs.map +1 -0
  96. package/dist/response/deliver.js +143 -0
  97. package/dist/response/deliver.js.map +1 -0
  98. package/dist/response/frame-loop.cjs +102 -0
  99. package/dist/response/frame-loop.cjs.map +1 -0
  100. package/dist/response/frame-loop.js +100 -0
  101. package/dist/response/frame-loop.js.map +1 -0
  102. package/dist/response/lifecycle.cjs +223 -0
  103. package/dist/response/lifecycle.cjs.map +1 -0
  104. package/dist/response/lifecycle.js +211 -0
  105. package/dist/response/lifecycle.js.map +1 -0
  106. package/dist/response/proxy.cjs +71 -0
  107. package/dist/response/proxy.cjs.map +1 -0
  108. package/dist/response/proxy.js +70 -0
  109. package/dist/response/proxy.js.map +1 -0
  110. package/dist/response/raw.cjs +228 -0
  111. package/dist/response/raw.cjs.map +1 -0
  112. package/dist/response/raw.js +227 -0
  113. package/dist/response/raw.js.map +1 -0
  114. package/dist/response/timing.cjs +157 -0
  115. package/dist/response/timing.cjs.map +1 -0
  116. package/dist/response/timing.js +150 -0
  117. package/dist/response/timing.js.map +1 -0
  118. package/dist/responses.cjs +269 -148
  119. package/dist/responses.cjs.map +1 -1
  120. package/dist/responses.d.cts.map +1 -1
  121. package/dist/responses.d.ts.map +1 -1
  122. package/dist/responses.js +270 -149
  123. package/dist/responses.js.map +1 -1
  124. package/dist/router.cjs +20 -4
  125. package/dist/router.cjs.map +1 -1
  126. package/dist/router.d.cts +7 -1
  127. package/dist/router.d.cts.map +1 -1
  128. package/dist/router.d.ts +7 -1
  129. package/dist/router.d.ts.map +1 -1
  130. package/dist/router.js +21 -5
  131. package/dist/router.js.map +1 -1
  132. package/dist/server.cjs +89 -120
  133. package/dist/server.cjs.map +1 -1
  134. package/dist/server.d.cts.map +1 -1
  135. package/dist/server.d.ts.map +1 -1
  136. package/dist/server.js +91 -122
  137. package/dist/server.js.map +1 -1
  138. package/dist/sse-writer.cjs +49 -30
  139. package/dist/sse-writer.cjs.map +1 -1
  140. package/dist/sse-writer.d.cts +0 -1
  141. package/dist/sse-writer.d.cts.map +1 -1
  142. package/dist/sse-writer.d.ts +0 -1
  143. package/dist/sse-writer.d.ts.map +1 -1
  144. package/dist/sse-writer.js +49 -31
  145. package/dist/sse-writer.js.map +1 -1
  146. package/dist/transcription.cjs +19 -33
  147. package/dist/transcription.cjs.map +1 -1
  148. package/dist/transcription.d.cts.map +1 -1
  149. package/dist/transcription.d.ts.map +1 -1
  150. package/dist/transcription.js +20 -34
  151. package/dist/transcription.js.map +1 -1
  152. package/dist/types.cjs.map +1 -1
  153. package/dist/types.d.cts +173 -10
  154. package/dist/types.d.cts.map +1 -1
  155. package/dist/types.d.ts +173 -10
  156. package/dist/types.d.ts.map +1 -1
  157. package/dist/types.js.map +1 -1
  158. package/dist/ws-framing.cjs +12 -6
  159. package/dist/ws-framing.cjs.map +1 -1
  160. package/dist/ws-framing.d.cts +2 -0
  161. package/dist/ws-framing.d.cts.map +1 -1
  162. package/dist/ws-framing.d.ts +2 -0
  163. package/dist/ws-framing.d.ts.map +1 -1
  164. package/dist/ws-framing.js +12 -6
  165. package/dist/ws-framing.js.map +1 -1
  166. package/dist/ws-gemini-live.cjs +120 -93
  167. package/dist/ws-gemini-live.cjs.map +1 -1
  168. package/dist/ws-gemini-live.js +120 -93
  169. package/dist/ws-gemini-live.js.map +1 -1
  170. package/dist/ws-realtime.cjs +80 -70
  171. package/dist/ws-realtime.cjs.map +1 -1
  172. package/dist/ws-realtime.d.cts.map +1 -1
  173. package/dist/ws-realtime.d.ts.map +1 -1
  174. package/dist/ws-realtime.js +80 -70
  175. package/dist/ws-realtime.js.map +1 -1
  176. package/dist/ws-responses.cjs +72 -53
  177. package/dist/ws-responses.cjs.map +1 -1
  178. package/dist/ws-responses.d.cts.map +1 -1
  179. package/dist/ws-responses.d.ts.map +1 -1
  180. package/dist/ws-responses.js +73 -54
  181. package/dist/ws-responses.js.map +1 -1
  182. package/package.json +1 -1
  183. package/skills/write-fixtures/SKILL.md +34 -2
@@ -1 +1 @@
1
- {"version":3,"file":"fixture-loader.d.ts","names":[],"sources":["../src/fixture-loader.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;AAgDA;;;;;AAGkB,iBAHF,iBAAA,CAGE,GAAA,EAFX,mBAEW,EAAA,WAAA,CAAA,EADF,WACE,CAAA,EAAf,eAAe;AA4TlB;;;;;;AAsEA;;;;AAw3CA;AA0EA;;AAGiB,iBA3gDD,eAAA,CA2gDC,QAAA,EAAA,MAAA,EAAA,MAAA,CAAA,EAzgDN,MAygDM,EAAA,WAAA,CAAA,EAxgDD,WAwgDC,CAAA,EAvgDd,OAugDc,EAAA;;;;;;AA0CjB;;;;;;;;;iBA/+CgB,mBAAA,2BAEL,sBACK,cACb;;;;;;;;;;;;;;KA+CS,aAAA;;;;;;;;;UAOK,gBAAA;;;;;QAKT;;;;;;;;iBASQ,mBAAA,MACT;;;;;;;;;;iBAshBS,gBAAA,WACJ,yBACI,cACb;;;;;;;;;;cA6tBU;KAgBD,gBAAA,WAA2B;;;;;;UAOtB,uBAAA;eACF;;;;;;;;KASH,eAAA,iBACE,0BAA0B,wBAAwB,QAAQ,sBAChE;UAES,oBAAA;;QAET;;;;;;;;;;;;;;;mBAeW;;UAGF,oBAAA;;;;;;;;;;;;;;;;;;;;cA0EJ,gBAAA,SAAyB,KAAA;;;iBAGrB;;;;oBAKG,gCAAgC;YAoBxC;;UAiBK,0BAAA;;;;;;;;;;;;;;cAeJ,sBAAA,SAA+B,KAAA;;iBAE3B;;;UAGW;;;;YAMhB"}
1
+ {"version":3,"file":"fixture-loader.d.ts","names":[],"sources":["../src/fixture-loader.ts"],"sourcesContent":[],"mappings":";;;;;;;;;AAsDA;;;;;;AAkUgB,iBAlUA,iBAAA,CAkUe,GAAA,EAjUxB,mBAiUwB,EAAA,WAAA,CAAA,EAhUf,WAgUe,CAAA,EA/T5B,eA+T4B;;;;;;AAsE/B;;;;AAk/CA;AA0EA;;;AAQoB,iBA1oDJ,eAAA,CA0oDI,QAAA,EAAA,MAAA,EAAA,MAAA,CAAA,EAxoDT,MAwoDS,EAAA,WAAA,CAAA,EAvoDJ,WAuoDI,CAAA,EAtoDjB,OAsoDiB,EAAA;;;;;AAqCpB;AAeA;;;;;;;;;iBAxnDgB,mBAAA,2BAEL,sBACK,cACb;;;;;;;;;;;;;;KA+CS,aAAA;;;;;;;;;UAOK,gBAAA;;;;;QAKT;;;;;;;;iBASQ,mBAAA,MACT;;;;;;;;;;iBAomBS,gBAAA,WACJ,yBACI,cACb;;;;;;;;;;cAywBU;KAgBD,gBAAA,WAA2B;;;;;;UAOtB,uBAAA;eACF;;;;;;;;KASH,eAAA,iBACE,0BAA0B,wBAAwB,QAAQ,sBAChE;UAES,oBAAA;;QAET;;;;;;;;;;;;;;;mBAeW;;UAGF,oBAAA;;;;;;;;;;;;;;;;;;;;cA0EJ,gBAAA,SAAyB,KAAA;;;iBAGrB;;;;oBAKG,gCAAgC;YAoBxC;;UAiBK,0BAAA;;;;;;;;;;;;;;cAeJ,sBAAA,SAA+B,KAAA;;iBAE3B;;;UAGW;;;;YAMhB"}
@@ -1,7 +1,8 @@
1
1
  import { MCP_FAKES_ECHO_LIMIT } from "./constants.js";
2
2
  import { build, fixed, jsonText, msg, quote, within } from "./message-text.js";
3
- import { fixtureListTarget, isAudioResponse, isCombinedFixtureResponse, isEmbeddingResponse, isErrorResponse, isImageResponse, isJSONResponse, isLiveResponse, isTextResponse, isToolCallResponse, isTranscriptionResponse, isVideoResponse } from "./helpers.js";
3
+ import { fixtureCitationsProblem, fixtureFilesProblem, fixtureListTarget, isAudioResponse, isCombinedFixtureResponse, isEmbeddingResponse, isErrorResponse, isImageResponse, isJSONResponse, isLiveResponse, isRawResponse, isTextResponse, isToolCallResponse, isTranscriptionResponse, isVideoResponse, resolveServedBlockOutcome } from "./helpers.js";
4
4
  import { normalizeLiveFixture } from "./live-fixture.js";
5
+ import { checkRawResponse } from "./raw-validation.js";
5
6
  import { CHAOS_FIELDS, CHAOS_FIELD_NAMES, parseChaosField } from "./chaos.js";
6
7
  import { getUsageFieldDefinition } from "./response/usage/fields.js";
7
8
  import { copyFixtureMisbehaviorPosition, parseMisbehavior, setFixtureMisbehaviorPosition, validateFixtureMisbehavior } from "./misbehavior.js";
@@ -93,6 +94,7 @@ function entryToFixture(entry, logger, liveOptions, source) {
93
94
  ...entry.chaos !== void 0 && { chaos: entry.chaos },
94
95
  ...entry.openRouterProcessing !== void 0 && { openRouterProcessing: entry.openRouterProcessing },
95
96
  ...entry.nonStreamingTiming !== void 0 && { nonStreamingTiming: entry.nonStreamingTiming },
97
+ ...entry.nonStreamingTimingAllProviders !== void 0 && { nonStreamingTimingAllProviders: entry.nonStreamingTimingAllProviders },
96
98
  ...entry.metadata !== void 0 && { metadata: entry.metadata }
97
99
  };
98
100
  if (source) setFixtureMisbehaviorPosition(fixture, `${source.file}#${source.index}`);
@@ -300,6 +302,52 @@ function validateReasoning(response, fixtureIndex, results) {
300
302
  });
301
303
  }
302
304
  }
305
+ /** The wires that read `files` and `citations`; every other wire ignores them. */
306
+ const CITATIONS_FILES_WIRES = "Chat Completions, Anthropic Messages, Gemini or the OpenAI Responses API";
307
+ /**
308
+ * Generated `files` and source `citations`. A malformed value is not a load
309
+ * error (registration never throws for it, as in the release that added the
310
+ * keys); each request the fixture serves on Chat Completions, Anthropic,
311
+ * Gemini or the Responses API answers a coded 500 instead, so warn here with
312
+ * the same message. Citations are checked against the text they cite when
313
+ * served ({@link citedText}). A turn with no text (tool calls only, blocks
314
+ * with no text block, or empty content) has nothing to cite, so any
315
+ * non-empty `citations` there is reported exactly as the wires report it.
316
+ */
317
+ function validateCitationsAndFiles(response, fixtureIndex, results) {
318
+ const filesProblem = fixtureFilesProblem(response.files);
319
+ if (filesProblem !== void 0) results.push({
320
+ severity: "warning",
321
+ fixtureIndex,
322
+ message: `${filesProblem} — requests it serves on ${CITATIONS_FILES_WIRES} answer a 500 (aimock_invalid_fixture_file)`
323
+ });
324
+ const text = citedText(response);
325
+ if (text === void 0) return;
326
+ const citationsProblem = fixtureCitationsProblem(response.citations, text);
327
+ if (citationsProblem !== void 0) results.push({
328
+ severity: "warning",
329
+ fixtureIndex,
330
+ message: `${citationsProblem} — requests it serves on ${CITATIONS_FILES_WIRES} answer a 500 (aimock_invalid_fixture_citation)`
331
+ });
332
+ }
333
+ /**
334
+ * The text a fixture's citations index when served: the joined text of every
335
+ * text block when `responsesBlocks` or `blocks` is non-empty (through the
336
+ * same {@link resolveServedBlockOutcome} the providers use; empty when no
337
+ * block is text), else a string `content`, else empty for a tool-only turn.
338
+ * Empty text means a turn with nothing to cite. Undefined for a response
339
+ * that is neither (validated elsewhere) and for a malformed blocks array,
340
+ * which `validateBlocks` reports as an error.
341
+ */
342
+ function citedText(response) {
343
+ if (Array.isArray(response.blocks) && response.blocks.length > 0 || Array.isArray(response.responsesBlocks) && response.responsesBlocks.length > 0) try {
344
+ return resolveServedBlockOutcome(response)?.content;
345
+ } catch {
346
+ return;
347
+ }
348
+ if (typeof response.content === "string") return response.content;
349
+ if (Array.isArray(response.toolCalls) || Array.isArray(response.customToolCalls)) return "";
350
+ }
303
351
  function validateWebSearches(response, fixtureIndex, results) {
304
352
  if (response.webSearches !== void 0) if (!Array.isArray(response.webSearches)) results.push({
305
353
  severity: "error",
@@ -682,11 +730,29 @@ function validateFixtures(fixtures, liveOptions) {
682
730
  });
683
731
  }
684
732
  if (typeof response === "function") {} else {
685
- if (!isCombinedFixtureResponse(response) && !isTextResponse(response) && !isToolCallResponse(response) && !isErrorResponse(response) && !isEmbeddingResponse(response) && !isImageResponse(response) && !isAudioResponse(response) && !isTranscriptionResponse(response) && !isVideoResponse(response) && !isJSONResponse(response) && !isLiveResponse(response)) results.push({
733
+ if (!isCombinedFixtureResponse(response) && !isTextResponse(response) && !isToolCallResponse(response) && !isErrorResponse(response) && !isEmbeddingResponse(response) && !isImageResponse(response) && !isAudioResponse(response) && !isTranscriptionResponse(response) && !isVideoResponse(response) && !isJSONResponse(response) && !isLiveResponse(response) && !isRawResponse(response)) results.push({
686
734
  severity: "error",
687
735
  fixtureIndex: i,
688
- message: "response is not a recognized type (must have content, toolCalls, error, embedding, image, audio, transcription, video, json, or live)"
736
+ message: "response is not a recognized type (must have content, toolCalls, error, embedding, image, audio, transcription, video, json, live, or raw)"
689
737
  });
738
+ if (isRawResponse(response)) {
739
+ const context = rawFixtureContext(original, response);
740
+ for (const finding of checkRawResponse(response.raw, context)) results.push({
741
+ severity: finding.severity,
742
+ fixtureIndex: i,
743
+ message: finding.message
744
+ });
745
+ if (f.chunkSize !== void 0) results.push({
746
+ severity: "warning",
747
+ fixtureIndex: i,
748
+ message: "chunkSize is ignored for raw fixtures: each event is one frame"
749
+ });
750
+ if (f.openRouterProcessing !== void 0) results.push({
751
+ severity: "warning",
752
+ fixtureIndex: i,
753
+ message: "openRouterProcessing is ignored for raw fixtures"
754
+ });
755
+ }
690
756
  const hasNonEmptyBlocks = Array.isArray(response.blocks) && response.blocks.length > 0 || Array.isArray(response.responsesBlocks) && response.responsesBlocks.length > 0;
691
757
  const hasCustomToolCalls = Array.isArray(response.customToolCalls) && response.customToolCalls.length > 0;
692
758
  if (isTextResponse(response)) {
@@ -735,6 +801,7 @@ function validateFixtures(fixtures, liveOptions) {
735
801
  }
736
802
  validateBlocks(response, i, results);
737
803
  validateResponsesToolKeys(response, i, results);
804
+ validateCitationsAndFiles(response, i, results);
738
805
  if (isToolCallResponse(response)) {
739
806
  if (response.toolCalls.length === 0 && !hasCustomToolCalls) results.push({
740
807
  severity: "warning",
@@ -902,6 +969,14 @@ function validateFixtures(fixtures, liveOptions) {
902
969
  fixtureIndex: i,
903
970
  message: "disconnectAfterMs must be >= 0"
904
971
  });
972
+ for (const flag of ["nonStreamingTiming", "nonStreamingTimingAllProviders"]) {
973
+ const value = f[flag];
974
+ if (value !== void 0 && typeof value !== "boolean") results.push({
975
+ severity: "warning",
976
+ fixtureIndex: i,
977
+ message: `${flag} must be a boolean, got ${typeof value} — the opt-in is ignored`
978
+ });
979
+ }
905
980
  if (f.streamingProfile !== void 0) {
906
981
  const sp = f.streamingProfile;
907
982
  if (sp.ttft !== void 0 && sp.ttft < 0) results.push({
@@ -1293,6 +1368,11 @@ const misbehaviorEnabledFixtures = /* @__PURE__ */ new WeakSet();
1293
1368
  function enableHeldFixtureMisbehavior(fixture) {
1294
1369
  const held = heldFixtureMisbehavior.get(fixture);
1295
1370
  if (held === void 0) return;
1371
+ if (typeof fixture.response !== "function" && isRawResponse(fixture.response)) throw new MisbehaviorConfigError({
1372
+ rule: "misbehavior/not-applicable",
1373
+ file: held.file,
1374
+ detail: `${held.path}: misbehavior does not apply to raw fixtures`
1375
+ });
1296
1376
  const parsed = parseMisbehavior(held.value, held.path);
1297
1377
  if (parsed.ok) fixture.misbehavior = parsed.config;
1298
1378
  const issue = parsed.ok ? validateFixtureMisbehavior(fixture, held.path) : parsed.issue;
@@ -1305,6 +1385,26 @@ function enableHeldFixtureMisbehavior(fixture) {
1305
1385
  misbehaviorEnabledFixtures.add(fixture);
1306
1386
  }
1307
1387
  /**
1388
+ * @internal The facts about a raw fixture that {@link checkRawResponse} checks
1389
+ * beyond `raw` itself, for `served`, the response as this server reads it.
1390
+ * Load validation and serve time both use it, so they agree:
1391
+ *
1392
+ * - `otherResponseKeys`: top-level keys of the fixture's response as written
1393
+ * that `served` lacks. Only `customToolCalls` / `responsesBlocks` are ever
1394
+ * dropped (on a legacy server), and a fixture that writes either next to
1395
+ * `raw` is not a raw fixture to the router.
1396
+ * - `fixtureMisbehavior`: the fixture sets its own `misbehavior`, recognized
1397
+ * or still held.
1398
+ */
1399
+ function rawFixtureContext(fixture, served) {
1400
+ const source = responsesToolsViewSource(fixture);
1401
+ const written = fixture.response;
1402
+ return {
1403
+ otherResponseKeys: typeof written === "function" ? [] : Object.keys(written).filter((key) => !(key in served)),
1404
+ fixtureMisbehavior: fixture.misbehavior !== void 0 || heldFixtureMisbehavior.has(source)
1405
+ };
1406
+ }
1407
+ /**
1308
1408
  * @internal Mark a fixture whose `misbehavior` a server with misbehavior
1309
1409
  * enabled has recognized, so `validateFixtures` checks it.
1310
1410
  */
@@ -1313,5 +1413,5 @@ function markFixtureMisbehaviorEnabled(fixture) {
1313
1413
  }
1314
1414
 
1315
1415
  //#endregion
1316
- export { FixtureLoadError, INJECTED_STATUS_RANGE, MisbehaviorConfigError, claimOneShotError, clearFixtureQueue, enableHeldFixtureMisbehavior, entryToFixture, fixturesOf, hasMcpFakesKey, isInjectableStatus, isOneShotError, listFixtureDir, loadFixtureFile, loadFixturesFromDir, markFixtureMisbehaviorEnabled, markFixtureResponsesToolsExtended, normalizeResponse, normalizeResponsesToolsKeys, queueOneShotError, readFixtureJson, releaseOneShotError, renderValidationRef, responsesToolsExtendedView, responsesToolsViewSource, validateFixtures };
1416
+ export { FixtureLoadError, INJECTED_STATUS_RANGE, MisbehaviorConfigError, claimOneShotError, clearFixtureQueue, enableHeldFixtureMisbehavior, entryToFixture, fixturesOf, hasMcpFakesKey, isInjectableStatus, isOneShotError, listFixtureDir, loadFixtureFile, loadFixturesFromDir, markFixtureMisbehaviorEnabled, markFixtureResponsesToolsExtended, normalizeResponse, normalizeResponsesToolsKeys, queueOneShotError, rawFixtureContext, readFixtureJson, releaseOneShotError, renderValidationRef, responsesToolsExtendedView, responsesToolsViewSource, validateFixtures };
1317
1417
  //# sourceMappingURL=fixture-loader.js.map