@myclaw163/clawclaw-cli 0.6.66 → 0.6.68

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 (206) hide show
  1. package/README.md +427 -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/find-hide-spots.py +157 -157
  9. package/scripts/postinstall.mjs +20 -20
  10. package/scripts/sync-bundled-skill.mjs +244 -244
  11. package/scripts/sync-bundled-skill.test.mjs +152 -152
  12. package/skills/clawclaw/SKILL.md +244 -245
  13. package/skills/clawclaw/references/CHATTERBOX.md +142 -142
  14. package/skills/clawclaw/references/COMMANDS.md +148 -148
  15. package/skills/clawclaw/references/GAME-MECHANICS.md +188 -188
  16. package/skills/clawclaw/references/HUB.md +48 -48
  17. package/skills/clawclaw/references/KNOWLEDGE.md +45 -43
  18. package/skills/clawclaw/references/STRATEGIES.md +57 -57
  19. package/skills/clawclaw/references/STREAM.md +91 -92
  20. package/skills/clawclaw/references/TACTICS.md +65 -65
  21. package/src/assets/clawclaw-ascii-map.txt +40 -40
  22. package/src/cli.ts +110 -110
  23. package/src/commands/_schema.ts +109 -109
  24. package/src/commands/account.ts +209 -209
  25. package/src/commands/config.ts +30 -30
  26. package/src/commands/do.test.ts +73 -73
  27. package/src/commands/do.ts +126 -126
  28. package/src/commands/events.test.ts +71 -71
  29. package/src/commands/events.ts +155 -155
  30. package/src/commands/game-map.test.ts +28 -28
  31. package/src/commands/game-start-plan.test.ts +84 -84
  32. package/src/commands/game.ts +1027 -1027
  33. package/src/commands/history-player.test.ts +102 -102
  34. package/src/commands/history.ts +573 -573
  35. package/src/commands/hub.test.ts +96 -96
  36. package/src/commands/hub.ts +234 -234
  37. package/src/commands/knowledge.test.ts +13 -19
  38. package/src/commands/knowledge.ts +139 -168
  39. package/src/commands/load.test.ts +51 -51
  40. package/src/commands/load.ts +13 -13
  41. package/src/commands/meeting-history.test.ts +106 -106
  42. package/src/commands/memory.ts +40 -40
  43. package/src/commands/peek.ts +45 -45
  44. package/src/commands/persona.ts +57 -57
  45. package/src/commands/setup/codex.ts +266 -248
  46. package/src/commands/setup/hermes.test.ts +96 -96
  47. package/src/commands/setup/hermes.ts +76 -76
  48. package/src/commands/setup/index.ts +13 -13
  49. package/src/commands/setup/openclaw.test.ts +114 -114
  50. package/src/commands/setup/openclaw.ts +147 -147
  51. package/src/commands/skill.ts +128 -128
  52. package/src/commands/state.ts +46 -46
  53. package/src/commands/strategy.test.ts +135 -135
  54. package/src/commands/strategy.ts +180 -180
  55. package/src/commands/tts.ts +128 -128
  56. package/src/commands/upgrade.test.ts +82 -82
  57. package/src/commands/upgrade.ts +148 -148
  58. package/src/commands/watch.test.ts +966 -966
  59. package/src/commands/watch.ts +659 -659
  60. package/src/lib/auth.test.ts +59 -59
  61. package/src/lib/auth.ts +186 -186
  62. package/src/lib/command-meta.ts +37 -37
  63. package/src/lib/game-client.ts +391 -391
  64. package/src/lib/host-config-patcher.test.ts +130 -130
  65. package/src/lib/host-config-patcher.ts +151 -151
  66. package/src/lib/http-keepalive.ts +15 -15
  67. package/src/lib/http-transport.test.ts +42 -42
  68. package/src/lib/http-transport.ts +113 -113
  69. package/src/lib/hub-client.test.ts +56 -56
  70. package/src/lib/hub-client.ts +88 -88
  71. package/src/lib/hub-install.test.ts +98 -98
  72. package/src/lib/hub-install.ts +121 -121
  73. package/src/lib/hub-reminder.ts +56 -56
  74. package/src/lib/hub-unzip.test.ts +69 -69
  75. package/src/lib/hub-unzip.ts +62 -62
  76. package/src/lib/init-command.test.ts +75 -75
  77. package/src/lib/init-command.ts +120 -120
  78. package/src/lib/knowledge-store.test.ts +170 -180
  79. package/src/lib/knowledge-store.ts +369 -374
  80. package/src/lib/load-context.test.ts +52 -52
  81. package/src/lib/load-context.ts +52 -52
  82. package/src/lib/match-state.test.ts +134 -134
  83. package/src/lib/match-state.ts +94 -94
  84. package/src/lib/netease-tts.ts +83 -83
  85. package/src/lib/normalize.ts +42 -42
  86. package/src/lib/persona.test.ts +41 -41
  87. package/src/lib/persona.ts +72 -72
  88. package/src/lib/server-registry.ts +152 -152
  89. package/src/lib/skill-version.test.ts +48 -48
  90. package/src/lib/skill-version.ts +19 -19
  91. package/src/lib/strategy-export.test.ts +232 -232
  92. package/src/lib/strategy-export.ts +242 -242
  93. package/src/lib/tts-keys.ts +7 -7
  94. package/src/lib/tts-speech.test.ts +63 -63
  95. package/src/lib/tts-speech.ts +76 -76
  96. package/src/lib/workspace-argv.test.ts +49 -49
  97. package/src/lib/workspace-argv.ts +44 -44
  98. package/src/perception/player-history-store.test.ts +87 -87
  99. package/src/perception/player-history-store.ts +194 -194
  100. package/src/pipeline/event-format.test.ts +135 -135
  101. package/src/pipeline/event-format.ts +376 -376
  102. package/src/pipeline/event-hints.ts +173 -173
  103. package/src/pipeline/event-store.test.ts +28 -28
  104. package/src/pipeline/event-store.ts +193 -193
  105. package/src/pipeline/pipeline.ts +35 -35
  106. package/src/runtime/auto-upgrade.test.ts +66 -66
  107. package/src/runtime/auto-upgrade.ts +31 -31
  108. package/src/runtime/event-daemon.test.ts +107 -107
  109. package/src/runtime/event-daemon.ts +409 -409
  110. package/src/runtime/owner-control.ts +150 -150
  111. package/src/runtime/raw-ws-log.test.ts +33 -33
  112. package/src/runtime/raw-ws-log.ts +32 -32
  113. package/src/runtime/runtime-logger.ts +107 -107
  114. package/src/runtime/ws-client.test.ts +104 -104
  115. package/src/runtime/ws-client.ts +272 -272
  116. package/src/sdk/action.ts +166 -166
  117. package/src/sdk/index.ts +110 -111
  118. package/src/sdk/types.ts +161 -159
  119. package/src/strategies/avoid-lone.ts +11 -11
  120. package/src/strategies/avoid-players.knowledge.md +19 -20
  121. package/src/strategies/avoid-players.ts +15 -15
  122. package/src/strategies/corpse-patrol.ts +22 -22
  123. package/src/strategies/crab-sabotage.ts +21 -21
  124. package/src/strategies/custom-module.test.ts +269 -269
  125. package/src/strategies/find-player.ts +16 -16
  126. package/src/strategies/game-utils.test.ts +190 -190
  127. package/src/strategies/game-utils.ts +794 -782
  128. package/src/strategies/goals/anchor-linger.ts +77 -77
  129. package/src/strategies/goals/avoid-lone-top.ts +168 -168
  130. package/src/strategies/goals/avoid-players-top.test.ts +83 -83
  131. package/src/strategies/goals/avoid-players-top.ts +121 -121
  132. package/src/strategies/goals/conversation-goal.ts +51 -51
  133. package/src/strategies/goals/corpse-patrol-top.ts +113 -91
  134. package/src/strategies/goals/crab-octopus-reflexes.ts +93 -93
  135. package/src/strategies/goals/crab-sabotage-top.ts +197 -197
  136. package/src/strategies/goals/emergency-hunt-goal.ts +28 -28
  137. package/src/strategies/goals/find-player-top.ts +93 -93
  138. package/src/strategies/goals/flee-players-goal.ts +53 -53
  139. package/src/strategies/goals/follow-companion-goal.ts +106 -106
  140. package/src/strategies/goals/goal-manager.ts +41 -41
  141. package/src/strategies/goals/goal-root-strategy.ts +49 -49
  142. package/src/strategies/goals/goal.ts +28 -28
  143. package/src/strategies/goals/hide-top.ts +197 -197
  144. package/src/strategies/goals/keep-away-goal.ts +217 -217
  145. package/src/strategies/goals/kill-frenzy-top.ts +80 -80
  146. package/src/strategies/goals/kill-lone-top.ts +160 -160
  147. package/src/strategies/goals/kill-target-goal.ts +59 -59
  148. package/src/strategies/goals/kill-target-top.ts +109 -109
  149. package/src/strategies/goals/leaf-goal.ts +27 -25
  150. package/src/strategies/goals/linger-corpse-goal.ts +35 -35
  151. package/src/strategies/goals/lone-kill-core.ts +82 -82
  152. package/src/strategies/goals/lone-kill-goal.ts +24 -24
  153. package/src/strategies/goals/lone-kill-task-top.test.ts +85 -85
  154. package/src/strategies/goals/lone-kill-task-top.ts +117 -86
  155. package/src/strategies/goals/move-room-goal.ts +60 -60
  156. package/src/strategies/goals/normal-shrimp-top.test.ts +80 -80
  157. package/src/strategies/goals/normal-shrimp-top.ts +242 -242
  158. package/src/strategies/goals/paradise-fish-top.test.ts +126 -126
  159. package/src/strategies/goals/paradise-fish-top.ts +224 -207
  160. package/src/strategies/goals/patrol-top.ts +57 -57
  161. package/src/strategies/goals/report-patrol-top.ts +80 -80
  162. package/src/strategies/goals/safe-task-goal.ts +102 -102
  163. package/src/strategies/goals/social-task-top.ts +161 -161
  164. package/src/strategies/goals/task-kill-report-top.ts +163 -163
  165. package/src/strategies/goals/task-only-top.ts +57 -57
  166. package/src/strategies/goals/task-or-patrol-goal.ts +41 -41
  167. package/src/strategies/goals/task-report-top.ts +57 -57
  168. package/src/strategies/goals/wander-task-goal.ts +33 -33
  169. package/src/strategies/goals/warrior-shrimp-top.test.ts +87 -86
  170. package/src/strategies/goals/warrior-shrimp-top.ts +560 -500
  171. package/src/strategies/greeting.ts +53 -53
  172. package/src/strategies/hide-spots.ts +123 -123
  173. package/src/strategies/hide.ts +23 -23
  174. package/src/strategies/kill-frenzy.ts +12 -12
  175. package/src/strategies/kill-lone.knowledge.md +17 -20
  176. package/src/strategies/kill-lone.ts +13 -13
  177. package/src/strategies/kill-target.ts +18 -18
  178. package/src/strategies/loader.test.ts +678 -678
  179. package/src/strategies/loader.ts +172 -172
  180. package/src/strategies/lone-kill-task.ts +21 -21
  181. package/src/strategies/meeting-gate.test.ts +59 -59
  182. package/src/strategies/meeting-gate.ts +23 -23
  183. package/src/strategies/move-room.ts +15 -15
  184. package/src/strategies/new-events-backfill.ts +98 -98
  185. package/src/strategies/paradise-fish.knowledge.md +19 -20
  186. package/src/strategies/paradise-fish.ts +25 -25
  187. package/src/strategies/pathfind/distance-field.ts +150 -150
  188. package/src/strategies/pathfind/escape-planner.test.ts +197 -197
  189. package/src/strategies/pathfind/escape-planner.ts +355 -355
  190. package/src/strategies/pathfind/walkable-grid.ts +117 -117
  191. package/src/strategies/patrol.ts +11 -11
  192. package/src/strategies/player-targets.ts +13 -13
  193. package/src/strategies/report-patrol.ts +11 -11
  194. package/src/strategies/shrimp-memory.knowledge.md +19 -20
  195. package/src/strategies/shrimp-memory.ts +25 -25
  196. package/src/strategies/social-task.test.ts +28 -28
  197. package/src/strategies/social-task.ts +49 -49
  198. package/src/strategies/spawn.ts +82 -82
  199. package/src/strategies/speech-module.ts +123 -123
  200. package/src/strategies/strategy-loop.ts +771 -771
  201. package/src/strategies/task-kill-report.ts +17 -17
  202. package/src/strategies/task-only.ts +11 -11
  203. package/src/strategies/task-report.ts +22 -22
  204. package/src/strategies/types.ts +102 -102
  205. package/src/strategies/warrior-memory.knowledge.md +21 -22
  206. package/src/strategies/warrior-memory.ts +16 -16
