From d7f3b833fddd56e86154dc6ff2274b02705feeba Mon Sep 17 00:00:00 2001 From: Tarik Ermis Date: Sun, 9 Aug 2026 01:06:12 +0200 Subject: [PATCH] fix(server): resolve Kimi provider lint and typecheck failures - replace process.platform checks in Kimi tests with isHostWindows from @t3tools/shared/hostProcess (custom-oxlint rule) - drop unused EMPTY_CAPABILITIES in KimiProvider - Schema.UnknownFromJsonString -> Schema.fromJsonString(Schema.Unknown) - drop obsolete ["Service"] indexing on FileSystem/Path types in KimiProvider.test.ts --- apps/server/src/provider/Layers/KimiAdapter.test.ts | 10 ++++++---- apps/server/src/provider/Layers/KimiAdapter.ts | 2 +- apps/server/src/provider/Layers/KimiProvider.test.ts | 10 ++++++---- apps/server/src/provider/Layers/KimiProvider.ts | 3 --- .../src/textGeneration/KimiTextGeneration.test.ts | 7 ++++--- 5 files changed, 17 insertions(+), 15 deletions(-) diff --git a/apps/server/src/provider/Layers/KimiAdapter.test.ts b/apps/server/src/provider/Layers/KimiAdapter.test.ts index f1500bdb8b4f..e48c6e116f44 100644 --- a/apps/server/src/provider/Layers/KimiAdapter.test.ts +++ b/apps/server/src/provider/Layers/KimiAdapter.test.ts @@ -20,17 +20,17 @@ import { TurnId, type ProviderRuntimeEvent, } from "@t3tools/contracts"; +import { isHostWindows } from "@t3tools/shared/hostProcess"; import { ServerConfig } from "../../config.ts"; import { kimiPromptSettlementBelongsToContext, makeKimiAdapter } from "./KimiAdapter.ts"; const decodeKimiSettings = Schema.decodeSync(KimiSettings); -const isWin = process.platform === "win32"; const __dirname = NodePath.dirname(NodeURL.fileURLToPath(import.meta.url)); const mockAgentPath = NodePath.join(__dirname, "../../../scripts/acp-mock-agent.ts"); -async function makeMockKimiWrapper(extraEnv?: Record) { +async function makeMockKimiWrapper(isWin: boolean, extraEnv?: Record) { const dir = await NodeFSP.mkdtemp(NodePath.join(NodeOS.tmpdir(), "kimi-acp-mock-")); const jsPath = NodePath.join(dir, "kimi.mjs"); const envJson = JSON.stringify(extraEnv ?? {}); @@ -113,7 +113,8 @@ it.layer(kimiAdapterTestLayer)("KimiAdapterLive", (it) => { it.effect("starts a session and maps mock ACP prompt flow to runtime events", () => Effect.gen(function* () { const threadId = ThreadId.make("kimi-mock-thread"); - const wrapperPath = yield* Effect.promise(() => makeMockKimiWrapper()); + const isWin = yield* isHostWindows; + const wrapperPath = yield* Effect.promise(() => makeMockKimiWrapper(isWin)); const adapter = yield* makeTestAdapter(wrapperPath); const runtimeEvents: ProviderRuntimeEvent[] = []; @@ -166,7 +167,8 @@ it.layer(kimiAdapterTestLayer)("KimiAdapterLive", (it) => { it.effect("rejects startSession without a cwd", () => Effect.gen(function* () { - const wrapperPath = yield* Effect.promise(() => makeMockKimiWrapper()); + const isWin = yield* isHostWindows; + const wrapperPath = yield* Effect.promise(() => makeMockKimiWrapper(isWin)); const adapter = yield* makeTestAdapter(wrapperPath); const error = yield* Effect.flip( adapter.startSession({ diff --git a/apps/server/src/provider/Layers/KimiAdapter.ts b/apps/server/src/provider/Layers/KimiAdapter.ts index b562719497aa..0eaa7399895f 100644 --- a/apps/server/src/provider/Layers/KimiAdapter.ts +++ b/apps/server/src/provider/Layers/KimiAdapter.ts @@ -62,7 +62,7 @@ import { import { type KimiAdapterShape } from "../Services/KimiAdapter.ts"; import { type EventNdjsonLogger, makeEventNdjsonLogger } from "./EventNdjsonLogger.ts"; -const encodeUnknownJsonStringExit = Schema.encodeUnknownExit(Schema.UnknownFromJsonString); +const encodeUnknownJsonStringExit = Schema.encodeUnknownExit(Schema.fromJsonString(Schema.Unknown)); const PROVIDER = ProviderDriverKind.make("kimi"); const KIMI_RESUME_VERSION = 1 as const; diff --git a/apps/server/src/provider/Layers/KimiProvider.test.ts b/apps/server/src/provider/Layers/KimiProvider.test.ts index d02e94cf978e..adeb29f0c448 100644 --- a/apps/server/src/provider/Layers/KimiProvider.test.ts +++ b/apps/server/src/provider/Layers/KimiProvider.test.ts @@ -9,19 +9,20 @@ import * as FileSystem from "effect/FileSystem"; import * as Path from "effect/Path"; import * as Schema from "effect/Schema"; import { KimiSettings } from "@t3tools/contracts"; +import { isHostWindows } from "@t3tools/shared/hostProcess"; import { buildInitialKimiProviderSnapshot, checkKimiProviderStatus } from "./KimiProvider.ts"; const decodeKimiSettings = Schema.decodeSync(KimiSettings); -const isWin = process.platform === "win32"; function writeFakeKimiBinary( - fs: FileSystem.FileSystem["Service"], + fs: FileSystem.FileSystem, dir: string, - path: Path.Path["Service"], + path: Path.Path, scriptBody: string, -): Effect.Effect { +) { return Effect.gen(function* () { + const isWin = yield* isHostWindows; const jsPath = path.join(dir, "kimi.mjs"); yield* fs.writeFileString(jsPath, scriptBody); if (isWin) { @@ -104,6 +105,7 @@ it.layer(NodeServices.layer)("checkKimiProviderStatus", (it) => { path, [ "const args = process.argv.slice(2);", + // @effect-diagnostics-next-line preferSchemaOverJson:off `process.stderr.write(${JSON.stringify(secretStderr + "\\n")});`, "process.exit(2);", "", diff --git a/apps/server/src/provider/Layers/KimiProvider.ts b/apps/server/src/provider/Layers/KimiProvider.ts index 52531b7a594f..4abcc63771c7 100644 --- a/apps/server/src/provider/Layers/KimiProvider.ts +++ b/apps/server/src/provider/Layers/KimiProvider.ts @@ -39,9 +39,6 @@ const KIMI_PRESENTATION = { showInteractionModeToggle: false, requiresNewThreadForModelChange: true, } as const; -const EMPTY_CAPABILITIES: ModelCapabilities = createModelCapabilities({ - optionDescriptors: [], -}); /** Default Thinking levels when ACP discovery is unavailable (Kimi K3 family). */ const DEFAULT_THINKING_CAPABILITIES: ModelCapabilities = createModelCapabilities({ diff --git a/apps/server/src/textGeneration/KimiTextGeneration.test.ts b/apps/server/src/textGeneration/KimiTextGeneration.test.ts index 36954c3cb407..e3d86aaf8286 100644 --- a/apps/server/src/textGeneration/KimiTextGeneration.test.ts +++ b/apps/server/src/textGeneration/KimiTextGeneration.test.ts @@ -10,6 +10,7 @@ import * as Effect from "effect/Effect"; import * as Layer from "effect/Layer"; import * as Schema from "effect/Schema"; import { createModelSelection } from "@t3tools/shared/model"; +import { isHostWindows } from "@t3tools/shared/hostProcess"; import { expect } from "vite-plus/test"; import { KimiSettings, ProviderInstanceId } from "@t3tools/contracts"; @@ -18,7 +19,6 @@ import * as TextGeneration from "./TextGeneration.ts"; import { makeKimiTextGeneration } from "./KimiTextGeneration.ts"; const decodeKimiSettings = Schema.decodeSync(KimiSettings); -const isWin = process.platform === "win32"; const __dirname = NodePath.dirname(NodeURL.fileURLToPath(import.meta.url)); const mockAgentPath = NodePath.join(__dirname, "../../scripts/acp-mock-agent.ts"); @@ -27,7 +27,7 @@ const KimiTextGenerationTestLayer = ServerConfig.ServerConfig.layerTest(process. prefix: "t3code-kimi-text-generation-test-", }).pipe(Layer.provideMerge(NodeServices.layer)); -function makeAcpKimiWrapper(dir: string, env: Record): string { +function makeAcpKimiWrapper(dir: string, env: Record, isWin: boolean): string { const binDir = NodePath.join(dir, "bin"); NodeFS.mkdirSync(binDir, { recursive: true }); const jsPath = NodePath.join(binDir, "kimi.mjs"); @@ -87,7 +87,8 @@ function withFakeAcpKimi( NodeFS.rmSync(tempDir, { recursive: true, force: true }); }), ); - const binaryPath = makeAcpKimiWrapper(tempDir, env); + const isWin = yield* isHostWindows; + const binaryPath = makeAcpKimiWrapper(tempDir, env, isWin); const config = decodeKimiSettings({ binaryPath }); const textGeneration = yield* makeKimiTextGeneration(config); return yield* effectFn(textGeneration);