@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.
Files changed (172) hide show
  1. package/dist/controllers/character.controller.d.ts +10 -0
  2. package/dist/controllers/character.controller.d.ts.map +1 -0
  3. package/dist/controllers/character.controller.js +58 -0
  4. package/dist/controllers/character.controller.js.map +1 -0
  5. package/dist/controllers/chat.controller.d.ts +13 -0
  6. package/dist/controllers/chat.controller.d.ts.map +1 -0
  7. package/dist/controllers/chat.controller.js +113 -0
  8. package/dist/controllers/chat.controller.js.map +1 -0
  9. package/dist/controllers/crisis.controller.d.ts +10 -0
  10. package/dist/controllers/crisis.controller.d.ts.map +1 -0
  11. package/dist/controllers/crisis.controller.js +69 -0
  12. package/dist/controllers/crisis.controller.js.map +1 -0
  13. package/dist/controllers/index.d.ts +10 -0
  14. package/dist/controllers/index.d.ts.map +1 -0
  15. package/dist/controllers/index.js +24 -0
  16. package/dist/controllers/index.js.map +1 -0
  17. package/dist/controllers/leaderboard.controller.d.ts +9 -0
  18. package/dist/controllers/leaderboard.controller.d.ts.map +1 -0
  19. package/dist/controllers/leaderboard.controller.js +51 -0
  20. package/dist/controllers/leaderboard.controller.js.map +1 -0
  21. package/dist/controllers/live-chat.controller.d.ts +14 -0
  22. package/dist/controllers/live-chat.controller.d.ts.map +1 -0
  23. package/dist/controllers/live-chat.controller.js +95 -0
  24. package/dist/controllers/live-chat.controller.js.map +1 -0
  25. package/dist/controllers/matchmaking.controller.d.ts +22 -0
  26. package/dist/controllers/matchmaking.controller.d.ts.map +1 -0
  27. package/dist/controllers/matchmaking.controller.js +157 -0
  28. package/dist/controllers/matchmaking.controller.js.map +1 -0
  29. package/dist/controllers/phrase.controller.d.ts +11 -0
  30. package/dist/controllers/phrase.controller.d.ts.map +1 -0
  31. package/dist/controllers/phrase.controller.js +78 -0
  32. package/dist/controllers/phrase.controller.js.map +1 -0
  33. package/dist/controllers/profile.controller.d.ts +9 -0
  34. package/dist/controllers/profile.controller.d.ts.map +1 -0
  35. package/dist/controllers/profile.controller.js +44 -0
  36. package/dist/controllers/profile.controller.js.map +1 -0
  37. package/dist/controllers/turing.controller.d.ts +18 -0
  38. package/dist/controllers/turing.controller.d.ts.map +1 -0
  39. package/dist/controllers/turing.controller.js +103 -0
  40. package/dist/controllers/turing.controller.js.map +1 -0
  41. package/dist/entities/chat-character.entity.d.ts +34 -0
  42. package/dist/entities/chat-character.entity.d.ts.map +1 -0
  43. package/dist/entities/chat-character.entity.js +101 -0
  44. package/dist/entities/chat-character.entity.js.map +1 -0
  45. package/dist/entities/chat-message.entity.d.ts +26 -0
  46. package/dist/entities/chat-message.entity.d.ts.map +1 -0
  47. package/dist/entities/chat-message.entity.js +84 -0
  48. package/dist/entities/chat-message.entity.js.map +1 -0
  49. package/dist/entities/chat-session.entity.d.ts +31 -0
  50. package/dist/entities/chat-session.entity.d.ts.map +1 -0
  51. package/dist/entities/chat-session.entity.js +95 -0
  52. package/dist/entities/chat-session.entity.js.map +1 -0
  53. package/dist/entities/chat-thread.entity.d.ts +30 -0
  54. package/dist/entities/chat-thread.entity.d.ts.map +1 -0
  55. package/dist/entities/chat-thread.entity.js +105 -0
  56. package/dist/entities/chat-thread.entity.js.map +1 -0
  57. package/dist/entities/crisis-event.entity.d.ts +30 -0
  58. package/dist/entities/crisis-event.entity.d.ts.map +1 -0
  59. package/dist/entities/crisis-event.entity.js +90 -0
  60. package/dist/entities/crisis-event.entity.js.map +1 -0
  61. package/dist/entities/index.d.ts +38 -0
  62. package/dist/entities/index.d.ts.map +1 -0
  63. package/dist/entities/index.js +62 -0
  64. package/dist/entities/index.js.map +1 -0
  65. package/dist/entities/leaderboard-entry.entity.d.ts +22 -0
  66. package/dist/entities/leaderboard-entry.entity.d.ts.map +1 -0
  67. package/dist/entities/leaderboard-entry.entity.js +75 -0
  68. package/dist/entities/leaderboard-entry.entity.js.map +1 -0
  69. package/dist/entities/live-message.entity.d.ts +34 -0
  70. package/dist/entities/live-message.entity.d.ts.map +1 -0
  71. package/dist/entities/live-message.entity.js +99 -0
  72. package/dist/entities/live-message.entity.js.map +1 -0
  73. package/dist/entities/live-thread.entity.d.ts +50 -0
  74. package/dist/entities/live-thread.entity.d.ts.map +1 -0
  75. package/dist/entities/live-thread.entity.js +144 -0
  76. package/dist/entities/live-thread.entity.js.map +1 -0
  77. package/dist/entities/match-room.entity.d.ts +44 -0
  78. package/dist/entities/match-room.entity.d.ts.map +1 -0
  79. package/dist/entities/match-room.entity.js +131 -0
  80. package/dist/entities/match-room.entity.js.map +1 -0
  81. package/dist/entities/phrase-template.entity.d.ts +28 -0
  82. package/dist/entities/phrase-template.entity.d.ts.map +1 -0
  83. package/dist/entities/phrase-template.entity.js +84 -0
  84. package/dist/entities/phrase-template.entity.js.map +1 -0
  85. package/dist/entities/player-profile.entity.d.ts +36 -0
  86. package/dist/entities/player-profile.entity.d.ts.map +1 -0
  87. package/dist/entities/player-profile.entity.js +112 -0
  88. package/dist/entities/player-profile.entity.js.map +1 -0
  89. package/dist/entities/player-queue.entity.d.ts +24 -0
  90. package/dist/entities/player-queue.entity.d.ts.map +1 -0
  91. package/dist/entities/player-queue.entity.js +76 -0
  92. package/dist/entities/player-queue.entity.js.map +1 -0
  93. package/dist/entities/turing-guess.entity.d.ts +29 -0
  94. package/dist/entities/turing-guess.entity.d.ts.map +1 -0
  95. package/dist/entities/turing-guess.entity.js +94 -0
  96. package/dist/entities/turing-guess.entity.js.map +1 -0
  97. package/dist/index.d.ts +14 -0
  98. package/dist/index.d.ts.map +1 -0
  99. package/dist/index.js +70 -0
  100. package/dist/index.js.map +1 -0
  101. package/dist/schemas/sea-king.schema.d.ts +109 -0
  102. package/dist/schemas/sea-king.schema.d.ts.map +1 -0
  103. package/dist/schemas/sea-king.schema.js +103 -0
  104. package/dist/schemas/sea-king.schema.js.map +1 -0
  105. package/dist/sea-king.module.d.ts +19 -0
  106. package/dist/sea-king.module.d.ts.map +1 -0
  107. package/dist/sea-king.module.js +114 -0
  108. package/dist/sea-king.module.js.map +1 -0
  109. package/dist/services/character.service.d.ts +30 -0
  110. package/dist/services/character.service.d.ts.map +1 -0
  111. package/dist/services/character.service.js +75 -0
  112. package/dist/services/character.service.js.map +1 -0
  113. package/dist/services/chat.service.d.ts +49 -0
  114. package/dist/services/chat.service.d.ts.map +1 -0
  115. package/dist/services/chat.service.js +332 -0
  116. package/dist/services/chat.service.js.map +1 -0
  117. package/dist/services/crisis.service.d.ts +17 -0
  118. package/dist/services/crisis.service.d.ts.map +1 -0
  119. package/dist/services/crisis.service.js +177 -0
  120. package/dist/services/crisis.service.js.map +1 -0
  121. package/dist/services/index.d.ts +13 -0
  122. package/dist/services/index.d.ts.map +1 -0
  123. package/dist/services/index.js +28 -0
  124. package/dist/services/index.js.map +1 -0
  125. package/dist/services/leaderboard.service.d.ts +29 -0
  126. package/dist/services/leaderboard.service.d.ts.map +1 -0
  127. package/dist/services/leaderboard.service.js +64 -0
  128. package/dist/services/leaderboard.service.js.map +1 -0
  129. package/dist/services/live-chat.service.d.ts +71 -0
  130. package/dist/services/live-chat.service.d.ts.map +1 -0
  131. package/dist/services/live-chat.service.js +273 -0
  132. package/dist/services/live-chat.service.js.map +1 -0
  133. package/dist/services/matchmaking.service.d.ts +60 -0
  134. package/dist/services/matchmaking.service.d.ts.map +1 -0
  135. package/dist/services/matchmaking.service.js +208 -0
  136. package/dist/services/matchmaking.service.js.map +1 -0
  137. package/dist/services/phrase.service.d.ts +27 -0
  138. package/dist/services/phrase.service.d.ts.map +1 -0
  139. package/dist/services/phrase.service.js +70 -0
  140. package/dist/services/phrase.service.js.map +1 -0
  141. package/dist/services/profile.service.d.ts +41 -0
  142. package/dist/services/profile.service.d.ts.map +1 -0
  143. package/dist/services/profile.service.js +107 -0
  144. package/dist/services/profile.service.js.map +1 -0
  145. package/dist/services/seed.service.d.ts +19 -0
  146. package/dist/services/seed.service.d.ts.map +1 -0
  147. package/dist/services/seed.service.js +550 -0
  148. package/dist/services/seed.service.js.map +1 -0
  149. package/dist/services/turing.service.d.ts +74 -0
  150. package/dist/services/turing.service.d.ts.map +1 -0
  151. package/dist/services/turing.service.js +175 -0
  152. package/dist/services/turing.service.js.map +1 -0
  153. package/dist/services/ws-hub.service.d.ts +51 -0
  154. package/dist/services/ws-hub.service.d.ts.map +1 -0
  155. package/dist/services/ws-hub.service.js +174 -0
  156. package/dist/services/ws-hub.service.js.map +1 -0
  157. package/dist/types.d.ts +12 -0
  158. package/dist/types.d.ts.map +1 -0
  159. package/dist/types.js +8 -0
  160. package/dist/types.js.map +1 -0
  161. package/package.json +69 -0
  162. package/web/index.ts +30 -0
  163. package/web/manifest.ts +40 -0
  164. package/web/messages/en-US.json +113 -0
  165. package/web/messages/zh-CN.json +113 -0
  166. package/web/pages/AnalysisPage.tsx +198 -0
  167. package/web/pages/ChatPage.tsx +482 -0
  168. package/web/pages/DashboardPage.tsx +281 -0
  169. package/web/pages/LeaderboardPage.tsx +208 -0
  170. package/web/pages/PhrasesPage.tsx +221 -0
  171. package/web/services/sea-king-service.ts +151 -0
  172. package/web/types/sea-king.ts +249 -0
