diff --git a/config/knip.config.ts b/config/knip.config.ts index 7d493c33e011..23380993aeb3 100644 --- a/config/knip.config.ts +++ b/config/knip.config.ts @@ -132,6 +132,7 @@ const ignoredTestSupportFiles = [ const config = { ignoreFiles: [ "scripts/**", + "dist/**", "packages/*/dist/**", "**/live-*.ts", "src/secrets/credential-matrix.ts", @@ -141,7 +142,7 @@ const config = { ], // Knip's `ignoreFiles` only suppresses unused-file findings. Test helpers // belong in `ignore` so they do not inflate unused-export/type findings. - ignore: ["packages/*/dist/**", ...ignoredTestSupportFiles], + ignore: ["dist/**", "packages/*/dist/**", ...ignoredTestSupportFiles], workspaces: { ".": { entry: rootEntries, diff --git a/scripts/deadcode-exports.baseline.mjs b/scripts/deadcode-exports.baseline.mjs index 87f89d80b4f8..b56777b3edcc 100644 --- a/scripts/deadcode-exports.baseline.mjs +++ b/scripts/deadcode-exports.baseline.mjs @@ -1450,10 +1450,6 @@ export const KNIP_UNUSED_EXPORT_BASELINE = [ "src/agents/modes/interactive/theme/theme.ts: ThemeColor", "src/agents/openai-completions-compat.ts: resolveOpenAICompletionsCompatDefaults", "src/agents/openai-transport-stream.ts: __testing", - "src/agents/openai-transport-stream.ts: buildOpenAIResponsesParams", - "src/agents/openai-transport-stream.ts: parseTransportChunkUsage", - "src/agents/openai-transport-stream.ts: resolveAzureOpenAIApiVersion", - "src/agents/openai-transport-stream.ts: sanitizeTransportPayloadText", "src/agents/openai-transport-stream.ts: testing", "src/agents/openclaw-tools.ts: testing", "src/agents/plugin-model-catalog.ts: PLUGIN_MODEL_CATALOG_FILE", diff --git a/scripts/ts-max-loc-baseline-v2.json b/scripts/ts-max-loc-baseline-v2.json index 7c357fee5a81..1be73df0f8d7 100644 --- a/scripts/ts-max-loc-baseline-v2.json +++ b/scripts/ts-max-loc-baseline-v2.json @@ -591,8 +591,8 @@ "src/agents/model-selection-shared.ts": 1673, "src/agents/models-config.providers.implicit.ts": 580, "src/agents/modes/interactive/theme/theme.ts": 857, - "src/agents/openai-completions-transport.ts": 1948, - "src/agents/openai-responses-transport.ts": 2602, + "src/agents/openai-completions-transport.ts": 1946, + "src/agents/openai-responses-transport.ts": 2601, "src/agents/openclaw-tools.ts": 712, "src/agents/provider-attribution.ts": 864, "src/agents/provider-local-service.ts": 786, diff --git a/src/agents/openai-completions-transport.ts b/src/agents/openai-completions-transport.ts index 47f4b2250101..805dcdf4f689 100644 --- a/src/agents/openai-completions-transport.ts +++ b/src/agents/openai-completions-transport.ts @@ -1,6 +1,3 @@ -/** - * OpenAI Chat Completions streaming transport. - */ import { randomUUID } from "node:crypto"; import { convertMessages, @@ -1904,7 +1901,7 @@ export function buildOpenAICompletionsParams( return params; } -export function parseTransportChunkUsage( +function parseTransportChunkUsage( rawUsage: NonNullable & { cost?: unknown }, model: Model, ): MutableAssistantOutput["usage"] { @@ -1943,6 +1940,7 @@ export const completionsTesting = { createSseDoneDetector, createOpenAICompletionsClient, buildOpenAICompletionsClientConfig, + parseTransportChunkUsage, processOpenAICompletionsStream, shouldEmitOpenAICompletionsReasoningForModel, }; diff --git a/src/agents/openai-responses-transport.ts b/src/agents/openai-responses-transport.ts index 0770b4d2ff30..08456cf76b03 100644 --- a/src/agents/openai-responses-transport.ts +++ b/src/agents/openai-responses-transport.ts @@ -1,8 +1,5 @@ /** - * OpenAI Responses streaming transport. - * - * Handles Responses, Azure variants, tool-call replay, reasoning events, and provider-specific - * payload policy before converting SDK streams into OpenClaw assistant events. + * OpenAI Responses transport for Azure variants, replay, reasoning, and payload policy. */ import { randomUUID } from "node:crypto"; import { @@ -858,7 +855,7 @@ async function createResponsesStreamWithEncryptedContentRetry(params: { } } -export function resolveAzureOpenAIApiVersion(env = process.env): string { +function resolveAzureOpenAIApiVersion(env = process.env): string { return env.AZURE_OPENAI_API_VERSION?.trim() || DEFAULT_AZURE_OPENAI_API_VERSION; } @@ -2250,7 +2247,7 @@ function resolveOpenAIResponsesTextFormat( return responseFormat as unknown as ResponseFormatTextConfig; } -export function buildOpenAIResponsesParams( +function buildOpenAIResponsesParams( model: Model, context: Context, options: OpenAIResponsesOptions | undefined, @@ -2577,6 +2574,7 @@ type OpenAIResponsesRequestParams = { export const responsesTesting = { getCompat, assertCodeModeResponsesToolSurface, + buildOpenAIResponsesParams, buildOpenAIClientHeaders, buildOpenAISdkClientOptions, buildOpenAISdkRequestOptions, @@ -2592,6 +2590,7 @@ export const responsesTesting = { normalizeResponsesFailedEvent, prepareOpenAIResponsesReasoningItemForReplay, createResponsesStreamWithEncryptedContentRetry, + resolveAzureOpenAIApiVersion, stripResponsesRequestEncryptedContent, tagOpenAIResponsesReasoningReplayItem, summarizeResponsesFailedNoDetailsObservation, diff --git a/src/agents/openai-tool-projection.live.test.ts b/src/agents/openai-tool-projection.live.test.ts index 8696f747ca34..2bc7d32f18f3 100644 --- a/src/agents/openai-tool-projection.live.test.ts +++ b/src/agents/openai-tool-projection.live.test.ts @@ -7,10 +7,12 @@ import type { Context, Model } from "../llm/types.js"; import { isLiveTestEnabled } from "./live-test-helpers.js"; import { buildOpenAICompletionsParams, - buildOpenAIResponsesParams, createOpenAIResponsesTransportStreamFn, + testing as openAITransportTesting, } from "./openai-transport-stream.js"; +const { buildOpenAIResponsesParams } = openAITransportTesting; + const OPENAI_KEY = process.env.OPENAI_API_KEY ?? ""; const LIVE = isLiveTestEnabled(["OPENAI_LIVE_TEST"]) && Boolean(OPENAI_KEY); const describeLive = LIVE ? describe : describe.skip; diff --git a/src/agents/openai-transport-stream.test.ts b/src/agents/openai-transport-stream.test.ts index bb3d9a3b9969..254c76cfd195 100644 --- a/src/agents/openai-transport-stream.test.ts +++ b/src/agents/openai-transport-stream.test.ts @@ -11,12 +11,8 @@ import { formatUserFacingAssistantErrorText, } from "./embedded-agent-helpers.js"; import { - buildOpenAIResponsesParams, buildOpenAICompletionsParams, createOpenAICompletionsTransportStreamFn, - parseTransportChunkUsage, - resolveAzureOpenAIApiVersion, - sanitizeTransportPayloadText, testing, } from "./openai-transport-stream.js"; import { attachModelProviderRequestTransport } from "./provider-request-config.js"; @@ -29,6 +25,9 @@ import { resolveTransportAwareSimpleApi, } from "./provider-transport-stream.js"; +const { buildOpenAIResponsesParams, parseTransportChunkUsage, resolveAzureOpenAIApiVersion } = + testing; + type OpenAICompletionsOutput = Parameters[1]; type OpenAIResponsesOutput = Parameters[1]; type ResponsesApi = Extract< @@ -1545,15 +1544,6 @@ describe("openai transport stream", () => { expect(buildTransportAwareSimpleStreamFn(model)).toBeTypeOf("function"); }); - it("removes unpaired surrogate code units but preserves valid surrogate pairs", () => { - const high = String.fromCharCode(0xd83d); - const low = String.fromCharCode(0xdc00); - - expect(sanitizeTransportPayloadText(`left${high}right`)).toBe("leftright"); - expect(sanitizeTransportPayloadText(`left${low}right`)).toBe("leftright"); - expect(sanitizeTransportPayloadText("emoji 🙈 ok")).toBe("emoji 🙈 ok"); - }); - it("uses a valid Azure API version default when the environment is unset", () => { expect(resolveAzureOpenAIApiVersion({})).toBe("preview"); expect(resolveAzureOpenAIApiVersion({ AZURE_OPENAI_API_VERSION: "2025-01-01-preview" })).toBe( @@ -6827,8 +6817,8 @@ describe("openai transport stream", () => { })); try { - const { buildOpenAIResponsesParams: isolatedBuildOpenAIResponsesParams } = - await import("./openai-transport-stream.js"); + const { testing: isolatedTesting } = await import("./openai-transport-stream.js"); + const isolatedBuildOpenAIResponsesParams = isolatedTesting.buildOpenAIResponsesParams; const model = makeResponsesModel({ id: "gpt-5.4", name: "GPT-5.4", diff --git a/src/agents/openai-transport-stream.ts b/src/agents/openai-transport-stream.ts index d67c2a40c9db..f10fe07a3761 100644 --- a/src/agents/openai-transport-stream.ts +++ b/src/agents/openai-transport-stream.ts @@ -8,13 +8,8 @@ import type { Context } from "../llm/types.js"; import { buildOpenAICompletionsParams as buildOpenAICompletionsParamsImpl, completionsTesting, - parseTransportChunkUsage as parseTransportChunkUsageImpl, } from "./openai-completions-transport.js"; -import { - buildOpenAIResponsesParams as buildOpenAIResponsesParamsImpl, - resolveAzureOpenAIApiVersion as resolveAzureOpenAIApiVersionImpl, - responsesTesting, -} from "./openai-responses-transport.js"; +import { responsesTesting } from "./openai-responses-transport.js"; import type { OpenAICompletionsOptions, OpenAIModeModel } from "./openai-transport-shared.js"; export { createOpenAICompletionsTransportStreamFn } from "./openai-completions-transport.js"; @@ -22,23 +17,6 @@ export { createAzureOpenAIResponsesTransportStreamFn, createOpenAIResponsesTransportStreamFn, } from "./openai-responses-transport.js"; -export { sanitizeTransportPayloadText } from "./transport-stream-shared.js"; - -export function parseTransportChunkUsage( - ...args: Parameters -): ReturnType { - return parseTransportChunkUsageImpl(...args); -} - -export function buildOpenAIResponsesParams( - ...args: Parameters -): ReturnType { - return buildOpenAIResponsesParamsImpl(...args); -} - -export function resolveAzureOpenAIApiVersion(env = process.env): string { - return resolveAzureOpenAIApiVersionImpl(env); -} // Keep this SDK-exported declaration anchored to the long-lived facade while the // completions implementation remains independently owned. diff --git a/src/agents/schema-normalization-runtime-contract.test.ts b/src/agents/schema-normalization-runtime-contract.test.ts index 66c6144e890c..9c9bb45a4d7d 100644 --- a/src/agents/schema-normalization-runtime-contract.test.ts +++ b/src/agents/schema-normalization-runtime-contract.test.ts @@ -10,7 +10,9 @@ import { import { describe, expect, it } from "vitest"; import { createOpenAIResponsesContextManagementWrapper } from "../llm/providers/stream-wrappers/openai.js"; import { buildProviderToolCompatFamilyHooks } from "../plugin-sdk/provider-tools.js"; -import { buildOpenAIResponsesParams } from "./openai-transport-stream.js"; +import { testing as openAITransportTesting } from "./openai-transport-stream.js"; + +const { buildOpenAIResponsesParams } = openAITransportTesting; describe("OpenAI transport schema normalization runtime contract", () => { it("keeps HTTP Responses strict decisions stable for the same tool set", () => { diff --git a/test/scripts/check-deadcode-exports.test.ts b/test/scripts/check-deadcode-exports.test.ts index d5e2a988f3ca..3df1dc6645e7 100644 --- a/test/scripts/check-deadcode-exports.test.ts +++ b/test/scripts/check-deadcode-exports.test.ts @@ -10,10 +10,12 @@ import { describe("check-deadcode-exports", () => { it("excludes test support from every Knip issue type", () => { + expect(knipConfig.ignore).toContain("dist/**"); expect(knipConfig.ignore).toContain("**/test-helpers/**"); expect(knipConfig.ignore).toContain("**/*.test-utils.ts"); expect(knipConfig.ignoreFiles).not.toContain("**/test-helpers/**"); expect(knipConfig.ignoreFiles).toContain("scripts/**"); + expect(knipConfig.ignoreFiles).toContain("dist/**"); expect(knipConfig.ignore).not.toContain("**/live-*.ts"); expect(knipConfig.ignoreFiles).toContain("**/live-*.ts"); });