* Align Oo avatar eye spacing with evoo-logo overlap ratio
Derive small-eye placement from evoo-logo.svg center spacing (~0.94 of
r_big + r_small) for the shared rig, EvooMascot brand lock, and face crops.
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
* Format brand-lock spacing test for Biome
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
* Align mobile Expo packages for install --check in CI
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
* ci: retrigger after flaky chart-links E2E
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
---------
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
The attach sheet's autopilot now offers "Until a time" with the native
time picker from Expo UI: Android's clock dialog, an iOS wheel in a sheet
with Start. The home list opens with the autopilots that run, wait or
ended within a day, as Today does on web, and each row opens its thread.
The attach and until menus move to the shared action sheet, so Android
pages them instead of dropping buttons past three.
Claude-Session: https://claude.ai/code/session_01UmSCnoCgXqBp2fU3vwz4o1
Co-authored-by: Claude <noreply@anthropic.com>
The autopilot's start line counts its steps and folds open to the latest
checkpoints, and its result reads as a card. The composer's plus menu
starts an autopilot with the draft as the order and a choice of until
done, tomorrow morning or a time. Today lists the autopilots that run,
wait or ended within a day, and their step runs no longer show one by
one. Autopilot runs send no completion or failure push; only a pause
notifies.
Claude-Session: https://claude.ai/code/session_01UmSCnoCgXqBp2fU3vwz4o1
Co-authored-by: Claude <noreply@anthropic.com>
update_bot takes a look (oo1: value), validated and normalized in core.
A suggested look renders as a "New look" card with the avatar preview on
web and mobile; accepting applies it to the bot.
Claude-Session: https://claude.ai/code/session_01EKuME5CgL1ddGGN7LGvtBj
Co-authored-by: Claude <noreply@anthropic.com>
An autopilot per thread continues the user's order run after run, with
no time limit. Each run reports a checkpoint; after three runs without
progress or three failed runs it pauses with Continue and Stop. Start,
pause, stop and finish show as quiet lines in the conversation.
Approvals during an autopilot run are parked as suggestions, and the
temporary approval rules end with the autopilot.
Claude-Session: https://claude.ai/code/session_01UmSCnoCgXqBp2fU3vwz4o1
Co-authored-by: Claude <noreply@anthropic.com>
The Atelier replaces Avatar Studio: pick a species, colour, eyes,
glasses, hats, neckwear, arms and temperament, with every option drawn
as your own Oo wearing it. Onboarding's "Design your Oo" now offers
species looks per vibe and opens the Atelier for the rest; mobile bot
settings carry the same editor instead of a bare colour row, so picking
a colour there no longer throws away the rest of the look.
Claude-Session: https://claude.ai/code/session_01EKuME5CgL1ddGGN7LGvtBj
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
Bots can offer an exact tool call as a card. Nothing runs until the user
taps Accept; the call then runs as its own approved run of the bot it was
meant for, and the card shows the outcome. Open suggestions also wait in
the inbox and expire after a week.
Claude-Session: https://claude.ai/code/session_01UmSCnoCgXqBp2fU3vwz4o1
Co-authored-by: Claude <noreply@anthropic.com>
A bot's Oo now cheers for a moment when its run finishes, the stage Oo
follows the pointer and squishes when tapped, and chat headers show the
speaking bot's own Oo instead of the generic mascot. Small avatars in
lists only animate while working or waiting so long lists stay calm.
Claude-Session: https://claude.ai/code/session_01EKuME5CgL1ddGGN7LGvtBj
Co-authored-by: Claude <noreply@anthropic.com>
Native avatars now draw the shared Oo rig with react-native-svg instead
of a visor with two equal eyes, so the Oo eyes look the same on every
surface. The robot/organic avatar setting is gone from web and mobile
because every bot is now an Oo; uploaded pictures show on native too.
Claude-Session: https://claude.ai/code/session_01EKuME5CgL1ddGGN7LGvtBj
Co-authored-by: Claude <noreply@anthropic.com>
* feat: show routines the bot sets up from chat as one quiet line
When someone mentions something recurring in passing ("every Sunday I plan the
week"), the bot now creates the routine right away and the conversation shows a
single line with the schedule, Edit and Undo, on web and mobile.
- New `event` message block for routine lines, kept in history so later turns
know what was set up or removed.
- schedule_create reuses an active repeating routine of the same name instead
of adding a duplicate, caps a bot at 50 active schedules, and falls back to
default times when none was given.
- Removing a routine (Undo, the editor, or schedule_cancel) marks its lines
removed via the new routines.noticeMessageId column.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UmSCnoCgXqBp2fU3vwz4o1
* test: give the routine notice test a complete job publisher
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UmSCnoCgXqBp2fU3vwz4o1
---------
Co-authored-by: Claude <noreply@anthropic.com>
A bot's look is stored in its `color` string, which today only holds a
colour, an optional classic shape index or an uploaded picture. The
customizable avatars (species, eye styling, accessories, temperament)
need a richer value that still travels everywhere `color` already goes:
bot rows, group members, mentions and the inbox.
- `@rakazo/core` gains `oo-avatar`: an `oo1:` key=value codec that writes
only non-default fields, reads every legacy value unchanged, rejects
malformed values, and exposes `ooAvatarColor` for plain CSS consumers.
- The rig's eye anchors keep the Oo trademark (big eye = small eye × φ),
and lenses scale with their eye so glasses stay asymmetric; the shared
asymmetry ratio now comes from core.
- The API rejects malformed `oo1:` values on bot create and update.
- `parseBotAvatar` reads through the codec, so an `oo1:` value already
renders with its colour and shape before the new renderer lands.
- The agent cursor and the mobile avatar used the raw value as a CSS
colour and broke on `#hex::shape_N`; they now use the decoded colour.
Claude-Session: https://claude.ai/code/session_01EKuME5CgL1ddGGN7LGvtBj
Co-authored-by: Claude <noreply@anthropic.com>