package/src/sdk/types.ts CHANGED
@@ -1,159 +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
- task_progress?: { completed: number; goal: number };
134
- new_events?: Array<Record<string, any>>;
135
- stale: boolean;
136
- meeting?: MeetingState;
137
- winner?: string | null;
138
- win_reason?: string;
139
- all_players?: Array<{ name: string; role: string; is_alive: boolean; seat: number }>;
140
- settlement?: Record<string, any>;
141
- game_id?: string;
142
- last_ejected?: string | null;
143
- last_votes?: Record<string, string>;
144
- [key: string]: any;
145
- }
146
-
147
- // ─── Review ───
148
-
149
- export interface GameResult {
150
- gameId: string;
151
- won: boolean;
152
- role: string;
153
- faction: string;
154
- winner: string;
155
- winReason: string;
156
- survivedToEnd: boolean;
157
- totalTicks: number;
158
- allPlayers: Array<{ name: string; role: string; is_alive: boolean; seat: number }>;
159
- }
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,11 +1,11 @@
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
- description: '避免落单。视野里只有一个人时寻路躲避主动避开(推演逃点、持续远离);视野里有两人以上时跟住次近的玩家、把可见人数维持在 ≥2(最近的人本就贴着不会丢,次近的人才是跌回一对一的临界);持续无人或没有当前目标时巡逻。',
8
- create() {
9
- return new GoalRootStrategy('avoid-lone', () => new AvoidLoneTop(), { resetOnMeetingResume: false });
10
- },
11
- };
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
+ description: '避免落单。视野里只有一个人时寻路躲避主动避开(推演逃点、持续远离);视野里有两人以上时跟住次近的玩家、把可见人数维持在 ≥2(最近的人本就贴着不会丢,次近的人才是跌回一对一的临界);持续无人或没有当前目标时巡逻。',
8
+ create() {
9
+ return new GoalRootStrategy('avoid-lone', () => new AvoidLoneTop(), { resetOnMeetingResume: false });
10
+ },
11
+ };
@@ -1,20 +1,19 @@
1
- # avoid-players 知识契约
2
-
3
- `avoid-players` 读取统一的玩家三档标记:
4
-
5
- | 标记 | 行为 |
6
- |------|------|
7
- | `suspect` | 加入回避名单,进入视野便逃离 |
8
- | `hostile` | 加入回避名单,进入视野便逃离 |
9
- | `trusted` | 不因知识标记而回避 |
10
-
11
- 回避名单 = 启动参数(座位号/名字)∪ suspect/hostile 标记。威胁消失后恢复巡逻。
12
-
13
- ```bash
14
- ccl knowledge mark 4 suspect --confidence 0.7 --note "贴脸尾随"
15
- ccl knowledge mark 4 hostile --confidence 0.9 --note "确认危险"
16
- ccl knowledge mark 4 trusted --note "已澄清"
17
- ccl knowledge del player 4
18
- ```
19
-
20
- `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,15 +1,15 @@
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
- description: '回避玩家:按房间顺序巡逻,视野里出现回避目标就寻路躲避(推演逃点、持续远离),威胁消失后恢复巡逻。回避名单 = 启动参数(座位号或名字,可多人,可省略)∪ 知识库中标记为 suspect/hostile 的玩家;trusted 不回避。Agent 可用 `ccl knowledge mark` 动态改判,免重启。',
9
- create(args?: string[]) {
10
- const targets = args ? parseTargetArgs(args) : [];
11
- return new GoalRootStrategy('avoid-players', () => new AvoidPlayersTop(targets), {
12
- resetOnMeetingResume: false,
13
- });
14
- },
15
- };
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
+ description: '回避玩家:按房间顺序巡逻,视野里出现回避目标就寻路躲避(推演逃点、持续远离),威胁消失后恢复巡逻。回避名单 = 启动参数(座位号或名字,可多人,可省略)∪ 知识库中标记为 hostile(坏人)的玩家;trusted 与未标记的被怀疑者都不自动回避(要躲就标 hostile 或用启动参数点名)。Agent 可用 `ccl knowledge mark` 动态改判,免重启。',
9
+ create(args?: string[]) {
10
+ const targets = args ? parseTargetArgs(args) : [];
11
+ return new GoalRootStrategy('avoid-players', () => new AvoidPlayersTop(targets), {
12
+ resetOnMeetingResume: false,
13
+ });
14
+ },
15
+ };
@@ -1,22 +1,22 @@
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
- description: '发现尸体就在附近40至100距离内随机游荡,但不报告——故意在尸体旁出没制造嫌疑感。没有尸体时巡逻各房间。传入打招呼话术时,视野内出现人就随机发送一条,之后120秒内不再发言。不做任务,不杀人。(天堂鱼默认;进阶版见 paradise-fish)参数:可选:1~3 条打招呼话术。',
19
- create(args?: string[]) {
20
- return new CorpsePatrolStrategy(parseGreetingArgs(args, 'corpse-patrol'));
21
- },
22
- };
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
+ description: '发现尸体就在附近40至100距离内随机游荡,但不报告——故意在尸体旁出没制造嫌疑感。没有尸体时巡逻各房间。传入打招呼话术时,视野内出现人就随机发送一条,之后120秒内不再发言。不做任务,不杀人;但残局(已知存活≤6)出现紧急维修任务时例外,会最高优先级抢着去做,阻止蟹靠破坏倒计时取胜。(天堂鱼默认;进阶版见 paradise-fish)参数:可选:1~3 条打招呼话术。',
19
+ create(args?: string[]) {
20
+ return new CorpsePatrolStrategy(parseGreetingArgs(args, 'corpse-patrol'));
21
+ },
22
+ };
@@ -1,21 +1,21 @@
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
- description: '优先完成蟹的真实破坏任务(破坏点紧挨已知尸体时会跳过);做完立刻触发紧急警报;警报期照样会被举报、不乱杀,只清真正落单的目标。有紧急事件时跳过破坏流程。视野里只有一个非队友且冷却可用就靠近,进入50距离就立刻出刀,即使正在做破坏任务;刀在冷却时不追不等、改做低优先级任务伪装,冷却好且目标仍落单可见再出刀;正在做任务时不会撇下任务去追猎(贴脸且刀好仍会立刻出刀)。发现尸体且附近有非队友、但当前不能原地出刀时,会靠近并报告尸体。视野里出现两人以上时,暂停攻击10秒并做任务伪装,先做真实任务再做虾的伪装任务;选任务时会跳过紧挨已知尸体(含看见过、已离开视野的)的任务。没有可做任务时按房间巡逻,绝不停在原地。(普通蟹默认)',
10
- create(args?: string[]) {
11
- const role = args?.[0] ?? 'crab_generic';
12
- let convo: ConversationGoal | null = null;
13
- return new GoalRootStrategy('crab-sabotage', () => {
14
- convo = new ConversationGoal(() => new CrabSabotageTop(), new SpeechModule(getSpeechConfigForRole(role)));
15
- return convo;
16
- }, {
17
- resetOnMeetingResume: false,
18
- onUpdateRole: role => convo?.updateConfig(role),
19
- });
20
- },
21
- };
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
+ description: '优先完成蟹的真实破坏任务(破坏点紧挨已知尸体时会跳过);做完立刻触发紧急警报;警报期照样会被举报、不乱杀,只清真正落单的目标。有紧急事件时跳过破坏流程。视野里只有一个非队友且冷却可用就靠近,进入50距离就立刻出刀,即使正在做破坏任务;刀在冷却时不追不等、改做低优先级任务伪装,冷却好且目标仍落单可见再出刀;正在做任务时不会撇下任务去追猎(贴脸且刀好仍会立刻出刀)。发现尸体且附近有非队友、但当前不能原地出刀时,会靠近并报告尸体。视野里出现两人以上时,暂停攻击10秒并做任务伪装,先做真实任务再做虾的伪装任务;选任务时会跳过紧挨已知尸体(含看见过、已离开视野的)的任务。没有可做任务时按房间巡逻,绝不停在原地。(普通蟹默认)',
10
+ create(args?: string[]) {
11
+ const role = args?.[0] ?? 'crab_generic';
12
+ let convo: ConversationGoal | null = null;
13
+ return new GoalRootStrategy('crab-sabotage', () => {
14
+ convo = new ConversationGoal(() => new CrabSabotageTop(), new SpeechModule(getSpeechConfigForRole(role)));
15
+ return convo;
16
+ }, {
17
+ resetOnMeetingResume: false,
18
+ onUpdateRole: role => convo?.updateConfig(role),
19
+ });
20
+ },
21
+ };