feat(thought): add mood-contextual emoji picker

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
root
2026-03-08 21:05:55 +00:00
parent a16d70a1b8
commit 4e5edda6c6
2 changed files with 68 additions and 0 deletions
@@ -0,0 +1,44 @@
import { describe, it, expect } from 'vitest';
import { pickThoughtEmoji, type ThoughtContext } from '../thoughtEmoji.js';
describe('pickThoughtEmoji', () => {
it('returns hungry emoji when hunger is critical', () => {
expect(pickThoughtEmoji({ trigger: 'need_critical', hunger: 15, energy: 80 })).toBe('🍖');
});
it('returns tired emoji when energy is critical', () => {
expect(pickThoughtEmoji({ trigger: 'need_critical', hunger: 80, energy: 10 })).toBe('😴');
});
it('returns hungry emoji when both are critical (hunger wins)', () => {
expect(pickThoughtEmoji({ trigger: 'need_critical', hunger: 10, energy: 10 })).toBe('🍖');
});
it('returns happy emoji for positive interaction', () => {
expect(pickThoughtEmoji({ trigger: 'post_interaction', interactionPositive: true })).toBe('😊');
});
it('returns frustrated emoji for negative interaction', () => {
expect(pickThoughtEmoji({ trigger: 'post_interaction', interactionPositive: false })).toBe('😤');
});
it('returns thinking emoji for idle trigger', () => {
expect(pickThoughtEmoji({ trigger: 'idle' })).toBe('🤔');
});
it('returns thinking emoji for periodic trigger', () => {
expect(pickThoughtEmoji({ trigger: 'periodic' })).toBe('🤔');
});
it('returns happy emoji for tier_change positive', () => {
expect(pickThoughtEmoji({ trigger: 'tier_change', interactionPositive: true })).toBe('😊');
});
it('returns frustrated emoji for tier_change negative', () => {
expect(pickThoughtEmoji({ trigger: 'tier_change', interactionPositive: false })).toBe('😤');
});
it('returns fallback for unknown trigger', () => {
expect(pickThoughtEmoji({ trigger: 'unknown' as any })).toBe('💭');
});
});
+24
View File
@@ -0,0 +1,24 @@
export interface ThoughtContext {
trigger: 'need_critical' | 'post_interaction' | 'tier_change' | 'idle' | 'periodic';
hunger?: number;
energy?: number;
interactionPositive?: boolean;
}
export function pickThoughtEmoji(ctx: ThoughtContext): string {
switch (ctx.trigger) {
case 'need_critical': {
const hunger = ctx.hunger ?? 100;
const energy = ctx.energy ?? 100;
return hunger <= energy ? '🍖' : '😴';
}
case 'post_interaction':
case 'tier_change':
return ctx.interactionPositive ? '😊' : '😤';
case 'idle':
case 'periodic':
return '🤔';
default:
return '💭';
}
}