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,10 +1,10 @@
1
1
  export const brandsData = [
2
- { id: "prsr", year: 2026, brandNameEn: "PRSR / Pasha", brandNameCn: "帕莎眼镜", title: "Global Brand Ambassador", category: "Luxury Eyewear", isGlobal: true, highlight: "Milan Fashion Week 2026 debut, viral pink sequin look" },
3
- { id: "versace", year: 2025, brandNameEn: "Versace Fragrance", brandNameCn: "范思哲香氛", title: "Global Fragrance Ambassador", category: "Luxury Fragrance", isGlobal: true, highlight: "Global ambassador for Versace Dylan Purple & luxury fragrance line" },
4
- { id: "fred", year: 2025, brandNameEn: "FRED Jewelry", brandNameCn: "FRED珠宝 (LVMH)", title: "China Brand Ambassador", category: "Luxury Jewelry", isGlobal: false, highlight: "Force 10 High Jewelry editorial for PORT Magazine" },
5
- { id: "tutucare", year: 2026, brandNameEn: "TuTuCare", brandNameCn: "凸凸棉", title: "Global Brand Ambassador", category: "Personal Care", isGlobal: true, highlight: "20,000 gift boxes sold out in 1 second, GMV 10.3M CNY in 1 hour" },
2
+ { id: "prsr", year: 2026, brandNameEn: "PRSR / Pasha", brandNameCn: "帕莎眼镜", title: "Global Brand Ambassador", category: "Luxury Eyewear", isGlobal: true, highlight: "Milan Fashion Week 2026 debut, viral pink sequin look", aliases: ["PRSR", "Pasha", "帕莎眼镜", "帕莎"], keywords: ["eyewear", "glasses", "sunglasses", "milan fashion week"] },
3
+ { id: "versace", year: 2025, brandNameEn: "Versace Fragrance", brandNameCn: "范思哲香氛", title: "Global Fragrance Ambassador", category: "Luxury Fragrance", isGlobal: true, highlight: "Global ambassador for Versace Dylan Purple & luxury fragrance line", aliases: ["Versace", "Versace Fragrance", "范思哲香氛", "范思哲"], keywords: ["fragrance", "perfume", "dylan purple"] },
4
+ { id: "fred", year: 2025, brandNameEn: "FRED Jewelry", brandNameCn: "FRED珠宝 (LVMH)", title: "China Brand Ambassador", category: "Luxury Jewelry", isGlobal: false, highlight: "Force 10 High Jewelry editorial for PORT Magazine", aliases: ["FRED", "FRED Paris", "FRED Jewelry", "斐登珠宝", "斐登", "French High Jewelry"], keywords: ["french high jewelry", "jewelry", "jewellery", "high jewelry", "lvmh", "force 10"] },
5
+ { id: "tutucare", year: 2026, brandNameEn: "TuTuCare", brandNameCn: "凸凸棉", title: "Global Brand Ambassador", category: "Personal Care", isGlobal: true, highlight: "20,000 gift boxes sold out in 1 second, GMV 10.3M CNY in 1 hour", aliases: ["TuTuCare", "凸凸棉", "tutu care"], keywords: ["personal care", "sanitary", "20000", "10.3m", "1 second"] },
6
6
  { id: "dafuyan", year: 2026, brandNameEn: "DAFUYAN", brandNameCn: "达肤妍", title: "Global Brand Ambassador", category: "Skincare", isGlobal: true, highlight: "10,000 sets sold out in 8 minutes, 20M CNY in 24 hours" },
7
- { id: "lafang", year: 2026, brandNameEn: "Lafang", brandNameCn: "拉芳", title: "Global Brand Ambassador", category: "Hair Care", isGlobal: true, highlight: "First Global Ambassador in brand's 30-year history" },
7
+ { id: "lafang", year: 2026, brandNameEn: "Lafang", brandNameCn: "拉芳", title: "Global Brand Ambassador", category: "Hair Care", isGlobal: true, highlight: "First Global Ambassador in brand's 30-year history. Douyin live stream on Sep 12, 2026 as 'Flower Fairy' in Tony Ward 2026 pink dress hit 130k+ concurrent viewers, 10,000+ orders, millions in GMV, and went viral with dialect catchphrases 'An Yi' and 'Ba Si'", aliases: ["Lafang", "拉芳", "ลาฟาง"], keywords: ["hair care", "shampoo", "30-year", "douyin", "live stream", "tony ward", "flower fairy", "an yi", "ba si", "130000", "10000"] },
8
8
  { id: "makeup-forever", year: 2024, brandNameEn: "MAKE UP FOR EVER", brandNameCn: "玫珂菲 (LVMH)", title: "Brand Ambassador", category: "Professional Makeup", isGlobal: false, highlight: "Asia-Pacific brand ambassador for LVMH professional beauty" },
9
9
  { id: "mistine", year: 2024, brandNameEn: "Mistine", brandNameCn: "蜜丝婷", title: "Global Sunscreen & Beauty Ambassador", category: "Sunscreen & Cosmetics", isGlobal: true, highlight: "Global ambassador for top-selling sunscreen and beauty products" },
10
10
  { id: "maybelline", year: 2023, brandNameEn: "Maybelline New York", brandNameCn: "美宝莲纽约", title: "Brand Ambassador", category: "Makeup", isGlobal: false, highlight: "Campaign ambassador for viral lip and foundation lines" },
@@ -1,45 +1,56 @@
1
- export const discographyData = [
2
- { id: "find-the-way", titleEn: "FIND THE WAY", titleCn: "FIND THE WAY", year: 2026, category: "single", duration: "3:30", youtubeId: "9AeErG03SZw" },
3
- { id: "set-fire", titleEn: "Set Fire to the Silent World", titleCn: "着火的沉默世界", year: 2026, category: "ost", duration: "3:55", youtubeId: "7FXGhAmHIAo", work: "Wanhua Sin" },
4
- { id: "not-suffering", titleEn: "Not Suffering", titleCn: "不苦", year: 2026, category: "ost", duration: "3:50", youtubeId: "DafSXZZo9AI", work: "Veil of Shadows" },
5
- { id: "eternal-fragrance-song", titleEn: "The Eternal Fragrance", titleCn: "千香", year: 2026, category: "ost", duration: "3:46", youtubeId: "vIanAvWb_HU", work: "The Eternal Fragrance" },
6
- { id: "rain-love", titleEn: "Yu Ai (Rain Love)", titleCn: "雨爱", year: 2026, category: "cover", duration: "4:15", youtubeId: "OMLpNyp8T7Q" },
7
- { id: "rosa", titleEn: "Rosa", titleCn: "Rosa", year: 2025, category: "single", duration: "3:20", youtubeId: "jZDzOLbd9OU" },
8
- { id: "sleepless-sunset", titleEn: "Sleepless Sunset", titleCn: "落日未眠", year: 2025, category: "single", duration: "3:45", youtubeId: "mYYD2JqZ1tE" },
9
- { id: "fall", titleEn: "Fall", titleCn: "落", year: 2024, category: "single", duration: "3:36", youtubeId: "8Nh4ZPhYKEc" },
10
- { id: "view-from-wall", titleEn: "View From The Wall", titleCn: "壁上观", year: 2024, category: "single", duration: "3:50", youtubeId: "Lge5XhVl9Fc" },
11
- { id: "ru-sha", titleEn: "Ru Sha", titleCn: "如纱", year: 2024, category: "ost", duration: "3:42", youtubeId: "lzDP2MfP3eA", work: "Sword and Fairy 4" },
12
- { id: "stay-with-me", titleEn: "Stay With Me", titleCn: "伴", year: 2024, category: "ost", duration: "3:30", youtubeId: "N7pWFylNQDM", work: "I Want to Go Against the Wind" },
13
- { id: "thoughts-of-joy", titleEn: "Thoughts of Joy", titleCn: "念思凡", year: 2023, category: "ost", duration: "3:38", youtubeId: "D-vEPdasbLo", work: "Beauty of Resilience" },
14
- { id: "dew-before-dawn", titleEn: "Dew Before Dawn", titleCn: "露珠在晨曦前消散", year: 2023, category: "ost", duration: "4:02", youtubeId: "D-vEPdasbLo", work: "Beauty of Resilience" },
15
- { id: "sakura", titleEn: "SAKURA", titleCn: "SAKURA", year: 2023, category: "single", duration: "3:28", youtubeId: "QAMohoC80JM" },
16
- { id: "call-me-queen", titleEn: "Call Me Queen", titleCn: "女王殿下", year: 2023, category: "single", duration: "3:20", youtubeId: "aIGC1motnfw" },
17
- { id: "0.2s", titleEn: "0.2s", titleCn: "0.2s", year: 2022, category: "single", duration: "3:12", youtubeId: "N0yV3DgE_Z4" },
18
- { id: "mo-li", titleEn: "Mo Li", titleCn: "莫离", year: 2021, category: "ost", duration: "3:45", youtubeId: "7VSAArsR-go", work: "Rebirth for You" },
19
- { id: "past-perfect", titleEn: "Past Perfect", titleCn: "过去完成时", year: 2021, category: "ost", duration: "3:58", youtubeId: "GzmxD3P1o9Y", work: "Love Under the Full Moon" },
20
- { id: "zhuo-guang-qu", titleEn: "Zhuo Guang Qu", titleCn: "琢光曲", year: 2020, category: "ost", duration: "3:40", youtubeId: "JNAbdAxiG9E", work: "In a Class of Her Own" },
21
- { id: "fu-rong", titleEn: "Fu Rong", titleCn: "芙蓉", year: 2020, category: "ost", duration: "3:48", youtubeId: "9ke3efb9U7A", work: "The Blooms at Ruyi Pavilion" },
22
- { id: "ancient-painting", titleEn: "Ancient Painting", titleCn: "古画", year: 2020, category: "ost", duration: "3:52", youtubeId: "a_sbpY2_buI", work: "The Blooms at Ruyi Pavilion" },
23
- { id: "thousand-years", titleEn: "A Millennium's Wait", titleCn: "千年等一回", year: 2019, category: "ost", duration: "4:05", youtubeId: "-vf6jU96WI4", work: "The Legend of White Snake" },
24
- { id: "du-qing", titleEn: "Du Qing", titleCn: "渡情", year: 2019, category: "ost", duration: "3:30", youtubeId: "1dmp3hUhVBI", work: "The Legend of White Snake" },
25
- { id: "qing-cheng-shan-xia", titleEn: "Bai Suzhen under Mount Qingcheng", titleCn: "青城山下白素贞", year: 2019, category: "ost", duration: "3:22", youtubeId: "wVZbHrI0q24", work: "The Legend of White Snake" },
26
- { id: "love-emergency", titleEn: "Love Emergency", titleCn: "恋爱告急", year: 2019, category: "single", duration: "3:35", youtubeId: "5MLPdCmnlmE" },
27
- { id: "tan-yun-xi", titleEn: "Sigh of Yunxi", titleCn: "叹云兮", year: 2018, category: "ost", duration: "3:50", youtubeId: "oEgxqij58LQ", work: "Legend of Yunxi" },
28
- { id: "falling-flowers", titleEn: "Falling Flowers", titleCn: "落花成泥", year: 2018, category: "ost", duration: "3:42", youtubeId: "cWibu5ISTyw", work: "Legend of Yunxi" },
29
- { id: "hong-zhao-yuan", titleEn: "Hong Zhao Yuan", titleCn: "红昭愿", year: 2018, category: "stage", duration: "3:30", youtubeId: "6gFUB9eDFD0" },
30
- { id: "everyday", titleEn: "Everyday", titleCn: "每一天", year: 2016, category: "single", duration: "3:30", youtubeId: "kfihNAtWBaU" },
31
- { id: "drunk-fei-shuang", titleEn: "Drunk Fei Shuang", titleCn: "醉飞霜", year: 2016, category: "ost", duration: "4:00", youtubeId: "VTyNNuUsKzM", work: "Novoland: The Castle in the Sky" }
32
- ];
33
-
34
- export const musicVideos = [
35
- { id: "mv-find-the-way", titleEn: "FIND THE WAY MV", titleCn: "FIND THE WAY", year: 2026, category: "Official MV", youtubeId: "9AeErG03SZw", duration: "3:30" },
36
- { id: "mv-not-suffering", titleEn: "Not Suffering MV", titleCn: "不苦", year: 2026, category: "OST MV", youtubeId: "DafSXZZo9AI", duration: "3:50", work: "Veil of Shadows" },
37
- { id: "mv-rain-love", titleEn: "Yu Ai (Rain Love) Stage", titleCn: "雨爱", year: 2026, category: "Stage Performance", youtubeId: "OMLpNyp8T7Q", duration: "4:15" },
38
- { id: "mv-set-fire", titleEn: "Set Fire to the Silent World MV", titleCn: "着火的沉默世界", year: 2026, category: "OST MV", youtubeId: "7FXGhAmHIAo", duration: "3:55", work: "Wanhua Sin" },
39
- { id: "mv-rosa", titleEn: "Rosa MV", titleCn: "Rosa", year: 2025, category: "Official MV", youtubeId: "jZDzOLbd9OU", duration: "3:20" },
40
- { id: "mv-fall", titleEn: "Fall MV", titleCn: "落", year: 2024, category: "Official MV", youtubeId: "8Nh4ZPhYKEc", duration: "3:36" },
41
- { id: "mv-ru-sha", titleEn: "Ru Sha MV", titleCn: "如纱", year: 2024, category: "OST MV", youtubeId: "lzDP2MfP3eA", duration: "3:42", work: "Sword and Fairy 4" },
42
- { id: "mv-tan-yun-xi", titleEn: "Sigh of Yunxi OST", titleCn: "叹云兮", year: 2018, category: "OST MV", youtubeId: "oEgxqij58LQ", duration: "3:50", work: "Legend of Yunxi" },
43
- { id: "mv-love-emergency", titleEn: "Love Emergency MV", titleCn: "恋爱告急", year: 2019, category: "Official MV", youtubeId: "5MLPdCmnlmE", duration: "3:35" },
44
- { id: "mv-everyday", titleEn: "Everyday MV", titleCn: "每一天", year: 2016, category: "Official MV", youtubeId: "kfihNAtWBaU", duration: "3:30" }
45
- ];
1
+ export const discographyData = [
2
+ { id: "find-the-way", titleEn: "FIND THE WAY", titleCn: "FIND THE WAY", year: 2026, category: "single", duration: "3:30", youtubeId: "9AeErG03SZw" },
3
+ { id: "set-fire", titleEn: "Set Fire to the Silent World", titleCn: "着火的沉默世界", year: 2026, category: "ost", duration: "3:55", youtubeId: "7FXGhAmHIAo", work: "Wanhua Sin" },
4
+ { id: "not-suffering", titleEn: "Not Suffering", titleCn: "不苦", year: 2026, category: "ost", duration: "3:50", youtubeId: "DafSXZZo9AI", work: "Veil of Shadows", role: "Destiny Theme duet with Tian Jiarui (田嘉瑞)", description: "Destiny Theme duet with Tian Jiarui (田嘉瑞) for Veil of Shadows" },
5
+ { id: "eternal-fragrance-song", titleEn: "The Eternal Fragrance", titleCn: "千香", year: 2026, category: "ost", duration: "3:46", youtubeId: "vIanAvWb_HU", work: "The Eternal Fragrance" },
6
+ { id: "rain-love", titleEn: "Yu Ai (Rain Love)", titleCn: "雨爱", year: 2026, category: "cover", duration: "4:15", youtubeId: "OMLpNyp8T7Q" },
7
+ { id: "rosa", titleEn: "Rosa", titleCn: "Rosa", year: 2025, category: "single", duration: "3:20", youtubeId: "jZDzOLbd9OU" },
8
+ { id: "sleepless-sunset", titleEn: "Sleepless Sunset", titleCn: "落日未眠", year: 2025, category: "single", duration: "3:45", youtubeId: "mYYD2JqZ1tE" },
9
+ { id: "fall", titleEn: "Fall", titleCn: "落", year: 2024, category: "single", duration: "3:36", youtubeId: "8Nh4ZPhYKEc" },
10
+ { id: "view-from-wall", titleEn: "View From The Wall", titleCn: "壁上观", year: 2024, category: "single", duration: "3:50", youtubeId: "Lge5XhVl9Fc" },
11
+ { id: "ru-sha", titleEn: "Ru Sha", titleCn: "如纱", year: 2024, category: "ost", duration: "3:42", youtubeId: "lzDP2MfP3eA", work: "Sword and Fairy 4", role: "Character theme for Han Lingsha (韩菱纱)", description: "Character theme for Han Lingsha (韩菱纱) in Sword and Fairy 4" },
12
+ { id: "stay-with-me", titleEn: "Stay With Me", titleCn: "伴", year: 2024, category: "ost", duration: "3:30", youtubeId: "N7pWFylNQDM", work: "I Want to Go Against the Wind" },
13
+ { id: "wu-chang-sheng", titleEn: "Longevity By Mistake", titleCn: "误长生", year: 2023, category: "ost", duration: "3:50", youtubeId: "GSZqFPkBMws", work: "Beauty of Resilience" },
14
+ { id: "reng-xun", titleEn: "Still Searching", titleCn: "仍寻", year: 2023, category: "ost", duration: "5:01", youtubeId: "nsTL6g_UOqE", work: "Beauty of Resilience" },
15
+ { id: "dew-before-dawn", titleEn: "Dew Before Dawn (Dewdrops)", titleCn: "露珠在晨曦前消散", year: 2026, category: "ost", duration: "4:42", youtubeId: "D-vEPdasbLo", work: "Veil of Shadows", aliases: ["Dewdrops", "Dewdrops Dissipate Before Dawn", "Dew Before Dawn", "露珠在晨曦前消散"] },
16
+ { id: "tu-hei-su", titleEn: "Melatonin", titleCn: "褪黑素", year: 2024, category: "stage", duration: "3:22", youtubeId: "1t0E5bVqGIQ" },
17
+ { id: "you-shan-lian", titleEn: "You Shan Lian", titleCn: "游山恋", year: 2024, category: "stage", duration: "4:06", youtubeId: "ZaGQuDsN0pc" },
18
+ { id: "mo-nu-da-mao-xian", titleEn: "The Witch's Great Adventure", titleCn: "魔女大冒险", year: 2024, category: "stage", duration: "5:59", youtubeId: "rzn_nqmBV-M" },
19
+ { id: "ke-ai-jiu-wei", titleEn: "Cuteness, In Position!", titleCn: "可爱就位!", year: 2024, category: "stage", duration: "5:59", youtubeId: "rzn_nqmBV-M" },
20
+ { id: "yin-ni-xin-dong", titleEn: "Heartbeat For You", titleCn: "音你心动", year: 2024, category: "stage", duration: "5:59", youtubeId: "rzn_nqmBV-M" },
21
+ { id: "sakura", titleEn: "SAKURA", titleCn: "SAKURA", year: 2023, category: "single", duration: "3:28", youtubeId: "QAMohoC80JM" },
22
+ { id: "call-me-queen", titleEn: "Call Me Queen", titleCn: "女王殿下", year: 2023, category: "single", duration: "3:20", youtubeId: "aIGC1motnfw" },
23
+ { id: "0.2s", titleEn: "0.2s", titleCn: "0.2s", year: 2022, category: "single", duration: "3:12", youtubeId: "N0yV3DgE_Z4", aliases: ["0.2s", "0.2秒", "0.2 seconds", "0.2s MV"] },
24
+ { id: "mo-li", titleEn: "Mo Li", titleCn: "莫离", year: 2021, category: "ost", duration: "3:45", youtubeId: "7VSAArsR-go", work: "Rebirth for You" },
25
+ { id: "past-perfect", titleEn: "Past Perfect", titleCn: "过去完成时", year: 2021, category: "ost", duration: "3:58", youtubeId: "GzmxD3P1o9Y", work: "Love Under the Full Moon" },
26
+ { id: "zhuo-guang-qu", titleEn: "Zhuo Guang Qu", titleCn: "琢光曲", year: 2020, category: "ost", duration: "3:40", youtubeId: "JNAbdAxiG9E", work: "In a Class of Her Own" },
27
+ { id: "fu-rong", titleEn: "Fu Rong", titleCn: "芙蓉", year: 2020, category: "ost", duration: "3:48", youtubeId: "9ke3efb9U7A", work: "The Blooms at Ruyi Pavilion" },
28
+ { id: "ancient-painting", titleEn: "Ancient Painting", titleCn: "古画", year: 2020, category: "ost", duration: "3:52", youtubeId: "a_sbpY2_buI", work: "The Blooms at Ruyi Pavilion" },
29
+ { id: "thousand-years", titleEn: "A Millennium's Wait", titleCn: "千年等一回", year: 2019, category: "ost", duration: "4:05", youtubeId: "-vf6jU96WI4", work: "The Legend of White Snake" },
30
+ { id: "du-qing", titleEn: "Du Qing", titleCn: "渡情", year: 2019, category: "ost", duration: "3:30", youtubeId: "1dmp3hUhVBI", work: "The Legend of White Snake" },
31
+ { id: "qing-cheng-shan-xia", titleEn: "Bai Suzhen under Mount Qingcheng", titleCn: "青城山下白素贞", year: 2019, category: "ost", duration: "3:22", youtubeId: "wVZbHrI0q24", work: "The Legend of White Snake" },
32
+ { id: "love-emergency", titleEn: "Love Emergency", titleCn: "恋爱告急", year: 2019, category: "single", duration: "3:35", youtubeId: "5MLPdCmnlmE" },
33
+ { id: "tan-yun-xi", titleEn: "Sigh of Yunxi", titleCn: "叹云兮", year: 2018, category: "ost", duration: "3:50", youtubeId: "oEgxqij58LQ", work: "Legend of Yunxi" },
34
+ { id: "falling-flowers", titleEn: "Falling Flowers", titleCn: "落花成泥", year: 2018, category: "ost", duration: "3:42", youtubeId: "cWibu5ISTyw", work: "Legend of Yunxi" },
35
+ { id: "hong-zhao-yuan", titleEn: "Hong Zhao Yuan", titleCn: "红昭愿", year: 2018, category: "stage", duration: "3:30", youtubeId: "6gFUB9eDFD0" },
36
+ { id: "everyday", titleEn: "Everyday", titleCn: "每一天", year: 2016, category: "single", duration: "3:30", youtubeId: "kfihNAtWBaU" },
37
+ { id: "drunk-fei-shuang", titleEn: "Drunk Fei Shuang", titleCn: "醉飞霜", year: 2016, category: "ost", duration: "4:00", youtubeId: "VTyNNuUsKzM", work: "Novoland: The Castle in the Sky" }
38
+ ];
39
+
40
+ export const musicVideos = [
41
+ { id: "mv-find-the-way", titleEn: "FIND THE WAY MV", titleCn: "FIND THE WAY", year: 2026, category: "Official MV", youtubeId: "9AeErG03SZw", duration: "3:30" },
42
+ { id: "mv-not-suffering", titleEn: "Not Suffering MV", titleCn: "不苦", year: 2026, category: "OST MV", youtubeId: "DafSXZZo9AI", duration: "3:50", work: "Veil of Shadows" },
43
+ { id: "mv-rain-love", titleEn: "Yu Ai (Rain Love) Stage", titleCn: "雨爱", year: 2026, category: "Stage Performance", youtubeId: "OMLpNyp8T7Q", duration: "4:15" },
44
+ { id: "mv-set-fire", titleEn: "Set Fire to the Silent World MV", titleCn: "着火的沉默世界", year: 2026, category: "OST MV", youtubeId: "7FXGhAmHIAo", duration: "3:55", work: "Wanhua Sin" },
45
+ { id: "mv-rosa", titleEn: "Rosa MV", titleCn: "Rosa", year: 2025, category: "Official MV", youtubeId: "jZDzOLbd9OU", duration: "3:20" },
46
+ { id: "mv-fall", titleEn: "Fall MV", titleCn: "落", year: 2024, category: "Official MV", youtubeId: "8Nh4ZPhYKEc", duration: "3:36" },
47
+ { id: "mv-ru-sha", titleEn: "Ru Sha MV", titleCn: "如纱", year: 2024, category: "OST MV", youtubeId: "lzDP2MfP3eA", duration: "3:42", work: "Sword and Fairy 4" },
48
+ { id: "mv-tu-hei-su", titleEn: "Melatonin NYE Gala Stage", titleCn: "褪黑素", year: 2024, category: "Stage Performance", youtubeId: "1t0E5bVqGIQ", duration: "3:22" },
49
+ { id: "mv-you-shan-lian", titleEn: "You Shan Lian Spring Gala Stage", titleCn: "游山恋", year: 2024, category: "Stage Performance", youtubeId: "ZaGQuDsN0pc", duration: "4:06" },
50
+ { id: "mv-hok-9th-medley", titleEn: "HoK 9th Anniversary Medley Stage", titleCn: "魔女大冒险/可爱就位!/音你心动", year: 2024, category: "Stage Performance", youtubeId: "rzn_nqmBV-M", duration: "5:59" },
51
+ { id: "mv-tan-yun-xi", titleEn: "Sigh of Yunxi OST", titleCn: "叹云兮", year: 2018, category: "OST MV", youtubeId: "oEgxqij58LQ", duration: "3:50", work: "Legend of Yunxi" },
52
+ { id: "mv-love-emergency", titleEn: "Love Emergency MV", titleCn: "恋爱告急", year: 2019, category: "Official MV", youtubeId: "5MLPdCmnlmE", duration: "3:35" },
53
+ { id: "mv-dew-before-dawn", titleEn: "Dewdrops Dissipate Before Dawn MV", titleCn: "露珠在晨曦前消散", year: 2026, category: "OST MV", youtubeId: "D-vEPdasbLo", duration: "4:42", work: "Veil of Shadows", aliases: ["Dewdrops", "露珠在晨曦前消散"] },
54
+ { id: "mv-0.2s", titleEn: "0.2s MV", titleCn: "0.2s", year: 2022, category: "Official MV", youtubeId: "N0yV3DgE_Z4", duration: "3:12", aliases: ["0.2s", "0.2秒"] },
55
+ { id: "mv-everyday", titleEn: "Everyday MV", titleCn: "每一天", year: 2016, category: "Official MV", youtubeId: "kfihNAtWBaU", duration: "3:30" }
56
+ ];
@@ -1,4 +1,13 @@
1
1
  export const galleryData = [
2
+ {
3
+ "id": "gal-lafang-douyin-live-2026",
4
+ "titleEn": "Lafang Douyin Live Stream: Flower Fairy Look in Tony Ward 2026 Haute Couture",
5
+ "titleCn": "拉芳品牌抖音直播 · 花仙子造型",
6
+ "category": "commercial-brand",
7
+ "era": "2026",
8
+ "image": "/images/008ET7Legy1ig9s8bab6sj30i20o7go1.jpg",
9
+ "description": "Lafang Douyin live stream on Sep 12, 2026: Ju Jingyi stunned as 'Flower Fairy' in Tony Ward 2026 pink gown. Reached 130,000+ peak concurrent viewers, 10,000+ orders, millions in GMV, and went viral with Sichuan dialect catchphrases 'An Yi' and 'Ba Si'."
10
+ },
2
11
  {
3
12
  "id": "gal-port-desert-flower",
4
13
  "titleEn": "PORT Magazine September Issue Cover: Flower of the Desert",
@@ -5,3 +5,4 @@ export { galleryData, galleryCategories } from './gallery.js';
5
5
  export { timelineData } from './timeline.js';
6
6
  export { awardsData } from './awards.js';
7
7
  export { brandsData } from './brands.js';
8
+ export { industryIndexData, platformsCatalog, artistIndustryMetrics, categoryDefinitions } from './industryIndex.js';
@@ -0,0 +1,251 @@
1
+ export const categoryDefinitions = [
2
+ {
3
+ id: 'actor_drama_index',
4
+ name: 'Actor & Drama Index Platforms',
5
+ nameCn: '演员与剧集热度指数平台',
6
+ description: 'Platforms tracking daily actor popularity, media index, and drama prosperity indices.',
7
+ platforms: ['vlinkage', 'datawin', 'guduo']
8
+ },
9
+ {
10
+ id: 'streaming_boxoffice',
11
+ name: 'Real Streaming & Box Office Platforms',
12
+ nameCn: '正片播放量与流媒体专业数据平台',
13
+ description: 'Industry benchmark platforms for verified effective streaming views and real-time broadcast heat.',
14
+ platforms: ['yunhe', 'maoyan', 'dengta']
15
+ },
16
+ {
17
+ id: 'social_commercial',
18
+ name: 'Social Buzz & Commercial Value Platforms',
19
+ nameCn: '社交舆情与商业价值平台',
20
+ description: 'Platforms measuring social discussions, critical reviews, fashion aesthetics, and seed-to-shop conversion.',
21
+ platforms: ['weibo', 'douban', 'xiaohongshu']
22
+ }
23
+ ];
24
+
25
+ export const platformsCatalog = [
26
+ {
27
+ id: 'vlinkage',
28
+ nameCn: '纬岭数据',
29
+ nameEn: 'Vlinkage',
30
+ category: 'actor_drama_index',
31
+ website: 'http://www.vlinkage.com/',
32
+ officialDomain: 'vlinkage.com',
33
+ industryRole: 'Daily ranking authority for New Media Artist Index and Web Drama Index.',
34
+ coreMetrics: [
35
+ 'New Media Artist Index (0.0 - 10.0 scale, 9.0+ denotes phenomenon hit status)',
36
+ 'Web Drama Index (calculated from video views, Baidu index, Weibo activity, and press coverage)'
37
+ ],
38
+ kikuHighlights: [
39
+ 'Ju Jingyi achieved a peak Vlinkage Artist Index of 9.05+ during In Blossom (2024).',
40
+ 'Consistently ranks in Top 3 Chinese drama actresses during broadcast windows.'
41
+ ]
42
+ },
43
+ {
44
+ id: 'datawin',
45
+ nameCn: '德塔文科技',
46
+ nameEn: 'DataWin',
47
+ category: 'actor_drama_index',
48
+ website: 'https://www.datawin.com/',
49
+ officialDomain: 'datawin.com',
50
+ industryRole: 'Authoritative evaluation of Drama Prosperity Index (景气指数) and Character Contribution Rate.',
51
+ coreMetrics: [
52
+ 'Drama Prosperity Index (0.0 - 3.0 scale, 2.0+ denotes nationwide explosive hit)',
53
+ 'Character Contribution Rate (%) measuring individual actor influence on project success'
54
+ ],
55
+ kikuHighlights: [
56
+ 'In Blossom achieved a peak DataWin Prosperity Index of 2.204.',
57
+ 'Ju Jingyi held over 42% Character Contribution Rate for Yang Caiwei / Pan Yue in In Blossom.'
58
+ ]
59
+ },
60
+ {
61
+ id: 'guduo',
62
+ nameCn: '骨朵数据',
63
+ nameEn: 'Guduo Data',
64
+ category: 'actor_drama_index',
65
+ website: 'http://guduodata.com/',
66
+ officialDomain: 'guduodata.com',
67
+ industryRole: 'Comprehensive multi-platform big data analytics across Tencent, iQIYI, Youku, and Mango TV.',
68
+ coreMetrics: [
69
+ 'Guduo Network Drama Heat Index (0 - 100 composite score)',
70
+ 'Artist Influence & Cross-Platform Hit Index'
71
+ ],
72
+ kikuHighlights: [
73
+ 'In Blossom and Sword and Fairy 4 both reached #1 on Guduo Network Drama Heat Index.'
74
+ ]
75
+ },
76
+ {
77
+ id: 'yunhe',
78
+ nameCn: '云合数据',
79
+ nameEn: 'Yunhe Data (Enlightent)',
80
+ category: 'streaming_boxoffice',
81
+ website: 'https://www.enlightent.cn/',
82
+ officialDomain: 'enlightent.cn',
83
+ industryRole: 'Industry gold standard for verified, de-duplicated full-feature Effective Streaming Views (正片有效播放).',
84
+ coreMetrics: [
85
+ 'Effective Views (正片有效播放): filters loop plays, trailers, and clips',
86
+ 'Market Share (市占率 %): proportion against all concurrently streaming dramas',
87
+ 'V30 metric: 30-day cumulative verified views'
88
+ ],
89
+ kikuHighlights: [
90
+ 'In Blossom captured over 15.8% Yunhe daily market share, dominating daily drama charts.',
91
+ 'Legend of Yunxi accumulated over 4.5B+ long-tail effective streaming views.'
92
+ ]
93
+ },
94
+ {
95
+ id: 'maoyan',
96
+ nameCn: '猫眼专业版',
97
+ nameEn: 'Maoyan Pro',
98
+ category: 'streaming_boxoffice',
99
+ website: 'https://pro.maoyan.com/',
100
+ officialDomain: 'pro.maoyan.com',
101
+ industryRole: 'Real-time box office, web drama streaming heatmap, and industry performance barometer.',
102
+ coreMetrics: [
103
+ 'Maoyan Real-Time Heat Index (9,000+ indicates high popularity, 9,500+ top tier)',
104
+ 'Daily Web Drama Champion count'
105
+ ],
106
+ kikuHighlights: [
107
+ 'In Blossom logged multiple daily champion titles with heat breaking 9,820 on Maoyan Pro.',
108
+ 'Sword and Fairy 4 debuted at #1 on Maoyan period drama heat index.'
109
+ ]
110
+ },
111
+ {
112
+ id: 'dengta',
113
+ nameCn: '灯塔专业版',
114
+ nameEn: 'Dengta Pro (Beacon)',
115
+ category: 'streaming_boxoffice',
116
+ website: 'https://dengta.cn/',
117
+ officialDomain: 'dengta.cn',
118
+ industryRole: 'Alibaba Pictures big data engine analyzing audience demographics, reach, and broadcast heat.',
119
+ coreMetrics: [
120
+ 'Real-Time Broadcast Heat',
121
+ 'Audience Demographics (age, gender, regional distribution)',
122
+ 'Media Reach Index'
123
+ ],
124
+ kikuHighlights: [
125
+ 'Audience profiling shows strong resonance with Gen Z and millennial demographics (18-35).',
126
+ 'Consistently ranks in Dengta Top 3 broadcast charts for Youku/iQIYI releases.'
127
+ ]
128
+ },
129
+ {
130
+ id: 'weibo',
131
+ nameCn: '微博热搜与超话',
132
+ nameEn: 'Weibo Hot Search & Chaohua',
133
+ category: 'social_commercial',
134
+ website: 'https://weibo.com/',
135
+ officialDomain: 'weibo.com',
136
+ industryRole: 'Epicenter of Chinese entertainment social buzz, trending topics, and superfan fandom power.',
137
+ coreMetrics: [
138
+ 'Hot Search Rankings (General and Entertainment charts)',
139
+ 'Super Topic (超话) reading and discussion volume (tens of billions scale)',
140
+ 'Weibo Engagement Index (reposts, comments, likes)'
141
+ ],
142
+ kikuHighlights: [
143
+ 'Over 120 billion reads across Ju Jingyi topic hashtags (#鞠婧祎# and drama roles).',
144
+ 'Red carpet and fashion looks regularly trend in Weibo Hot Search Top 5 within minutes.'
145
+ ]
146
+ },
147
+ {
148
+ id: 'douban',
149
+ nameCn: '豆瓣',
150
+ nameEn: 'Douban',
151
+ category: 'social_commercial',
152
+ website: 'https://www.douban.com/',
153
+ officialDomain: 'douban.com',
154
+ industryRole: 'China’s most influential and critical film/drama community reflecting audience word-of-mouth.',
155
+ coreMetrics: [
156
+ 'Douban Rating (0.0 - 10.0 scale)',
157
+ 'Rating Count (scale of mass reach and engagement)',
158
+ 'Score Distribution (1 to 5 star rating curve)'
159
+ ],
160
+ kikuHighlights: [
161
+ 'Legend of Yunxi and The Bloom in Ruyi Pavilion garnered extensive discussion and strong romance chemistry praise.',
162
+ 'Active community engagement on acting evolution and period styling.'
163
+ ]
164
+ },
165
+ {
166
+ id: 'xiaohongshu',
167
+ nameCn: '小红书',
168
+ nameEn: 'Xiaohongshu (RED)',
169
+ category: 'social_commercial',
170
+ website: 'https://www.xiaohongshu.com/',
171
+ officialDomain: 'xiaohongshu.com',
172
+ industryRole: 'Premier fashion, beauty aesthetic, lifestyle virality, and commercial seed-to-shop (种草) engine.',
173
+ coreMetrics: [
174
+ 'Viral Note Ratio (makeup tutorials, outfit breakdowns)',
175
+ 'Seed-to-Shop Commercial Conversion Rate',
176
+ 'Aesthetic Trend Keywords ("鞠式美学" Kiku Aesthetic, "鞠婧祎同款")'
177
+ ],
178
+ kikuHighlights: [
179
+ 'Originator of the pan-Asian viral trend "鞠式美学" (Kiku Aesthetic) with over 1M+ user notes.',
180
+ 'High commercial sell-out power drives global endorsements (Maybelline, Bobbi Brown, Laneige).'
181
+ ]
182
+ }
183
+ ];
184
+
185
+ export const artistIndustryMetrics = {
186
+ artist: {
187
+ nameCn: '鞠婧祎',
188
+ nameEn: 'Ju Jingyi',
189
+ tier: 'Top-Tier Female Solo Artist & Leading Actress',
190
+ coreStrengths: [
191
+ 'Aesthetic Trendsetter (Pan-Asian "鞠式美学" phenomenon)',
192
+ 'Loyal fandom with high purchasing power and continuous engagement',
193
+ 'Proven multi-billion streaming viewership and consistent top index rankings'
194
+ ]
195
+ },
196
+ dramaBenchmarks: [
197
+ {
198
+ titleCn: '花间令',
199
+ titleEn: 'In Blossom',
200
+ year: 2024,
201
+ platform: 'Youku',
202
+ dataWinProsperity: '2.204 (Explosive Hit Tier)',
203
+ vlinkageArtistIndex: '9.05 (Peak Rank #1)',
204
+ yunheMarketShare: '15.8% (Daily Streaming Champion)',
205
+ maoyanHeatPeak: '9,820 (Daily Record)',
206
+ weiboHashtagReads: '3.8B+'
207
+ },
208
+ {
209
+ titleCn: '芸汐传',
210
+ titleEn: 'Legend of Yunxi',
211
+ year: 2018,
212
+ platform: 'iQIYI',
213
+ dataWinProsperity: '1.95+ (Breakthrough Hit)',
214
+ vlinkageArtistIndex: '8.92',
215
+ effectiveViews: '4.5B+ cumulative streaming views'
216
+ },
217
+ {
218
+ titleCn: '仙剑四',
219
+ titleEn: 'Sword and Fairy 4',
220
+ year: 2024,
221
+ platform: 'iQIYI',
222
+ dataWinProsperity: '1.88+',
223
+ vlinkageArtistIndex: '8.86',
224
+ guduoHeatIndex: '#1 Web Drama',
225
+ maoyanHeatPeak: '9,200+'
226
+ },
227
+ {
228
+ titleCn: '嘉南传',
229
+ titleEn: 'Rebirth For You',
230
+ year: 2021,
231
+ platform: 'Tencent Video / WeTV',
232
+ vlinkageArtistIndex: '8.75',
233
+ weiboHotSearchTimes: '180+'
234
+ }
235
+ ],
236
+ socialBuzzOverview: {
237
+ weiboTotalTopicReads: '120B+',
238
+ weiboFollowers: '27M+',
239
+ douyinTopicReads: '30B+ plays',
240
+ redAestheticNotes: '1,000,000+ notes',
241
+ commercialEndorsementsTotal: '30+'
242
+ }
243
+ };
244
+
245
+ export const industryIndexData = {
246
+ categoryDefinitions,
247
+ platformsCatalog,
248
+ artistIndustryMetrics
249
+ };
250
+
251
+ export default industryIndexData;
@@ -65,10 +65,10 @@ export const profileData = {
65
65
  { textCn: "我想成为那种,不管在什么环境下都能发光的人", textEn: "I want to be the kind of person who shines in any environment.", tag: "mindset" },
66
66
  ],
67
67
  socialMedia: {
68
- weibo: "https://weibo.com/jujingyi",
69
- douyin: "https://www.douyin.com/user/jujingyi",
70
- instagram: "https://www.instagram.com/jujingyi_official",
71
- bilibili: "https://space.bilibili.com/jujingyi",
72
- youtube: "https://www.youtube.com/@jujingyi",
68
+ weibo: "https://weibo.com/u/3669102477",
69
+ douyin: "https://www.douyin.com/user/MS4wLjABAAAACV5Em110SiusElwKlIpUd-MRSi8rBYyg0NfpPrqZmykHY8wLPQ8O4pv3wPL6A-oz",
70
+ instagram: "https://www.instagram.com/jujingyi_kikuuu",
71
+ bilibili: "https://search.bilibili.com/all?keyword=%E9%9E%A0%E5%A9%A7%E7%A5%8E&from_source=websuggest_search&spm_id_from=333.1387&search_source=5",
72
+ youtube: "https://www.youtube.com/results?search_query=%E9%9E%A0%E5%A9%A7%E7%A5%8E",
73
73
  },
74
74
  };
@@ -3,7 +3,7 @@ export const timelineData = [
3
3
  { id: "fame-2014", year: 2014, title: "4th Place General Election & '4000-Year Idol'", titleCn: "总选举第4名·4000年偶像", era: "SNH48 Era", summary: "4th place in 1st General Election. Japanese media dubbed her 'idol who appears once in 4000 years' (中国4000年一遇偶像) — viral across Asia." },
4
4
  { id: "senbatsu-2015", year: 2015, title: "2nd Place General Election & Seine River Unit", titleCn: "总选举亚军·塞纳河组合", era: "SNH48 Era", summary: "Runner-up in 2nd General Election. Member of Seine River (塞纳河) performance unit." },
5
5
  { id: "election-2016", year: 2016, title: "1st General Election Champion", titleCn: "总选举冠军", era: "SNH48 Era", summary: "Won 1st place in SNH48 3rd General Election, becoming center. First of two consecutive championships." },
6
- { id: "election-2017", year: 2017, title: "2nd Consecutive Champion & Star Hall of Fame", titleCn: "蝉联冠军·星殿堂", era: "SNH48 Era", summary: "Won 1st place again (2nd consecutive). Inducted into SNH48 Star Hall of Fame. Graduated December 15, 2017." },
6
+ { id: "election-2017", year: 2017, date: "December 15, 2017", title: "2nd Consecutive Champion & Star Hall of Fame", titleCn: "蝉联冠军·星殿堂", era: "SNH48 Era", summary: "Won 1st place again (2nd consecutive). Inducted into SNH48 Star Hall of Fame. Graduated December 15, 2017." },
7
7
  { id: "fallen-flowers-2017", year: 2017, title: "The Fallen Flowers (热血长安)", titleCn: "热血长安", era: "Solo Career", summary: "First major acting role after SNH48 graduation. Historical mystery drama on Youku as Shangguan Wan'er." },
8
8
  { id: "yunxi-2018", year: 2018, title: "Acting Breakthrough — Legend of Yunxi", titleCn: "芸汐传·演技突破", era: "Solo Career", summary: "Lead role in Legend of Yunxi (芸汐传). Breakthrough as solo actress. Won Breakthrough Actress at Weibo TV & Video Summit." },
9
9
  { id: "white-snake-2019", year: 2019, title: "The Legend of White Snake & Please Give Me Wings", titleCn: "新白娘子传奇·请赐我一双翅膀", era: "Solo Career", summary: "Starred as Bai Suzhen in classic remake. Also appeared in modern crime thriller. Won Drama Actress of the Year." },
@@ -12,5 +12,5 @@ export const timelineData = [
12
12
  { id: "resilience-2023", year: 2023, title: "Beauty of Resilience & Influential Figure", titleCn: "花戎·影响力人物", era: "Solo Career", summary: "Xianxia drama Beauty of Resilience with triple-role performance. Won Influential Figure of the Year at Weibo Night." },
13
13
  { id: "blossom-2024", year: 2024, title: "In Blossom & Sword and Fairy 4", titleCn: "花间令·仙剑四", era: "Solo Career", summary: "Played Yang Caiwei's identity in Shangguan Zhi's appearance in In Blossom (花间令), rather than two independent characters throughout the story, and Han Lingsha in Sword and Fairy 4 (仙剑四)." },
14
14
  { id: "brand-2025", year: 2025, title: "Mega Brand Deals & International Expansion", titleCn: "国际品牌代言扩张", era: "Present", summary: "Global brand ambassador roles across luxury and fashion brands. International presence expansion. Solo singles Rosa and Sleepless Sunset released." },
15
- { id: "2026-present", year: 2026, title: "Veil of Shadows, Eternal Fragrance, Wanhua Sin & FIND THE WAY", titleCn: "月鳞绮纪·千香·万花世界·FIND THE WAY", era: "Present", summary: "Multiple major 2026 projects: Veil of Shadows (Youku #1), The Eternal Fragrance (Youku S+), Wanhua Sin, solo single FIND THE WAY, special stage Yu Ai (Rain Love). PRSR Global Brand Ambassador debut at Milan Fashion Week." },
15
+ { id: "2026-present", year: 2026, title: "Veil of Shadows, Eternal Fragrance, Lafang Live & FIND THE WAY", titleCn: "月鳞绮纪·千香·拉芳直播·FIND THE WAY", era: "Present", summary: "Multiple major 2026 projects: Veil of Shadows (Youku #1), The Eternal Fragrance (Youku S+), Lafang Douyin live stream (130k+ peak viewers, Tony Ward 2026 pink dress), solo single FIND THE WAY, and PRSR Global Brand Ambassador debut at Milan Fashion Week." },
16
16
  ];
@@ -20,7 +20,7 @@ export const worksData = [
20
20
  category: "fantasy-drama", role: "Lead Role", platform: "TBA",
21
21
  synopsis: "Upcoming fantasy epic under Ju Jingyi Studio. Promo OST: 'Set Fire to the Silent World' (着火的沉默世界).",
22
22
  themeSong: { titleEn: "Set Fire to the Silent World", titleCn: "着火的沉默世界", youtubeId: "7FXGhAmHIAo" },
23
- featured: true, highlights: ["Major fantasy production under Ju Jingyi Studio", "Lead promotional single 'Set Fire to the Silent World'"],
23
+ featured: true, highlights: ["Major fantasy production under Ju Jingyi Studio", "Lead promotional single 'Set Fire to the Silent World'", "Viral September 2026 on-set footage featuring the iconic proposal rejection ring slap scene"],
24
24
  },
25
25
  {
26
26
  id: "lets-fight-upcoming", alias: "lets-fight", titleEn: "Let's Fight", titleCn: "来战", year: 2026,
@@ -55,7 +55,7 @@ export const worksData = [
55
55
  category: "xianxia-drama", role: "Wei Zhi / Sima Wangyue / A Ya (魏枝 / 司马忘月 / 阿涯)",
56
56
  roleCn: "魏枝 / 司马忘月 / 阿涯", episodes: 36, rating: "8.9/10", platform: "iQIYI",
57
57
  synopsis: "Xianxia romance. Wei Zhi, a servant girl deemed unlucky, is actually the reincarnation of the Phoenix. She meets Yan Yue, a sun god disguised as her master.",
58
- themeSong: { titleEn: "Thoughts of Joy", titleCn: "念思凡", youtubeId: "D-vEPdasbLo" },
58
+ themeSong: { titleEn: "Longevity By Mistake", titleCn: "误长生", youtubeId: "GSZqFPkBMws" },
59
59
  highlights: ["Triple-role performance across 3 lifetimes", "8,500+ popularity index on iQIYI in first week"],
60
60
  },
61
61
  {
@@ -44,8 +44,6 @@ export async function handleMcpHttp(req, res) {
44
44
  if (!rate.allowed) return sendJson(res, 429, { error: rate.error }, { 'Retry-After': '60' });
45
45
  res.setHeader('X-RateLimit-Remaining', String(rate.remaining));
46
46
 
47
- // Privileged MCP tools (filesystem, secrets, skill management) are only reachable
48
- // when the server has MCP_API_KEY configured AND this request carries the matching key.
49
47
  const authorized = !!process.env.MCP_API_KEY && validateApiKey(req).valid;
50
48
  const server = createMcpServer({ transport: 'http', authorized });
51
49
  const transport = new StreamableHTTPServerTransport({
@@ -50,6 +50,21 @@ export const promptDefinitions = [
50
50
  { name: 'era_b', description: 'Second era (e.g. "modern", "solo")', required: false },
51
51
  ],
52
52
  },
53
+ {
54
+ name: 'investigate_viral_claim',
55
+ description: 'Investigate a viral claim, set leak, casting rumor, or news report about Ju Jingyi using multi-tool evidence and catalog cross-referencing.',
56
+ arguments: [
57
+ { name: 'claim', description: 'The viral rumor, set leak, or statement to investigate (e.g. "Ju Jingyi slapped away proposal ring on set in Wan Hua Shi Jie")', required: true },
58
+ { name: 'platform_hint', description: 'Optional platform where the claim went viral (e.g. "weibo", "douyin", "baidu", "sohu")', required: false },
59
+ ],
60
+ },
61
+ {
62
+ name: 'deep_research_topic',
63
+ description: 'Perform an exhaustive deep research investigation on any Ju Jingyi entertainment topic across catalog, live Chinese media, news, and images.',
64
+ arguments: [
65
+ { name: 'topic', description: 'The topic, milestone, or controversy to research in depth', required: true },
66
+ ],
67
+ },
53
68
  ];
54
69
 
55
70
  function recommendSeries({ mood, genre } = {}) {
@@ -122,7 +137,7 @@ function careerOverview() {
122
137
 
123
138
  for (const [era, events] of Object.entries(eras)) {
124
139
  overview += `### ${era}\n`;
125
- for (const e of events.sort((a, b) => a.year - b.year)) {
140
+ for (const e of [...events].sort((a, b) => a.year - b.year)) {
126
141
  overview += `- **${e.year}**: ${e.title} (${e.titleCn}) — ${e.summary}\n`;
127
142
  }
128
143
  overview += '\n';
@@ -209,7 +224,30 @@ function compareDiscographyEra({ era_a, era_b } = {}) {
209
224
  return { messages: [{ role: 'user', content: { type: 'text', text } }] };
210
225
  }
211
226
 
212
- // ── Dispatch ──
227
+ function investigateViralClaim({ claim, platform_hint } = {}) {
228
+ const text = `# Ju Jingyi Investigation Directive: "${claim || 'Entertainment Claim'}"
229
+ ${platform_hint ? `Platform Context: ${platform_hint}\n` : ''}
230
+ Execute a comprehensive multi-angle investigation:
231
+ 1. **Catalog Check:** Use \`search_works\` and \`get_character_roles\` to check if this relates to a filmed drama scene or official character identity.
232
+ 2. **Web & Article Ingestion:** Call \`search_chinese_web\` and \`web_extract\` to find primary Chinese entertainment reports (Sohu, Sina, Weibo).
233
+ 3. **Visual Media & Image Evidence:** Call \`search_web_images\` to locate on-set stills, CDN photos, and visual proofs.
234
+ 4. **Social & Industry Buzz:** Call \`get_entertainment_metrics\` if trending on Weibo/Douyin/Vlinkage.
235
+ 5. **Synthesis & Verdict:** Provide a clear status: VERIFIED (specifying if it is an in-character performance), UNVERIFIED, CONFLICTING, or FALSE, citing complete full URLs without truncation.`;
236
+
237
+ return { messages: [{ role: 'user', content: { type: 'text', text } }] };
238
+ }
239
+
240
+ function deepResearchTopic({ topic } = {}) {
241
+ const text = `# Ju Jingyi Deep Research Protocol: "${topic || 'General Topic'}"
242
+
243
+ Execute a 360-degree investigation across all authorized tools:
244
+ 1. Query official catalog tools (\`global_search\`, \`search_works\`, \`search_discography\`, \`get_profile_and_fandom\`).
245
+ 2. Fetch live web intelligence (\`search_chinese_web\`, \`search_news\`, \`search_encyclopedia\`).
246
+ 3. Retrieve visual media proofs (\`search_web_images\`, \`get_gallery_photos\`).
247
+ 4. Cross-corroborate findings and synthesize a structured, cited report with complete URLs.`;
248
+
249
+ return { messages: [{ role: 'user', content: { type: 'text', text } }] };
250
+ }
213
251
 
214
252
  const promptHandlers = {
215
253
  recommend_series: recommendSeries,
@@ -219,6 +257,8 @@ const promptHandlers = {
219
257
  draft_fan_fiction: draftFanFiction,
220
258
  analyze_drama_rating: analyzeDramaRating,
221
259
  compare_discography_era: compareDiscographyEra,
260
+ investigate_viral_claim: investigateViralClaim,
261
+ deep_research_topic: deepResearchTopic,
222
262
  };
223
263
 
224
264
  export async function getPrompt(name, args = {}) {
@@ -1,4 +1,4 @@
1
- import { profileData, worksData, discographyData, awardsData, timelineData, brandsData } from './data/index.js';
1
+ import { profileData, worksData, discographyData, awardsData, timelineData, brandsData, industryIndexData } from './data/index.js';
2
2
 
3
3
  export const resourceDefinitions = [
4
4
  { uri: 'kiku://bio', name: 'Ju Jingyi Biography', description: 'Full biographical profile, talents, quotes, and social media links.', mimeType: 'application/json' },
@@ -8,6 +8,7 @@ export const resourceDefinitions = [
8
8
  { uri: 'kiku://discography', name: 'Discography', description: 'Complete discography with YouTube links.', mimeType: 'application/json' },
9
9
  { uri: 'kiku://brands', name: 'Brand Endorsements', description: 'All brand endorsements and ambassadorships.', mimeType: 'application/json' },
10
10
  { uri: 'kiku://social', name: 'Social Media Links', description: 'Official social media accounts and links.', mimeType: 'application/json' },
11
+ { uri: 'kiku://industry-index', name: 'Chinese Entertainment Industry Index', description: 'Third-party big data platforms (Vlinkage, DataWin, Guduo, Yunhe, Maoyan, Dengta, Weibo, Douban, Xiaohongshu) and Ju Jingyi benchmarks.', mimeType: 'application/json' },
11
12
  ];
12
13
 
13
14
  export async function readResource(uri) {
@@ -48,6 +49,9 @@ export async function readResource(uri) {
48
49
  case 'kiku://social':
49
50
  return { contents: [{ uri, mimeType: 'application/json', text: JSON.stringify(profileData.socialMedia || {}, null, 2) }] };
50
51
 
52
+ case 'kiku://industry-index':
53
+ return { contents: [{ uri, mimeType: 'application/json', text: JSON.stringify(industryIndexData, null, 2) }] };
54
+
51
55
  default:
52
56
  throw new Error(`Unknown resource: ${uri}`);
53
57
  }