kiku-agent 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/README.md +459 -407
  2. package/package.json +27 -3
  3. package/server/agent/agentCore.js +635 -267
  4. package/server/agent/appPaths.js +2 -0
  5. package/server/agent/catalogEntityResolver.js +629 -0
  6. package/server/agent/citations.js +0 -21
  7. package/server/agent/clarificationAnalytics.js +1 -1
  8. package/server/agent/clarifyingQuestions.js +286 -216
  9. package/server/agent/cli.js +528 -73
  10. package/server/agent/commandFeatures.js +123 -24
  11. package/server/agent/commandRegistry.js +128 -62
  12. package/server/agent/commands.js +1410 -95
  13. package/server/agent/config.js +253 -163
  14. package/server/agent/contextCompactor.js +239 -25
  15. package/server/agent/dynamicCatalog.js +192 -0
  16. package/server/agent/envBootstrap.js +46 -0
  17. package/server/agent/envManager.js +317 -0
  18. package/server/agent/eventBus.js +3 -3
  19. package/server/agent/feedbackLearning.js +0 -8
  20. package/server/agent/gpuMetrics.js +188 -55
  21. package/server/agent/ingestionWorker.js +339 -0
  22. package/server/agent/lanDiscovery.js +369 -0
  23. package/server/agent/llmClient.js +111 -39
  24. package/server/agent/lmStudioWakeup.js +144 -0
  25. package/server/agent/mcpClient.js +2 -2
  26. package/server/agent/memory.js +635 -494
  27. package/server/agent/modelConfig.js +487 -0
  28. package/server/agent/newsIntelligence.js +219 -0
  29. package/server/agent/newsWatch.js +85 -0
  30. package/server/agent/prompts.js +146 -0
  31. package/server/agent/publicTools.js +7 -0
  32. package/server/agent/queryDetails.js +62 -1
  33. package/server/agent/research.js +314 -35
  34. package/server/agent/routingInterceptor.js +77 -0
  35. package/server/agent/rumoredProjects.js +15 -0
  36. package/server/agent/sanitizer.js +117 -17
  37. package/server/agent/subagent.js +52 -9
  38. package/server/agent/suggestionTui.js +33 -13
  39. package/server/agent/suggestions.js +29 -13
  40. package/server/agent/telemetry.js +0 -11
  41. package/server/agent/terminalImage.js +0 -1
  42. package/server/agent/textToolProtocol.js +190 -0
  43. package/server/agent/tokenTracker.js +220 -0
  44. package/server/agent/toolRouter.js +362 -216
  45. package/server/agent/tools.js +1155 -194
  46. package/server/agent/ui.js +144 -41
  47. package/server/agent/vramService.js +572 -0
  48. package/server/agent/webSearch.js +2279 -273
  49. package/server/agent/youtubeAuth.js +82 -73
  50. package/server/agent/youtubeTranscript.js +209 -0
  51. package/server/apiRouter.js +383 -179
  52. package/server/mcp/data/brands.js +5 -5
  53. package/server/mcp/data/discography.js +56 -45
  54. package/server/mcp/data/gallery.js +9 -0
  55. package/server/mcp/data/index.js +1 -0
  56. package/server/mcp/data/industryIndex.js +251 -0
  57. package/server/mcp/data/profile.js +5 -5
  58. package/server/mcp/data/timeline.js +2 -2
  59. package/server/mcp/data/works.js +2 -2
  60. package/server/mcp/handler.js +0 -2
  61. package/server/mcp/prompts.js +42 -2
  62. package/server/mcp/resources.js +5 -1
  63. package/server/mcp/security.js +25 -14
  64. package/server/mcp/server.js +92 -3
  65. package/server/mcp/tools.js +20 -11
  66. package/server/web-chat/core/connection.js +218 -194
  67. package/server/web-chat/core/conversationContext.js +1 -1
  68. package/server/web-chat/core/directCatalogEngine.js +190 -184
  69. package/server/web-chat/core/followUpEngine.js +88 -11
  70. package/server/web-chat/core/security.js +7 -4
  71. package/server/web-chat/router.js +54 -17
  72. package/server/web-chat/routes/bilibiliRoute.js +34 -0
  73. package/server/web-chat/routes/chatRoute.js +488 -397
  74. package/server/web-chat/routes/clarifyConfigRoute.js +1 -2
  75. package/server/web-chat/routes/exportRoute.js +2 -1
  76. package/server/web-chat/routes/lanDiscoveryRoute.js +90 -0
  77. package/server/web-chat/routes/newsRoute.js +36 -6
  78. package/server/web-chat/routes/providerRoute.js +87 -0
  79. package/server/web-chat/routes/staticRoute.js +61 -13
  80. package/server/web-chat/routes/statusRoute.js +23 -2
  81. package/server/web-chat/routes/vramRoute.js +22 -0
  82. package/server/web-chat/server.js +135 -106
  83. package/server/web-chat/ui/htmlBuilder.js +8 -8
  84. package/server/web-chat/ui/previews/modelSettings.preview.html +41 -0
  85. package/server/web-chat/ui/scripts/agentBubbleSystem.js +0 -5
  86. package/server/web-chat/ui/scripts/client.js +10526 -8397
  87. package/server/web-chat/ui/scripts/webchatI18n.js +190 -138
  88. package/server/web-chat/ui/styles/main.css +7471 -4246
  89. package/server/web-chat/ui/templates/body.html +305 -179
  90. package/src/data/brandsData.js +29 -6
  91. package/src/data/discographyData.js +918 -900
  92. package/src/data/galleryData.js +66 -0
  93. package/src/data/industryIndexData.js +292 -0
  94. package/src/data/musicVideoData.js +48 -5
  95. package/src/data/profileData.js +15 -1
  96. package/src/data/timelineData.js +4 -3
  97. package/src/data/worksData.js +536 -535
  98. package/src/lib/vram/estimator.js +464 -0
  99. package/src/lib/vram/modelRegistry.js +387 -0
  100. package/tokens.css +33 -2
