puck / frontend /src /engine /events.ts
vu1n's picture
Puck β€” desktop fairy familiar (HF Build Small)
3c124f3
Raw
History Blame Contribute Delete
9.59 kB
import type { EventDef } from "./types";
// The event deck Puck patrols. Lines come in three voice tiers;
// taste + fairy state pick which one he actually says.
export const EVENTS: readonly EventDef[] = [
{
id: "claude_done",
source: "Claude",
target: "claude",
glyph: "✦",
title: "Task finished β€” Implement Memory Garden",
base: { urgency: 76, relevance: 91, novelty: 48, annoyance: 16, interest: 88 },
effect: "claude_done",
lines: {
plain: "Claude finished the Memory Garden task. 7 files changed β€” worth a review.",
playful: "The thing on Desktop 2 says it's done. Seven files different. Go look before it gets cocky.",
mythic:
"The code goblin has stopped scratching. It claims the garden blooms β€” I am suspicious but pleased.",
},
memory: {
text: "Vu wants to know the moment Claude finishes a task.",
type: "preference",
icon: "πŸͺΆ",
},
},
{
id: "claude_permission",
source: "Claude",
target: "claude",
glyph: "βœ‹",
title: "Permission needed β€” run database migration",
// blocked-waiting-on-you is the design doc's killer case: urgent AND relevant β†’ interrupt band
base: { urgency: 82, relevance: 88, novelty: 45, annoyance: 20, interest: 70 },
effect: "none",
lines: {
plain: "Claude needs a yes or no before it can continue. It's blocked until you answer.",
playful: "The code goblin is pawing at a locked door. It needs your yes to keep going.",
mythic: "The goblin halts mid-ritual, hand raised β€” it awaits your blessing to proceed.",
},
memory: {
text: "A blocked Claude is wasted time β€” permission requests are interrupt-worthy.",
type: "boundary",
icon: "πŸ—οΈ",
},
},
{
id: "build_done",
source: "Build",
target: "terminal",
glyph: "β–Έ",
title: "Build succeeded in 2m 14s",
base: { urgency: 58, relevance: 72, novelty: 30, annoyance: 22, interest: 60 },
effect: "build_done",
lines: {
plain: "Build passed. 2m 14s, no errors.",
playful: "The long-running spell finished and didn't explode. Green across the board.",
mythic: "The forge cooled. Two minutes of smoke, zero curses. The artifact is whole.",
},
memory: {
text: "Builds on Desktop 2 are worth a quiet nod, not a shout.",
type: "pattern",
icon: "🌿",
},
},
{
id: "build_fail",
source: "Build",
target: "terminal",
glyph: "βœ•",
title: "Tests failed β€” 3 failing in auth.test.ts",
base: { urgency: 84, relevance: 86, novelty: 55, annoyance: 30, interest: 70 },
effect: "build_fail",
lines: {
plain: "Tests failed: 3 failing in auth.test.ts. You'll want this now.",
playful: "The forge spat sparks β€” three tests went red in auth. I'd peek before it spreads.",
mythic: "Something in the auth thicket bit back. Three little failures, fangs out. I bring word early.",
},
memory: {
text: "Vu wants failing tests surfaced fast, even mid-focus.",
type: "boundary",
icon: "πŸ„",
},
},
{
id: "mail_important",
source: "Mail",
target: "mail",
glyph: "βœ‰",
title: "New mail β€” Hugging Face (hackathon)",
base: { urgency: 64, relevance: 80, novelty: 60, annoyance: 28, interest: 72 },
effect: "mail_unread",
lines: {
plain: "Email from Hugging Face about the hackathon. Looks like it matters.",
playful: "A letter came from the hackathon people. It smells official, not spammy.",
mythic: "A rectangle from Hugging Face arrived. It hums with deadline. Worth opening, I think.",
},
memory: {
text: "Mail from the hackathon org is always worth a flag.",
type: "preference",
icon: "πŸ—οΈ",
},
},
{
id: "mail_finance",
source: "Mail",
target: "mail",
glyph: "βœ‰",
title: "New mail β€” Fidelity statement",
base: { urgency: 30, relevance: 44, novelty: 25, annoyance: 46, interest: 30 },
effect: "mail_unread",
lines: {
plain: "A statement from Fidelity landed. Not urgent β€” filed it for later.",
playful: "A rectangle from Fidelity arrived. It smells like finance. No fire, just numbers.",
mythic: "A grey envelope from the money-keepers. It can wait in the reeds until you're ready.",
},
memory: {
text: "Finance mail is low-urgency unless Vu says otherwise.",
type: "aversion",
icon: "πŸ„",
},
},
{
id: "discord_noise",
source: "Discord",
target: "discord",
glyph: "◍",
title: "12 messages in #general",
base: { urgency: 12, relevance: 18, novelty: 10, annoyance: 86, interest: 14 },
effect: "discord_noise",
lines: {
plain: "Discord #general got noisy. Nothing aimed at you β€” leaving it.",
playful: "Discord made swamp noises again. Twelve of them. No emergency in the muck.",
mythic: "The social bog gurgled twelve times. I waded in, found no treasure, waded out.",
},
memory: {
text: "Vu does not want general Discord chatter surfaced.",
type: "aversion",
icon: "πŸ„",
},
},
{
id: "discord_mention",
source: "Discord",
target: "discord",
glyph: "◍",
title: "@mention from Mira in #puck-build",
base: { urgency: 70, relevance: 78, novelty: 65, annoyance: 32, interest: 66 },
effect: "discord_mention",
lines: {
plain: "Mira mentioned you in #puck-build. That one's actually for you.",
playful: "Someone named Mira poked you directly in #puck-build. The rest is bog noise, but this isn't.",
mythic: "A voice in the bog called your true name β€” Mira, in the build-channel. That, I carry to you.",
},
memory: {
text: "Direct @mentions are worth surfacing; channel noise is not.",
type: "boundary",
icon: "πŸ—οΈ",
},
},
{
id: "calendar_soon",
source: "Calendar",
target: "calendar",
glyph: "β—·",
title: "Demo sync in 10 minutes",
base: { urgency: 80, relevance: 82, novelty: 40, annoyance: 24, interest: 58 },
effect: "calendar_soon",
lines: {
plain: "Heads up β€” demo sync in 10 minutes.",
playful: "A meeting is creeping up β€” the demo sync, ten minutes out. Just so you're not ambushed.",
mythic: "The clock-spirits whisper: a gathering approaches in ten minutes. Ready your face.",
},
memory: {
text: "Vu likes a 10-minute warning before meetings.",
type: "preference",
icon: "🌿",
},
},
{
id: "stale_tab",
source: "Browser",
target: null,
glyph: "❍",
title: "Tab open 3 days β€” 'sqlite-vec docs'",
base: { urgency: 8, relevance: 34, novelty: 20, annoyance: 40, interest: 52 },
effect: "none",
lines: {
plain: "That sqlite-vec docs tab has been open 3 days. Read it or close it?",
playful: "A tab has been loitering for three days β€” sqlite-vec docs. It deserves judgment.",
mythic: "A tab has gone feral after three days in the open. The sqlite-vec scroll. Tame it or free it.",
},
memory: {
text: "Vu collects docs tabs and rarely returns to them.",
type: "pattern",
icon: "❍",
},
},
{
id: "browser_newpage",
source: "Browser",
target: null,
glyph: "❍",
// childlike-wonder dimension: a fresh page is a doorway, and Puck wants to peek
title: "New page opened β€” a long-read about deep-sea creatures",
base: { urgency: 10, relevance: 38, novelty: 80, annoyance: 18, interest: 82 },
effect: "none",
lines: {
plain: "You opened something about deep-sea creatures. Looks interesting.",
playful: "Ooh β€” a new portal just opened, all about deep-sea creatures. Can I look? I want to look.",
mythic:
"A doorway bloomed in the glass! Beyond it, glowing things from the deep. I pressed my face to it.",
},
memory: {
text: "Vu opens long-reads; Puck is endlessly curious about them.",
type: "preference",
icon: "🫧",
},
},
{
id: "browser_rabbithole",
source: "Browser",
target: null,
glyph: "❍",
title: "Eleven tabs deep on one topic",
base: { urgency: 14, relevance: 42, novelty: 55, annoyance: 30, interest: 74 },
effect: "none",
lines: {
plain: "Eleven tabs on the same thing now. You're down a rabbit hole.",
playful:
"Eleven little doorways, all the same shape β€” you've tumbled down a rabbit hole and I tumbled after you.",
mythic:
"Eleven portals, one obsession. We are both lost in the warren now, and I do not wish to be found.",
},
memory: {
text: "Vu rabbit-holes; Puck happily follows the curiosity rather than scolding it.",
type: "pattern",
icon: "🫧",
},
},
{
id: "git_push",
source: "Git",
target: "terminal",
glyph: "βŽ‡",
// the showcase for repetition-as-personality: celebrated once, shrugged-at on a streak
title: "Pushed 3 commits to origin/main",
base: { urgency: 28, relevance: 56, novelty: 34, annoyance: 16, interest: 52 },
effect: "none",
lines: {
plain: "Pushed to origin/main β€” 3 commits up.",
playful: "Whoosh β€” three commits flung at origin. They stuck the landing.",
mythic: "Three parcels hurled into the great remote void. They arrived. Probably.",
},
memory: {
text: "Vu ships in small frequent pushes β€” celebrate the first, shrug at the streak.",
type: "pattern",
icon: "βŽ‡",
},
},
];