File size: 2,625 Bytes
4e23b01 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | import { resolveConfigPath } from '@moonshot-ai/agent-core-v2';
import { z } from 'zod';
import { parseConfigString } from '#/config/index';
import { ErrorCodes, KimiError } from '#/errors';
export type KimiConfigValidationPathSegment = string | number;
export interface KimiConfigValidationIssue {
readonly path: readonly KimiConfigValidationPathSegment[];
readonly message: string;
}
export interface ResolveKimiConfigPathInput {
readonly homeDir?: string | undefined;
readonly configPath?: string | undefined;
}
export interface ValidateKimiConfigTomlInput {
readonly text: string;
readonly filePath?: string | undefined;
}
export interface KimiConfigRpc {
resolveConfigPath(input?: ResolveKimiConfigPathInput): Promise<string>;
validateConfigToml(input: ValidateKimiConfigTomlInput): Promise<void>;
}
export class KimiConfigRpcClient implements KimiConfigRpc {
async resolveConfigPath(input: ResolveKimiConfigPathInput = {}): Promise<string> {
return resolveConfigPath(input);
}
async validateConfigToml(input: ValidateKimiConfigTomlInput): Promise<void> {
try {
parseConfigString(input.text, input.filePath);
} catch (error) {
const validationIssues = extractValidationIssues(error);
if (validationIssues !== undefined) {
throw toConfigValidationError(error, validationIssues);
}
throw error;
}
}
}
export function createKimiConfigRpc(): KimiConfigRpc {
return new KimiConfigRpcClient();
}
function toConfigValidationError(
error: unknown,
validationIssues: readonly KimiConfigValidationIssue[],
): KimiError {
const details =
error instanceof KimiError && error.details !== undefined
? { ...error.details, validationIssues }
: { validationIssues };
if (error instanceof KimiError) {
return new KimiError(error.code, error.message, { details });
}
const message = error instanceof Error ? error.message : String(error);
return new KimiError(ErrorCodes.CONFIG_INVALID, message, { details });
}
function extractValidationIssues(error: unknown): readonly KimiConfigValidationIssue[] | undefined {
const zodError = findZodError(error);
if (zodError === undefined) return undefined;
return zodError.issues.map((issue) => ({
path: issue.path.map((segment) =>
typeof segment === 'number' ? segment : String(segment),
),
message: issue.message,
}));
}
function findZodError(error: unknown): z.ZodError | undefined {
if (error instanceof z.ZodError) return error;
if (error instanceof Error && error.cause instanceof z.ZodError) return error.cause;
return undefined;
}
|