@@ -1,6 +1,3 @@
1
- // Kiku web-chat UI i18n pack — injected BEFORE client.js (see htmlBuilder.js).
2
- // Provides ja/ko UI strings (client.js ships th/zh/en inline) and the
3
- // clarifying-question-box strings for all 5 languages.
4
1
  const WEBCHAT_I18N_EXTRA = {
5
2
  ja: {
6
3
  brandSubtitle: "KIKU AGENT",
@@ -71,8 +68,8 @@ const WEBCHAT_I18N_EXTRA = {
71
68
  lblModel: "モデル名 / ID",
72
69
  lblThinking: "Thinking Mode",
73
70
  lblTemp: "創造性 (Temperature)",
74
- apiKeyHelpLm: "🔒 ローカルLM Studio利用時は不要",
75
- apiKeyHelpCloud: "🔒 このブラウザにのみ保存 (Local Client Storage)",
71
+ apiKeyHelpLm: "ローカルLM Studio利用時は不要",
72
+ apiKeyHelpCloud: "このブラウザにのみ保存 (Local Client Storage)",
76
73
  copyMsg: "コピー",
77
74
  quoteMsg: "名言カード",
78
75
  regenerateMsg: "再生成",
@@ -148,8 +145,8 @@ const WEBCHAT_I18N_EXTRA = {
148
145
  lblModel: "모델명 / ID",
149
146
  lblThinking: "Thinking Mode",
150
147
  lblTemp: "창의성 (Temperature)",
151
- apiKeyHelpLm: "🔒 로컬 LM Studio 사용 시 불필요",
152
- apiKeyHelpCloud: "🔒 이 브라우저에만 저장 (Local Client Storage)",
148
+ apiKeyHelpLm: "로컬 LM Studio 사용 시 불필요",
149
+ apiKeyHelpCloud: "이 브라우저에만 저장 (Local Client Storage)",
153
150
  copyMsg: "복사",
154
151
  quoteMsg: "명언 카드",
155
152
  regenerateMsg: "다시 생성",
@@ -157,135 +154,190 @@ const WEBCHAT_I18N_EXTRA = {
157
154
  sidebarSponsors: "스폰서"
158
155
  }
159
156
  };
160
- const WEBCHAT_CLARIFY_I18N = {
161
- th: {
162
- title: "คำถามเพิ่มเติมเพื่อคำตอบที่แม่นยำ",
163
- countSuffix: "ข้อ",
164
- skip: "หรือตอบแบบภาพรวมทั่วไป ❯",
165
- submitIdle: "ส่งคำตอบ (เลือกหรือพิมพ์เพื่อตอบ) ❯",
166
- submitReady: "ส่งคำตอบ (เลือกแล้ว {done}/{total} ข้อ) ❯",
167
- freeTextPlaceholder: "หรือพิมพ์คำตอบเพิ่มเติมเอง แล้วกด Enter…",
168
- freeTextAria: "พิมพ์คำตอบเพิ่มเติมเอง",
169
- collapsedSkipped: "ตอบแบบภาพรวมทั่วไป",
170
- collapsedPicked: "เลือก:",
171
- categories: {
172
- specific_work: "🎬 ผลงานซีรีส์ / ละคร",
173
- subject_focus: "🎯 ประเด็นที่สนใจ",
174
- subject_scope: "🔍 ขอบเขตเรื่องที่ถาม",
175
- career_phase: "✨ ช่วงเวลาและบทบาท",
176
- timeframe: "📅 ช่วงเวลาที่สนใจ",
177
- media_type: "🎵 หมวดหมู่เพลง & ผลงาน",
178
- aspect_focus: "🎭 มุมมองที่ต้องการเน้น",
179
- scope: "🔍 ขอบเขตเนื้อหา",
180
- depth: "📖 ความละเอียดของข้อมูล",
181
- comparison: "⚖️ หัวข้อเปรียบเทียบ",
182
- language: "🌐 ภาษาที่ต้องการ",
183
- date_range: "📆 ช่วงปี/พ.ศ.",
184
- content_format: "📑 รูปแบบคำตอบ"
185
- }
186
- },
187
- zh: {
188
- title: "为了更准确的回答,请补充回答",
189
- countSuffix: "题",
190
- skip: "或按常规总体回答 ❯",
191
- submitIdle: "提交回答(选择或输入后提交) ❯",
192
- submitReady: "提交回答(已选 {done}/{total} 题) ❯",
193
- freeTextPlaceholder: "或手动输入补充回答,按 Enter…",
194
- freeTextAria: "手动输入补充回答",
195
- collapsedSkipped: "按常规总体回答",
196
- collapsedPicked: "已选:",
197
- categories: {
198
- specific_work: "🎬 影视剧作品",
199
- subject_focus: "🎯 感兴趣的要点",
200
- subject_scope: "🔍 提问范围",
201
- career_phase: "✨ 时期与角色",
202
- timeframe: "📅 感兴趣的时间",
203
- media_type: "🎵 音乐作品分类",
204
- aspect_focus: "🎭 想要强调的视角",
205
- scope: "🔍 内容范围",
206
- depth: "📖 信息详细程度",
207
- comparison: "⚖️ 比较主题",
208
- language: "🌐 想要的语言",
209
- date_range: "📆 年份区间",
210
- content_format: "📑 回答格式"
211
- }
212
- },
213
- en: {
214
- title: "Follow-up questions for accurate answers",
215
- countSuffix: "items",
216
- skip: "Or answer generally ❯",
217
- submitIdle: "Submit (select or type to answer) ❯",
218
- submitReady: "Submit ({done}/{total} selected) ❯",
219
- freeTextPlaceholder: "Or type your own answer, then Enter…",
220
- freeTextAria: "Type your own answer",
221
- collapsedSkipped: "Answered generally",
222
- collapsedPicked: "Picked:",
223
- categories: {
224
- specific_work: "🎬 Drama / Film",
225
- subject_focus: "🎯 Focus point",
226
- subject_scope: "🔍 Question scope",
227
- career_phase: "✨ Era & role",
228
- timeframe: "📅 Time of interest",
229
- media_type: "🎵 Music category",
230
- aspect_focus: "🎭 Angle to emphasize",
231
- scope: "🔍 Content scope",
232
- depth: "📖 Detail level",
233
- comparison: "⚖️ Comparison topic",
234
- language: "🌐 Preferred language",
235
- date_range: "📆 Year range",
236
- content_format: "📑 Answer format"
237
- }
238
- },
239
- ja: {
240
- title: "正確な回答のための追加質問",
241
- countSuffix: "問",
242
- skip: "または一般的に回答 ❯",
243
- submitIdle: "回答を送信(選択または入力) ❯",
244
- submitReady: "回答を送信({done}/{total} 選択中) ❯",
245
- freeTextPlaceholder: "または自由に回答を入力して Enter…",
246
- freeTextAria: "自由に回答を入力",
247
- collapsedSkipped: "一般的に回答",
248
- collapsedPicked: "選択:",
249
- categories: {
250
- specific_work: "🎬 ドラマ・映画",
251
- subject_focus: "🎯 関心のあるポイント",
252
- subject_scope: "🔍 質問の範囲",
253
- career_phase: "✨ 時期と役柄",
254
- timeframe: "📅 興味のある時期",
255
- media_type: "🎵 楽曲・作品カテゴリー",
256
- aspect_focus: "🎭 注目したい視点",
257
- scope: "🔍 内容の範囲",
258
- depth: "📖 情報の詳しさ",
259
- comparison: "⚖️ 比較テーマ",
260
- language: "🌐 希望言語",
261
- date_range: "📆 年代・期間",
262
- content_format: "📑 回答形式"
263
- }
264
- },
265
- ko: {
266
- title: "정확한 답변을 위한 추가 질문",
267
- countSuffix: "문항",
268
- skip: "또는 일반적으로 답변 ❯",
269
- submitIdle: "답변 제출(선택 또는 입력) ❯",
270
- submitReady: "답변 제출({done}/{total} 선택) ❯",
271
- freeTextPlaceholder: "또는 직접 답변을 입력하고 Enter…",
272
- freeTextAria: "직접 답변 입력",
273
- collapsedSkipped: "일반적으로 답변",
274
- collapsedPicked: "선택:",
275
- categories: {
276
- specific_work: "🎬 드라마・영화",
277
- subject_focus: "🎯 관심 포인트",
278
- subject_scope: "🔍 질문 범위",
279
- career_phase: "✨ 시기 및 역할",
280
- timeframe: "📅 관심 시기",
281
- media_type: "🎵 음악・작품 카테고리",
282
- aspect_focus: "🎭 주목할 관점",
283
- scope: "🔍 내용 범위",
284
- depth: "📖 정보 상세도",
285
- comparison: "⚖️ 비교 주제",
286
- language: "🌐 원하는 언어",
287
- date_range: "📆 연도・기간",
288
- content_format: "📑 답변 형식"
289
- }
290
- }
157
+ const WEBCHAT_CLARIFY_I18N = {
158
+ th: {
159
+ title: "เลือกมุมมองที่อยากรู้เพิ่มเติม 🌸",
160
+ countSuffix: "ข้อ",
161
+ skip: "หรือให้เสี่ยวจวีตอบภาพรวมทั่วไป ❯",
162
+ submitIdle: "ส่งคำตอบ (เลือกหรือพิมพ์เพื่อตอบ) ❯",
163
+ submitReady: "ส่งคำตอบ (เลือกแล้ว {done}/{total} ข้อ) ❯",
164
+ freeTextPlaceholder: "หรือพิมพ์บอกเสี่ยวจวีเพิ่มเติมเอง แล้วกด Enter…",
165
+ freeTextAria: "พิมพ์บอกเสี่ยวจวีเพิ่มเติมเอง",
166
+ collapsedSkipped: "ตอบแบบภาพรวมทั่วไป",
167
+ collapsedPicked: "เลือก:",
168
+ categories: {
169
+ specific_work: "🎬 ผลงานซีรีส์ / ละคร",
170
+ subject_focus: "🎯 ประเด็นที่สนใจ",
171
+ subject_scope: "🔍 ขอบเขตเรื่องที่ถาม",
172
+ career_phase: "✨ ช่วงเวลาและบทบาท",
173
+ timeframe: "📅 ช่วงเวลาที่สนใจ",
174
+ media_type: "🎵 หมวดหมู่เพลง & ผลงาน",
175
+ aspect_focus: "🎭 มุมมองที่ต้องการเน้น",
176
+ scope: "🔍 ขอบเขตเนื้อหา",
177
+ depth: "📖 ความละเอียดของข้อมูล",
178
+ comparison: "⚖️ หัวข้อเปรียบเทียบ",
179
+ language: "🌐 ภาษาที่ต้องการ",
180
+ date_range: "📆 ช่วงปี/พ.ศ.",
181
+ content_format: "📑 รูปแบบคำตอบ",
182
+ drama_genre: "🎬 แนวซีรีส์ & บทบาท",
183
+ drama_aspect: "🎭 มิติการแสดง & บทบาท",
184
+ music_aspect: "🎶 สไตล์เพลง & ดนตรี",
185
+ stage_vibe: "💃 สเตจ & การแสดงสด",
186
+ stage_performance: "💃 สเตจ & คอนเสิร์ต",
187
+ fashion_aspect: "👗 แฟชั่น & แบรนด์",
188
+ fan_focus: "🌸 มุมมองโดนใจแฟนคลับ",
189
+ character_arc: "✨ มิติของตัวละคร",
190
+ soundtrack_vibe: "🎵 สไตล์เพลง OST",
191
+ behind_the_scenes: "🎥 เบื้องหลังการถ่ายทำ",
192
+ fan_highlights: "🌟 ไฮไลต์พิเศษ"
193
+ }
194
+ },
195
+ zh: {
196
+ title: "选择想深入了解的精彩亮点 🌸",
197
+ countSuffix: "题",
198
+ skip: "或按常规总体回答 ❯",
199
+ submitIdle: "提交回答(选择或输入后提交) ❯",
200
+ submitReady: "提交回答(已选 {done}/{total} 题) ❯",
201
+ freeTextPlaceholder: "或手动输入补充想法,按 Enter…",
202
+ freeTextAria: "手动输入补充想法",
203
+ collapsedSkipped: "按常规总体回答",
204
+ collapsedPicked: "已选:",
205
+ categories: {
206
+ specific_work: "🎬 影视剧作品",
207
+ subject_focus: "🎯 感兴趣的要点",
208
+ subject_scope: "🔍 提问范围",
209
+ career_phase: "✨ 时期与角色",
210
+ timeframe: "📅 感兴趣的时间",
211
+ media_type: "🎵 音乐作品分类",
212
+ aspect_focus: "🎭 想要强调的视角",
213
+ scope: "🔍 内容范围",
214
+ depth: "📖 信息详细程度",
215
+ comparison: "⚖️ 比较主题",
216
+ language: "🌐 想要的语言",
217
+ date_range: "📆 年份区间",
218
+ content_format: "📑 回答格式",
219
+ drama_genre: "🎬 剧集类型与题材",
220
+ drama_aspect: "🎭 角色表现与看点",
221
+ music_aspect: "🎶 音乐与舞台魅力",
222
+ stage_vibe: "💃 神级现场舞台",
223
+ stage_performance: "💃 现场演唱与舞蹈",
224
+ fashion_aspect: "👗 时尚造型与高奢",
225
+ fan_focus: "🌸 专属粉丝亮点",
226
+ character_arc: "✨ 角色人设深度",
227
+ soundtrack_vibe: "🎵 影视原声风格",
228
+ behind_the_scenes: "🎥 幕后花絮趣事",
229
+ fan_highlights: "🌟 封神名场面"
230
+ }
231
+ },
232
+ en: {
233
+ title: "Explore deeper with Kiku ✨",
234
+ countSuffix: "items",
235
+ skip: "Or answer generally ❯",
236
+ submitIdle: "Submit (select or type to answer) ❯",
237
+ submitReady: "Submit ({done}/{total} selected) ❯",
238
+ freeTextPlaceholder: "Or type your own question/preference, then Enter…",
239
+ freeTextAria: "Type your own question or preference",
240
+ collapsedSkipped: "Answered generally",
241
+ collapsedPicked: "Picked:",
242
+ categories: {
243
+ specific_work: "🎬 Drama / Film",
244
+ subject_focus: "🎯 Focus point",
245
+ subject_scope: "🔍 Question scope",
246
+ career_phase: "✨ Era & role",
247
+ timeframe: "📅 Time of interest",
248
+ media_type: "🎵 Music category",
249
+ aspect_focus: "🎭 Angle to emphasize",
250
+ scope: "🔍 Content scope",
251
+ depth: "📖 Detail level",
252
+ comparison: "⚖️ Comparison topic",
253
+ language: "🌐 Preferred language",
254
+ date_range: "📆 Year range",
255
+ content_format: "📑 Answer format",
256
+ drama_genre: "🎬 Drama Genre & Style",
257
+ drama_aspect: "🎭 Acting & Portrayal",
258
+ music_aspect: "🎶 Music & Vocals",
259
+ stage_vibe: "💃 Iconic Live Stages",
260
+ stage_performance: "💃 Stage & Concerts",
261
+ fashion_aspect: "👗 Fashion & Luxury",
262
+ fan_focus: "🌸 Fanclub Highlights",
263
+ character_arc: "✨ Character Arc & Depth",
264
+ soundtrack_vibe: "🎵 OST & Soundtracks",
265
+ behind_the_scenes: "🎥 Behind the Scenes",
266
+ fan_highlights: "🌟 Signature Highlights"
267
+ }
268
+ },
269
+ ja: {
270
+ title: "もっと知りたいポイントを選択 🌸",
271
+ countSuffix: "問",
272
+ skip: "または全体的な回答を見る ❯",
273
+ submitIdle: "回答を送信(選択または入力) ❯",
274
+ submitReady: "回答を送信({done}/{total} 選択中) ❯",
275
+ freeTextPlaceholder: "または自由に回答を入力して Enter…",
276
+ freeTextAria: "自由に回答を入力",
277
+ collapsedSkipped: "全体的な回答を見る",
278
+ collapsedPicked: "選択:",
279
+ categories: {
280
+ specific_work: "🎬 ドラマ・映画",
281
+ subject_focus: "🎯 関心のあるポイント",
282
+ subject_scope: "🔍 質問の範囲",
283
+ career_phase: "✨ 時期と役柄",
284
+ timeframe: "📅 興味のある時期",
285
+ media_type: "🎵 楽曲・作品カテゴリー",
286
+ aspect_focus: "🎭 注目したい視点",
287
+ scope: "🔍 内容の範囲",
288
+ depth: "📖 情報の詳しさ",
289
+ comparison: "⚖️ 比較テーマ",
290
+ language: "🌐 希望言語",
291
+ date_range: "📆 年代・期間",
292
+ content_format: "📑 回答形式",
293
+ drama_genre: "🎬 ドラマジャンル",
294
+ drama_aspect: "🎭 演技・キャラクター",
295
+ music_aspect: "🎶 音楽・ボーカル",
296
+ stage_vibe: "💃 ライブステージ",
297
+ stage_performance: "💃 パフォーマンス",
298
+ fashion_aspect: "👗 ファッション・ブランド",
299
+ fan_focus: "🌸 ファン注目ポイント",
300
+ character_arc: "✨ キャラクターの魅力",
301
+ soundtrack_vibe: "🎵 OST・楽曲世界観",
302
+ behind_the_scenes: "🎥 メイキング・舞台裏",
303
+ fan_highlights: "🌟 ハイライトシーン"
304
+ }
305
+ },
306
+ ko: {
307
+ title: "더 알아보고 싶은 포인트를 선택해 보세요 🌸",
308
+ countSuffix: "문항",
309
+ skip: "또는 일반적인 전체 답변 보기 ❯",
310
+ submitIdle: "답변 제출(선택 또는 입력) ❯",
311
+ submitReady: "답변 제출({done}/{total} 선택) ❯",
312
+ freeTextPlaceholder: "또는 직접 의견을 입력하고 Enter…",
313
+ freeTextAria: "직접 의견 입력",
314
+ collapsedSkipped: "일반적인 전체 답변 보기",
315
+ collapsedPicked: "선택:",
316
+ categories: {
317
+ specific_work: "🎬 드라마・영화",
318
+ subject_focus: "🎯 관심 포인트",
319
+ subject_scope: "🔍 질문 범위",
320
+ career_phase: "✨ 시기 및 역할",
321
+ timeframe: "📅 관심 시기",
322
+ media_type: "🎵 음악・작품 카테고리",
323
+ aspect_focus: "🎭 주목할 관점",
324
+ scope: "🔍 내용 범위",
325
+ depth: "📖 정보 상세도",
326
+ comparison: "⚖️ 비교 주제",
327
+ language: "🌐 원하는 언어",
328
+ date_range: "📆 연도・기간",
329
+ content_format: "📑 답변 형식",
330
+ drama_genre: "🎬 드라마 장르",
331
+ drama_aspect: "🎭 연기・캐릭터",
332
+ music_aspect: "🎶 음악・보컬",
333
+ stage_vibe: "💃 라이브 무대",
334
+ stage_performance: "💃 퍼포먼스・콘서트",
335
+ fashion_aspect: "👗 패션・브랜드",
336
+ fan_focus: "🌸 팬 추천 포인트",
337
+ character_arc: "✨ 캐릭터 매력",
338
+ soundtrack_vibe: "🎵 OST 스타일",
339
+ behind_the_scenes: "🎥 비하인드 스토리",
340
+ fan_highlights: "🌟 주요 하이라이트"
341
+ }
342
+ }
291
343
  };