kimi-code/packages/node-sdk/test/session-steer.test.ts
2026-05-22 15:54:50 +08:00

114 lines
3.4 KiB
TypeScript

import type * as KosongModule from '@moonshot-ai/kosong';
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
import type { KimiError } from '#/index';
import { makeTempDir, removeTempDirs, waitForAgentWireEvent } from './session-runtime-helpers';
import { TEST_IDENTITY } from './test-identity';
const fakeProviderState = vi.hoisted(() => ({
responseText: 'steer response',
}));
vi.mock('@moonshot-ai/kosong', async (importOriginal) => {
const actual = await importOriginal<typeof KosongModule>();
return {
...actual,
createProvider: () => ({
name: 'fake',
modelName: 'fake-model',
thinkingEffort: null,
async generate() {
return {
id: 'fake-response',
usage: {
inputOther: 0,
output: 1,
inputCacheRead: 0,
inputCacheCreation: 0,
},
finishReason: 'completed',
rawFinishReason: 'stop',
async *[Symbol.asyncIterator]() {
yield { type: 'text', text: fakeProviderState.responseText };
},
};
},
withThinking() {
return this;
},
}),
};
});
const { KimiHarness } = await import('#/index');
const tempDirs: string[] = [];
beforeEach(() => {
fakeProviderState.responseText = 'steer response';
});
afterEach(async () => {
await removeTempDirs(tempDirs);
});
describe('Session.steer', () => {
it('sends turn.steer to the core session runtime', async () => {
const homeDir = await makeTempDir(tempDirs, 'kimi-sdk-steer-home-');
const workDir = await makeTempDir(tempDirs, 'kimi-sdk-steer-work-');
const harness = new KimiHarness({ homeDir, identity: TEST_IDENTITY });
try {
const session = await harness.createSession({ id: 'ses_steer_wire', workDir });
await session.steer('also do this');
await expect(
waitForAgentWireEvent(homeDir, session.id, 'turn.steer', (event) =>
Array.isArray(event['input']),
),
).resolves.toMatchObject({
type: 'turn.steer',
input: [{ type: 'text', text: 'also do this' }],
});
} finally {
await harness.close();
}
});
it('rejects empty steer input', async () => {
const homeDir = await makeTempDir(tempDirs, 'kimi-sdk-steer-home-');
const workDir = await makeTempDir(tempDirs, 'kimi-sdk-steer-work-');
const harness = new KimiHarness({ homeDir, identity: TEST_IDENTITY });
try {
const session = await harness.createSession({ id: 'ses_steer_empty', workDir });
await expect(session.steer(' ')).rejects.toMatchObject({
name: 'KimiError',
code: 'request.prompt_input_empty',
} satisfies Partial<KimiError>);
} finally {
await harness.close();
}
});
it('rejects after the session is closed', async () => {
const homeDir = await makeTempDir(tempDirs, 'kimi-sdk-steer-home-');
const workDir = await makeTempDir(tempDirs, 'kimi-sdk-steer-work-');
const harness = new KimiHarness({ homeDir, identity: TEST_IDENTITY });
try {
const session = await harness.createSession({ id: 'ses_steer_closed', workDir });
await session.close();
await expect(session.steer('hello')).rejects.toMatchObject({
name: 'KimiError',
code: 'session.closed',
} satisfies Partial<KimiError>);
} finally {
await harness.close();
}
});
});