@@ -0,0 +1,109 @@
1
+ import { z } from 'zod';
2
+ export declare const CHARACTER_PERSONALITIES: readonly ["gentle", "tsundere", "intellectual", "rational", "playful", "mysterious"];
3
+ export declare const CHARACTER_GENDERS: readonly ["male", "female", "neutral"];
4
+ export declare const CRISIS_TYPES: readonly ["double_date", "seen_together", "same_gift", "wrong_name", "social_media_leak", "mutual_friend", "jealousy_storm", "surprise_encounter"];
5
+ export declare const PLAYER_RANKS: readonly ["bronze", "silver", "gold", "platinum", "diamond", "master", "king"];
6
+ export declare const RANK_LABELS: Record<string, {
7
+ zh: string;
8
+ en: string;
9
+ emoji: string;
10
+ }>;
11
+ export declare const PHRASE_SCENES: readonly ["first_meet", "daily_care", "resolve_awkward", "elegant_reject", "flirt", "cool_down", "crisis_response", "morning_night"];
12
+ export declare const SKILL_DIMENSIONS: readonly ["humor", "empathy", "topic_lead", "time_manage", "crisis_handle"];
13
+ export declare const StartSessionSchema: z.ZodObject<{
14
+ characterCount: z.ZodDefault<z.ZodNumber>;
15
+ difficulty: z.ZodDefault<z.ZodEnum<["easy", "normal", "hard", "nightmare"]>>;
16
+ preferredPersonalities: z.ZodOptional<z.ZodArray<z.ZodEnum<["gentle", "tsundere", "intellectual", "rational", "playful", "mysterious"]>, "many">>;
17
+ }, "strip", z.ZodTypeAny, {
18
+ characterCount: number;
19
+ difficulty: "easy" | "normal" | "hard" | "nightmare";
20
+ preferredPersonalities?: ("gentle" | "tsundere" | "intellectual" | "rational" | "playful" | "mysterious")[] | undefined;
21
+ }, {
22
+ characterCount?: number | undefined;
23
+ difficulty?: "easy" | "normal" | "hard" | "nightmare" | undefined;
24
+ preferredPersonalities?: ("gentle" | "tsundere" | "intellectual" | "rational" | "playful" | "mysterious")[] | undefined;
25
+ }>;
26
+ export type StartSessionDto = z.infer<typeof StartSessionSchema>;
27
+ export declare const SendMessageSchema: z.ZodObject<{
28
+ threadId: z.ZodString;
29
+ content: z.ZodString;
30
+ }, "strip", z.ZodTypeAny, {
31
+ threadId: string;
32
+ content: string;
33
+ }, {
34
+ threadId: string;
35
+ content: string;
36
+ }>;
37
+ export type SendMessageDto = z.infer<typeof SendMessageSchema>;
38
+ export declare const ResolveCrisisSchema: z.ZodObject<{
39
+ crisisId: z.ZodString;
40
+ response: z.ZodString;
41
+ }, "strip", z.ZodTypeAny, {
42
+ crisisId: string;
43
+ response: string;
44
+ }, {
45
+ crisisId: string;
46
+ response: string;
47
+ }>;
48
+ export type ResolveCrisisDto = z.infer<typeof ResolveCrisisSchema>;
49
+ export declare const PhraseQuerySchema: z.ZodObject<{
50
+ page: z.ZodDefault<z.ZodNumber>;
51
+ pageSize: z.ZodDefault<z.ZodNumber>;
52
+ scene: z.ZodOptional<z.ZodEnum<["first_meet", "daily_care", "resolve_awkward", "elegant_reject", "flirt", "cool_down", "crisis_response", "morning_night"]>>;
53
+ difficulty: z.ZodOptional<z.ZodEnum<["beginner", "intermediate", "advanced", "expert"]>>;
54
+ }, "strip", z.ZodTypeAny, {
55
+ page: number;
56
+ pageSize: number;
57
+ scene?: "first_meet" | "daily_care" | "resolve_awkward" | "elegant_reject" | "flirt" | "cool_down" | "crisis_response" | "morning_night" | undefined;
58
+ difficulty?: "beginner" | "intermediate" | "advanced" | "expert" | undefined;
59
+ }, {
60
+ scene?: "first_meet" | "daily_care" | "resolve_awkward" | "elegant_reject" | "flirt" | "cool_down" | "crisis_response" | "morning_night" | undefined;
61
+ difficulty?: "beginner" | "intermediate" | "advanced" | "expert" | undefined;
62
+ page?: number | undefined;
63
+ pageSize?: number | undefined;
64
+ }>;
65
+ export type PhraseQueryDto = z.infer<typeof PhraseQuerySchema>;
66
+ export declare const CreatePhraseSchema: z.ZodObject<{
67
+ scene: z.ZodEnum<["first_meet", "daily_care", "resolve_awkward", "elegant_reject", "flirt", "cool_down", "crisis_response", "morning_night"]>;
68
+ trigger: z.ZodString;
69
+ badReply: z.ZodString;
70
+ goodReply: z.ZodString;
71
+ explanation: z.ZodString;
72
+ favorBonus: z.ZodDefault<z.ZodNumber>;
73
+ difficulty: z.ZodDefault<z.ZodEnum<["beginner", "intermediate", "advanced", "expert"]>>;
74
+ tags: z.ZodOptional<z.ZodNullable<z.ZodString>>;
75
+ }, "strip", z.ZodTypeAny, {
76
+ scene: "first_meet" | "daily_care" | "resolve_awkward" | "elegant_reject" | "flirt" | "cool_down" | "crisis_response" | "morning_night";
77
+ trigger: string;
78
+ badReply: string;
79
+ goodReply: string;
80
+ explanation: string;
81
+ favorBonus: number;
82
+ difficulty: "beginner" | "intermediate" | "advanced" | "expert";
83
+ tags?: string | null | undefined;
84
+ }, {
85
+ scene: "first_meet" | "daily_care" | "resolve_awkward" | "elegant_reject" | "flirt" | "cool_down" | "crisis_response" | "morning_night";
86
+ trigger: string;
87
+ badReply: string;
88
+ goodReply: string;
89
+ explanation: string;
90
+ favorBonus?: number | undefined;
91
+ difficulty?: "beginner" | "intermediate" | "advanced" | "expert" | undefined;
92
+ tags?: string | null | undefined;
93
+ }>;
94
+ export type CreatePhraseDto = z.infer<typeof CreatePhraseSchema>;
95
+ export declare const LeaderboardQuerySchema: z.ZodObject<{
96
+ page: z.ZodDefault<z.ZodNumber>;
97
+ pageSize: z.ZodDefault<z.ZodNumber>;
98
+ season: z.ZodDefault<z.ZodString>;
99
+ }, "strip", z.ZodTypeAny, {
100
+ season: string;
101
+ page: number;
102
+ pageSize: number;
103
+ }, {
104
+ season?: string | undefined;
105
+ page?: number | undefined;
106
+ pageSize?: number | undefined;
107
+ }>;
108
+ export type LeaderboardQueryDto = z.infer<typeof LeaderboardQuerySchema>;
109
+ //# sourceMappingURL=sea-king.schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sea-king.schema.d.ts","sourceRoot":"","sources":["../../src/schemas/sea-king.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,uBAAuB,sFAO1B,CAAC;AAEX,eAAO,MAAM,iBAAiB,wCAAyC,CAAC;AAIxE,eAAO,MAAM,YAAY,oJASf,CAAC;AAIX,eAAO,MAAM,YAAY,gFAQf,CAAC;AAEX,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAQjF,CAAC;AAIF,eAAO,MAAM,aAAa,sIAShB,CAAC;AAIX,eAAO,MAAM,gBAAgB,6EAMnB,CAAC;AAIX,eAAO,MAAM,kBAAkB;;;;;;;;;;;;EAI7B,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAIjE,eAAO,MAAM,iBAAiB;;;;;;;;;EAG5B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAI/D,eAAO,MAAM,mBAAmB;;;;;;;;;EAG9B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAInE,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;EAK5B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE/D,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;EAS7B,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAIjE,eAAO,MAAM,sBAAsB;;;;;;;;;;;;EAIjC,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC"}
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LeaderboardQuerySchema = exports.CreatePhraseSchema = exports.PhraseQuerySchema = exports.ResolveCrisisSchema = exports.SendMessageSchema = exports.StartSessionSchema = exports.SKILL_DIMENSIONS = exports.PHRASE_SCENES = exports.RANK_LABELS = exports.PLAYER_RANKS = exports.CRISIS_TYPES = exports.CHARACTER_GENDERS = exports.CHARACTER_PERSONALITIES = void 0;
4
+ const zod_1 = require("zod");
5
+ // ─── Character Personalities ─────────────────────────────────────────────────
6
+ exports.CHARACTER_PERSONALITIES = [
7
+ 'gentle',
8
+ 'tsundere',
9
+ 'intellectual',
10
+ 'rational',
11
+ 'playful',
12
+ 'mysterious',
13
+ ];
14
+ exports.CHARACTER_GENDERS = ['male', 'female', 'neutral'];
15
+ // ─── Crisis Types ────────────────────────────────────────────────────────────
16
+ exports.CRISIS_TYPES = [
17
+ 'double_date',
18
+ 'seen_together',
19
+ 'same_gift',
20
+ 'wrong_name',
21
+ 'social_media_leak',
22
+ 'mutual_friend',
23
+ 'jealousy_storm',
24
+ 'surprise_encounter',
25
+ ];
26
+ // ─── Player Ranks ────────────────────────────────────────────────────────────
27
+ exports.PLAYER_RANKS = [
28
+ 'bronze',
29
+ 'silver',
30
+ 'gold',
31
+ 'platinum',
32
+ 'diamond',
33
+ 'master',
34
+ 'king',
35
+ ];
36
+ exports.RANK_LABELS = {
37
+ bronze: { zh: '青铜直男/直女', en: 'Bronze Newbie', emoji: '🥉' },
38
+ silver: { zh: '白银暖男/暖女', en: 'Silver Sweetheart', emoji: '🥈' },
39
+ gold: { zh: '黄金交际花', en: 'Gold Socialite', emoji: '🥇' },
40
+ platinum: { zh: '铂金万人迷', en: 'Platinum Charmer', emoji: '💎' },
41
+ diamond: { zh: '钻石社交达人', en: 'Diamond Social Star', emoji: '💠' },
42
+ master: { zh: '大师级海王/海后', en: 'Master Player', emoji: '👑' },
43
+ king: { zh: '王者海王/海后', en: 'King/Queen of the Sea', emoji: '🔱' },
44
+ };
45
+ // ─── Phrase Scenes ───────────────────────────────────────────────────────────
46
+ exports.PHRASE_SCENES = [
47
+ 'first_meet',
48
+ 'daily_care',
49
+ 'resolve_awkward',
50
+ 'elegant_reject',
51
+ 'flirt',
52
+ 'cool_down',
53
+ 'crisis_response',
54
+ 'morning_night',
55
+ ];
56
+ // ─── Skill Dimensions ───────────────────────────────────────────────────────
57
+ exports.SKILL_DIMENSIONS = [
58
+ 'humor',
59
+ 'empathy',
60
+ 'topic_lead',
61
+ 'time_manage',
62
+ 'crisis_handle',
63
+ ];
64
+ // ─── Session Schemas ─────────────────────────────────────────────────────────
65
+ exports.StartSessionSchema = zod_1.z.object({
66
+ characterCount: zod_1.z.number().int().min(2).max(6).default(3),
67
+ difficulty: zod_1.z.enum(['easy', 'normal', 'hard', 'nightmare']).default('normal'),
68
+ preferredPersonalities: zod_1.z.array(zod_1.z.enum(exports.CHARACTER_PERSONALITIES)).optional(),
69
+ });
70
+ // ─── Chat Schemas ────────────────────────────────────────────────────────────
71
+ exports.SendMessageSchema = zod_1.z.object({
72
+ threadId: zod_1.z.string().uuid(),
73
+ content: zod_1.z.string().min(1).max(2000),
74
+ });
75
+ // ─── Crisis Schemas ──────────────────────────────────────────────────────────
76
+ exports.ResolveCrisisSchema = zod_1.z.object({
77
+ crisisId: zod_1.z.string().uuid(),
78
+ response: zod_1.z.string().min(1).max(2000),
79
+ });
80
+ // ─── Phrase Schemas ──────────────────────────────────────────────────────────
81
+ exports.PhraseQuerySchema = zod_1.z.object({
82
+ page: zod_1.z.coerce.number().int().min(1).default(1),
83
+ pageSize: zod_1.z.coerce.number().int().min(1).max(100).default(20),
84
+ scene: zod_1.z.enum(exports.PHRASE_SCENES).optional(),
85
+ difficulty: zod_1.z.enum(['beginner', 'intermediate', 'advanced', 'expert']).optional(),
86
+ });
87
+ exports.CreatePhraseSchema = zod_1.z.object({
88
+ scene: zod_1.z.enum(exports.PHRASE_SCENES),
89
+ trigger: zod_1.z.string().min(1),
90
+ badReply: zod_1.z.string().min(1),
91
+ goodReply: zod_1.z.string().min(1),
92
+ explanation: zod_1.z.string().min(1),
93
+ favorBonus: zod_1.z.number().int().min(0).max(20).default(5),
94
+ difficulty: zod_1.z.enum(['beginner', 'intermediate', 'advanced', 'expert']).default('beginner'),
95
+ tags: zod_1.z.string().max(500).nullable().optional(),
96
+ });
97
+ // ─── Leaderboard Schemas ─────────────────────────────────────────────────────
98
+ exports.LeaderboardQuerySchema = zod_1.z.object({
99
+ page: zod_1.z.coerce.number().int().min(1).default(1),
100
+ pageSize: zod_1.z.coerce.number().int().min(1).max(50).default(20),
101
+ season: zod_1.z.string().default('S1'),
102
+ });
103
+ //# sourceMappingURL=sea-king.schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sea-king.schema.js","sourceRoot":"","sources":["../../src/schemas/sea-king.schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { Express } from 'express';
2
+ import type { IModule, IModuleContext } from '@octo-cyber/core';
3
+ export declare class SeaKingModule implements IModule {
4
+ name: string;
5
+ entities: any[];
6
+ private characterService;
7
+ private chatService;
8
+ private crisisService;
9
+ private profileService;
10
+ private phraseService;
11
+ private leaderboardService;
12
+ private matchmakingService;
13
+ private liveChatService;
14
+ private turingService;
15
+ private wsHub;
16
+ initialize(context: IModuleContext): Promise<void>;
17
+ registerRoutes(app: Express, _context: IModuleContext): void;
18
+ }
19
+ //# sourceMappingURL=sea-king.module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sea-king.module.d.ts","sourceRoot":"","sources":["../src/sea-king.module.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAuChE,qBAAa,aAAc,YAAW,OAAO;IAC3C,IAAI,SAAc;IAClB,QAAQ,EAA6B,GAAG,EAAE,CAAC;IAG3C,OAAO,CAAC,gBAAgB,CAA0B;IAClD,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,cAAc,CAAwB;IAC9C,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,kBAAkB,CAA4B;IAGtD,OAAO,CAAC,kBAAkB,CAA4B;IACtD,OAAO,CAAC,eAAe,CAAyB;IAChD,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,KAAK,CAAsB;IAE7B,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAyDxD,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI;CA0C7D"}
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SeaKingModule = void 0;
4
+ const core_1 = require("@octo-cyber/core");
5
+ const index_js_1 = require("./entities/index.js");
6
+ const chat_character_entity_js_1 = require("./entities/chat-character.entity.js");
7
+ const chat_session_entity_js_1 = require("./entities/chat-session.entity.js");
8
+ const chat_thread_entity_js_1 = require("./entities/chat-thread.entity.js");
9
+ const chat_message_entity_js_1 = require("./entities/chat-message.entity.js");
10
+ const crisis_event_entity_js_1 = require("./entities/crisis-event.entity.js");
11
+ const player_profile_entity_js_1 = require("./entities/player-profile.entity.js");
12
+ const phrase_template_entity_js_1 = require("./entities/phrase-template.entity.js");
13
+ const leaderboard_entry_entity_js_1 = require("./entities/leaderboard-entry.entity.js");
14
+ const match_room_entity_js_1 = require("./entities/match-room.entity.js");
15
+ const live_thread_entity_js_1 = require("./entities/live-thread.entity.js");
16
+ const live_message_entity_js_1 = require("./entities/live-message.entity.js");
17
+ const player_queue_entity_js_1 = require("./entities/player-queue.entity.js");
18
+ const turing_guess_entity_js_1 = require("./entities/turing-guess.entity.js");
19
+ const character_service_js_1 = require("./services/character.service.js");
20
+ const chat_service_js_1 = require("./services/chat.service.js");
21
+ const crisis_service_js_1 = require("./services/crisis.service.js");
22
+ const profile_service_js_1 = require("./services/profile.service.js");
23
+ const phrase_service_js_1 = require("./services/phrase.service.js");
24
+ const leaderboard_service_js_1 = require("./services/leaderboard.service.js");
25
+ const seed_service_js_1 = require("./services/seed.service.js");
26
+ const matchmaking_service_js_1 = require("./services/matchmaking.service.js");
27
+ const live_chat_service_js_1 = require("./services/live-chat.service.js");
28
+ const turing_service_js_1 = require("./services/turing.service.js");
29
+ const ws_hub_service_js_1 = require("./services/ws-hub.service.js");
30
+ const character_controller_js_1 = require("./controllers/character.controller.js");
31
+ const chat_controller_js_1 = require("./controllers/chat.controller.js");
32
+ const crisis_controller_js_1 = require("./controllers/crisis.controller.js");
33
+ const profile_controller_js_1 = require("./controllers/profile.controller.js");
34
+ const phrase_controller_js_1 = require("./controllers/phrase.controller.js");
35
+ const leaderboard_controller_js_1 = require("./controllers/leaderboard.controller.js");
36
+ const matchmaking_controller_js_1 = require("./controllers/matchmaking.controller.js");
37
+ const live_chat_controller_js_1 = require("./controllers/live-chat.controller.js");
38
+ const turing_controller_js_1 = require("./controllers/turing.controller.js");
39
+ class SeaKingModule {
40
+ name = 'sea-king';
41
+ entities = [...index_js_1.SEA_KING_ENTITIES];
42
+ // Solo mode services
43
+ characterService = new character_service_js_1.CharacterService();
44
+ chatService = new chat_service_js_1.ChatService();
45
+ crisisService = new crisis_service_js_1.CrisisService();
46
+ profileService = new profile_service_js_1.ProfileService();
47
+ phraseService = new phrase_service_js_1.PhraseService();
48
+ leaderboardService = new leaderboard_service_js_1.LeaderboardService();
49
+ // Live mode services
50
+ matchmakingService = new matchmaking_service_js_1.MatchmakingService();
51
+ liveChatService = new live_chat_service_js_1.LiveChatService();
52
+ turingService = new turing_service_js_1.TuringService();
53
+ wsHub = new ws_hub_service_js_1.WSHubService();
54
+ async initialize(context) {
55
+ const ds = context.dataSource;
56
+ // ─── Solo Mode ──────────────────────────────────────────────────────────
57
+ this.characterService.initialize(ds.getRepository(chat_character_entity_js_1.ChatCharacter));
58
+ this.chatService.initialize(ds.getRepository(chat_session_entity_js_1.ChatSession), ds.getRepository(chat_thread_entity_js_1.ChatThread), ds.getRepository(chat_message_entity_js_1.ChatMessage), this.characterService);
59
+ this.crisisService.initialize(ds.getRepository(crisis_event_entity_js_1.CrisisEvent), ds.getRepository(chat_thread_entity_js_1.ChatThread));
60
+ this.profileService.initialize(ds.getRepository(player_profile_entity_js_1.PlayerProfile));
61
+ this.phraseService.initialize(ds.getRepository(phrase_template_entity_js_1.PhraseTemplate));
62
+ this.leaderboardService.initialize(ds.getRepository(leaderboard_entry_entity_js_1.LeaderboardEntry));
63
+ // ─── Live Mode ──────────────────────────────────────────────────────────
64
+ this.matchmakingService.initialize(ds.getRepository(match_room_entity_js_1.MatchRoom), ds.getRepository(live_thread_entity_js_1.LiveThread), ds.getRepository(player_queue_entity_js_1.PlayerQueue), this.characterService);
65
+ this.liveChatService.initialize(ds.getRepository(live_thread_entity_js_1.LiveThread), ds.getRepository(live_message_entity_js_1.LiveMessage), ds.getRepository(match_room_entity_js_1.MatchRoom), this.chatService);
66
+ this.turingService.initialize(ds.getRepository(turing_guess_entity_js_1.TuringGuess), ds.getRepository(live_thread_entity_js_1.LiveThread), ds.getRepository(match_room_entity_js_1.MatchRoom));
67
+ // ─── Seed default data ──────────────────────────────────────────────────
68
+ const seedService = new seed_service_js_1.SeedService(ds.getRepository(chat_character_entity_js_1.ChatCharacter), this.phraseService);
69
+ try {
70
+ const result = await seedService.seedAll();
71
+ if (result.characters > 0 || result.phrases > 0) {
72
+ console.log(`[sea-king] 🌊 Seeded ${result.characters} characters, ${result.phrases} phrase templates`);
73
+ }
74
+ }
75
+ catch (err) {
76
+ console.warn('[sea-king] Seed data warning:', err);
77
+ }
78
+ }
79
+ registerRoutes(app, _context) {
80
+ // ─── Solo Mode Controllers ───────────────────────────────────────────────
81
+ const characterCtrl = new character_controller_js_1.CharacterController();
82
+ characterCtrl.initialize(this.characterService);
83
+ const chatCtrl = new chat_controller_js_1.ChatController();
84
+ chatCtrl.initialize(this.chatService);
85
+ const crisisCtrl = new crisis_controller_js_1.CrisisController();
86
+ crisisCtrl.initialize(this.crisisService);
87
+ const profileCtrl = new profile_controller_js_1.ProfileController();
88
+ profileCtrl.initialize(this.profileService);
89
+ const phraseCtrl = new phrase_controller_js_1.PhraseController();
90
+ phraseCtrl.initialize(this.phraseService);
91
+ const leaderboardCtrl = new leaderboard_controller_js_1.LeaderboardController();
92
+ leaderboardCtrl.initialize(this.leaderboardService);
93
+ // ─── Live Mode Controllers ───────────────────────────────────────────────
94
+ const matchmakingCtrl = new matchmaking_controller_js_1.MatchmakingController();
95
+ matchmakingCtrl.initializeController(this.matchmakingService);
96
+ const liveChatCtrl = new live_chat_controller_js_1.LiveChatController();
97
+ liveChatCtrl.initializeController(this.liveChatService);
98
+ const turingCtrl = new turing_controller_js_1.TuringController();
99
+ turingCtrl.initializeController(this.turingService);
100
+ (0, core_1.registerControllers)(app, [
101
+ characterCtrl,
102
+ chatCtrl,
103
+ crisisCtrl,
104
+ profileCtrl,
105
+ phraseCtrl,
106
+ leaderboardCtrl,
107
+ matchmakingCtrl,
108
+ liveChatCtrl,
109
+ turingCtrl,
110
+ ]);
111
+ }
112
+ }
113
+ exports.SeaKingModule = SeaKingModule;
114
+ //# sourceMappingURL=sea-king.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sea-king.module.js","sourceRoot":"","sources":["../src/sea-king.module.ts"],"names":[],"mappings":";;;AAGA,2CAAuD;AACvD,kDAAwD;AACxD,kFAAoE;AACpE,8EAAgE;AAChE,4EAA8D;AAC9D,8EAAgE;AAChE,8EAAgE;AAChE,kFAAoE;AACpE,oFAAsE;AACtE,wFAA0E;AAC1E,0EAA4D;AAC5D,4EAA8D;AAC9D,8EAAgE;AAChE,8EAAgE;AAChE,8EAAgE;AAEhE,0EAAmE;AACnE,gEAAyD;AACzD,oEAA6D;AAC7D,sEAA+D;AAC/D,oEAA6D;AAC7D,8EAAuE;AACvE,gEAAyD;AACzD,8EAAuE;AACvE,0EAAkE;AAClE,oEAA6D;AAC7D,oEAA4D;AAE5D,mFAA4E;AAC5E,yEAAkE;AAClE,6EAAsE;AACtE,+EAAwE;AACxE,6EAAsE;AACtE,uFAAgF;AAChF,uFAAgF;AAChF,mFAA2E;AAC3E,6EAAsE;AAEtE,MAAa,aAAa;IACxB,IAAI,GAAG,UAAU,CAAC;IAClB,QAAQ,GAAG,CAAC,GAAG,4BAAiB,CAAU,CAAC;IAE3C,qBAAqB;IACb,gBAAgB,GAAG,IAAI,uCAAgB,EAAE,CAAC;IAC1C,WAAW,GAAG,IAAI,6BAAW,EAAE,CAAC;IAChC,aAAa,GAAG,IAAI,iCAAa,EAAE,CAAC;IACpC,cAAc,GAAG,IAAI,mCAAc,EAAE,CAAC;IACtC,aAAa,GAAG,IAAI,iCAAa,EAAE,CAAC;IACpC,kBAAkB,GAAG,IAAI,2CAAkB,EAAE,CAAC;IAEtD,qBAAqB;IACb,kBAAkB,GAAG,IAAI,2CAAkB,EAAE,CAAC;IAC9C,eAAe,GAAG,IAAI,sCAAe,EAAE,CAAC;IACxC,aAAa,GAAG,IAAI,iCAAa,EAAE,CAAC;IACpC,KAAK,GAAG,IAAI,gCAAY,EAAE,CAAC;IAEnC,KAAK,CAAC,UAAU,CAAC,OAAuB;QACtC,MAAM,EAAE,GAAe,OAAO,CAAC,UAAU,CAAC;QAE1C,2EAA2E;QAC3E,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,EAAE,CAAC,aAAa,CAAC,wCAAa,CAAC,CAAC,CAAC;QAElE,IAAI,CAAC,WAAW,CAAC,UAAU,CACzB,EAAE,CAAC,aAAa,CAAC,oCAAW,CAAC,EAC7B,EAAE,CAAC,aAAa,CAAC,kCAAU,CAAC,EAC5B,EAAE,CAAC,aAAa,CAAC,oCAAW,CAAC,EAC7B,IAAI,CAAC,gBAAgB,CACtB,CAAC;QAEF,IAAI,CAAC,aAAa,CAAC,UAAU,CAC3B,EAAE,CAAC,aAAa,CAAC,oCAAW,CAAC,EAC7B,EAAE,CAAC,aAAa,CAAC,kCAAU,CAAC,CAC7B,CAAC;QAEF,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,CAAC,aAAa,CAAC,wCAAa,CAAC,CAAC,CAAC;QAChE,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,CAAC,aAAa,CAAC,0CAAc,CAAC,CAAC,CAAC;QAChE,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC,aAAa,CAAC,8CAAgB,CAAC,CAAC,CAAC;QAEvE,2EAA2E;QAC3E,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAChC,EAAE,CAAC,aAAa,CAAC,gCAAS,CAAC,EAC3B,EAAE,CAAC,aAAa,CAAC,kCAAU,CAAC,EAC5B,EAAE,CAAC,aAAa,CAAC,oCAAW,CAAC,EAC7B,IAAI,CAAC,gBAAgB,CACtB,CAAC;QAEF,IAAI,CAAC,eAAe,CAAC,UAAU,CAC7B,EAAE,CAAC,aAAa,CAAC,kCAAU,CAAC,EAC5B,EAAE,CAAC,aAAa,CAAC,oCAAW,CAAC,EAC7B,EAAE,CAAC,aAAa,CAAC,gCAAS,CAAC,EAC3B,IAAI,CAAC,WAAW,CACjB,CAAC;QAEF,IAAI,CAAC,aAAa,CAAC,UAAU,CAC3B,EAAE,CAAC,aAAa,CAAC,oCAAW,CAAC,EAC7B,EAAE,CAAC,aAAa,CAAC,kCAAU,CAAC,EAC5B,EAAE,CAAC,aAAa,CAAC,gCAAS,CAAC,CAC5B,CAAC;QAEF,2EAA2E;QAC3E,MAAM,WAAW,GAAG,IAAI,6BAAW,CAAC,EAAE,CAAC,aAAa,CAAC,wCAAa,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QACzF,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC;YAC3C,IAAI,MAAM,CAAC,UAAU,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;gBAChD,OAAO,CAAC,GAAG,CACT,wBAAwB,MAAM,CAAC,UAAU,gBAAgB,MAAM,CAAC,OAAO,mBAAmB,CAC3F,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,cAAc,CAAC,GAAY,EAAE,QAAwB;QACnD,4EAA4E;QAC5E,MAAM,aAAa,GAAG,IAAI,6CAAmB,EAAE,CAAC;QAChD,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAEhD,MAAM,QAAQ,GAAG,IAAI,mCAAc,EAAE,CAAC;QACtC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAEtC,MAAM,UAAU,GAAG,IAAI,uCAAgB,EAAE,CAAC;QAC1C,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAE1C,MAAM,WAAW,GAAG,IAAI,yCAAiB,EAAE,CAAC;QAC5C,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAE5C,MAAM,UAAU,GAAG,IAAI,uCAAgB,EAAE,CAAC;QAC1C,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAE1C,MAAM,eAAe,GAAG,IAAI,iDAAqB,EAAE,CAAC;QACpD,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAEpD,4EAA4E;QAC5E,MAAM,eAAe,GAAG,IAAI,iDAAqB,EAAE,CAAC;QACpD,eAAe,CAAC,oBAAoB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAE9D,MAAM,YAAY,GAAG,IAAI,4CAAkB,EAAE,CAAC;QAC9C,YAAY,CAAC,oBAAoB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAExD,MAAM,UAAU,GAAG,IAAI,uCAAgB,EAAE,CAAC;QAC1C,UAAU,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAEpD,IAAA,0BAAmB,EAAC,GAAG,EAAE;YACvB,aAAa;YACb,QAAQ;YACR,UAAU;YACV,WAAW;YACX,UAAU;YACV,eAAe;YACf,eAAe;YACf,YAAY;YACZ,UAAU;SACX,CAAC,CAAC;IACL,CAAC;CACF;AArHD,sCAqHC"}
@@ -0,0 +1,30 @@
1
+ import { Repository } from 'typeorm';
2
+ import { ChatCharacter } from '../entities/chat-character.entity.js';
3
+ import type { CharacterPersonality } from '../entities/chat-character.entity.js';
4
+ /**
5
+ * 角色管理服务
6
+ * 🎭 管理所有可聊天的AI角色
7
+ */
8
+ export declare class CharacterService {
9
+ private characterRepo;
10
+ initialize(characterRepo: Repository<ChatCharacter>): void;
11
+ /** 获取所有启用的角色 */
12
+ listEnabled(): Promise<ChatCharacter[]>;
13
+ /** 根据ID获取角色 */
14
+ getById(id: string): Promise<ChatCharacter | null>;
15
+ /**
16
+ * 随机挑选指定数量的角色
17
+ * 优先保证性格多样性
18
+ */
19
+ pickRandom(options: {
20
+ count: number;
21
+ preferredPersonalities?: CharacterPersonality[];
22
+ excludeIds?: string[];
23
+ }): Promise<ChatCharacter[]>;
24
+ /** 获取角色统计 */
25
+ getStats(): Promise<{
26
+ total: number;
27
+ byPersonality: Record<string, number>;
28
+ }>;
29
+ }
30
+ //# sourceMappingURL=character.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"character.service.d.ts","sourceRoot":"","sources":["../../src/services/character.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AACrE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAEjF;;;GAGG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,aAAa,CAA6B;IAElD,UAAU,CAAC,aAAa,EAAE,UAAU,CAAC,aAAa,CAAC,GAAG,IAAI;IAI1D,gBAAgB;IACV,WAAW,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAO7C,eAAe;IACT,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAIxD;;;OAGG;IACG,UAAU,CAAC,OAAO,EAAE;QACxB,KAAK,EAAE,MAAM,CAAC;QACd,sBAAsB,CAAC,EAAE,oBAAoB,EAAE,CAAC;QAChD,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;KACvB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAsC5B,aAAa;IACP,QAAQ,IAAI,OAAO,CAAC;QACxB,KAAK,EAAE,MAAM,CAAC;QACd,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACvC,CAAC;CAkBH"}
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CharacterService = void 0;
4
+ /**
5
+ * 角色管理服务
6
+ * 🎭 管理所有可聊天的AI角色
7
+ */
8
+ class CharacterService {
9
+ characterRepo;
10
+ initialize(characterRepo) {
11
+ this.characterRepo = characterRepo;
12
+ }
13
+ /** 获取所有启用的角色 */
14
+ async listEnabled() {
15
+ return this.characterRepo.find({
16
+ where: { enabled: true },
17
+ order: { createdAt: 'ASC' },
18
+ });
19
+ }
20
+ /** 根据ID获取角色 */
21
+ async getById(id) {
22
+ return this.characterRepo.findOne({ where: { id } });
23
+ }
24
+ /**
25
+ * 随机挑选指定数量的角色
26
+ * 优先保证性格多样性
27
+ */
28
+ async pickRandom(options) {
29
+ const qb = this.characterRepo
30
+ .createQueryBuilder('c')
31
+ .where('c.enabled = :enabled', { enabled: true });
32
+ if (options.excludeIds?.length) {
33
+ qb.andWhere('c.id NOT IN (:...excludeIds)', { excludeIds: options.excludeIds });
34
+ }
35
+ if (options.preferredPersonalities?.length) {
36
+ qb.andWhere('c.personality IN (:...personalities)', {
37
+ personalities: options.preferredPersonalities,
38
+ });
39
+ }
40
+ qb.orderBy('RANDOM()').take(options.count);
41
+ const result = await qb.getMany();
42
+ // 如果按偏好找不够,放宽条件
43
+ if (result.length < options.count) {
44
+ const moreQb = this.characterRepo
45
+ .createQueryBuilder('c')
46
+ .where('c.enabled = :enabled', { enabled: true });
47
+ const existingIds = result.map((r) => r.id);
48
+ if (existingIds.length) {
49
+ moreQb.andWhere('c.id NOT IN (:...ids)', { ids: existingIds });
50
+ }
51
+ moreQb.orderBy('RANDOM()').take(options.count - result.length);
52
+ const more = await moreQb.getMany();
53
+ result.push(...more);
54
+ }
55
+ return result;
56
+ }
57
+ /** 获取角色统计 */
58
+ async getStats() {
59
+ const total = await this.characterRepo.count({ where: { enabled: true } });
60
+ const byPersonalityRaw = await this.characterRepo
61
+ .createQueryBuilder('c')
62
+ .select('c.personality', 'personality')
63
+ .addSelect('COUNT(*)', 'count')
64
+ .where('c.enabled = :enabled', { enabled: true })
65
+ .groupBy('c.personality')
66
+ .getRawMany();
67
+ const byPersonality = {};
68
+ for (const row of byPersonalityRaw) {
69
+ byPersonality[row.personality] = Number(row.count);
70
+ }
71
+ return { total, byPersonality };
72
+ }
73
+ }
74
+ exports.CharacterService = CharacterService;
75
+ //# sourceMappingURL=character.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"character.service.js","sourceRoot":"","sources":["../../src/services/character.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import { Repository } from 'typeorm';
2
+ import { ChatSession } from '../entities/chat-session.entity.js';
3
+ import { ChatThread } from '../entities/chat-thread.entity.js';
4
+ import { ChatMessage } from '../entities/chat-message.entity.js';
5
+ import { CharacterService } from './character.service.js';
6
+ import type { StartSessionDto, SendMessageDto } from '../schemas/sea-king.schema.js';
7
+ /**
8
+ * 多线聊天核心服务
9
+ * 🌊 海王的核心能力就是同时聊好几个
10
+ */
11
+ export declare class ChatService {
12
+ private sessionRepo;
13
+ private threadRepo;
14
+ private messageRepo;
15
+ private characterService;
16
+ initialize(sessionRepo: Repository<ChatSession>, threadRepo: Repository<ChatThread>, messageRepo: Repository<ChatMessage>, characterService: CharacterService): void;
17
+ /** 创建新的多线聊天会话 */
18
+ startSession(dto: StartSessionDto, userId?: string): Promise<{
19
+ session: ChatSession;
20
+ threads: ChatThread[];
21
+ }>;
22
+ /** 发送消息到指定线程 */
23
+ sendMessage(dto: SendMessageDto, userId?: string): Promise<{
24
+ userMessage: ChatMessage;
25
+ characterReply: ChatMessage;
26
+ favorDelta: number;
27
+ newFavorability: number;
28
+ threadStatus: string;
29
+ }>;
30
+ /** 获取会话详情 */
31
+ getSession(sessionId: string): Promise<ChatSession | null>;
32
+ /** 获取线程消息列表 */
33
+ getThreadMessages(threadId: string, page?: number, pageSize?: number): Promise<{
34
+ items: ChatMessage[];
35
+ total: number;
36
+ }>;
37
+ /** 结束会话 */
38
+ endSession(sessionId: string): Promise<ChatSession>;
39
+ /** 获取历史会话列表 */
40
+ getHistory(userId?: string, page?: number, pageSize?: number): Promise<{
41
+ items: ChatSession[];
42
+ total: number;
43
+ }>;
44
+ private generateGreeting;
45
+ private analyzeMessage;
46
+ private generateReply;
47
+ private generateSessionSummary;
48
+ }
49
+ //# sourceMappingURL=chat.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.service.d.ts","sourceRoot":"","sources":["../../src/services/chat.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAGrF;;;GAGG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,WAAW,CAA2B;IAC9C,OAAO,CAAC,UAAU,CAA0B;IAC5C,OAAO,CAAC,WAAW,CAA2B;IAC9C,OAAO,CAAC,gBAAgB,CAAoB;IAE5C,UAAU,CACR,WAAW,EAAE,UAAU,CAAC,WAAW,CAAC,EACpC,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC,EAClC,WAAW,EAAE,UAAU,CAAC,WAAW,CAAC,EACpC,gBAAgB,EAAE,gBAAgB,GACjC,IAAI;IAOP,iBAAiB;IACX,YAAY,CAAC,GAAG,EAAE,eAAe,EAAE,MAAM,GAAE,MAAoB,GAAG,OAAO,CAAC;QAC9E,OAAO,EAAE,WAAW,CAAC;QACrB,OAAO,EAAE,UAAU,EAAE,CAAC;KACvB,CAAC;IA0DF,gBAAgB;IACV,WAAW,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,GAAE,MAAoB,GAAG,OAAO,CAAC;QAC5E,WAAW,EAAE,WAAW,CAAC;QACzB,cAAc,EAAE,WAAW,CAAC;QAC5B,UAAU,EAAE,MAAM,CAAC;QACnB,eAAe,EAAE,MAAM,CAAC;QACxB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IAqEF,aAAa;IACP,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAOhE,eAAe;IACT,iBAAiB,CACrB,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,MAAU,EAChB,QAAQ,GAAE,MAAW,GACpB,OAAO,CAAC;QAAE,KAAK,EAAE,WAAW,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAUnD,WAAW;IACL,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAezD,eAAe;IACT,UAAU,CACd,MAAM,GAAE,MAAoB,EAC5B,IAAI,GAAE,MAAU,EAChB,QAAQ,GAAE,MAAW,GACpB,OAAO,CAAC;QAAE,KAAK,EAAE,WAAW,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAYnD,OAAO,CAAC,gBAAgB;IAgCxB,OAAO,CAAC,cAAc;IA+EtB,OAAO,CAAC,aAAa;IAiDrB,OAAO,CAAC,sBAAsB;CAqB/B"}