Skip to content

v2.3.0

Choose a tag to compare

@enriquephl enriquephl released this 17 Oct 00:35
· 40 commits to main since this release
v2.3.0
9715af2

Features

  • Bring your own character (BYOC) (#426). A downstream server keeps the character card; the engine keeps a persona instance with no genome and a per-instance key, and opens the card the caller sends, sealed with that key (AES-256-GCM), on every request that needs it. Off unless BYOC_CALLER_SECRET is set; only a caller holding it may create an instance or send a card.
    • Two key routes: init returns a fresh key and a ticket; create takes them back and writes the instance, idempotent per key.
    • The card is the persona genome's shape, documented as eros-character-v1. It is never stored: messages, the turn queue, the instance and its items hold no card content.
    • Card routes: the streaming send, image compose and image edit. Reads that need no card (chat start, history, profile, insight, items, effects, image request, the affinity list) work by instance. Async send, session open, life events, voice and group chat refuse a BYOC instance; World Memories, Town and Stories never see one.
    • Guide: docs/byoc.md.
  • Offline life events and false alarms (#423). offline is now an attribute of a kind: away_from_phone plus the new busy, in_battle and asleep silence her text turns while they last, share a 12-hour cooldown and are explained afterwards in the kind's words. busy and in_battle are announced at intimacy rung 2 and up. period_scare and pregnancy_scare are told as a scare and resolved as a false alarm in her next message in that session. EventView.offline is new.
  • Five run-in kinds and an allow/disallow form of kinds (#428). got_bumped, bumped_someone, quarrel, scolded_by_superior and scolded_superior are new short incidents; 38 kinds in all. kinds also accepts {"allow": […], "disallow": […]}: what allow allows (absent: every kind) minus what disallow lists, so a caller can rule kinds out (a persona with no one above her, or sudden_desire and pregnancy_scare for users who should not get adult themes) without freezing the rest. An unknown key or kind is rejected.
  • changes_at on GET …/effects (#427, #425): the earliest time the response changes with no new turn and no new event (a need's next drift step, or the end of an event under way), or null, so a client that caches it knows when to re-read.
  • Event lines under [now] (#429). The reply's 正在经历 and 刚才 lines move from [character_state], which defers to the blocks above it, to [now], so a story digest written before an event started no longer overrides it.
  • GET /svc/v1/memories/changes (#422, #416): a keyset export of the extracted profile-layer memories, with the same paging and the same secret as the insights export.
  • Store: migration 0073 removes the v1 event metadata and its index (#420).

Docs

  • The life events and needs guide, and a README highlight (#421).
  • The v2.3.0 migrating guide (#430).

Compatibility

  • HTTP: with kinds absent, the ten kinds new since v2.2.2 are drawn, three of them offline; a caller that wants to phase them in sends an allowlist of the 28 old kinds before upgrading, then disallow once v2.3.0 serves (v2.2.2 rejects the object form). With BYOC on, genome_id on an affinity-list item and persona_name on chat start are null for a BYOC instance; affinity-list items gain instance_id. See docs/migrating/v2-3-0-life-events-and-byoc.md.
  • Store: migrations 0073 (v1 event metadata and chat_messages_event_key_uidx removed), 0074 (index for the memory export) and 0075 (persona_instances.genome_id nullable, byoc_key). Run migrate, then serve. The v2.2.2 image, deployed without running migrate, is the rollback target: it reads the new kinds as absent, and with BYOC instances present it answers 500 on the affinity list for a user with one. No older image runs past 0073.
  • Crates: eros-engine-core: PersonaGenome.id and PersonaInstance.genome_id are Option<Uuid>; EventKind gains ten variants, which breaks exhaustive matches; new EventKind::is_offline, EventKind::is_false_alarm, events::is_told, needs::next_change. eros-engine-store: InstanceGate.genome_id / genome_name and UserAffinity.genome_id are optional; MemberRefusal gains Byoc; EventRepo::unexplained_away is renamed unexplained_offline; new ByocInstance, PersonaRepo::create_byoc_instance / load_byoc_instance, EventRepo::unresolved_scare, MemoryRepo::list_profile_changes.

Docker: ghcr.io/etherfunlab/eros-engine:2.3.0