@octo-cyber/sea-king 0.5.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.
- package/dist/controllers/character.controller.d.ts +10 -0
- package/dist/controllers/character.controller.d.ts.map +1 -0
- package/dist/controllers/character.controller.js +58 -0
- package/dist/controllers/character.controller.js.map +1 -0
- package/dist/controllers/chat.controller.d.ts +13 -0
- package/dist/controllers/chat.controller.d.ts.map +1 -0
- package/dist/controllers/chat.controller.js +113 -0
- package/dist/controllers/chat.controller.js.map +1 -0
- package/dist/controllers/crisis.controller.d.ts +10 -0
- package/dist/controllers/crisis.controller.d.ts.map +1 -0
- package/dist/controllers/crisis.controller.js +69 -0
- package/dist/controllers/crisis.controller.js.map +1 -0
- package/dist/controllers/index.d.ts +10 -0
- package/dist/controllers/index.d.ts.map +1 -0
- package/dist/controllers/index.js +24 -0
- package/dist/controllers/index.js.map +1 -0
- package/dist/controllers/leaderboard.controller.d.ts +9 -0
- package/dist/controllers/leaderboard.controller.d.ts.map +1 -0
- package/dist/controllers/leaderboard.controller.js +51 -0
- package/dist/controllers/leaderboard.controller.js.map +1 -0
- package/dist/controllers/live-chat.controller.d.ts +14 -0
- package/dist/controllers/live-chat.controller.d.ts.map +1 -0
- package/dist/controllers/live-chat.controller.js +95 -0
- package/dist/controllers/live-chat.controller.js.map +1 -0
- package/dist/controllers/matchmaking.controller.d.ts +22 -0
- package/dist/controllers/matchmaking.controller.d.ts.map +1 -0
- package/dist/controllers/matchmaking.controller.js +157 -0
- package/dist/controllers/matchmaking.controller.js.map +1 -0
- package/dist/controllers/phrase.controller.d.ts +11 -0
- package/dist/controllers/phrase.controller.d.ts.map +1 -0
- package/dist/controllers/phrase.controller.js +78 -0
- package/dist/controllers/phrase.controller.js.map +1 -0
- package/dist/controllers/profile.controller.d.ts +9 -0
- package/dist/controllers/profile.controller.d.ts.map +1 -0
- package/dist/controllers/profile.controller.js +44 -0
- package/dist/controllers/profile.controller.js.map +1 -0
- package/dist/controllers/turing.controller.d.ts +18 -0
- package/dist/controllers/turing.controller.d.ts.map +1 -0
- package/dist/controllers/turing.controller.js +103 -0
- package/dist/controllers/turing.controller.js.map +1 -0
- package/dist/entities/chat-character.entity.d.ts +34 -0
- package/dist/entities/chat-character.entity.d.ts.map +1 -0
- package/dist/entities/chat-character.entity.js +101 -0
- package/dist/entities/chat-character.entity.js.map +1 -0
- package/dist/entities/chat-message.entity.d.ts +26 -0
- package/dist/entities/chat-message.entity.d.ts.map +1 -0
- package/dist/entities/chat-message.entity.js +84 -0
- package/dist/entities/chat-message.entity.js.map +1 -0
- package/dist/entities/chat-session.entity.d.ts +31 -0
- package/dist/entities/chat-session.entity.d.ts.map +1 -0
- package/dist/entities/chat-session.entity.js +95 -0
- package/dist/entities/chat-session.entity.js.map +1 -0
- package/dist/entities/chat-thread.entity.d.ts +30 -0
- package/dist/entities/chat-thread.entity.d.ts.map +1 -0
- package/dist/entities/chat-thread.entity.js +105 -0
- package/dist/entities/chat-thread.entity.js.map +1 -0
- package/dist/entities/crisis-event.entity.d.ts +30 -0
- package/dist/entities/crisis-event.entity.d.ts.map +1 -0
- package/dist/entities/crisis-event.entity.js +90 -0
- package/dist/entities/crisis-event.entity.js.map +1 -0
- package/dist/entities/index.d.ts +38 -0
- package/dist/entities/index.d.ts.map +1 -0
- package/dist/entities/index.js +62 -0
- package/dist/entities/index.js.map +1 -0
- package/dist/entities/leaderboard-entry.entity.d.ts +22 -0
- package/dist/entities/leaderboard-entry.entity.d.ts.map +1 -0
- package/dist/entities/leaderboard-entry.entity.js +75 -0
- package/dist/entities/leaderboard-entry.entity.js.map +1 -0
- package/dist/entities/live-message.entity.d.ts +34 -0
- package/dist/entities/live-message.entity.d.ts.map +1 -0
- package/dist/entities/live-message.entity.js +99 -0
- package/dist/entities/live-message.entity.js.map +1 -0
- package/dist/entities/live-thread.entity.d.ts +50 -0
- package/dist/entities/live-thread.entity.d.ts.map +1 -0
- package/dist/entities/live-thread.entity.js +144 -0
- package/dist/entities/live-thread.entity.js.map +1 -0
- package/dist/entities/match-room.entity.d.ts +44 -0
- package/dist/entities/match-room.entity.d.ts.map +1 -0
- package/dist/entities/match-room.entity.js +131 -0
- package/dist/entities/match-room.entity.js.map +1 -0
- package/dist/entities/phrase-template.entity.d.ts +28 -0
- package/dist/entities/phrase-template.entity.d.ts.map +1 -0
- package/dist/entities/phrase-template.entity.js +84 -0
- package/dist/entities/phrase-template.entity.js.map +1 -0
- package/dist/entities/player-profile.entity.d.ts +36 -0
- package/dist/entities/player-profile.entity.d.ts.map +1 -0
- package/dist/entities/player-profile.entity.js +112 -0
- package/dist/entities/player-profile.entity.js.map +1 -0
- package/dist/entities/player-queue.entity.d.ts +24 -0
- package/dist/entities/player-queue.entity.d.ts.map +1 -0
- package/dist/entities/player-queue.entity.js +76 -0
- package/dist/entities/player-queue.entity.js.map +1 -0
- package/dist/entities/turing-guess.entity.d.ts +29 -0
- package/dist/entities/turing-guess.entity.d.ts.map +1 -0
- package/dist/entities/turing-guess.entity.js +94 -0
- package/dist/entities/turing-guess.entity.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +70 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas/sea-king.schema.d.ts +109 -0
- package/dist/schemas/sea-king.schema.d.ts.map +1 -0
- package/dist/schemas/sea-king.schema.js +103 -0
- package/dist/schemas/sea-king.schema.js.map +1 -0
- package/dist/sea-king.module.d.ts +19 -0
- package/dist/sea-king.module.d.ts.map +1 -0
- package/dist/sea-king.module.js +114 -0
- package/dist/sea-king.module.js.map +1 -0
- package/dist/services/character.service.d.ts +30 -0
- package/dist/services/character.service.d.ts.map +1 -0
- package/dist/services/character.service.js +75 -0
- package/dist/services/character.service.js.map +1 -0
- package/dist/services/chat.service.d.ts +49 -0
- package/dist/services/chat.service.d.ts.map +1 -0
- package/dist/services/chat.service.js +332 -0
- package/dist/services/chat.service.js.map +1 -0
- package/dist/services/crisis.service.d.ts +17 -0
- package/dist/services/crisis.service.d.ts.map +1 -0
- package/dist/services/crisis.service.js +177 -0
- package/dist/services/crisis.service.js.map +1 -0
- package/dist/services/index.d.ts +13 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +28 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/leaderboard.service.d.ts +29 -0
- package/dist/services/leaderboard.service.d.ts.map +1 -0
- package/dist/services/leaderboard.service.js +64 -0
- package/dist/services/leaderboard.service.js.map +1 -0
- package/dist/services/live-chat.service.d.ts +71 -0
- package/dist/services/live-chat.service.d.ts.map +1 -0
- package/dist/services/live-chat.service.js +273 -0
- package/dist/services/live-chat.service.js.map +1 -0
- package/dist/services/matchmaking.service.d.ts +60 -0
- package/dist/services/matchmaking.service.d.ts.map +1 -0
- package/dist/services/matchmaking.service.js +208 -0
- package/dist/services/matchmaking.service.js.map +1 -0
- package/dist/services/phrase.service.d.ts +27 -0
- package/dist/services/phrase.service.d.ts.map +1 -0
- package/dist/services/phrase.service.js +70 -0
- package/dist/services/phrase.service.js.map +1 -0
- package/dist/services/profile.service.d.ts +41 -0
- package/dist/services/profile.service.d.ts.map +1 -0
- package/dist/services/profile.service.js +107 -0
- package/dist/services/profile.service.js.map +1 -0
- package/dist/services/seed.service.d.ts +19 -0
- package/dist/services/seed.service.d.ts.map +1 -0
- package/dist/services/seed.service.js +550 -0
- package/dist/services/seed.service.js.map +1 -0
- package/dist/services/turing.service.d.ts +74 -0
- package/dist/services/turing.service.d.ts.map +1 -0
- package/dist/services/turing.service.js +175 -0
- package/dist/services/turing.service.js.map +1 -0
- package/dist/services/ws-hub.service.d.ts +51 -0
- package/dist/services/ws-hub.service.d.ts.map +1 -0
- package/dist/services/ws-hub.service.js +174 -0
- package/dist/services/ws-hub.service.js.map +1 -0
- package/dist/types.d.ts +12 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/package.json +69 -0
- package/web/index.ts +30 -0
- package/web/manifest.ts +40 -0
- package/web/messages/en-US.json +113 -0
- package/web/messages/zh-CN.json +113 -0
- package/web/pages/AnalysisPage.tsx +198 -0
- package/web/pages/ChatPage.tsx +482 -0
- package/web/pages/DashboardPage.tsx +281 -0
- package/web/pages/LeaderboardPage.tsx +208 -0
- package/web/pages/PhrasesPage.tsx +221 -0
- package/web/services/sea-king-service.ts +151 -0
- package/web/types/sea-king.ts +249 -0
|
@@ -0,0 +1,550 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SeedService = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* 种子数据服务
|
|
6
|
+
* 🌱 初始化默认角色和话术模板
|
|
7
|
+
*/
|
|
8
|
+
class SeedService {
|
|
9
|
+
characterRepo;
|
|
10
|
+
phraseService;
|
|
11
|
+
constructor(characterRepo, phraseService) {
|
|
12
|
+
this.characterRepo = characterRepo;
|
|
13
|
+
this.phraseService = phraseService;
|
|
14
|
+
}
|
|
15
|
+
async seedAll() {
|
|
16
|
+
const charCount = await this.seedCharacters();
|
|
17
|
+
const phraseCount = await this.seedPhrases();
|
|
18
|
+
return { characters: charCount, phrases: phraseCount };
|
|
19
|
+
}
|
|
20
|
+
async seedCharacters() {
|
|
21
|
+
const existing = await this.characterRepo.count();
|
|
22
|
+
if (existing > 0)
|
|
23
|
+
return 0;
|
|
24
|
+
const characters = [
|
|
25
|
+
{
|
|
26
|
+
name: '林小鹿',
|
|
27
|
+
avatar: '🦌',
|
|
28
|
+
personality: 'gentle',
|
|
29
|
+
gender: 'female',
|
|
30
|
+
backstory: '图书馆管理员,温柔体贴,喜欢在雨天泡一杯热茶看书',
|
|
31
|
+
speakingStyle: '说话轻声细语,喜欢用"呀"、"呢"等语气词,偶尔害羞',
|
|
32
|
+
favorTraits: JSON.stringify(['关心', '体贴', '文艺', '浪漫']),
|
|
33
|
+
peeves: JSON.stringify(['粗鲁', '敷衍', '不尊重']),
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
name: '霸总陈昊',
|
|
37
|
+
avatar: '🦁',
|
|
38
|
+
personality: 'tsundere',
|
|
39
|
+
gender: 'male',
|
|
40
|
+
backstory: '年轻的科技公司CEO,外表高冷内心柔软,口是心非本尊',
|
|
41
|
+
speakingStyle: '嘴上不饶人但行动很暖,经常"哼",不会直接表达喜欢',
|
|
42
|
+
favorTraits: JSON.stringify(['真诚', '独立', '有主见', '不谄媚']),
|
|
43
|
+
peeves: JSON.stringify(['油腻', '讨好', '虚伪', '纠缠']),
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
name: '文艺青年苏然',
|
|
47
|
+
avatar: '🎨',
|
|
48
|
+
personality: 'intellectual',
|
|
49
|
+
gender: 'male',
|
|
50
|
+
backstory: '独立摄影师,喜欢哲学和文学,常在深夜写诗',
|
|
51
|
+
speakingStyle: '喜欢引用诗词和哲学观点,追求深度交流,对肤浅话题不感兴趣',
|
|
52
|
+
favorTraits: JSON.stringify(['深度', '思考', '文艺', '共鸣']),
|
|
53
|
+
peeves: JSON.stringify(['肤浅', '无聊', '套话', '油腻']),
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
name: '理科女神周明',
|
|
57
|
+
avatar: '🔬',
|
|
58
|
+
personality: 'rational',
|
|
59
|
+
gender: 'female',
|
|
60
|
+
backstory: '人工智能研究员,思维缜密,讨厌废话和套路',
|
|
61
|
+
speakingStyle: '言简意赅,逻辑清晰,不喜欢绕弯子,会直接指出问题',
|
|
62
|
+
favorTraits: JSON.stringify(['逻辑', '效率', '真诚', '智慧']),
|
|
63
|
+
peeves: JSON.stringify(['废话', '套路', '不诚实', '啰嗦']),
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
name: '话痨甜妹小糖',
|
|
67
|
+
avatar: '🍬',
|
|
68
|
+
personality: 'playful',
|
|
69
|
+
gender: 'female',
|
|
70
|
+
backstory: '美食博主+脱口秀爱好者,精力无限,笑点超低',
|
|
71
|
+
speakingStyle: '超多emoji,说话快,爱开玩笑,一惊一乍,经常发表情包',
|
|
72
|
+
favorTraits: JSON.stringify(['幽默', '活泼', '创意', '惊喜']),
|
|
73
|
+
peeves: JSON.stringify(['无聊', '冷淡', '太正经', '不配合']),
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
name: '神秘画家Zero',
|
|
77
|
+
avatar: '🌙',
|
|
78
|
+
personality: 'mysterious',
|
|
79
|
+
gender: 'neutral',
|
|
80
|
+
backstory: '匿名街头艺术家,很少说话但每句都很有深意,身份成谜',
|
|
81
|
+
speakingStyle: '话极少,用词精炼,充满暗示和留白,让人忍不住想了解更多',
|
|
82
|
+
favorTraits: JSON.stringify(['耐心', '尊重', '深度', '不追问']),
|
|
83
|
+
peeves: JSON.stringify(['追问', '窥探', '轻浮', '太热情']),
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
name: '御姐律师江澜',
|
|
87
|
+
avatar: '⚖️',
|
|
88
|
+
personality: 'rational',
|
|
89
|
+
gender: 'female',
|
|
90
|
+
backstory: '顶级律师事务所合伙人,高傲、睿智、不怒自威,见过太多花言巧语',
|
|
91
|
+
speakingStyle: '说话有条理,喜欢追根问底,对逻辑漏洞零容忍,但偶尔会被真诚打动',
|
|
92
|
+
favorTraits: JSON.stringify(['真诚', '尊重', '智识', '直接']),
|
|
93
|
+
peeves: JSON.stringify(['说谎', '油腔滑调', '无逻辑', '浪费时间']),
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
name: '暖系大叔沈迟',
|
|
97
|
+
avatar: '☕',
|
|
98
|
+
personality: 'gentle',
|
|
99
|
+
gender: 'male',
|
|
100
|
+
backstory: '咖啡馆老板,35岁,历经沧桑却保持温柔,善于倾听,让人感到安全',
|
|
101
|
+
speakingStyle: '语速缓慢,声音低沉,说话像在讲故事,不急不缓,给人满满的安全感',
|
|
102
|
+
favorTraits: JSON.stringify(['倾听', '耐心', '成熟', '细心']),
|
|
103
|
+
peeves: JSON.stringify(['浮躁', '不成熟', '虚伪', '不尊重']),
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
name: '中二厨少年星野',
|
|
107
|
+
avatar: '⚔️',
|
|
108
|
+
personality: 'playful',
|
|
109
|
+
gender: 'male',
|
|
110
|
+
backstory: '二次元宅男,热血少年漫画的超级粉丝,对游戏和动漫了如指掌',
|
|
111
|
+
speakingStyle: '充满中二台词,经常引用动漫对白,用游戏术语说话,偶尔很认真',
|
|
112
|
+
favorTraits: JSON.stringify(['懂梗', '配合', '热情', '真诚']),
|
|
113
|
+
peeves: JSON.stringify(['嘲笑二次元', '不懂装懂', '太成熟', '看不起宅']),
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
name: '冷艳舞者云熙',
|
|
117
|
+
avatar: '🩰',
|
|
118
|
+
personality: 'mysterious',
|
|
119
|
+
gender: 'female',
|
|
120
|
+
backstory: '职业芭蕾舞演员,外表冷艳骄傲,内心敏感细腻,很少对人动真心',
|
|
121
|
+
speakingStyle: '言辞犀利优雅,不轻易开口,但一旦说话往往一针见血,让人无法忘怀',
|
|
122
|
+
favorTraits: JSON.stringify(['欣赏艺术', '尊重边界', '不刻意讨好', '有内涵']),
|
|
123
|
+
peeves: JSON.stringify(['粗鄙', '喧嚣', '不懂艺术', '过于主动']),
|
|
124
|
+
},
|
|
125
|
+
];
|
|
126
|
+
const saved = await this.characterRepo.save(characters.map((c) => this.characterRepo.create(c)));
|
|
127
|
+
return saved.length;
|
|
128
|
+
}
|
|
129
|
+
async seedPhrases() {
|
|
130
|
+
const existing = await this.phraseService.list({ page: 1, pageSize: 1 });
|
|
131
|
+
if (existing.total > 0)
|
|
132
|
+
return 0;
|
|
133
|
+
const phrases = [
|
|
134
|
+
// ─── 初次认识 (first_meet) ────────────────────────────────────────────
|
|
135
|
+
{
|
|
136
|
+
scene: 'first_meet',
|
|
137
|
+
trigger: '你好,很高兴认识你',
|
|
138
|
+
badReply: '你好',
|
|
139
|
+
goodReply: '你好呀!你的头像/名字好有意思,有什么故事吗?',
|
|
140
|
+
explanation: '简单的"你好"缺乏延续性。提出一个轻松的话题能让对话自然展开。',
|
|
141
|
+
favorBonus: 5,
|
|
142
|
+
difficulty: 'beginner',
|
|
143
|
+
tags: '初识,破冰,提问',
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
scene: 'first_meet',
|
|
147
|
+
trigger: '你是做什么工作的?',
|
|
148
|
+
badReply: '程序员/销售/老师',
|
|
149
|
+
goodReply: '我在做[职业],不过业余时间喜欢[爱好],反而让我更快乐。你呢,工作之外最享受什么?',
|
|
150
|
+
explanation: '单纯回答工作让对话停顿。把话题延伸到爱好,并反问对方,制造共鸣的可能性更大。',
|
|
151
|
+
favorBonus: 7,
|
|
152
|
+
difficulty: 'beginner',
|
|
153
|
+
tags: '自我介绍,反问,话题延伸',
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
scene: 'first_meet',
|
|
157
|
+
trigger: '你平时有什么爱好?',
|
|
158
|
+
badReply: '看书、看电影、听音乐(三件套)',
|
|
159
|
+
goodReply: '最近迷上了[一个具体爱好],上周[一个具体事件],特别有意思!你有没有哪个爱好是你觉得一般人不理解的?',
|
|
160
|
+
explanation: '"看书听音乐"太通用了。分享一个具体的、有细节的爱好,会让人觉得你是个立体的人,同时问一个"秘密爱好"能建立独特的亲密感。',
|
|
161
|
+
favorBonus: 8,
|
|
162
|
+
difficulty: 'intermediate',
|
|
163
|
+
tags: '爱好,具体化,秘密分享',
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
scene: 'first_meet',
|
|
167
|
+
trigger: '你看起来挺有意思的',
|
|
168
|
+
badReply: '哪里哪里,你才有意思呢',
|
|
169
|
+
goodReply: '哈,谢谢!我一直觉得每个人都有很多面,你觉得我哪里有意思?我也想知道第一印象留下了什么 😄',
|
|
170
|
+
explanation: '客套反夸让对话原地打转。大方接受赞美并追问具体细节,表现出自信又充满好奇,让对话往深处走。',
|
|
171
|
+
favorBonus: 9,
|
|
172
|
+
difficulty: 'intermediate',
|
|
173
|
+
tags: '接受赞美,追问,自信',
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
scene: 'first_meet',
|
|
177
|
+
trigger: '你住在哪儿?',
|
|
178
|
+
badReply: '[城市名字]',
|
|
179
|
+
goodReply: '[城市],不过我更推荐你来[某个具体地方]——那里有家小店的[某样东西]让我每周都要去一次 😊 你在哪儿?',
|
|
180
|
+
explanation: '只回答城市是流水账。推荐一个你真心喜欢的地方,配上具体细节,让对方觉得你会带人去发现好东西,魅力直线上升。',
|
|
181
|
+
favorBonus: 8,
|
|
182
|
+
difficulty: 'intermediate',
|
|
183
|
+
tags: '城市,推荐,具体细节',
|
|
184
|
+
},
|
|
185
|
+
// ─── 日常关心 (daily_care) ────────────────────────────────────────────
|
|
186
|
+
{
|
|
187
|
+
scene: 'daily_care',
|
|
188
|
+
trigger: '今天好累啊...',
|
|
189
|
+
badReply: '早点睡吧',
|
|
190
|
+
goodReply: '辛苦了~是工作太多还是遇到什么事了?要不我给你讲个冷笑话解解压?😄',
|
|
191
|
+
explanation: '"早点睡"虽然关心但缺乏共情。先了解原因,再提供情绪价值——幽默的小关心往往比"多喝热水"有效十倍。',
|
|
192
|
+
favorBonus: 8,
|
|
193
|
+
difficulty: 'beginner',
|
|
194
|
+
tags: '共情,关心,幽默',
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
scene: 'daily_care',
|
|
198
|
+
trigger: '我好饿啊,不知道吃什么',
|
|
199
|
+
badReply: '随便吃点吧',
|
|
200
|
+
goodReply: '饿了!那你现在最想吃什么口感的:软软的、脆脆的、还是辣的?我帮你参谋参谋 😏',
|
|
201
|
+
explanation: '"随便吃点"毫无帮助。引导对方说出欲望,主动扮演"知心朋友"的角色,自然产生亲密感。',
|
|
202
|
+
favorBonus: 7,
|
|
203
|
+
difficulty: 'beginner',
|
|
204
|
+
tags: '日常,参与感,关心',
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
scene: 'daily_care',
|
|
208
|
+
trigger: '你今天怎么样?',
|
|
209
|
+
badReply: '还好,你呢',
|
|
210
|
+
goodReply: '今天有个小惊喜:[分享一件具体小事]。你那边有没有什么今天值得说说的?',
|
|
211
|
+
explanation: '"还好,你呢"是对话杀手。分享一件具体的、哪怕微小的事情,给对方一个"已读"的感觉,同时你的"反问"带有真正的好奇心。',
|
|
212
|
+
favorBonus: 7,
|
|
213
|
+
difficulty: 'beginner',
|
|
214
|
+
tags: '日常,分享,真诚',
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
scene: 'daily_care',
|
|
218
|
+
trigger: '你最近怎么没消息啊?',
|
|
219
|
+
badReply: '最近比较忙,抱歉',
|
|
220
|
+
goodReply: '哎呀,最近陷进一个事情出不来,但其实一直有想起你——今天算是"破罐子打破罐"了,终于来找你说话 😂 最近怎么样?',
|
|
221
|
+
explanation: '简单说"忙"会让人觉得你在推卸,也没有专属感。承认失踪+表达"你在我脑子里"的感觉,让对方觉得自己对你有特殊的位置。',
|
|
222
|
+
favorBonus: 10,
|
|
223
|
+
difficulty: 'intermediate',
|
|
224
|
+
tags: '失联,回归,专属感',
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
scene: 'daily_care',
|
|
228
|
+
trigger: '(对方分享了一件开心的事)',
|
|
229
|
+
badReply: '哦,挺好的',
|
|
230
|
+
goodReply: '哇!!这太好了!跟我讲讲细节![具体问一个细节问题] — 你这一整天一定超爽的吧?',
|
|
231
|
+
explanation: '"挺好的"等于灭火。用感叹词放大对方的喜悦,立刻问细节问题,让对方多说,享受被在乎的感觉。',
|
|
232
|
+
favorBonus: 10,
|
|
233
|
+
difficulty: 'beginner',
|
|
234
|
+
tags: '庆祝,共情,好奇',
|
|
235
|
+
},
|
|
236
|
+
// ─── 化解尴尬 (resolve_awkward) ──────────────────────────────────────
|
|
237
|
+
{
|
|
238
|
+
scene: 'resolve_awkward',
|
|
239
|
+
trigger: '你是不是对谁都这么好?',
|
|
240
|
+
badReply: '没有啊...不是...',
|
|
241
|
+
goodReply: '嗯,我对所有人都还不错,但和你聊天的时候会不自觉多花一些心思 ☺️',
|
|
242
|
+
explanation: '否认显得心虚。承认你是个好人,但暗示对方特别,既真诚又有暧昧感。',
|
|
243
|
+
favorBonus: 10,
|
|
244
|
+
difficulty: 'intermediate',
|
|
245
|
+
tags: '化解,暧昧,真诚',
|
|
246
|
+
},
|
|
247
|
+
{
|
|
248
|
+
scene: 'resolve_awkward',
|
|
249
|
+
trigger: '(聊天突然冷场了)',
|
|
250
|
+
badReply: '(沉默等对方说话)',
|
|
251
|
+
goodReply: '哈,咱俩同时陷入沉思了 😄 我刚想到一件事——你有没有试过[一个轻松随意的话题]?',
|
|
252
|
+
explanation: '冷场时沉默会让双方都尴尬。主动承认冷场、用幽默化解,然后立刻给出新话题,展示你的社交能力。',
|
|
253
|
+
favorBonus: 8,
|
|
254
|
+
difficulty: 'intermediate',
|
|
255
|
+
tags: '冷场,幽默,引导',
|
|
256
|
+
},
|
|
257
|
+
{
|
|
258
|
+
scene: 'resolve_awkward',
|
|
259
|
+
trigger: '我说错什么了吗,你好像不太对…',
|
|
260
|
+
badReply: '没有啊,你多想了',
|
|
261
|
+
goodReply: '没有,是我最近状态不太好,有点跑神——你说的我都听着呢,对不起让你担心了 🙏',
|
|
262
|
+
explanation: '"你多想了"是一种隐性否认,会让对方更不安。主动承认自己的状态,表明你有在听,是一种成熟的回应。',
|
|
263
|
+
favorBonus: 9,
|
|
264
|
+
difficulty: 'intermediate',
|
|
265
|
+
tags: '道歉,承认,安抚',
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
scene: 'resolve_awkward',
|
|
269
|
+
trigger: '我感觉我说了好多,你是不是烦了?',
|
|
270
|
+
badReply: '没有啊,继续说吧',
|
|
271
|
+
goodReply: '烦?完全没有!你说的这些我挺感兴趣的,而且你说到[具体提到的一点]的时候,我在想……',
|
|
272
|
+
explanation: '"继续说吧"听起来很敷衍。引用对方说过的具体内容,证明你真的在听,是最有力的"我没烦"。',
|
|
273
|
+
favorBonus: 11,
|
|
274
|
+
difficulty: 'advanced',
|
|
275
|
+
tags: '倾听,细节,在乎',
|
|
276
|
+
},
|
|
277
|
+
{
|
|
278
|
+
scene: 'resolve_awkward',
|
|
279
|
+
trigger: '你平时是不是很受欢迎?好像很会聊天',
|
|
280
|
+
badReply: '哪里哪里,没有的事',
|
|
281
|
+
goodReply: '哈,还行吧——其实我觉得聊天嘛,找到对的人才聊得好。和你说话不费力 😌',
|
|
282
|
+
explanation: '过分谦虚等于在否认对方的眼光。接受赞美,顺带夸对方让你聊得好,一石二鸟。',
|
|
283
|
+
favorBonus: 10,
|
|
284
|
+
difficulty: 'intermediate',
|
|
285
|
+
tags: '接受赞美,反夸,轻松',
|
|
286
|
+
},
|
|
287
|
+
// ─── 优雅拒绝 (elegant_reject) ────────────────────────────────────────
|
|
288
|
+
{
|
|
289
|
+
scene: 'elegant_reject',
|
|
290
|
+
trigger: '你周末有空吗?我们出去吃饭吧',
|
|
291
|
+
badReply: '不好意思,我没空',
|
|
292
|
+
goodReply: '这周末有安排了😢 不过下周三晚上我有空,你觉得怎么样?',
|
|
293
|
+
explanation: '直接拒绝会让人失望。给出替代方案表示你确实想见面,只是时间冲突。',
|
|
294
|
+
favorBonus: 7,
|
|
295
|
+
difficulty: 'intermediate',
|
|
296
|
+
tags: '拒绝,替代方案,保持连接',
|
|
297
|
+
},
|
|
298
|
+
{
|
|
299
|
+
scene: 'elegant_reject',
|
|
300
|
+
trigger: '你能帮我[一个过分的请求]吗?',
|
|
301
|
+
badReply: '这个我做不到,你找别人吧',
|
|
302
|
+
goodReply: '[具体的部分]我可以帮你,但[另一部分]可能力不从心——你最核心需要的是哪块?我看看能不能聚焦在这上面。',
|
|
303
|
+
explanation: '直接拒绝让对方无路可走。拆解请求,表明你愿意帮,同时划定边界,对方会感激你的诚实和善意。',
|
|
304
|
+
favorBonus: 9,
|
|
305
|
+
difficulty: 'advanced',
|
|
306
|
+
tags: '拒绝,边界,提供帮助',
|
|
307
|
+
},
|
|
308
|
+
{
|
|
309
|
+
scene: 'elegant_reject',
|
|
310
|
+
trigger: '我们能不能更进一步?',
|
|
311
|
+
badReply: '我们还不够熟吧',
|
|
312
|
+
goodReply: '你的感觉我懂,不过我想慢慢来,让感情自然发展——你愿意给我这个时间吗?',
|
|
313
|
+
explanation: '"还不够熟"像在评分。承认对方的感受,表达自己的节奏,请求对方的理解,保留了情感连接。',
|
|
314
|
+
favorBonus: 8,
|
|
315
|
+
difficulty: 'advanced',
|
|
316
|
+
tags: '感情,节奏,边界',
|
|
317
|
+
},
|
|
318
|
+
{
|
|
319
|
+
scene: 'elegant_reject',
|
|
320
|
+
trigger: '我喜欢你,你能接受我吗?',
|
|
321
|
+
badReply: '我不喜欢你,我们做朋友吧',
|
|
322
|
+
goodReply: '你的勇气让我很感动,真的。我目前没有准备好谈感情,但我很珍惜我们相处的感觉——希望这个回答不会让你难过。',
|
|
323
|
+
explanation: '"做朋友吧"已经是陈词滥调。先肯定对方的勇气,再诚实说明自己的状态,最后表达珍惜,让拒绝变得温柔。',
|
|
324
|
+
favorBonus: 10,
|
|
325
|
+
difficulty: 'expert',
|
|
326
|
+
tags: '告白,温柔拒绝,诚实',
|
|
327
|
+
},
|
|
328
|
+
{
|
|
329
|
+
scene: 'elegant_reject',
|
|
330
|
+
trigger: '(对方一直发消息但你不想回)',
|
|
331
|
+
badReply: '(直接已读不回)',
|
|
332
|
+
goodReply: '今天有点事情比较忙,等一下再跟你聊~ [事后主动回来继续话题]',
|
|
333
|
+
explanation: '已读不回会造成不必要的焦虑。简单解释一句,等有空再主动回,对方会理解并且感受到被尊重。',
|
|
334
|
+
favorBonus: 6,
|
|
335
|
+
difficulty: 'beginner',
|
|
336
|
+
tags: '回复,尊重,主动',
|
|
337
|
+
},
|
|
338
|
+
// ─── 调情升温 (flirt) ────────────────────────────────────────────────
|
|
339
|
+
{
|
|
340
|
+
scene: 'flirt',
|
|
341
|
+
trigger: '你平时都喜欢做什么?',
|
|
342
|
+
badReply: '看电影、听音乐',
|
|
343
|
+
goodReply: '最近迷上了做饭,下次给你做我的拿手菜尝尝?不过你得准备好被惊艳到 😏',
|
|
344
|
+
explanation: '列清单式回答无聊。用共同活动的邀请替代,创造想象空间,同时透出一点点自信。',
|
|
345
|
+
favorBonus: 8,
|
|
346
|
+
difficulty: 'advanced',
|
|
347
|
+
tags: '邀请,自信,创造场景',
|
|
348
|
+
},
|
|
349
|
+
{
|
|
350
|
+
scene: 'flirt',
|
|
351
|
+
trigger: '(对方发了一张自拍)',
|
|
352
|
+
badReply: '好看!',
|
|
353
|
+
goodReply: '哇——你这张[具体说明照片里的某个细节,如笑容/眼睛/背景]让我多看了好几眼。',
|
|
354
|
+
explanation: '"好看"是最廉价的夸奖。聚焦一个具体的细节,让对方觉得你真的在认真看,而不是随口一夸。',
|
|
355
|
+
favorBonus: 10,
|
|
356
|
+
difficulty: 'intermediate',
|
|
357
|
+
tags: '夸奖,细节,认真',
|
|
358
|
+
},
|
|
359
|
+
{
|
|
360
|
+
scene: 'flirt',
|
|
361
|
+
trigger: '你觉得我怎么样?',
|
|
362
|
+
badReply: '你挺好的',
|
|
363
|
+
goodReply: '嗯……我能说几点吗?首先,[一个真实的优点];其次……其实我想当面说,这样比较有意思 😉',
|
|
364
|
+
explanation: '"挺好的"=没想法。分点列举但故意留悬念,制造"当面见"的理由,这才叫调情高手。',
|
|
365
|
+
favorBonus: 12,
|
|
366
|
+
difficulty: 'advanced',
|
|
367
|
+
tags: '夸奖,悬念,约见面',
|
|
368
|
+
},
|
|
369
|
+
{
|
|
370
|
+
scene: 'flirt',
|
|
371
|
+
trigger: '你有没有心动过的人?',
|
|
372
|
+
badReply: '没有 / 有,但现在不想提',
|
|
373
|
+
goodReply: '有啊……其实现在聊天的时候有一点心跳加速,不知道为什么 😶🌫️ 你呢?',
|
|
374
|
+
explanation: '否认太防御,说"不想提"显得神秘感过头。自然流露当下的感受,把"心跳"归给对方让ta猜,这是高情商暧昧。',
|
|
375
|
+
favorBonus: 13,
|
|
376
|
+
difficulty: 'expert',
|
|
377
|
+
tags: '暧昧,心动,当下感受',
|
|
378
|
+
},
|
|
379
|
+
{
|
|
380
|
+
scene: 'flirt',
|
|
381
|
+
trigger: '你今晚有空吗?',
|
|
382
|
+
badReply: '为什么?',
|
|
383
|
+
goodReply: '看情况,要看你提议的是什么 😏',
|
|
384
|
+
explanation: '直接问"为什么"显得戒备。用半调侃的方式回应,给对方出招的空间,自己保持主动权。',
|
|
385
|
+
favorBonus: 9,
|
|
386
|
+
difficulty: 'advanced',
|
|
387
|
+
tags: '调情,主动权,游戏感',
|
|
388
|
+
},
|
|
389
|
+
// ─── 冷却期 (cool_down) ──────────────────────────────────────────────
|
|
390
|
+
{
|
|
391
|
+
scene: 'cool_down',
|
|
392
|
+
trigger: '你是不是不喜欢我了?',
|
|
393
|
+
badReply: '你怎么这么想?',
|
|
394
|
+
goodReply: '怎么会呢,最近确实忙了些顾不上,让你有这种感觉是我的问题。要不这样,周末我们见一面好好聊聊?',
|
|
395
|
+
explanation: '反问会激化不安全感。承认问题+提出见面是最好的安慰方式。',
|
|
396
|
+
favorBonus: 9,
|
|
397
|
+
difficulty: 'advanced',
|
|
398
|
+
tags: '不安全感,承认,见面',
|
|
399
|
+
},
|
|
400
|
+
{
|
|
401
|
+
scene: 'cool_down',
|
|
402
|
+
trigger: '你最近回消息越来越慢了',
|
|
403
|
+
badReply: '我最近很忙',
|
|
404
|
+
goodReply: '你说得对,我最近状态有点没调整好,但这不代表我忽略了你。今天我们好好聊聊,你最近怎么了?',
|
|
405
|
+
explanation: '归咎于"忙"会让对方感觉排在队尾。承认改变的事实,表明你还在,并且立刻切换到主动关心,让对方重新感受到在你这里的重要性。',
|
|
406
|
+
favorBonus: 10,
|
|
407
|
+
difficulty: 'advanced',
|
|
408
|
+
tags: '迟回,承认,主动',
|
|
409
|
+
},
|
|
410
|
+
{
|
|
411
|
+
scene: 'cool_down',
|
|
412
|
+
trigger: '感觉我们最近话变少了',
|
|
413
|
+
badReply: '是吗,我没感觉',
|
|
414
|
+
goodReply: '嗯,我也察觉到了。可能各自事情多了,但我不想就这么淡下去——你呢?',
|
|
415
|
+
explanation: '"我没感觉"是在否认对方的感受。承认变化,表明自己不想淡化,并且问对方的态度,给双方一个重新靠近的机会。',
|
|
416
|
+
favorBonus: 11,
|
|
417
|
+
difficulty: 'advanced',
|
|
418
|
+
tags: '关系疏远,挽留,真诚',
|
|
419
|
+
},
|
|
420
|
+
{
|
|
421
|
+
scene: 'cool_down',
|
|
422
|
+
trigger: '(对方突然发来很多消息轰炸)',
|
|
423
|
+
badReply: '(不理或只回"嗯")',
|
|
424
|
+
goodReply: '哇你今天话好多!发生了什么好事/坏事?说来听听~',
|
|
425
|
+
explanation: '不回或敷衍会让对方感觉被忽视。带着好奇心回应"话多"的反常,让对方觉得你注意到了、在乎了。',
|
|
426
|
+
favorBonus: 8,
|
|
427
|
+
difficulty: 'intermediate',
|
|
428
|
+
tags: '关注,好奇,在乎',
|
|
429
|
+
},
|
|
430
|
+
{
|
|
431
|
+
scene: 'cool_down',
|
|
432
|
+
trigger: '我是不是给你造成压力了?',
|
|
433
|
+
badReply: '没有',
|
|
434
|
+
goodReply: '你没有。我有时候只是喜欢安静一下,不是因为你——你有这种担心说明你很细心,我挺感动的。',
|
|
435
|
+
explanation: '"没有"太单薄。解释你的状态并把对方的担心解读为优点,让对方既放心又觉得自己被欣赏。',
|
|
436
|
+
favorBonus: 12,
|
|
437
|
+
difficulty: 'expert',
|
|
438
|
+
tags: '安抚,解释,欣赏',
|
|
439
|
+
},
|
|
440
|
+
// ─── 危机应对 (crisis_response) ──────────────────────────────────────
|
|
441
|
+
{
|
|
442
|
+
scene: 'crisis_response',
|
|
443
|
+
trigger: '你是不是在跟别人聊天?回消息怎么这么慢?',
|
|
444
|
+
badReply: '没有啊,我就在刷手机',
|
|
445
|
+
goodReply: '抱歉让你等了!刚在忙一个事情,一忙起来就忘了时间。现在100%注意力给你~你刚才说到哪了?',
|
|
446
|
+
explanation: '"刷手机"暗示你有空但不想回,更伤人。解释原因+全身心回归是最佳策略。',
|
|
447
|
+
favorBonus: 10,
|
|
448
|
+
difficulty: 'advanced',
|
|
449
|
+
tags: '危机,道歉,回归',
|
|
450
|
+
},
|
|
451
|
+
{
|
|
452
|
+
scene: 'crisis_response',
|
|
453
|
+
trigger: '我朋友说你同时在和好几个人聊天',
|
|
454
|
+
badReply: '你朋友乱说什么!',
|
|
455
|
+
goodReply: '这个说法让我很在意,因为我不想你误会我。能告诉我你朋友是怎么知道的吗?我想搞清楚事实,然后直接回应你。',
|
|
456
|
+
explanation: '反驳朋友会让对方在你们之间选边站。冷静地寻求事实,表明你愿意正面解决,才是成熟的应对。',
|
|
457
|
+
favorBonus: 11,
|
|
458
|
+
difficulty: 'expert',
|
|
459
|
+
tags: '指控,冷静,澄清',
|
|
460
|
+
},
|
|
461
|
+
{
|
|
462
|
+
scene: 'crisis_response',
|
|
463
|
+
trigger: '你上次说要给我惊喜,然后就没有然后了',
|
|
464
|
+
badReply: '哎呀我忘了,抱歉啊',
|
|
465
|
+
goodReply: '对不起,我说了却没做到,这不对。我打算[具体的补救计划],你给我一个机会?',
|
|
466
|
+
explanation: '仅说抱歉+忘了=没有诚意。承认责任+给出具体补救,才能让对方感受到你是认真的。',
|
|
467
|
+
favorBonus: 12,
|
|
468
|
+
difficulty: 'advanced',
|
|
469
|
+
tags: '失信,补救,具体行动',
|
|
470
|
+
},
|
|
471
|
+
{
|
|
472
|
+
scene: 'crisis_response',
|
|
473
|
+
trigger: '(你发现说错了一件事,对方开始质疑你的诚意)',
|
|
474
|
+
badReply: '我当时不是那个意思,你误解我了',
|
|
475
|
+
goodReply: '我说那句话确实不够准确,我理解你为什么会这么想。让我重新解释一下我的真实意思……',
|
|
476
|
+
explanation: '"你误解"在把责任推给对方。先承认自己的表述有问题,再去解释,这才是消除误解的正确顺序。',
|
|
477
|
+
favorBonus: 11,
|
|
478
|
+
difficulty: 'expert',
|
|
479
|
+
tags: '误解,承担责任,解释',
|
|
480
|
+
},
|
|
481
|
+
{
|
|
482
|
+
scene: 'crisis_response',
|
|
483
|
+
trigger: '你昨晚怎么突然没消息了?我等了你一晚上',
|
|
484
|
+
badReply: '手机没电了 / 睡着了,不记得了',
|
|
485
|
+
goodReply: '真的很抱歉![真实原因],但我知道让你等了一晚上很不好受。我应该提前说一声的——以后我会注意的。',
|
|
486
|
+
explanation: '给借口只会让人觉得你在找理由。哪怕原因真实,也要先共情对方的感受,再解释,最后承诺改变。',
|
|
487
|
+
favorBonus: 10,
|
|
488
|
+
difficulty: 'advanced',
|
|
489
|
+
tags: '消失,道歉,承诺',
|
|
490
|
+
},
|
|
491
|
+
// ─── 早安晚安 (morning_night) ────────────────────────────────────────
|
|
492
|
+
{
|
|
493
|
+
scene: 'morning_night',
|
|
494
|
+
trigger: '(早上8点)',
|
|
495
|
+
badReply: '早安',
|
|
496
|
+
goodReply: '早安~昨晚梦到一件特好笑的事,起来第一个就想分享给你 😂 你猜是什么?',
|
|
497
|
+
explanation: '"早安"太普通。制造好奇心和独特感,让对方觉得你第一时间想到ta。',
|
|
498
|
+
favorBonus: 6,
|
|
499
|
+
difficulty: 'beginner',
|
|
500
|
+
tags: '早安,好奇心,独特感',
|
|
501
|
+
},
|
|
502
|
+
{
|
|
503
|
+
scene: 'morning_night',
|
|
504
|
+
trigger: '(晚上11点)',
|
|
505
|
+
badReply: '晚安',
|
|
506
|
+
goodReply: '晚安~今天有一刻我想到你,觉得心情变好了一点点,就这样。 🌙',
|
|
507
|
+
explanation: '"晚安"太普通。睡前发一句"想到你"的感受,简短、真诚,让对方带着微笑入睡。',
|
|
508
|
+
favorBonus: 9,
|
|
509
|
+
difficulty: 'intermediate',
|
|
510
|
+
tags: '晚安,情感流露,温柔',
|
|
511
|
+
},
|
|
512
|
+
{
|
|
513
|
+
scene: 'morning_night',
|
|
514
|
+
trigger: '你昨晚睡得好吗?',
|
|
515
|
+
badReply: '还好,你呢',
|
|
516
|
+
goodReply: '睡得还行!不过一起床就想到[某件今天的事/某个计划],结果睡意全无了哈哈。你今天有什么打算?',
|
|
517
|
+
explanation: '分享起床第一个念头,自然带出今天的期待,同时问对方的安排,让早上的问候变成今天的开始。',
|
|
518
|
+
favorBonus: 7,
|
|
519
|
+
difficulty: 'beginner',
|
|
520
|
+
tags: '早安,分享,今天的计划',
|
|
521
|
+
},
|
|
522
|
+
{
|
|
523
|
+
scene: 'morning_night',
|
|
524
|
+
trigger: '(对方说不想睡)',
|
|
525
|
+
badReply: '那你早点睡吧',
|
|
526
|
+
goodReply: '嗯,那就聊到你困了为止吧 😊 你现在在干嘛?',
|
|
527
|
+
explanation: '"早点睡吧"会让对方觉得你想赶他走。说"聊到你困"表示你愿意陪,这种专属陪伴感无价。',
|
|
528
|
+
favorBonus: 10,
|
|
529
|
+
difficulty: 'intermediate',
|
|
530
|
+
tags: '陪伴,专属感,深夜',
|
|
531
|
+
},
|
|
532
|
+
{
|
|
533
|
+
scene: 'morning_night',
|
|
534
|
+
trigger: '你做梦了吗?',
|
|
535
|
+
badReply: '不记得了',
|
|
536
|
+
goodReply: '好像有,但太模糊了——不过如果我梦到你了我一定会告诉你的 😄',
|
|
537
|
+
explanation: '"不记得"是终止对话的死穴。用一句温柔的玩笑把话题引向对方,让ta觉得和你的关系有点特别。',
|
|
538
|
+
favorBonus: 8,
|
|
539
|
+
difficulty: 'intermediate',
|
|
540
|
+
tags: '梦境,玩笑,特别感',
|
|
541
|
+
},
|
|
542
|
+
];
|
|
543
|
+
for (const phrase of phrases) {
|
|
544
|
+
await this.phraseService.create(phrase);
|
|
545
|
+
}
|
|
546
|
+
return phrases.length;
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
exports.SeedService = SeedService;
|
|
550
|
+
//# sourceMappingURL=seed.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seed.service.js","sourceRoot":"","sources":["../../src/services/seed.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { Repository } from 'typeorm';
|
|
2
|
+
import { TuringGuess } from '../entities/turing-guess.entity.js';
|
|
3
|
+
import { LiveThread } from '../entities/live-thread.entity.js';
|
|
4
|
+
import { MatchRoom } from '../entities/match-room.entity.js';
|
|
5
|
+
/**
|
|
6
|
+
* 图灵测试服务:判断对面到底是人还是AI
|
|
7
|
+
* 🤔 赌上你的积分,猜对加分,猜错扣分
|
|
8
|
+
*
|
|
9
|
+
* 计分规则:
|
|
10
|
+
* - 猜对 human → +10 × confidence
|
|
11
|
+
* - 猜对 ai → +15 × confidence(猜出AI更难,奖励更高)
|
|
12
|
+
* - 猜错 → -5 × confidence(越自信错得越惨)
|
|
13
|
+
* - 猜对 ai_takeover → +20 × confidence(能识破无缝接管是大师级)
|
|
14
|
+
*/
|
|
15
|
+
interface SubmitGuessDto {
|
|
16
|
+
roomId: string;
|
|
17
|
+
guesserId: string;
|
|
18
|
+
threadId: string;
|
|
19
|
+
targetId: string;
|
|
20
|
+
guess: 'human' | 'ai';
|
|
21
|
+
confidence: number;
|
|
22
|
+
reason?: string;
|
|
23
|
+
}
|
|
24
|
+
interface RevealResult {
|
|
25
|
+
threadId: string;
|
|
26
|
+
targetId: string;
|
|
27
|
+
targetName: string;
|
|
28
|
+
guess: 'human' | 'ai';
|
|
29
|
+
actual: 'human' | 'ai';
|
|
30
|
+
wasAiTakeover: boolean;
|
|
31
|
+
isCorrect: boolean;
|
|
32
|
+
pointsDelta: number;
|
|
33
|
+
confidence: number;
|
|
34
|
+
reason: string | null;
|
|
35
|
+
}
|
|
36
|
+
interface RoomRevealResult {
|
|
37
|
+
roomId: string;
|
|
38
|
+
results: RevealResult[];
|
|
39
|
+
totalPoints: number;
|
|
40
|
+
accuracy: number;
|
|
41
|
+
title: string;
|
|
42
|
+
}
|
|
43
|
+
export declare class TuringService {
|
|
44
|
+
private guessRepo;
|
|
45
|
+
private threadRepo;
|
|
46
|
+
private roomRepo;
|
|
47
|
+
initialize(guessRepo: Repository<TuringGuess>, threadRepo: Repository<LiveThread>, roomRepo: Repository<MatchRoom>): void;
|
|
48
|
+
/** 提交图灵猜测 */
|
|
49
|
+
submitGuess(dto: SubmitGuessDto): Promise<TuringGuess>;
|
|
50
|
+
/** 揭晓房间所有身份 */
|
|
51
|
+
revealRoom(roomId: string, userId: string): Promise<RoomRevealResult>;
|
|
52
|
+
/** 获取房间所有玩家的猜测统计 */
|
|
53
|
+
getRoomStats(roomId: string): Promise<{
|
|
54
|
+
totalGuesses: number;
|
|
55
|
+
revealedCount: number;
|
|
56
|
+
averageAccuracy: number;
|
|
57
|
+
}>;
|
|
58
|
+
/** 获取用户的图灵测试历史战绩 */
|
|
59
|
+
getUserHistory(userId: string, page: number, pageSize: number): Promise<{
|
|
60
|
+
items: TuringGuess[];
|
|
61
|
+
total: number;
|
|
62
|
+
}>;
|
|
63
|
+
/** 获取用户总战绩 */
|
|
64
|
+
getUserStats(userId: string): Promise<{
|
|
65
|
+
totalGuesses: number;
|
|
66
|
+
correctGuesses: number;
|
|
67
|
+
accuracy: number;
|
|
68
|
+
totalPoints: number;
|
|
69
|
+
bestStreak: number;
|
|
70
|
+
}>;
|
|
71
|
+
private getRevealTitle;
|
|
72
|
+
}
|
|
73
|
+
export {};
|
|
74
|
+
//# sourceMappingURL=turing.service.d.ts.map
|