fix(ci): stabilize dead-export ratchet (#105945)

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
This commit is contained in:
Peter Steinberger
2026-07-12 23:03:53 -07:00
committed by GitHub
parent a5883c33d1
commit ebe69fd238
10 changed files with 25 additions and 57 deletions

View File

@@ -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,

View File

@@ -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",

View File

@@ -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,

View File

@@ -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<ChatCompletionChunk["usage"]> & { cost?: unknown },
model: Model,
): MutableAssistantOutput["usage"] {
@@ -1943,6 +1940,7 @@ export const completionsTesting = {
createSseDoneDetector,
createOpenAICompletionsClient,
buildOpenAICompletionsClientConfig,
parseTransportChunkUsage,
processOpenAICompletionsStream,
shouldEmitOpenAICompletionsReasoningForModel,
};

View File

@@ -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,

View File

@@ -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;

View File

@@ -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<typeof testing.processOpenAICompletionsStream>[1];
type OpenAIResponsesOutput = Parameters<typeof testing.processResponsesStream>[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",

View File

@@ -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<typeof parseTransportChunkUsageImpl>
): ReturnType<typeof parseTransportChunkUsageImpl> {
return parseTransportChunkUsageImpl(...args);
}
export function buildOpenAIResponsesParams(
...args: Parameters<typeof buildOpenAIResponsesParamsImpl>
): ReturnType<typeof buildOpenAIResponsesParamsImpl> {
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.

View File

@@ -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", () => {

View File

@@ -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");
});