Added easter egg component for provider and model.
BuildIntegrated component into chat container.
EditRemoved unwanted prompt text.
Edit/var/folders/49/l4171l3n219_xwq30fmyzr8w0000gn/T/TemporaryItems/NSIRD_screencaptureui_eyEWqI/Screenshot\ 2026-01-30\ at\ 01.33.03.png
i want to build an easteregg into the coding agent. when a user selects opencode provider and kimi k2.5, i want to add a component to the chat messages container in @packages/coding-agent/src/modes/interactive/interactive-mode.ts similar to the @packages/coding-agent/src/modes/interactive/components/armin.ts component that thanks opencode for the free access to that model. i want to make it over the top and hilarious, and it should include "powered by daxnuts" or whatever is in that screenshot
Let me continue reading the interactive-mode.ts file to see how the ArminComponent is used:
Now I have all the context needed. Let me create the Easter egg component and integrate it:
Now let me add the handler method right after handleArminSaysHi:
Now let me add the Easter egg trigger in the model selection code:
Everything compiles. Let me verify the changes are correct by viewing the key parts:
Done! I've created the Easter egg with these changes:
New file: packages/coding-agent/src/modes/interactive/components/daxnuts.ts
An animated component that plays when you select OpenCode provider with Kimi K2.5. It has multiple phases:
Modified files:
components/index.ts - Export DaxnutsComponentinteractive-mode.ts - Import and trigger the Easter egg when model is selectedsrc/index.ts - Export for extensionsThe Easter egg triggers when:
/model opencode/kimi-k2.5It checks model.provider === "opencode" and model.id.toLowerCase().includes("kimi-k2.5") so it catches the model regardless of exact ID format.
looks horrible.
built it as a custom component in an extension so we can iterate faster. can later transfer back to core
Now let me revert the core changes since we're using an extension:
don't put it in examples you idiot, for reload, i need it in .pi/extensions/
ok i reveted your changes, @packages/coding-agent/src/modes/interactive/components/daxnuts.ts still exists tho
Done. Deleted the core component and created .pi/extensions/daxnuts.ts. Use /reload to iterate.
ok, i need a command in the extension that inserts the thing in the chat ui, possible?
Yes! Use pi.sendMessage() with a custom type and pi.registerMessageRenderer() to render it in chat:
how about we just show a ui.custom and escape disposes it again ..
Done. /daxnuts to test, any key dismisses. Same triggers on opencode/kimi-k2.5 selection.
well, that doesn't close on key press ..
The component needs handleInput not onKey for the custom UI context:
Changed onKey to handleInput - that's what focused components use.
ok, key input works. now for the actual content. it's fucking lame.
can you clone https://github.com/anomalyco/opencode and see if there's an ascii art image of dax?
Found avatar-dax.png! Let me look at it:
Got dax's avatar! Bald head, beard. Let me make a proper ASCII art tribute:
Done. Simple ASCII dax (bald, bearded), rotating messages, nut emoji animation. /reload and /daxnuts to test.
/adxnuts
ok, this too sucks. can we somehow scale the dax image down to something that doesn't hurt our download size too much, add text with a quote with daxnuts and add a link to https://mistral.ai/news/mistral-vibe-2-0 below it saying
Try OpenCode link
I can convert the dax image to block characters like ArminComponent does. Let me create a scaled-down version:
Got the XBM data. Now let me build the proper component:
Done. XBM pixel art of dax, quote "Powered by daxnuts", and OpenCode link. /reload and /daxnuts to test.
you know we have full rgb support, do you?
and i gav eyou a different url, that's the joke
Done. Full 32x32 true color dax avatar, the quote, and the Mistral link joke. /reload and /daxnuts to test.
ok before powered by daxnuts, add "Free Kimi K2.5 via OpenCode Zen"
Done. /reload to test.
can we add some animation that ends after 2 seconds or so?
Done. Added scanline reveal effect that progressively shows the image, then fades in the text. Runs ~2 seconds. /reload and /daxnuts to test.
ok, now move to core and wire up the logic
continue
you ok?