@myclaw163/clawclaw-cli 0.6.70 → 0.6.74

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 (212) hide show
  1. package/README.md +377 -427
  2. package/package.json +48 -48
  3. package/personas//347/220/206/346/231/272/346/270/251/345/222/214.md +23 -23
  4. package/personas//350/200/201/350/260/213/346/267/261/347/256/227.md +22 -22
  5. package/personas//350/257/232/346/201/263/347/233/264/347/216/207.md +22 -22
  6. package/personas//350/275/273/346/235/276/346/264/273/346/263/274.md +22 -22
  7. package/personas//351/207/216/346/200/247/345/217/233/351/200/206.md +23 -23
  8. package/scripts/check-skill-command-surface.mjs +116 -0
  9. package/scripts/find-hide-spots.py +157 -157
  10. package/scripts/postinstall.mjs +20 -20
  11. package/scripts/sync-bundled-skill.mjs +244 -244
  12. package/scripts/sync-bundled-skill.test.mjs +152 -152
  13. package/skills/clawclaw/SKILL.md +246 -244
  14. package/skills/clawclaw/references/CHATTERBOX.md +141 -142
  15. package/skills/clawclaw/references/COMMANDS.md +155 -148
  16. package/skills/clawclaw/references/GAME-MECHANICS.md +188 -188
  17. package/skills/clawclaw/references/HUB.md +48 -48
  18. package/skills/clawclaw/references/KNOWLEDGE.md +42 -45
  19. package/skills/clawclaw/references/STRATEGIES.md +59 -59
  20. package/skills/clawclaw/references/STREAM.md +93 -91
  21. package/skills/clawclaw/references/TACTICS.md +65 -65
  22. package/src/assets/clawclaw-ascii-map.txt +40 -40
  23. package/src/cli.ts +110 -110
  24. package/src/commands/_schema.ts +124 -109
  25. package/src/commands/account.ts +209 -209
  26. package/src/commands/config.ts +30 -30
  27. package/src/commands/do.test.ts +84 -73
  28. package/src/commands/do.ts +130 -126
  29. package/src/commands/events.test.ts +71 -71
  30. package/src/commands/events.ts +221 -155
  31. package/src/commands/game-map.test.ts +28 -28
  32. package/src/commands/game-start-plan.test.ts +84 -84
  33. package/src/commands/game.ts +1113 -1042
  34. package/src/commands/history-player.test.ts +102 -102
  35. package/src/commands/history.ts +573 -573
  36. package/src/commands/hub.test.ts +96 -96
  37. package/src/commands/hub.ts +234 -234
  38. package/src/commands/knowledge.test.ts +13 -13
  39. package/src/commands/knowledge.ts +139 -139
  40. package/src/commands/load.test.ts +51 -51
  41. package/src/commands/load.ts +13 -13
  42. package/src/commands/meeting-history.test.ts +106 -106
  43. package/src/commands/memory.ts +40 -40
  44. package/src/commands/peek.ts +45 -45
  45. package/src/commands/persona.ts +57 -57
  46. package/src/commands/setup/codex.ts +266 -266
  47. package/src/commands/setup/hermes.test.ts +96 -96
  48. package/src/commands/setup/hermes.ts +76 -76
  49. package/src/commands/setup/index.ts +13 -13
  50. package/src/commands/setup/openclaw.test.ts +114 -114
  51. package/src/commands/setup/openclaw.ts +147 -147
  52. package/src/commands/skill.ts +128 -128
  53. package/src/commands/state.ts +46 -46
  54. package/src/commands/strategy.test.ts +145 -145
  55. package/src/commands/strategy.ts +181 -181
  56. package/src/commands/tts.ts +128 -128
  57. package/src/commands/upgrade.test.ts +82 -82
  58. package/src/commands/upgrade.ts +148 -148
  59. package/src/commands/watch.test.ts +999 -977
  60. package/src/commands/watch.ts +660 -658
  61. package/src/lib/auth.test.ts +74 -74
  62. package/src/lib/auth.ts +186 -186
  63. package/src/lib/command-meta.ts +37 -37
  64. package/src/lib/game-client.ts +403 -391
  65. package/src/lib/game-context.ts +92 -0
  66. package/src/lib/host-config-patcher.test.ts +130 -130
  67. package/src/lib/host-config-patcher.ts +151 -151
  68. package/src/lib/http-keepalive.ts +15 -15
  69. package/src/lib/http-transport.test.ts +42 -42
  70. package/src/lib/http-transport.ts +113 -113
  71. package/src/lib/hub-client.test.ts +56 -56
  72. package/src/lib/hub-client.ts +88 -88
  73. package/src/lib/hub-install.test.ts +98 -98
  74. package/src/lib/hub-install.ts +121 -121
  75. package/src/lib/hub-reminder.ts +56 -56
  76. package/src/lib/hub-unzip.test.ts +69 -69
  77. package/src/lib/hub-unzip.ts +62 -62
  78. package/src/lib/init-command.test.ts +75 -75
  79. package/src/lib/init-command.ts +120 -120
  80. package/src/lib/knowledge-store.test.ts +170 -170
  81. package/src/lib/knowledge-store.ts +369 -369
  82. package/src/lib/load-context.test.ts +52 -52
  83. package/src/lib/load-context.ts +52 -52
  84. package/src/lib/match-state.test.ts +134 -134
  85. package/src/lib/match-state.ts +94 -94
  86. package/src/lib/netease-tts.ts +83 -83
  87. package/src/lib/normalize.ts +42 -42
  88. package/src/lib/persona.test.ts +41 -41
  89. package/src/lib/persona.ts +72 -72
  90. package/src/lib/server-registry.ts +152 -152
  91. package/src/lib/skill-version.test.ts +48 -48
  92. package/src/lib/skill-version.ts +19 -19
  93. package/src/lib/strategy-export.test.ts +232 -232
  94. package/src/lib/strategy-export.ts +242 -242
  95. package/src/lib/tts-keys.ts +7 -7
  96. package/src/lib/tts-speech.test.ts +63 -63
  97. package/src/lib/tts-speech.ts +76 -76
  98. package/src/lib/workspace-argv.test.ts +49 -49
  99. package/src/lib/workspace-argv.ts +44 -44
  100. package/src/perception/player-history-store.test.ts +87 -87
  101. package/src/perception/player-history-store.ts +194 -194
  102. package/src/pipeline/event-format.test.ts +243 -215
  103. package/src/pipeline/event-format.ts +501 -485
  104. package/src/pipeline/event-hints.ts +195 -190
  105. package/src/pipeline/event-store.test.ts +28 -28
  106. package/src/pipeline/event-store.ts +193 -193
  107. package/src/pipeline/pipeline.ts +35 -35
  108. package/src/pipeline/player-projection.test.ts +119 -0
  109. package/src/pipeline/player-projection.ts +380 -0
  110. package/src/runtime/auto-upgrade.test.ts +66 -66
  111. package/src/runtime/auto-upgrade.ts +31 -31
  112. package/src/runtime/event-daemon.test.ts +209 -141
  113. package/src/runtime/event-daemon.ts +519 -457
  114. package/src/runtime/owner-control.ts +150 -150
  115. package/src/runtime/raw-ws-log.test.ts +33 -33
  116. package/src/runtime/raw-ws-log.ts +32 -32
  117. package/src/runtime/runtime-logger.ts +107 -107
  118. package/src/runtime/ws-client.test.ts +125 -104
  119. package/src/runtime/ws-client.ts +287 -272
  120. package/src/sdk/action.ts +166 -166
  121. package/src/sdk/index.ts +110 -110
  122. package/src/sdk/types.ts +161 -161
  123. package/src/strategies/avoid-lone.ts +12 -12
  124. package/src/strategies/avoid-players.knowledge.md +19 -19
  125. package/src/strategies/avoid-players.ts +16 -16
  126. package/src/strategies/corpse-patrol.ts +23 -23
  127. package/src/strategies/crab-sabotage.ts +22 -22
  128. package/src/strategies/custom-module.test.ts +270 -270
  129. package/src/strategies/find-player.ts +17 -17
  130. package/src/strategies/game-utils.test.ts +242 -242
  131. package/src/strategies/game-utils.ts +846 -846
  132. package/src/strategies/goals/anchor-linger.ts +77 -77
  133. package/src/strategies/goals/avoid-lone-top.ts +168 -168
  134. package/src/strategies/goals/avoid-players-top.test.ts +83 -83
  135. package/src/strategies/goals/avoid-players-top.ts +121 -121
  136. package/src/strategies/goals/conversation-goal.ts +51 -51
  137. package/src/strategies/goals/corpse-patrol-top.ts +113 -113
  138. package/src/strategies/goals/crab-octopus-reflexes.ts +101 -101
  139. package/src/strategies/goals/crab-sabotage-top.ts +197 -197
  140. package/src/strategies/goals/emergency-hunt-goal.ts +28 -28
  141. package/src/strategies/goals/find-player-top.ts +93 -93
  142. package/src/strategies/goals/flee-players-goal.ts +53 -53
  143. package/src/strategies/goals/follow-companion-goal.ts +106 -106
  144. package/src/strategies/goals/goal-manager.ts +41 -41
  145. package/src/strategies/goals/goal-root-strategy.ts +49 -49
  146. package/src/strategies/goals/goal.ts +28 -28
  147. package/src/strategies/goals/hide-top.ts +197 -197
  148. package/src/strategies/goals/keep-away-goal.ts +221 -221
  149. package/src/strategies/goals/kill-frenzy-top.ts +80 -80
  150. package/src/strategies/goals/kill-lone-top.ts +160 -160
  151. package/src/strategies/goals/kill-target-goal.ts +59 -59
  152. package/src/strategies/goals/kill-target-top.ts +109 -109
  153. package/src/strategies/goals/leaf-goal.ts +27 -27
  154. package/src/strategies/goals/linger-corpse-goal.ts +35 -35
  155. package/src/strategies/goals/lone-kill-core.ts +82 -82
  156. package/src/strategies/goals/lone-kill-goal.ts +24 -24
  157. package/src/strategies/goals/lone-kill-task-top.test.ts +85 -85
  158. package/src/strategies/goals/lone-kill-task-top.ts +133 -133
  159. package/src/strategies/goals/move-room-goal.ts +60 -60
  160. package/src/strategies/goals/normal-shrimp-top.test.ts +80 -80
  161. package/src/strategies/goals/normal-shrimp-top.ts +242 -242
  162. package/src/strategies/goals/paradise-fish-top.test.ts +126 -126
  163. package/src/strategies/goals/paradise-fish-top.ts +224 -224
  164. package/src/strategies/goals/patrol-top.ts +57 -57
  165. package/src/strategies/goals/report-patrol-top.ts +80 -80
  166. package/src/strategies/goals/safe-task-goal.ts +102 -102
  167. package/src/strategies/goals/social-task-top.ts +161 -161
  168. package/src/strategies/goals/task-kill-report-top.ts +163 -163
  169. package/src/strategies/goals/task-only-top.ts +57 -57
  170. package/src/strategies/goals/task-or-patrol-goal.ts +41 -41
  171. package/src/strategies/goals/task-report-top.ts +57 -57
  172. package/src/strategies/goals/wander-task-goal.ts +33 -33
  173. package/src/strategies/goals/warrior-shrimp-top.test.ts +87 -87
  174. package/src/strategies/goals/warrior-shrimp-top.ts +267 -267
  175. package/src/strategies/greeting.ts +53 -53
  176. package/src/strategies/hide-spots.ts +59 -59
  177. package/src/strategies/hide.ts +24 -24
  178. package/src/strategies/kill-frenzy.ts +13 -13
  179. package/src/strategies/kill-lone.knowledge.md +17 -17
  180. package/src/strategies/kill-lone.ts +14 -14
  181. package/src/strategies/kill-target.ts +19 -19
  182. package/src/strategies/loader.test.ts +678 -678
  183. package/src/strategies/loader.ts +179 -179
  184. package/src/strategies/lone-kill-task.ts +22 -22
  185. package/src/strategies/meeting-gate.test.ts +59 -59
  186. package/src/strategies/meeting-gate.ts +23 -23
  187. package/src/strategies/move-room.ts +16 -16
  188. package/src/strategies/new-events-backfill.ts +98 -98
  189. package/src/strategies/off-route-points.ts +105 -105
  190. package/src/strategies/paradise-fish.knowledge.md +19 -19
  191. package/src/strategies/paradise-fish.ts +26 -26
  192. package/src/strategies/pathfind/distance-field.ts +150 -150
  193. package/src/strategies/pathfind/escape-planner.test.ts +197 -197
  194. package/src/strategies/pathfind/escape-planner.ts +355 -355
  195. package/src/strategies/pathfind/walkable-grid.ts +117 -117
  196. package/src/strategies/patrol.ts +12 -12
  197. package/src/strategies/player-targets.ts +13 -13
  198. package/src/strategies/report-patrol.ts +12 -12
  199. package/src/strategies/shrimp-memory.knowledge.md +19 -19
  200. package/src/strategies/shrimp-memory.ts +26 -26
  201. package/src/strategies/social-task.test.ts +28 -28
  202. package/src/strategies/social-task.ts +50 -50
  203. package/src/strategies/spawn.ts +82 -82
  204. package/src/strategies/speech-module.ts +123 -123
  205. package/src/strategies/strategy-loop.test.ts +15 -0
  206. package/src/strategies/strategy-loop.ts +776 -771
  207. package/src/strategies/task-kill-report.ts +18 -18
  208. package/src/strategies/task-only.ts +12 -12
  209. package/src/strategies/task-report.ts +23 -23
  210. package/src/strategies/types.ts +109 -109
  211. package/src/strategies/warrior-memory.knowledge.md +21 -21
  212. package/src/strategies/warrior-memory.ts +17 -17
