@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
package/dist/recorder.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Logger } from "./logger.cjs";
|
|
2
|
-
import { ChatCompletionRequest, Fixture, RecordConfig, RecordProviderKey } from "./types.cjs";
|
|
2
|
+
import { ChatCompletionRequest, Fixture, RecordConfig, RecordProviderKey, ResponsesToolsMode } from "./types.cjs";
|
|
3
3
|
import * as http$1 from "node:http";
|
|
4
4
|
|
|
5
5
|
//#region src/recorder.d.ts
|
|
@@ -72,6 +72,7 @@ declare function proxyAndRecord(req: http$1.IncomingMessage, res: http$1.ServerR
|
|
|
72
72
|
record?: RecordConfig;
|
|
73
73
|
logger: Logger;
|
|
74
74
|
requestTransform?: (req: ChatCompletionRequest) => ChatCompletionRequest;
|
|
75
|
+
responsesTools?: ResponsesToolsMode;
|
|
75
76
|
}, rawBody?: string, options?: ProxyOptions): Promise<ProxyOutcome>;
|
|
76
77
|
/**
|
|
77
78
|
* Decodes a sequence of byte chunks to UTF-8 text for SSE/NDJSON frame
|
package/dist/recorder.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recorder.d.cts","names":[],"sources":["../src/recorder.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"recorder.d.cts","names":[],"sources":["../src/recorder.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;UAsOiB,qBAAA;;;QAGT;;UAGS,YAAA;;;;;;;;;;;;;;;;;;mCAkBkB,oCAAoC;;;;;;;;;;;;;;;;;;;;;;KAuB3D,YAAA;;;;;;;;;;;;;;;iBA8OU,cAAA,MACf,MAAA,CAAK,sBACL,MAAA,CAAK,yBACD,oCACI,+CAEH;WAEC;UACD;2BACiB,0BAA0B;mBAClC;+BAGT,eACT,QAAQ"}
|
package/dist/recorder.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Logger } from "./logger.js";
|
|
2
|
-
import { ChatCompletionRequest, Fixture, RecordConfig, RecordProviderKey } from "./types.js";
|
|
2
|
+
import { ChatCompletionRequest, Fixture, RecordConfig, RecordProviderKey, ResponsesToolsMode } from "./types.js";
|
|
3
3
|
import * as http$1 from "node:http";
|
|
4
4
|
|
|
5
5
|
//#region src/recorder.d.ts
|
|
@@ -72,6 +72,7 @@ declare function proxyAndRecord(req: http$1.IncomingMessage, res: http$1.ServerR
|
|
|
72
72
|
record?: RecordConfig;
|
|
73
73
|
logger: Logger;
|
|
74
74
|
requestTransform?: (req: ChatCompletionRequest) => ChatCompletionRequest;
|
|
75
|
+
responsesTools?: ResponsesToolsMode;
|
|
75
76
|
}, rawBody?: string, options?: ProxyOptions): Promise<ProxyOutcome>;
|
|
76
77
|
/**
|
|
77
78
|
* Decodes a sequence of byte chunks to UTF-8 text for SSE/NDJSON frame
|
package/dist/recorder.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recorder.d.ts","names":[],"sources":["../src/recorder.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"recorder.d.ts","names":[],"sources":["../src/recorder.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;UAsOiB,qBAAA;;;QAGT;;UAGS,YAAA;;;;;;;;;;;;;;;;;;mCAkBkB,oCAAoC;;;;;;;;;;;;;;;;;;;;;;KAuB3D,YAAA;;;;;;;;;;;;;;;iBA8OU,cAAA,MACf,MAAA,CAAK,sBACL,MAAA,CAAK,yBACD,oCACI,+CAEH;WAEC;UACD;2BACiB,0BAA0B;mBAClC;+BAGT,eACT,QAAQ"}
|
package/dist/recorder.js
CHANGED
|
@@ -4,7 +4,7 @@ import { isAuthenticatedRequest, isRecognizedApiKeyHeader } from "./api-key-auth
|
|
|
4
4
|
import { getTestId, hasMintedRequestId, slugifyContext, slugifyTestId } from "./helpers.js";
|
|
5
5
|
import { writeErrorResponse } from "./sse-writer.js";
|
|
6
6
|
import { currentTurnHasToolResult, getLastMessageByRole, getTextContent } from "./router.js";
|
|
7
|
-
import { capturedRedactedData,
|
|
7
|
+
import { capturedRedactedData, collapseStreamingResponseWithResponsesTools, withoutResponsesToolFields } from "./stream-collapse.js";
|
|
8
8
|
import { resolveUpstreamUrl } from "./url.js";
|
|
9
9
|
import { applyConfiguredProviderAuth, applyProviderAuth } from "./provider-auth.js";
|
|
10
10
|
import * as http$1 from "node:http";
|
|
@@ -380,7 +380,8 @@ async function proxyAndRecord(req, res, request, providerKey, pathname, fixtures
|
|
|
380
380
|
const contentType = upstreamHeaders["content-type"];
|
|
381
381
|
const ctString = pickContentType(contentType);
|
|
382
382
|
const isBinaryStream = ctString.toLowerCase().includes("application/vnd.amazon.eventstream");
|
|
383
|
-
const
|
|
383
|
+
const collapsedRaw = collapseStreamingResponseWithResponsesTools(ctString, providerKey, isBinaryStream ? rawBuffer : upstreamBody, defaults.logger);
|
|
384
|
+
const collapsed = collapsedRaw && defaults.responsesTools !== "extended" ? withoutResponsesToolFields(collapsedRaw) : collapsedRaw;
|
|
384
385
|
let fixtureResponse;
|
|
385
386
|
if (ctString.toLowerCase().startsWith("audio/") && upstreamStatus >= 200 && upstreamStatus < 300) {
|
|
386
387
|
const audioFormat = ctString.toLowerCase().replace("audio/", "").replace("mpeg", "mp3").split(";")[0].trim();
|
|
@@ -414,7 +415,7 @@ async function proxyAndRecord(req, res, request, providerKey, pathname, fixtures
|
|
|
414
415
|
...audioContentSpread,
|
|
415
416
|
...audioReasoningSpread
|
|
416
417
|
};
|
|
417
|
-
} else if (collapsed.content === "" && (!collapsed.toolCalls || collapsed.toolCalls.length === 0)) {
|
|
418
|
+
} else if (collapsed.content === "" && (!collapsed.toolCalls || collapsed.toolCalls.length === 0) && !collapsed.customToolCalls?.length) {
|
|
418
419
|
defaults.logger.warn("Stream collapse produced empty content — fixture may be incomplete");
|
|
419
420
|
const reasoningSpread = collapsed.reasoning ? { reasoning: collapsed.reasoning } : {};
|
|
420
421
|
const reasoningSignatureSpread = collapsed.reasoning && collapsed.reasoningSignature ? { reasoningSignature: collapsed.reasoningSignature } : {};
|
|
@@ -435,12 +436,27 @@ async function proxyAndRecord(req, res, request, providerKey, pathname, fixtures
|
|
|
435
436
|
logDroppedReasoningSignature(defaults.logger, collapsed.reasoning, collapsed.reasoningSignature);
|
|
436
437
|
const redactedThinkingSpread = collapsed.redactedThinking?.length ? { redactedThinking: collapsed.redactedThinking } : {};
|
|
437
438
|
const webSearchesSpread = collapsed.webSearches?.length ? { webSearches: collapsed.webSearches } : {};
|
|
438
|
-
if (collapsed.
|
|
439
|
-
const
|
|
439
|
+
if (collapsed.customToolCalls?.length) {
|
|
440
|
+
const toolCalls = (collapsed.toolCalls ?? []).map(sanitizeRecordedToolCall);
|
|
441
|
+
const customToolCalls = collapsed.customToolCalls.map((tc) => ({
|
|
440
442
|
...tc,
|
|
441
443
|
name: tc.name ?? "",
|
|
442
|
-
|
|
444
|
+
input: tc.input ?? ""
|
|
443
445
|
}));
|
|
446
|
+
const orderSpread = collapsed.responsesBlocks?.length ? { responsesBlocks: collapsed.responsesBlocks } : collapsed.blocks?.length ? { blocks: collapsed.blocks } : {};
|
|
447
|
+
fixtureResponse = {
|
|
448
|
+
...collapsed.content ? { content: collapsed.content } : {},
|
|
449
|
+
toolCalls,
|
|
450
|
+
customToolCalls,
|
|
451
|
+
...orderSpread,
|
|
452
|
+
...reasoningSpread,
|
|
453
|
+
...reasoningSignatureSpread,
|
|
454
|
+
...redactedThinkingSpread,
|
|
455
|
+
...webSearchesSpread,
|
|
456
|
+
...usageSpread
|
|
457
|
+
};
|
|
458
|
+
} else if (collapsed.toolCalls && collapsed.toolCalls.length > 0) {
|
|
459
|
+
const sanitizedToolCalls = collapsed.toolCalls.map(sanitizeRecordedToolCall);
|
|
444
460
|
if (collapsed.content) {
|
|
445
461
|
const blocksSpread = collapsed.blocks?.length ? { blocks: collapsed.blocks } : {};
|
|
446
462
|
fixtureResponse = {
|
|
@@ -803,6 +819,14 @@ function makeUpstreamRequest(target, headers, body, clientRes, method = "POST",
|
|
|
803
819
|
function logDroppedReasoningSignature(logger, reasoning, reasoningSignature) {
|
|
804
820
|
if (reasoningSignature && !reasoning) logger?.warn("Dropping captured reasoningSignature — no plaintext reasoning to attach it to");
|
|
805
821
|
}
|
|
822
|
+
/** Sanitize a collapsed function call before it is persisted: string `name` and `arguments`. */
|
|
823
|
+
function sanitizeRecordedToolCall(tc) {
|
|
824
|
+
return {
|
|
825
|
+
...tc,
|
|
826
|
+
name: tc.name ?? "",
|
|
827
|
+
arguments: tc.arguments ?? "{}"
|
|
828
|
+
};
|
|
829
|
+
}
|
|
806
830
|
/**
|
|
807
831
|
* Coerce a tool call's `arguments` field into the string the fixture contract
|
|
808
832
|
* requires (types.ts `ToolCall.arguments: string`). When the upstream omits the
|
|
@@ -1267,7 +1291,83 @@ function buildFixtureMetadata(request) {
|
|
|
1267
1291
|
if (request.tools && request.tools.length > 0) meta.toolsHash = crypto$1.createHash("sha256").update(JSON.stringify(request.tools)).digest("hex").slice(0, 8);
|
|
1268
1292
|
return Object.keys(meta).length > 0 ? meta : void 0;
|
|
1269
1293
|
}
|
|
1294
|
+
/**
|
|
1295
|
+
* MR11: read-merge-validate-write one service fakes file atomically (temp +
|
|
1296
|
+
* rename, 0o600). Synchronous, so writes to one path never interleave in this
|
|
1297
|
+
* process. Keeps unknown top-level keys (fakes:F9). `validate` returns a
|
|
1298
|
+
* problem text, or null when the whole merged file is valid. Logs RL4 on a
|
|
1299
|
+
* write; a failure is returned, never logged here (the caller logs RL1 with
|
|
1300
|
+
* its own context).
|
|
1301
|
+
*/
|
|
1302
|
+
function persistServiceFakes(opts) {
|
|
1303
|
+
const { filepath, merge, validate, logger } = opts;
|
|
1304
|
+
let existing = null;
|
|
1305
|
+
let text = null;
|
|
1306
|
+
try {
|
|
1307
|
+
text = fs.readFileSync(filepath, "utf-8");
|
|
1308
|
+
} catch (err) {
|
|
1309
|
+
if (err.code !== "ENOENT") return {
|
|
1310
|
+
kind: "failed",
|
|
1311
|
+
stage: "write",
|
|
1312
|
+
error: err instanceof Error ? err.message : "Unknown filesystem error"
|
|
1313
|
+
};
|
|
1314
|
+
}
|
|
1315
|
+
if (text !== null) {
|
|
1316
|
+
let parsed;
|
|
1317
|
+
try {
|
|
1318
|
+
parsed = JSON.parse(text);
|
|
1319
|
+
} catch {
|
|
1320
|
+
return {
|
|
1321
|
+
kind: "failed",
|
|
1322
|
+
stage: "read",
|
|
1323
|
+
error: `${filepath} is not valid JSON`
|
|
1324
|
+
};
|
|
1325
|
+
}
|
|
1326
|
+
if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) return {
|
|
1327
|
+
kind: "failed",
|
|
1328
|
+
stage: "read",
|
|
1329
|
+
error: `${filepath} is not a JSON object`
|
|
1330
|
+
};
|
|
1331
|
+
existing = parsed;
|
|
1332
|
+
}
|
|
1333
|
+
const content = merge(existing);
|
|
1334
|
+
const problem = validate(content);
|
|
1335
|
+
if (problem !== null) return {
|
|
1336
|
+
kind: "failed",
|
|
1337
|
+
stage: "validate",
|
|
1338
|
+
error: problem
|
|
1339
|
+
};
|
|
1340
|
+
let tmpPath;
|
|
1341
|
+
try {
|
|
1342
|
+
fs.mkdirSync(path.dirname(filepath), { recursive: true });
|
|
1343
|
+
const bytes = Buffer.from(JSON.stringify(content, null, 2), "utf-8");
|
|
1344
|
+
tmpPath = filepath + ".tmp." + crypto$1.randomUUID();
|
|
1345
|
+
fs.writeFileSync(tmpPath, bytes, {
|
|
1346
|
+
flag: "wx",
|
|
1347
|
+
mode: 384
|
|
1348
|
+
});
|
|
1349
|
+
fs.renameSync(tmpPath, filepath);
|
|
1350
|
+
tmpPath = void 0;
|
|
1351
|
+
logger.warn(`Response recorded → ${filepath}`);
|
|
1352
|
+
return {
|
|
1353
|
+
kind: "written",
|
|
1354
|
+
filepath,
|
|
1355
|
+
sha256: crypto$1.createHash("sha256").update(bytes).digest("hex"),
|
|
1356
|
+
content
|
|
1357
|
+
};
|
|
1358
|
+
} catch (err) {
|
|
1359
|
+
return {
|
|
1360
|
+
kind: "failed",
|
|
1361
|
+
stage: "write",
|
|
1362
|
+
error: err instanceof Error ? err.message : "Unknown filesystem error"
|
|
1363
|
+
};
|
|
1364
|
+
} finally {
|
|
1365
|
+
if (tmpPath) try {
|
|
1366
|
+
fs.unlinkSync(tmpPath);
|
|
1367
|
+
} catch {}
|
|
1368
|
+
}
|
|
1369
|
+
}
|
|
1270
1370
|
|
|
1271
1371
|
//#endregion
|
|
1272
|
-
export { DEFAULT_MAX_PROXY_BUFFER_BYTES, DEFAULT_MAX_PROXY_BUFFER_FRAMES, PROXY_BUFFER_HARD_CEILING, buildFixtureMatch, buildForwardHeaders, clampTimeout, persistFixture, prepareEgressHeaders, proxyAndRecord, removeForwardHeader, sanitizeHeaderValue, setForwardHeaderDefault };
|
|
1372
|
+
export { DEFAULT_MAX_PROXY_BUFFER_BYTES, DEFAULT_MAX_PROXY_BUFFER_FRAMES, PROXY_BUFFER_HARD_CEILING, buildFixtureMatch, buildForwardHeaders, clampTimeout, persistFixture, persistServiceFakes, prepareEgressHeaders, proxyAndRecord, removeForwardHeader, sanitizeHeaderValue, setForwardHeaderDefault };
|
|
1273
1373
|
//# sourceMappingURL=recorder.js.map
|