redscv95
Initial deploy: korean-privacy-law-mcp v0.0.1 (37 tools, RAG 2,202 chunks)
3798d02
Raw
History Blame Contribute Delete
1.98 kB
/**
* ๊ธด ๋ณธ๋ฌธ ๊ณ„๋‹จ์‹ ์ถ•์•ฝ โ€” PIPC ์˜๊ฒฐ๋ฌธ(ํ‰๊ท  1๋งŒ์ž+) ํ† ํฐ ์ ˆ์•ฝ์šฉ.
* ์•ž 800์ž + ์ค‘๋žต ๋งˆ์ปค + ๋’ค 400์ž. minSave ๊ฐ€๋“œ๋กœ ์งง์€ ๋ณธ๋ฌธ์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€.
*/
const HEAD_LIMIT = 800;
const TAIL_LIMIT = 400;
const MIN_LENGTH_TO_COMPACT = 1300;
/** ํ•œ๊ตญ์–ด ์ข…๊ฒฐ์–ด๋ฏธ โ€” ๋ฌธ์žฅ ๊ฒฝ๊ณ„ ํƒ์ง€ */
const SENTENCE_ENDINGS = /(?:๋‹ค\.|๋ผ\.|์š”\.|์Œ\.|ํ•จ\.|์ด๋‹ค\.|๊ฒƒ์ด๋‹ค\.|ํŒ๋‹จ๋œ๋‹ค\.)\s*/g;
export interface CompactOptions {
/** override head ๊ธ€์ž์ˆ˜ */
headLimit?: number;
/** override tail ๊ธ€์ž์ˆ˜ */
tailLimit?: number;
/** override ์ตœ์†Œ ์••์ถ• ๊ธธ์ด ์ž„๊ณ„๊ฐ’ */
minLength?: number;
}
export function compactBody(text: string, options: CompactOptions = {}): string {
const head = options.headLimit ?? HEAD_LIMIT;
const tail = options.tailLimit ?? TAIL_LIMIT;
const minLen = options.minLength ?? MIN_LENGTH_TO_COMPACT;
if (text.length <= minLen) return text;
if (text.length <= head + tail) return text;
const headRaw = text.substring(0, head);
const tailRaw = text.substring(text.length - tail);
const headFinal = trimAtSentenceEnd(headRaw);
const tailFinal = trimAtSentenceStart(tailRaw);
const omitted = text.length - headFinal.length - tailFinal.length;
if (omitted <= 0) return text;
return `${headFinal}\n\nโ‹ฏ ์ค‘๋žต ${omitted}์ž (full=true๋กœ ์ „๋ฌธ ์กฐํšŒ) โ‹ฏ\n\n${tailFinal}`;
}
function trimAtSentenceEnd(text: string): string {
const matches = [...text.matchAll(SENTENCE_ENDINGS)];
if (matches.length === 0) return text;
const last = matches[matches.length - 1];
if (!last || last.index === undefined) return text;
return text.substring(0, last.index + last[0].length).trimEnd();
}
function trimAtSentenceStart(text: string): string {
// ์ฒซ ์ข…๊ฒฐ ๋‹ค์Œ ์‹œ์ž‘์  โ€” ๋ฌธ์žฅ ์ค‘๊ฐ„ ์ž˜๋ฆผ ๋ฐฉ์ง€
const m = text.match(/[.ใ€‚]\s+([๊ฐ€-ํžฃA-Z\d])/);
if (!m || m.index === undefined) return text;
return text.substring(m.index + m[0].length - 1);
}