표현 아키텍처: agent 스크립트는 의미(텍스트)만 소유, 표현(굵기·색)은 프론트 소유.
Slate 는 negodata 에디터 내부에만 두고, 전송/저장은 마커 문자열 한 벌(구버전의 리치텍스트 이중관리 폐기).
- 트랙 A (negodata): serializeToMarker 추가 — Slate 마크(bold/underline/color)를 **/__/{{토큰}} 로
인코딩해 nego_cards.script 저장. edit_script(Slate 원본)는 재편집 전용. 고정 3색 → 시맨틱 토큰(강조/안내).
- 트랙 B (agent): 카드 멘트 DB 소스 — ICardScriptRepository/CardScriptDbRepository(port+adapter),
ScriptRepository.resolve_card_script 가 cards.source_type=backoffice_db 면 card.nego_cards.script 우선,
없으면 파일 폴백. action_id→card_id→nego_cards.number 매칭.
- 트랙 C (양 프론트): renderEmphasis 재귀 파서 — **굵게**·__밑줄__·{{강조|빨강}}·{{안내|파랑}} 중첩 렌더.
색은 시맨틱 토큰→디자인 토큰 클래스(다크모드 안전). negodata tokens.css 에 --info 신설. CardTable 미리보기 적용.
- supplier_items 연동: 유통코드=supplier_items.supply_type(→quotations.supplier_type 폴백),
파트너유형=상품별 매핑 협력사 수(→세션 이력 폴백).
- 가격 수용률: 기존 공급가(item_price) 기준 양보율로 정정 — 첫 라운드부터 실값(첫 제시가 기준 0 아님).
테스트: agent 86/86, 공급사 frontend·negodata front tsc 통과.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
148 lines
6.8 KiB
JSON
148 lines
6.8 KiB
JSON
{
|
|
"_comment": "재견적(requote) 대화 스크립트. 신규 공급사 선정 흐름. 구조 보존 + 브랜드/표현 중립 재작성(CLEANROOM.md).",
|
|
"시작": {
|
|
"script": "",
|
|
"editor_script_id": "시작",
|
|
"next_input_mode": "null",
|
|
"input_options": [],
|
|
"next_step": { "default": "서비스안내" },
|
|
"type": "null",
|
|
"chat_end": false
|
|
},
|
|
"서비스안내": {
|
|
"script": "안녕하세요. {company_name} {service_name}입니다. 본 서비스는 {company_name}와 협력사 간 신규 물품 공급 협상을 위한 것으로, 귀사에 새로운 공급 기회를 제공하고자 합니다. 이용 방법 안내를 확인하신 뒤 [확인]을 눌러 주세요.",
|
|
"editor_script_id": "서비스안내",
|
|
"next_input_mode": "confirm",
|
|
"input_options": ["확인"],
|
|
"next_step": { "default": "담당자확인" },
|
|
"type": "text",
|
|
"chat_end": false
|
|
},
|
|
"담당자확인": {
|
|
"script": "본 안내는 협력사 포털에 등록된 담당자에게 발송되었습니다. 구매 협상 담당자가 맞는지 확인 부탁드립니다. 담당자가 맞다면 [예], 맞지 않다면 [아니오]를 선택해 주세요.",
|
|
"editor_script_id": "담당자확인",
|
|
"next_input_mode": "yes_no",
|
|
"input_options": ["예", "아니오"],
|
|
"next_step": { "예": "협상품목안내", "아니오": "담당자확인_아니오" },
|
|
"type": "text",
|
|
"chat_end": false
|
|
},
|
|
"담당자확인_아니오": {
|
|
"script": "[아니오]를 선택하셨습니다. 담당자 정보를 변경하시려면 [정보변경]을, 다시 진행하려면 [돌아가기]를 선택해 주세요.",
|
|
"editor_script_id": "담당자확인_아니오",
|
|
"next_input_mode": "yes_no",
|
|
"input_options": ["돌아가기", "정보변경"],
|
|
"next_step": { "돌아가기": "담당자확인", "정보변경": "정보변경_완료" },
|
|
"type": "text",
|
|
"chat_end": false
|
|
},
|
|
"정보변경_완료": {
|
|
"script": "[정보변경]을 선택하셨습니다. 협력사 관리 시스템에서 담당자 정보를 변경하신 뒤 고객센터로 새 견적 생성을 요청해 주세요. 24시간 이내 갱신되지 않으면 미참여로 처리될 수 있습니다.",
|
|
"editor_script_id": "정보변경_완료",
|
|
"next_input_mode": "null",
|
|
"input_options": [],
|
|
"next_step": null,
|
|
"type": "text",
|
|
"chat_end": true
|
|
},
|
|
"협상품목안내": {
|
|
"script": "{company_name}는 아래 상품에 대해 신규 공급사를 선정하고 있으며, 귀사를 초대하여 견적을 요청드립니다. 제출하신 견적은 복수 업체와의 비교 평가를 통해 공급사 선정에 반영됩니다. 상품 정보를 확인해 주세요.",
|
|
"editor_script_id": "협상품목안내",
|
|
"next_input_mode": "confirm",
|
|
"input_options": ["네, 알겠습니다."],
|
|
"next_step": { "default": "가격제안" },
|
|
"type": "text",
|
|
"chat_end": false
|
|
},
|
|
"가격제안": {
|
|
"script": "제안 가격에 동의해 주시면 동의한 업체에 한하여 가격 경쟁을 진행합니다. 진행하시겠습니까?",
|
|
"editor_script_id": "가격제안",
|
|
"next_input_mode": "yes_no",
|
|
"input_options": ["예", "아니오"],
|
|
"next_step": { "예": "배송형태선택", "아니오": "협상실패" },
|
|
"type": "text",
|
|
"chat_end": false
|
|
},
|
|
"협상실패": {
|
|
"script": "참여해 주셔서 감사합니다. 협상이 종료되었습니다.",
|
|
"editor_script_id": "협상실패",
|
|
"next_input_mode": "null",
|
|
"input_options": [],
|
|
"next_step": { "default": "협상종료" },
|
|
"type": "text",
|
|
"chat_end": false
|
|
},
|
|
"배송형태선택": {
|
|
"script": "배송 형태를 선택해 주세요.",
|
|
"editor_script_id": "배송형태선택",
|
|
"next_input_mode": "delivery_type",
|
|
"input_options": ["협력사배송", "지정택배배송", "픽업배송"],
|
|
"next_step": { "default": "가격협상_입력" },
|
|
"type": "text",
|
|
"chat_end": false
|
|
},
|
|
"가격협상_입력": {
|
|
"script": "제안하실 가격을 입력해 주세요.",
|
|
"editor_script_id": "가격협상_입력",
|
|
"next_input_mode": "price",
|
|
"input_options": [],
|
|
"next_step": { "default": "가격협상_확인" },
|
|
"type": "text",
|
|
"chat_end": false
|
|
},
|
|
"가격협상_확인": {
|
|
"script": "**{input_price}원**으로 제안하시겠습니까?",
|
|
"editor_script_id": "가격협상_확인",
|
|
"next_input_mode": "yes_no",
|
|
"input_options": ["예", "아니오"],
|
|
"next_step": { "예": "추가할인요청", "아니오": "가격재입력" },
|
|
"type": "text",
|
|
"chat_end": false
|
|
},
|
|
"가격재입력": {
|
|
"script": "다시 제안하실 가격을 입력해 주세요.",
|
|
"editor_script_id": "가격재입력",
|
|
"next_input_mode": "price",
|
|
"input_options": [],
|
|
"next_step": { "default": "가격협상_확인" },
|
|
"type": "text",
|
|
"chat_end": false
|
|
},
|
|
"추가할인요청": {
|
|
"script": "추가 할인 여지가 있으신가요? 가능하시면 더 경쟁력 있는 제안을 부탁드립니다.",
|
|
"editor_script_id": "추가할인요청",
|
|
"next_input_mode": "yes_no",
|
|
"input_options": ["예", "아니오"],
|
|
"next_step": { "default": "결과안내" },
|
|
"type": "text",
|
|
"chat_end": false
|
|
},
|
|
"결과안내": {
|
|
"script": "협상 결과를 확인해 주세요. 투찰을 확정하시려면 [투찰확정], 정보를 수정하시려면 [정보수정]을 선택해 주세요.",
|
|
"editor_script_id": "결과안내",
|
|
"next_input_mode": "yes_no",
|
|
"input_options": ["투찰확정", "정보수정"],
|
|
"next_step": { "투찰확정": "결과제출", "정보수정": "가격제안" },
|
|
"type": "text",
|
|
"chat_end": false
|
|
},
|
|
"결과제출": {
|
|
"script": "협상 내용을 확인하신 뒤 동의해 주세요.",
|
|
"editor_script_id": "결과제출",
|
|
"next_input_mode": "confirm",
|
|
"input_options": ["협상 내용을 확인했으며, 이의가 없음에 동의합니다."],
|
|
"next_step": { "default": "협상종료" },
|
|
"type": "text",
|
|
"chat_end": false
|
|
},
|
|
"협상종료": {
|
|
"script": "지금까지 {company_name} {service_name}를 통해 협상에 참여해 주셔서 감사합니다. 협상이 종료되었습니다.",
|
|
"editor_script_id": "협상종료",
|
|
"next_input_mode": "null",
|
|
"input_options": [],
|
|
"next_step": null,
|
|
"type": "text",
|
|
"chat_end": true
|
|
}
|
|
}
|