takt/src/core/piece/schema-loader.ts
2026-02-12 13:32:28 +09:00

51 lines
1.6 KiB
TypeScript

import { readFileSync } from 'node:fs';
import { join } from 'node:path';
import { getResourcesDir } from '../../infra/resources/index.js';
type JsonSchema = Record<string, unknown>;
const schemaCache = new Map<string, JsonSchema>();
function loadSchema(name: string): JsonSchema {
const cached = schemaCache.get(name);
if (cached) {
return cached;
}
const schemaPath = join(getResourcesDir(), 'schemas', name);
const content = readFileSync(schemaPath, 'utf-8');
const parsed = JSON.parse(content) as JsonSchema;
schemaCache.set(name, parsed);
return parsed;
}
function cloneSchema(schema: JsonSchema): JsonSchema {
return JSON.parse(JSON.stringify(schema)) as JsonSchema;
}
export function loadJudgmentSchema(): JsonSchema {
return loadSchema('judgment.json');
}
export function loadEvaluationSchema(): JsonSchema {
return loadSchema('evaluation.json');
}
export function loadDecompositionSchema(maxParts: number): JsonSchema {
if (!Number.isInteger(maxParts) || maxParts <= 0) {
throw new Error(`maxParts must be a positive integer: ${maxParts}`);
}
const schema = cloneSchema(loadSchema('decomposition.json'));
const properties = schema.properties;
if (!properties || typeof properties !== 'object' || Array.isArray(properties)) {
throw new Error('decomposition schema is invalid: properties is missing');
}
const rawParts = (properties as Record<string, unknown>).parts;
if (!rawParts || typeof rawParts !== 'object' || Array.isArray(rawParts)) {
throw new Error('decomposition schema is invalid: parts is missing');
}
(rawParts as Record<string, unknown>).maxItems = maxParts;
return schema;
}