package/src/sdk/types.ts CHANGED
@@ -1,161 +1,161 @@
1
- // ─── Spatial ───
2
-
3
- export interface Position {
4
- x: number;
5
- y: number;
6
- }
7
-
8
- export interface MapRoom {
9
- id: string;
10
- x: number;
11
- y: number;
12
- }
13
-
14
- // ─── WebSocket Events ───
15
-
16
- export interface GameEvent {
17
- type: string;
18
- [key: string]: any;
19
- }
20
-
21
- // ─── Action Error Codes ───
22
-
23
- export enum ActionErrorCode {
24
- TASK_ALREADY_COMPLETED = 'task_already_completed',
25
- TASK_NOT_ASSIGNED = 'task_not_assigned_to_you',
26
- TASK_ALREADY_IN_PROGRESS = 'task_already_in_progress',
27
- NO_SABOTAGE_COMPLETED = 'no_sabotage_completed',
28
- ROLE_CANNOT_KILL = 'role_cannot_kill',
29
- EMERGENCY_ALREADY_ACTIVE = 'emergency_already_active',
30
- TARGET_UNREACHABLE = 'target_unreachable_or_too_far',
31
- PATH_NOT_FOUND = 'path_not_found',
32
- INVALID_POSITION = 'invalid_position_blocked',
33
- }
34
-
35
- // ─── WebSocket Connection State ───
36
-
37
- export enum WsConnectionState {
38
- Disconnected = 'disconnected',
39
- Connecting = 'connecting',
40
- Connected = 'connected',
41
- Reconnecting = 'reconnecting',
42
- Switching = 'switching',
43
- }
44
-
45
- // ─── Phase ───
46
-
47
- export type Phase = 'preparing' | 'wandering' | 'meeting' | 'game_over';
48
- export type MeetingSubPhase = 'entry' | 'speech' | 'vote';
49
-
50
- // ─── Game State ───
51
-
52
- export interface PlayerSelf {
53
- name: string;
54
- x: number;
55
- y: number;
56
- room: string;
57
- seat?: number;
58
- role: string;
59
- faction: string;
60
- is_alive: boolean;
61
- kill_cooldown_secs?: number;
62
- kills_remaining?: number | null;
63
- currently_moving?: boolean;
64
- remaining_secs?: number;
65
- doing_task?: boolean;
66
- task_name?: string;
67
- }
68
-
69
- export interface PlayerInfo {
70
- name: string;
71
- seat?: number;
72
- x: number;
73
- y: number;
74
- room: string;
75
- distance?: number;
76
- }
77
-
78
- export interface CorpseInfo {
79
- name: string;
80
- seat?: number;
81
- room: string;
82
- distance?: number;
83
- x?: number;
84
- y?: number;
85
- }
86
-
87
- export interface MeetingState {
88
- caller: string | null;
89
- sub_phase: MeetingSubPhase;
90
- alive_players: string[];
91
- current_speaker?: string | null;
92
- speeches_so_far?: Record<string, string>;
93
- speeches?: Record<string, string>;
94
- votes_submitted?: string[];
95
- }
96
-
97
- export interface TaskInfo {
98
- task_id: string;
99
- task_name: string;
100
- room: string;
101
- status: string;
102
- x?: number;
103
- y?: number;
104
- is_fake_shrimp?: boolean;
105
- faction?: 'lobster' | 'crab';
106
- }
107
-
108
- /**
109
- * 全局任务站点(map 的 all_task_locations):所有玩家共享、开局固定的任务点位置。与 `your_tasks` /
110
- * `StrategyContext.taskData`(仅自己被分配、带 status)不同——这里只有位置,没有 status。
111
- * faction='lobster' 是正常任务点,'crab' 是破坏点。
112
- */
113
- export interface TaskLocation {
114
- name: string;
115
- room?: string;
116
- x: number;
117
- y: number;
118
- faction?: 'lobster' | 'crab';
119
- }
120
-
121
- export interface EmergencyInfo extends TaskInfo {
122
- remaining_secs: number;
123
- }
124
-
125
- export interface GameState {
126
- phase: Phase;
127
- tick: number;
128
- you: PlayerSelf;
129
- your_tasks: TaskInfo[];
130
- players: PlayerInfo[];
131
- corpses: CorpseInfo[];
132
- emergency?: EmergencyInfo;
133
- /** 服务端下发的「已知存活人数」:存活者 + 本玩家尚未目睹其死亡者之和。残局抢修紧急任务的门槛。 */
134
- alive_count?: number;
135
- task_progress?: { completed: number; goal: number };
136
- new_events?: Array<Record<string, any>>;
137
- stale: boolean;
138
- meeting?: MeetingState;
139
- winner?: string | null;
140
- win_reason?: string;
141
- all_players?: Array<{ name: string; role: string; is_alive: boolean; seat: number }>;
142
- settlement?: Record<string, any>;
143
- game_id?: string;
144
- last_ejected?: string | null;
145
- last_votes?: Record<string, string>;
146
- [key: string]: any;
147
- }
148
-
149
- // ─── Review ───
150
-
151
- export interface GameResult {
152
- gameId: string;
153
- won: boolean;
154
- role: string;
155
- faction: string;
156
- winner: string;
157
- winReason: string;
158
- survivedToEnd: boolean;
159
- totalTicks: number;
160
- allPlayers: Array<{ name: string; role: string; is_alive: boolean; seat: number }>;
161
- }
1
+ // ─── Spatial ───
2
+
3
+ export interface Position {
4
+ x: number;
5
+ y: number;
6
+ }
7
+
8
+ export interface MapRoom {
9
+ id: string;
10
+ x: number;
11
+ y: number;
12
+ }
13
+
14
+ // ─── WebSocket Events ───
15
+
16
+ export interface GameEvent {
17
+ type: string;
18
+ [key: string]: any;
19
+ }
20
+
21
+ // ─── Action Error Codes ───
22
+
23
+ export enum ActionErrorCode {
24
+ TASK_ALREADY_COMPLETED = 'task_already_completed',
25
+ TASK_NOT_ASSIGNED = 'task_not_assigned_to_you',
26
+ TASK_ALREADY_IN_PROGRESS = 'task_already_in_progress',
27
+ NO_SABOTAGE_COMPLETED = 'no_sabotage_completed',
28
+ ROLE_CANNOT_KILL = 'role_cannot_kill',
29
+ EMERGENCY_ALREADY_ACTIVE = 'emergency_already_active',
30
+ TARGET_UNREACHABLE = 'target_unreachable_or_too_far',
31
+ PATH_NOT_FOUND = 'path_not_found',
32
+ INVALID_POSITION = 'invalid_position_blocked',
33
+ }
34
+
35
+ // ─── WebSocket Connection State ───
36
+
37
+ export enum WsConnectionState {
38
+ Disconnected = 'disconnected',
39
+ Connecting = 'connecting',
40
+ Connected = 'connected',
41
+ Reconnecting = 'reconnecting',
42
+ Switching = 'switching',
43
+ }
44
+
45
+ // ─── Phase ───
46
+
47
+ export type Phase = 'preparing' | 'wandering' | 'meeting' | 'game_over';
48
+ export type MeetingSubPhase = 'entry' | 'speech' | 'vote';
49
+
50
+ // ─── Game State ───
51
+
52
+ export interface PlayerSelf {
53
+ name: string;
54
+ x: number;
55
+ y: number;
56
+ room: string;
57
+ seat?: number;
58
+ role: string;
59
+ faction: string;
60
+ is_alive: boolean;
61
+ kill_cooldown_secs?: number;
62
+ kills_remaining?: number | null;
63
+ currently_moving?: boolean;
64
+ remaining_secs?: number;
65
+ doing_task?: boolean;
66
+ task_name?: string;
67
+ }
68
+
69
+ export interface PlayerInfo {
70
+ name: string;
71
+ seat?: number;
72
+ x: number;
73
+ y: number;
74
+ room: string;
75
+ distance?: number;
76
+ }
77
+
78
+ export interface CorpseInfo {
79
+ name: string;
80
+ seat?: number;
81
+ room: string;
82
+ distance?: number;
83
+ x?: number;
84
+ y?: number;
85
+ }
86
+
87
+ export interface MeetingState {
88
+ caller: string | null;
89
+ sub_phase: MeetingSubPhase;
90
+ alive_players: string[];
91
+ current_speaker?: string | null;
92
+ speeches_so_far?: Record<string, string>;
93
+ speeches?: Record<string, string>;
94
+ votes_submitted?: string[];
95
+ }
96
+
97
+ export interface TaskInfo {
98
+ task_id: string;
99
+ task_name: string;
100
+ room: string;
101
+ status: string;
102
+ x?: number;
103
+ y?: number;
104
+ is_fake_shrimp?: boolean;
105
+ faction?: 'lobster' | 'crab';
106
+ }
107
+
108
+ /**
109
+ * 全局任务站点(map 的 all_task_locations):所有玩家共享、开局固定的任务点位置。与 `your_tasks` /
110
+ * `StrategyContext.taskData`(仅自己被分配、带 status)不同——这里只有位置,没有 status。
111
+ * faction='lobster' 是正常任务点,'crab' 是破坏点。
112
+ */
113
+ export interface TaskLocation {
114
+ name: string;
115
+ room?: string;
116
+ x: number;
117
+ y: number;
118
+ faction?: 'lobster' | 'crab';
119
+ }
120
+
121
+ export interface EmergencyInfo extends TaskInfo {
122
+ remaining_secs: number;
123
+ }
124
+
125
+ export interface GameState {
126
+ phase: Phase;
127
+ tick: number;
128
+ you: PlayerSelf;
129
+ your_tasks: TaskInfo[];
130
+ players: PlayerInfo[];
131
+ corpses: CorpseInfo[];
132
+ emergency?: EmergencyInfo;
133
+ /** 服务端下发的「已知存活人数」:存活者 + 本玩家尚未目睹其死亡者之和。残局抢修紧急任务的门槛。 */
134
+ alive_count?: number;
135
+ task_progress?: { completed: number; goal: number };
136
+ new_events?: Array<Record<string, any>>;
137
+ stale: boolean;
138
+ meeting?: MeetingState;
139
+ winner?: string | null;
140
+ win_reason?: string;
141
+ all_players?: Array<{ name: string; role: string; is_alive: boolean; seat: number }>;
142
+ settlement?: Record<string, any>;
143
+ game_id?: string;
144
+ last_ejected?: string | null;
145
+ last_votes?: Record<string, string>;
146
+ [key: string]: any;
147
+ }
148
+
149
+ // ─── Review ───
150
+
151
+ export interface GameResult {
152
+ gameId: string;
153
+ won: boolean;
154
+ role: string;
155
+ faction: string;
156
+ winner: string;
157
+ winReason: string;
158
+ survivedToEnd: boolean;
159
+ totalTicks: number;
160
+ allPlayers: Array<{ name: string; role: string; is_alive: boolean; seat: number }>;
161
+ }
@@ -1,12 +1,12 @@
1
- import type { StrategyEntry } from './types.js';
2
- import { GoalRootStrategy } from './goals/goal-root-strategy.js';
3
- import { AvoidLoneTop } from './goals/avoid-lone-top.js';
4
-
5
- export const strategy: StrategyEntry = {
6
- id: 'avoid-lone',
7
- name: '结伴',
8
- description: '避免落单。视野里只有一个人时寻路躲避主动避开(推演逃点、持续远离);视野里有两人以上时跟住次近的玩家、把可见人数维持在 ≥2(最近的人本就贴着不会丢,次近的人才是跌回一对一的临界);持续无人或没有当前目标时巡逻。',
9
- create() {
10
- return new GoalRootStrategy('avoid-lone', () => new AvoidLoneTop(), { resetOnMeetingResume: false });
11
- },
12
- };
1
+ import type { StrategyEntry } from './types.js';
2
+ import { GoalRootStrategy } from './goals/goal-root-strategy.js';
3
+ import { AvoidLoneTop } from './goals/avoid-lone-top.js';
4
+
5
+ export const strategy: StrategyEntry = {
6
+ id: 'avoid-lone',
7
+ name: '结伴',
8
+ description: '避免落单。视野里只有一个人时寻路躲避主动避开(推演逃点、持续远离);视野里有两人以上时跟住次近的玩家、把可见人数维持在 ≥2(最近的人本就贴着不会丢,次近的人才是跌回一对一的临界);持续无人或没有当前目标时巡逻。',
9
+ create() {
10
+ return new GoalRootStrategy('avoid-lone', () => new AvoidLoneTop(), { resetOnMeetingResume: false });
11
+ },
12
+ };
@@ -1,19 +1,19 @@
1
- # avoid-players 知识契约
2
-
3
- `avoid-players` 读取两档玩家标记,**未标记的一律默认「被怀疑」**:
4
-
5
- | 标记 | 行为 |
6
- |------|------|
7
- | `hostile`(坏人) | 加入回避名单,进入视野便逃离 |
8
- | `trusted`(好人) | 不因知识标记而回避 |
9
- | 未标记(被怀疑) | 不自动回避——照常按房间巡逻(需要躲谁就把它标 hostile,或用启动参数点名) |
10
-
11
- 回避名单 = 启动参数(座位号/名字)∪ 知识库 hostile 标记。威胁消失后恢复巡逻。
12
-
13
- ```bash
14
- ccl knowledge mark 4 hostile --note "确认危险"
15
- ccl knowledge mark 4 trusted --note "已澄清"
16
- ccl knowledge del player 4 # 取消标记 → 回到默认「被怀疑」(不自动回避)
17
- ```
18
-
19
- `role` 是纯身份事实,不直接控制策略。
1
+ # avoid-players 知识契约
2
+
3
+ `avoid-players` 读取两档玩家标记,**未标记的一律默认「被怀疑」**:
4
+
5
+ | 标记 | 行为 |
6
+ |------|------|
7
+ | `hostile`(坏人) | 加入回避名单,进入视野便逃离 |
8
+ | `trusted`(好人) | 不因知识标记而回避 |
9
+ | 未标记(被怀疑) | 不自动回避——照常按房间巡逻(需要躲谁就把它标 hostile,或用启动参数点名) |
10
+
11
+ 回避名单 = 启动参数(座位号/名字)∪ 知识库 hostile 标记。威胁消失后恢复巡逻。
12
+
13
+ ```bash
14
+ ccl knowledge mark 4 hostile --note "确认危险"
15
+ ccl knowledge mark 4 trusted --note "已澄清"
16
+ ccl knowledge del player 4 # 取消标记 → 回到默认「被怀疑」(不自动回避)
17
+ ```
18
+
19
+ `role` 是纯身份事实,不直接控制策略。
@@ -1,16 +1,16 @@
1
- import type { StrategyEntry } from './types.js';
2
- import { GoalRootStrategy } from './goals/goal-root-strategy.js';
3
- import { AvoidPlayersTop } from './goals/avoid-players-top.js';
4
- import { parseTargetArgs } from './player-targets.js';
5
-
6
- export const strategy: StrategyEntry = {
7
- id: 'avoid-players',
8
- name: '避人',
9
- description: '回避玩家:按房间顺序巡逻,视野里出现回避目标就寻路躲避(推演逃点、持续远离),威胁消失后恢复巡逻。回避名单 = 启动参数(座位号或名字,可多人,可省略)∪ 知识库中标记为 hostile(坏人)的玩家;trusted 与未标记的被怀疑者都不自动回避(要躲就标 hostile 或用启动参数点名)。Agent 可用 `ccl knowledge mark` 动态改判,免重启。',
10
- create(args?: string[]) {
11
- const targets = args ? parseTargetArgs(args) : [];
12
- return new GoalRootStrategy('avoid-players', () => new AvoidPlayersTop(targets), {
13
- resetOnMeetingResume: false,
14
- });
15
- },
16
- };
1
+ import type { StrategyEntry } from './types.js';
2
+ import { GoalRootStrategy } from './goals/goal-root-strategy.js';
3
+ import { AvoidPlayersTop } from './goals/avoid-players-top.js';
4
+ import { parseTargetArgs } from './player-targets.js';
5
+
6
+ export const strategy: StrategyEntry = {
7
+ id: 'avoid-players',
8
+ name: '避人',
9
+ description: '回避玩家:按房间顺序巡逻,视野里出现回避目标就寻路躲避(推演逃点、持续远离),威胁消失后恢复巡逻。回避名单 = 启动参数(座位号或名字,可多人,可省略)∪ 知识库中标记为 hostile(坏人)的玩家;trusted 与未标记的被怀疑者都不自动回避(要躲就标 hostile 或用启动参数点名)。Agent 可用 `ccl knowledge mark` 动态改判,免重启。',
10
+ create(args?: string[]) {
11
+ const targets = args ? parseTargetArgs(args) : [];
12
+ return new GoalRootStrategy('avoid-players', () => new AvoidPlayersTop(targets), {
13
+ resetOnMeetingResume: false,
14
+ });
15
+ },
16
+ };
@@ -1,23 +1,23 @@
1
- import type { StrategyEntry } from './types.js';
2
- import { GoalRootStrategy } from './goals/goal-root-strategy.js';
3
- import { CorpsePatrolTop } from './goals/corpse-patrol-top.js';
4
- import { parseGreetingArgs } from './greeting.js';
5
-
6
- class CorpsePatrolStrategy extends GoalRootStrategy {
7
- constructor(private readonly greetingPhrases: string[]) {
8
- super('corpse-patrol', () => new CorpsePatrolTop(greetingPhrases), { resetOnMeetingResume: false });
9
- }
10
-
11
- speechWarmupTexts(): string[] {
12
- return this.greetingPhrases;
13
- }
14
- }
15
-
16
- export const strategy: StrategyEntry = {
17
- id: 'corpse-patrol',
18
- name: '守尸',
19
- description: '发现尸体就在附近40至100距离内随机游荡,但不报告——故意在尸体旁出没制造嫌疑感。没有尸体时巡逻各房间。传入打招呼话术时,视野内出现人就随机发送一条,之后120秒内不再发言。不做任务,不杀人;但残局(已知存活≤6)出现紧急维修任务时例外,会最高优先级抢着去做,阻止蟹靠破坏倒计时取胜。(天堂鱼默认;进阶版见 paradise-fish)参数:可选:1~3 条打招呼话术。',
20
- create(args?: string[]) {
21
- return new CorpsePatrolStrategy(parseGreetingArgs(args, 'corpse-patrol'));
22
- },
23
- };
1
+ import type { StrategyEntry } from './types.js';
2
+ import { GoalRootStrategy } from './goals/goal-root-strategy.js';
3
+ import { CorpsePatrolTop } from './goals/corpse-patrol-top.js';
4
+ import { parseGreetingArgs } from './greeting.js';
5
+
6
+ class CorpsePatrolStrategy extends GoalRootStrategy {
7
+ constructor(private readonly greetingPhrases: string[]) {
8
+ super('corpse-patrol', () => new CorpsePatrolTop(greetingPhrases), { resetOnMeetingResume: false });
9
+ }
10
+
11
+ speechWarmupTexts(): string[] {
12
+ return this.greetingPhrases;
13
+ }
14
+ }
15
+
16
+ export const strategy: StrategyEntry = {
17
+ id: 'corpse-patrol',
18
+ name: '守尸',
19
+ description: '发现尸体就在附近40至100距离内随机游荡,但不报告——故意在尸体旁出没制造嫌疑感。没有尸体时巡逻各房间。传入打招呼话术时,视野内出现人就随机发送一条,之后120秒内不再发言。不做任务,不杀人;但残局(已知存活≤6)出现紧急维修任务时例外,会最高优先级抢着去做,阻止蟹靠破坏倒计时取胜。(天堂鱼默认;进阶版见 paradise-fish)参数:可选:1~3 条打招呼话术。',
20
+ create(args?: string[]) {
21
+ return new CorpsePatrolStrategy(parseGreetingArgs(args, 'corpse-patrol'));
22
+ },
23
+ };
@@ -1,22 +1,22 @@
1
- import type { StrategyEntry } from './types.js';
2
- import { GoalRootStrategy } from './goals/goal-root-strategy.js';
3
- import { CrabSabotageTop } from './goals/crab-sabotage-top.js';
4
- import { ConversationGoal } from './goals/conversation-goal.js';
5
- import { SpeechModule, getSpeechConfigForRole } from './speech-module.js';
6
-
7
- export const strategy: StrategyEntry = {
8
- id: 'crab-sabotage',
9
- name: '破坏蟹',
10
- description: '优先完成蟹的真实破坏任务(破坏点紧挨已知尸体时会跳过);做完立刻触发紧急警报;警报期照样会被举报、不乱杀,只清真正落单的目标。有紧急事件时跳过破坏流程。视野里只有一个非队友且冷却可用就靠近,进入50距离就立刻出刀,即使正在做破坏任务;刀在冷却时不追不等、改做低优先级任务伪装,冷却好且目标仍落单可见再出刀;正在做任务时不会撇下任务去追猎(贴脸且刀好仍会立刻出刀)。发现尸体且附近有非队友、但当前不能原地出刀时,会靠近并报告尸体。视野里出现两人以上时,暂停攻击10秒并做任务伪装,先做真实任务再做虾的伪装任务;选任务时会跳过紧挨已知尸体(含看见过、已离开视野的)的任务。没有可做任务时按房间巡逻,绝不停在原地。(普通蟹默认)',
11
- create(args?: string[]) {
12
- const role = args?.[0] ?? 'crab_generic';
13
- let convo: ConversationGoal | null = null;
14
- return new GoalRootStrategy('crab-sabotage', () => {
15
- convo = new ConversationGoal(() => new CrabSabotageTop(), new SpeechModule(getSpeechConfigForRole(role)));
16
- return convo;
17
- }, {
18
- resetOnMeetingResume: false,
19
- onUpdateRole: role => convo?.updateConfig(role),
20
- });
21
- },
22
- };
1
+ import type { StrategyEntry } from './types.js';
2
+ import { GoalRootStrategy } from './goals/goal-root-strategy.js';
3
+ import { CrabSabotageTop } from './goals/crab-sabotage-top.js';
4
+ import { ConversationGoal } from './goals/conversation-goal.js';
5
+ import { SpeechModule, getSpeechConfigForRole } from './speech-module.js';
6
+
7
+ export const strategy: StrategyEntry = {
8
+ id: 'crab-sabotage',
9
+ name: '破坏蟹',
10
+ description: '优先完成蟹的真实破坏任务(破坏点紧挨已知尸体时会跳过);做完立刻触发紧急警报;警报期照样会被举报、不乱杀,只清真正落单的目标。有紧急事件时跳过破坏流程。视野里只有一个非队友且冷却可用就靠近,进入50距离就立刻出刀,即使正在做破坏任务;刀在冷却时不追不等、改做低优先级任务伪装,冷却好且目标仍落单可见再出刀;正在做任务时不会撇下任务去追猎(贴脸且刀好仍会立刻出刀)。发现尸体且附近有非队友、但当前不能原地出刀时,会靠近并报告尸体。视野里出现两人以上时,暂停攻击10秒并做任务伪装,先做真实任务再做虾的伪装任务;选任务时会跳过紧挨已知尸体(含看见过、已离开视野的)的任务。没有可做任务时按房间巡逻,绝不停在原地。(普通蟹默认)',
11
+ create(args?: string[]) {
12
+ const role = args?.[0] ?? 'crab_generic';
13
+ let convo: ConversationGoal | null = null;
14
+ return new GoalRootStrategy('crab-sabotage', () => {
15
+ convo = new ConversationGoal(() => new CrabSabotageTop(), new SpeechModule(getSpeechConfigForRole(role)));
16
+ return convo;
17
+ }, {
18
+ resetOnMeetingResume: false,
19
+ onUpdateRole: role => convo?.updateConfig(role),
20
+ });
21
+ },
22
+ };