// 협상카드 스크립트에 끼워 넣는 치환 변수 카탈로그. // negowiz 는 Zustand 전역 스토어로 들고 있었지만, 여기선 결합도를 낮추려 순수 상수로 둔다. // 저장 포맷의 토큰은 {name} (단일 중괄호) — 백엔드/기존 카드 hint 와 동일 표기. export type CardVariable = { name: string; // 토큰/직렬화 키 (예: target_price) label: string; // 칩·툴바에 보이는 한글 라벨 (예: 목표가) }; // 라벨은 카드 작성자(구매 담당) 관점 용어. name 은 agent 치환 키(chat_engine.vars_for)와 일치해야 한다. export const CARD_VARIABLES: CardVariable[] = [ { name: 'target_price', label: '목표가' }, { name: 'anchor_price', label: '앵커가' }, { name: 'partner_name', label: '협력사명' }, { name: 'product_name', label: '상품명' }, { name: 'input_price', label: '제시가' }, // 협력사가 이번에 제시한 가격 { name: 'prev_partner_price', label: '협력사 직전가' }, // 협력사의 직전 라운드 제시가 { name: 'counter_price', label: '제안가' }, // 당사가 이번에 제시하는 카운터 가격 { name: 'target_mid_price', label: '중간가' }, // 앵커·목표 중간값(역제안용) { name: 'middle_price', label: '절충가' }, // 당사 직전가·협력사 제시가의 절충값 { name: 'discount_rate', label: '인하율' }, // 기존 공급가 대비 인하율(%) ]; const VARIABLE_NAMES = new Set(CARD_VARIABLES.map((v) => v.name)); export const isKnownVariable = (name: string): boolean => VARIABLE_NAMES.has(name); export const variableLabel = (name: string): string => CARD_VARIABLES.find((v) => v.name === name)?.label ?? name;