{"version":3,"file":"date-DzUE7x6A.mjs","sources":["../src/schemas/aidol.ts","../src/schemas/chatroom.ts","../src/schemas/companion.ts","../src/schemas/companion-relationship.ts","../src/schemas/highlight.ts","../src/schemas/lead.ts","../src/constants/relationship.ts","../src/lib/koreanParticle.ts","../src/lib/date.ts"],"sourcesContent":["/**\n * AIdol (group) schemas\n * Matches backend aidol/schemas/aidol.py definitions (Public only for MVP)\n */\n\nimport type { BaseRecord } from \"@aioia/core\";\nimport { z } from \"zod\";\n\nimport type { Companion } from \"./companion\";\n\n/**\n * AIdol schema (public fields only, excludes anonymous_id)\n * Matches backend AIdolPublic (aidol/schemas/aidol.py)\n */\nexport const aidolStatusSchema = z.enum([\"DRAFT\", \"PUBLISHED\"]);\nexport type AIdolStatus = z.infer<typeof aidolStatusSchema>;\n\nexport const aidolSchema = z.object({\n  id: z.string(),\n  name: z.string().nullable(),\n  email: z.string().nullable().optional(),\n  greeting: z.string().nullable().optional(),\n  concept: z.string().nullable().optional(),\n  profileImageUrl: z.string().nullable(),\n  status: aidolStatusSchema,\n  createdAt: z.string(),\n  updatedAt: z.string(),\n});\n\nexport interface AIdol extends BaseRecord {\n  id: string;\n  name: string | null;\n  email?: string | null;\n  greeting?: string | null;\n  concept?: string | null;\n  profileImageUrl: string | null;\n  status: AIdolStatus;\n  createdAt: string;\n  updatedAt: string;\n  companions?: Companion[];\n}\n\n/**\n * Schema for AIdol creation response (backend returns only id)\n */\nexport const aidolCreateResponseSchema = z.object({\n  id: z.string(),\n});\n\nexport type AIdolCreateResponse = z.infer<typeof aidolCreateResponseSchema>;\n\n/**\n * Schema for creating an AIdol group\n */\nexport interface AIdolCreate {\n  name: string;\n  concept?: string | null;\n  profileImageUrl: string;\n}\n\n/**\n * Schema for updating an AIdol group\n */\nexport interface AIdolUpdate {\n  name?: string;\n  concept?: string | null;\n  profileImageUrl?: string | null;\n  status?: AIdolStatus;\n}\n\n// ---------------------------------------------------------------------------\n// Image Generation\n// ---------------------------------------------------------------------------\n\n/**\n * Request schema for image generation\n */\nexport const imageGenerationRequestSchema = z.object({\n  prompt: z.string().max(200),\n});\n\nexport type ImageGenerationRequest = z.infer<\n  typeof imageGenerationRequestSchema\n>;\n\n/**\n * Image generation result data\n */\nexport const imageGenerationDataSchema = z.object({\n  imageUrl: z.string(),\n  width: z.number(),\n  height: z.number(),\n  format: z.string(),\n});\n\nexport type ImageGenerationData = z.infer<typeof imageGenerationDataSchema>;\n\n/**\n * Response schema for image generation\n */\nexport const imageGenerationResponseSchema = z.object({\n  data: imageGenerationDataSchema,\n});\n\nexport type ImageGenerationResponse = z.infer<\n  typeof imageGenerationResponseSchema\n>;\n","/**\n * Chatroom schemas\n * Matches backend aidol/schemas/chatroom.py definitions\n */\n\nimport type { BaseRecord } from \"@aioia/core\";\nimport { z } from \"zod\";\n\n// =============================================================================\n// Chatroom Schemas\n// =============================================================================\n\nexport const chatroomSchema = z.object({\n  id: z.string(),\n  companionId: z.string(),\n  name: z.string(),\n  language: z.string(),\n  createdAt: z.string(),\n  updatedAt: z.string(),\n});\n\nexport interface Chatroom extends BaseRecord {\n  id: string;\n  companionId: string;\n  name: string;\n  language: string;\n  createdAt: string;\n  updatedAt: string;\n}\n\nexport interface ChatroomCreate {\n  companionId: string;\n  name: string;\n  language?: string;\n}\n\n// =============================================================================\n// Message Schemas\n// =============================================================================\n\nexport enum SenderType {\n  USER = \"USER\",\n  COMPANION = \"COMPANION\",\n}\n\nexport enum MessageStatus {\n  SENDING = \"SENDING\",\n  SENT = \"SENT\",\n  ERROR = \"ERROR\",\n}\n\nexport const messageSchema = z.object({\n  id: z.string(),\n  senderType: z.nativeEnum(SenderType),\n  content: z.string(),\n  createdAt: z.string(),\n  companionId: z.string().optional(),\n  anonymousId: z.string().optional(),\n});\n\nexport interface Message extends BaseRecord {\n  id: string;\n  senderType: SenderType;\n  content: string;\n  createdAt: string;\n  companionId?: string;\n  anonymousId?: string;\n  status?: MessageStatus;\n}\n\n/**\n * Type guard to check if message is from user\n */\nexport const isUser = (message: Message): boolean => {\n  return message.senderType === SenderType.USER;\n};\n\n/**\n * Type guard to check if message is from companion\n */\nexport const isCompanion = (message: Message): boolean => {\n  return message.senderType === SenderType.COMPANION;\n};\n","/**\n * Companion (member) schemas\n * Matches backend aidol/schemas/companion.py definitions (Public only for MVP)\n */\n\nimport type { BaseRecord } from \"@aioia/core\";\nimport { z } from \"zod\";\n\nexport const POSITIONS = [\n  \"MAIN_VOCAL\",\n  \"SUB_VOCAL\",\n  \"MAIN_DANCER\",\n  \"SUB_DANCER\",\n  \"MAIN_RAPPER\",\n  \"SUB_RAPPER\",\n] as const;\n\nexport type Position = (typeof POSITIONS)[number];\n\nexport type Gender = \"MALE\" | \"FEMALE\";\n\nexport type Grade = \"A\" | \"B\" | \"C\" | \"F\";\n\nexport type Status = \"DRAFT\" | \"PUBLISHED\";\n\nexport interface CompanionStats {\n  vocal: number;\n  dance: number;\n  rap: number;\n  visual: number;\n  stamina: number;\n  charm: number;\n}\n\nconst companionStatsSchema = z.object({\n  vocal: z.number(),\n  dance: z.number(),\n  rap: z.number(),\n  visual: z.number(),\n  stamina: z.number(),\n  charm: z.number(),\n});\n\n/**\n * Companion schema (public fields only, excludes system_prompt)\n */\nexport const companionSchema = z.object({\n  id: z.string(),\n  aidolId: z.string().nullable().optional(),\n  name: z.string().nullable().optional(),\n  biography: z.string().nullable().optional(),\n  profilePictureUrl: z.string().nullable().optional(),\n  grade: z.enum([\"A\", \"B\", \"C\", \"F\"]).nullable().optional(),\n  position: z\n    .enum([\n      \"MAIN_VOCAL\",\n      \"SUB_VOCAL\",\n      \"MAIN_DANCER\",\n      \"SUB_DANCER\",\n      \"MAIN_RAPPER\",\n      \"SUB_RAPPER\",\n    ])\n    .nullable()\n    .optional(),\n  mbti: z.string().nullable().optional(),\n  gender: z.enum([\"MALE\", \"FEMALE\"]).nullable().optional(),\n  status: z.enum([\"DRAFT\", \"PUBLISHED\"]),\n  stats: companionStatsSchema.optional(),\n  createdAt: z.string(),\n  updatedAt: z.string(),\n});\n\nexport interface Companion extends BaseRecord {\n  id: string;\n  aidolId?: string | null;\n  name?: string | null;\n  biography?: string | null;\n  profilePictureUrl?: string | null;\n  grade?: Grade | null;\n  position?: Position | null;\n  mbti?: string | null;\n  gender?: Gender | null;\n  status: Status;\n  stats?: CompanionStats;\n  createdAt: string;\n  updatedAt: string;\n}\n\n/**\n * Schema for creating a Companion\n * Includes systemPrompt for creation (excluded from response)\n */\nexport interface CompanionCreate {\n  aidolId?: string | null;\n  name: string;\n  biography?: string | null;\n  profilePictureUrl?: string | null;\n  systemPrompt?: string | null;\n}\n\n/**\n * Schema for updating a Companion\n */\nexport interface CompanionUpdate {\n  aidolId?: string | null;\n  name?: string;\n  biography?: string | null;\n  profilePictureUrl?: string | null;\n  systemPrompt?: string | null;\n  position?: Position | null;\n  gender?: Gender | null;\n  status?: Status;\n  mbtiEnergy?: number;\n  mbtiPerception?: number;\n  mbtiJudgment?: number;\n  mbtiLifestyle?: number;\n}\n","/**\n * Companion Relationship schemas\n * Matches backend aidol/schemas/companion_relationship.py definitions\n */\n\nimport type { BaseRecord } from \"@aioia/core\";\nimport { z } from \"zod\";\n\n/**\n * CompanionRelationship schema\n * Matches backend CompanionRelationship (aidol/schemas/companion_relationship.py)\n */\nexport const companionRelationshipSchema = z.object({\n  id: z.string(),\n  fromCompanionId: z.string().nullable().optional(),\n  toCompanionId: z.string().nullable().optional(),\n  intimacy: z.number().nullable().optional(),\n  nickname: z.string().nullable().optional(),\n  createdAt: z.string(),\n  updatedAt: z.string(),\n});\n\nexport interface CompanionRelationship extends BaseRecord {\n  id: string;\n  fromCompanionId?: string | null;\n  toCompanionId?: string | null;\n  intimacy?: number | null;\n  nickname?: string | null;\n  createdAt: string;\n  updatedAt: string;\n}\n\nexport interface CompanionRelationshipCreate {\n  fromCompanionId: string;\n  toCompanionId: string;\n  intimacy?: number;\n  nickname?: string;\n}\n","/**\n * AIdol Highlight schemas\n * Matches backend aidol/schemas/highlight.py definitions\n */\n\nimport type { BaseRecord } from \"@aioia/core\";\nimport { z } from \"zod\";\n\n// ---------------------------------------------------------------------------\n// HighlightMessage\n// ---------------------------------------------------------------------------\n\nexport interface HighlightMessage {\n  id: string;\n  highlightId: string;\n  companionId: string | null;\n  sequence: number;\n  content: string;\n  createdAt: string;\n  updatedAt: string;\n}\n\nexport const highlightMessageSchema = z.object({\n  id: z.string(),\n  highlightId: z.string(),\n  companionId: z.string().nullable(),\n  sequence: z.number(),\n  content: z.string(),\n  createdAt: z.string(),\n  updatedAt: z.string(),\n}) satisfies z.ZodType<HighlightMessage>;\n\n// ---------------------------------------------------------------------------\n// AIdolHighlight\n// ---------------------------------------------------------------------------\n\nexport const aidolHighlightSchema = z.object({\n  id: z.string(),\n  aidolId: z.string().nullable().optional(),\n  title: z.string(),\n  thumbnailUrl: z.string(),\n  subtitle: z.string(),\n  isPremium: z.boolean(),\n  createdAt: z.string(),\n  updatedAt: z.string(),\n});\n\nexport interface AIdolHighlight extends BaseRecord {\n  id: string;\n  aidolId?: string | null;\n  title: string;\n  thumbnailUrl: string;\n  subtitle: string;\n  isPremium: boolean;\n  createdAt: string;\n  updatedAt: string;\n}\n\n// 내그룹의 하이라이트 섹션 표현이 달라서 따로 정의\nexport interface MyGroupHighlightSection {\n  title: string;\n  subtitle: string;\n  items: AIdolHighlight[];\n}\n","/**\n * Lead schemas\n * Matches backend aidol/schemas/aidol_lead.py definitions\n */\n\nimport { z } from \"zod\";\n\n/**\n * Lead request schema\n */\nexport interface LeadRequest {\n  aidolId: string;\n  email: string;\n}\n\n/**\n * Lead response schema\n */\nexport const leadResponseSchema = z.object({\n  email: z.string(),\n});\n\nexport type LeadResponse = z.infer<typeof leadResponseSchema>;\n","/** 관계 유형 → 친밀도 매핑 */\nexport const RELATIONSHIP_TYPE_TO_INTIMACY = {\n  awkward: 15,\n  polite: 30,\n  friendly: 45,\n  tikitaka: 60,\n  trust: 70,\n  emotional: 80,\n  bestFriend: 90,\n  inseparable: 100,\n} as const;\n\n/** 관계 유형 타입 (위 객체에서 자동 추론) */\nexport type RelationshipType = keyof typeof RELATIONSHIP_TYPE_TO_INTIMACY;\n\n/** 친밀도 → 관계 유형 매핑 (위 객체에서 파생) */\nexport const INTIMACY_TO_RELATIONSHIP_TYPE = Object.fromEntries(\n  Object.entries(RELATIONSHIP_TYPE_TO_INTIMACY).map(([type, intimacy]) => [\n    intimacy,\n    type,\n  ]),\n) as Record<number, RelationshipType>;\n","// 한글의 마지막 글자를 기준으로 적절한 조사를 반환하는 함수\n// words: 조사 적용 대상 단어\n// withFinalConsonant: 받침이 있을 때 사용할 조사\n// withoutFinalConsonant: 받침이 없을 때 사용할 조사\n// 예: getParticle(\"민준\", \"과\", \"와\") => \"과\"\nexport function getParticle(\n  word: string,\n  withFinalConsonant: string,\n  withoutFinalConsonant: string,\n): string {\n  if (!word) return withoutFinalConsonant;\n\n  const lastChar = word.charAt(word.length - 1);\n  const code = lastChar.charCodeAt(0);\n\n  // 한글 유니코드 범위 = 0xAC00 ~ 0xD7A3\n  if (code < 0xac00 || code > 0xd7a3) {\n    return withoutFinalConsonant;\n  }\n\n  // 받침 여부 (code - 0xAC00) % 28 !== 0 이면 받침 있음\n  const finalConsonantIndex = (code - 0xac00) % 28;\n\n  // '로/으로' 예외 처리\n  if (withFinalConsonant === \"으로\" && withoutFinalConsonant === \"로\") {\n    return finalConsonantIndex === 0 || finalConsonantIndex === 8\n      ? \"로\"\n      : \"으로\"; // 8 = ㄹ\n  }\n\n  return finalConsonantIndex === 0 ? withoutFinalConsonant : withFinalConsonant;\n}\n","export const formatDate = (dateStr: string) => {\n  const date = new Date(dateStr);\n  if (isNaN(date.getTime())) return \"-\";\n  const year = date.getFullYear();\n  const month = String(date.getMonth() + 1).padStart(2, \"0\");\n  const day = String(date.getDate()).padStart(2, \"0\");\n  return `${year}.${month}.${day}`;\n};\n\nexport interface RelativeTime {\n  key: string;\n  params?: Record<string, string | number>;\n}\n\n/**\n * Returns an i18n key + params for relative time display.\n * - < 1 min → chat.time.justNow\n * - < 60 min → chat.time.minutesAgo { count }\n * - < 24 hours → chat.time.hoursAgo { count }\n * - >= 24 hours → chat.time.absolute { month, day, time }\n */\nexport const getRelativeTime = (\n  dateStr: string,\n  now: Date = new Date(),\n): RelativeTime | null => {\n  const date = new Date(dateStr);\n  if (isNaN(date.getTime())) return null;\n\n  const diffMs = now.getTime() - date.getTime();\n  if (diffMs < 0) return { key: \"chat.time.justNow\" };\n\n  const diffMin = Math.floor(diffMs / (1000 * 60));\n  if (diffMin < 1) return { key: \"chat.time.justNow\" };\n  if (diffMin < 60)\n    return { key: \"chat.time.minutesAgo\", params: { count: diffMin } };\n\n  const diffHour = Math.floor(diffMin / 60);\n  if (diffHour < 24)\n    return { key: \"chat.time.hoursAgo\", params: { count: diffHour } };\n\n  const month = date.getMonth() + 1;\n  const day = date.getDate();\n  const hours = String(date.getHours()).padStart(2, \"0\");\n  const minute = String(date.getMinutes()).padStart(2, \"0\");\n\n  return {\n    key: \"chat.time.absolute\",\n    params: { month, day, time: `${hours}:${minute}` },\n  };\n};\n\nexport const getDaysSince = (dateStr: string) => {\n  const created = new Date(dateStr);\n  if (isNaN(created.getTime())) return 0;\n  const now = new Date();\n  const diffMs = now.getTime() - created.getTime();\n  return Math.max(0, Math.floor(diffMs / (1000 * 60 * 60 * 24)));\n};\n"],"names":["aidolStatusSchema","z","aidolSchema","aidolCreateResponseSchema","imageGenerationDataSchema","imageGenerationResponseSchema","chatroomSchema","SenderType","MessageStatus","messageSchema","isUser","message","isCompanion","POSITIONS","companionStatsSchema","companionSchema","companionRelationshipSchema","highlightMessageSchema","aidolHighlightSchema","leadResponseSchema","RELATIONSHIP_TYPE_TO_INTIMACY","INTIMACY_TO_RELATIONSHIP_TYPE","type","intimacy","getParticle","word","withFinalConsonant","withoutFinalConsonant","code","finalConsonantIndex","formatDate","dateStr","date","year","month","day","getRelativeTime","now","diffMs","diffMin","diffHour","hours","minute","getDaysSince","created"],"mappings":"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"}