mom: add events system for scheduled wake-ups

- Three event types: immediate, one-shot, periodic (cron)
- Events are JSON files in workspace/events/
- EventsWatcher with fs.watch, 100ms debounce
- Queue integration via SlackBot.enqueueEvent() (max 5)
- Fix setTyping race condition causing duplicate messages
- System prompt documents events for mom
- Design doc in docs/events.md
- Add croner dependency for cron scheduling
This commit is contained in:
Mario Zechner 2025-12-12 22:45:34 +01:00
parent 03c404c15f
commit d6809328da
9 changed files with 847 additions and 7 deletions

View file

@ -72,9 +72,10 @@ export interface MomHandler {
/**
* Handle an event that triggers mom (ASYNC)
* Called only when isRunning() returned false
* Called only when isRunning() returned false for user messages.
* Events always queue and pass isEvent=true.
*/
handleEvent(event: SlackEvent, slack: SlackBot): Promise<void>;
handleEvent(event: SlackEvent, slack: SlackBot, isEvent?: boolean): Promise<void>;
/**
* Handle stop command (ASYNC)
@ -98,6 +99,10 @@ class ChannelQueue {
this.processNext();
}
size(): number {
return this.queue.length;
}
private async processNext(): Promise<void> {
if (this.processing || this.queue.length === 0) return;
this.processing = true;
@ -226,6 +231,25 @@ export class SlackBot {
});
}
// ==========================================================================
// Events Integration
// ==========================================================================
/**
* Enqueue an event for processing. Always queues (no "already working" rejection).
* Returns true if enqueued, false if queue is full (max 5).
*/
enqueueEvent(event: SlackEvent): boolean {
const queue = this.getQueue(event.channel);
if (queue.size() >= 5) {
log.logWarning(`Event queue full for ${event.channel}, discarding: ${event.text.substring(0, 50)}`);
return false;
}
log.logInfo(`Enqueueing event for ${event.channel}: ${event.text.substring(0, 50)}`);
queue.enqueue(() => this.handler.handleEvent(event, this, true));
return true;
}
// ==========================================================================
// Private - Event Handlers
// ==========================================================================