Skip to content

Commit d53031f

Browse files
shinohara-rinnekomeowww
authored andcommitted
feat(minecraft): accept system message
1 parent 69c61c1 commit d53031f

File tree

6 files changed

+68
-5
lines changed

6 files changed

+68
-5
lines changed

services/minecraft/src/cognitive/conscious/brain.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ export class Brain {
162162
this.blackboard.update({ selfUsername: bot.username })
163163

164164
const handleSignal = async (signal: PerceptionSignal) => {
165-
if (signal.type !== 'chat_message' && signal.type !== 'social_presence')
165+
if (signal.type !== 'chat_message' && signal.type !== 'social_presence' && signal.type !== 'system_message')
166166
return
167167

168168
try {
@@ -182,6 +182,10 @@ export class Brain {
182182
void handleSignal(event.payload)
183183
})
184184

185+
this.deps.eventBus.subscribe<PerceptionSignal>('signal:system_message', (event: TracedEvent<PerceptionSignal>) => {
186+
void handleSignal(event.payload)
187+
})
188+
185189
// Listen to Task Execution Events (Action Feedback)
186190
this.deps.taskExecutor.on('action:started', ({ action }) => {
187191
const id = action.id

services/minecraft/src/cognitive/perception/mineflayer-perception-collector.ts

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import type {
1111
SightedArmSwingEvent,
1212
SightedEntityMovedEvent,
1313
SightedSneakToggleEvent,
14+
SystemMessageEvent,
1415
} from './types/raw-events'
1516

1617
export class MineflayerPerceptionCollector {
@@ -77,12 +78,15 @@ export class MineflayerPerceptionCollector {
7778
this.onBot('entityMoved', entity => this.handleEntityMoved(entity))
7879
this.onBot('entitySwingArm', entity => this.handleEntitySwingArm(entity))
7980
this.onBot('entityUpdate', entity => this.handleEntityUpdate(entity))
80-
this.onBot('playerJoined', player => this.handlePlayerJoined(player))
81-
this.onBot('playerUpdated', () => this.handlePlayersMaybeChanged())
81+
// NOTICE: playerJoined hook disconnected - system messages now cover join/leave events
82+
// this.onBot('playerJoined', player => this.handlePlayerJoined(player))
83+
// this.onBot('playerUpdated', () => this.handlePlayersMaybeChanged())
8284
this.onBot('soundEffectHeard', (soundId, pos) => this.handleSoundHeard(soundId, pos))
8385
this.onBot('health', () => this.handleHealthChange())
8486
this.onBot('playerCollect', (collector, collected) => this.handleItemCollected(collector, collected))
8587
this.onBot('entityCollect', (collector, collected) => this.handleItemCollected(collector, collected))
88+
// Listen for system messages (e.g., "player A was slain by player B", join/leave messages)
89+
this.onBot('messagestr', (message: string, messagePosition: string) => this.handleSystemMessage(message, messagePosition))
8690
}
8791

8892
// ========================================
@@ -236,6 +240,30 @@ export class MineflayerPerceptionCollector {
236240
this.emitEvent(event, 'felt.item_collected')
237241
}
238242

243+
// ========================================
244+
// System Event Handlers
245+
// ========================================
246+
247+
private handleSystemMessage(message: string, messagePosition: string): void {
248+
// messagePosition: 'chat' = player chat, 'system' = system message, 'game_info' = action bar
249+
if (messagePosition !== 'system')
250+
return
251+
252+
const event: SystemMessageEvent = {
253+
modality: 'system',
254+
kind: 'system_message',
255+
message,
256+
position: messagePosition,
257+
timestamp: Date.now(),
258+
source: 'minecraft',
259+
}
260+
261+
this.emitEvent(event, 'system.system_message')
262+
}
263+
264+
// NOTICE: handlePlayerJoined and handlePlayersMaybeChanged are disconnected
265+
// System messages now cover join/leave events via messagestr
266+
// @ts-expect-error Intentionally unused - kept for potential future reconnection
239267
private handlePlayerJoined(player: any): void {
240268
if (!player)
241269
return
@@ -261,6 +289,7 @@ export class MineflayerPerceptionCollector {
261289
this.emitEvent(event, 'system.player_joined')
262290
}
263291

292+
// @ts-expect-error Intentionally unused - kept for potential future reconnection
264293
private handlePlayersMaybeChanged(): void {
265294
const bot = this.bot
266295
if (!bot)

services/minecraft/src/cognitive/perception/pipeline.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,9 @@ export class PerceptionPipeline {
101101

102102
const signal = signalWrapper.payload as PerceptionSignal
103103

104+
// Emit with signal:<type> format so Brain and Reflex can subscribe
104105
this.deps.eventBus.emit<PerceptionSignal>({
105-
type: 'perception',
106+
type: `signal:${signal.type}`,
106107
payload: signal,
107108
source: { component: 'perception', id: 'perception' },
108109
})

services/minecraft/src/cognitive/perception/saliency-rules.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ export const EVENT_KEYS = [
3636
'sound:ambient',
3737
'felt:damage',
3838
'felt:pickup',
39+
'system:message',
3940
] as const
4041

4142
export type EventKey = typeof EVENT_KEYS[number]
@@ -169,4 +170,24 @@ export const SALIENCY_RULES: SaliencyRuleBook = {
169170
}),
170171
},
171172
},
173+
system: {
174+
system_message: {
175+
threshold: 1, // System messages are immediately salient
176+
key: 'system:message',
177+
buildSignal: (event) => {
178+
const e = event as Extract<RawPerceptionEvent, { modality: 'system', kind: 'system_message' }>
179+
return {
180+
type: 'system_message',
181+
description: e.message,
182+
sourceId: 'system',
183+
confidence: 1.0,
184+
timestamp: Date.now(),
185+
metadata: {
186+
message: e.message,
187+
position: e.position,
188+
},
189+
}
190+
},
191+
},
192+
},
172193
}

services/minecraft/src/cognitive/perception/types/raw-events.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,13 @@ export interface PlayerJoinedEvent extends RawPerceptionEventBase {
7878
displayName?: string
7979
}
8080

81-
export type SystemEvent = PlayerJoinedEvent
81+
export interface SystemMessageEvent extends RawPerceptionEventBase {
82+
modality: 'system'
83+
kind: 'system_message'
84+
message: string
85+
position: string
86+
}
87+
88+
export type SystemEvent = PlayerJoinedEvent | SystemMessageEvent
8289

8390
export type RawPerceptionEvent = SightedEvent | HeardEvent | FeltEvent | SystemEvent

services/minecraft/src/cognitive/perception/types/signals.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ export type PerceptionSignalType
55
| 'saliency_high' // generic high saliency event
66
| 'social_gesture' // e.g. teabagging, waving
77
| 'social_presence'
8+
| 'system_message' // e.g. death messages, join/leave
89

910
export interface PerceptionSignal {
1011
type: PerceptionSignalType

0 commit comments

Comments
 (0)