Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 6 additions & 4 deletions apps/server/src/provider/Layers/KimiAdapter.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<string, string>) {
async function makeMockKimiWrapper(isWin: boolean, extraEnv?: Record<string, string>) {
const dir = await NodeFSP.mkdtemp(NodePath.join(NodeOS.tmpdir(), "kimi-acp-mock-"));
const jsPath = NodePath.join(dir, "kimi.mjs");
const envJson = JSON.stringify(extraEnv ?? {});
Expand Down Expand Up @@ -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[] = [];
Expand Down Expand Up @@ -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({
Expand Down
2 changes: 1 addition & 1 deletion apps/server/src/provider/Layers/KimiAdapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
10 changes: 6 additions & 4 deletions apps/server/src/provider/Layers/KimiProvider.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<string> {
) {
return Effect.gen(function* () {
const isWin = yield* isHostWindows;
const jsPath = path.join(dir, "kimi.mjs");
yield* fs.writeFileString(jsPath, scriptBody);
if (isWin) {
Expand Down Expand Up @@ -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);",
"",
Expand Down
3 changes: 0 additions & 3 deletions apps/server/src/provider/Layers/KimiProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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({
Expand Down
7 changes: 4 additions & 3 deletions apps/server/src/textGeneration/KimiTextGeneration.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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";

Expand All @@ -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");
Expand All @@ -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, string>): string {
function makeAcpKimiWrapper(dir: string, env: Record<string, string>, isWin: boolean): string {
const binDir = NodePath.join(dir, "bin");
NodeFS.mkdirSync(binDir, { recursive: true });
const jsPath = NodePath.join(binDir, "kimi.mjs");
Expand Down Expand Up @@ -87,7 +87,8 @@ function withFakeAcpKimi<A, E, R>(
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);
Expand Down
Loading