Repository navigation
v2.3.0
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_SECRETis 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).
offlineis now an attribute of a kind:away_from_phoneplus the newbusy,in_battleandasleepsilence her text turns while they last, share a 12-hour cooldown and are explained afterwards in the kind's words.busyandin_battleare announced at intimacy rung 2 and up.period_scareandpregnancy_scareare told as a scare and resolved as a false alarm in her next message in that session.EventView.offlineis new. - Five run-in kinds and an allow/disallow form of
kinds(#428).got_bumped,bumped_someone,quarrel,scolded_by_superiorandscolded_superiorare newshortincidents; 38 kinds in all.kindsalso accepts{"allow": […], "disallow": […]}: whatallowallows (absent: every kind) minus whatdisallowlists, so a caller can rule kinds out (a persona with no one above her, orsudden_desireandpregnancy_scarefor users who should not get adult themes) without freezing the rest. An unknown key or kind is rejected. changes_atonGET …/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), ornull, 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
0073removes the v1 event metadata and its index (#420).
Docs
Compatibility
- HTTP: with
kindsabsent, 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, thendisallowonce v2.3.0 serves (v2.2.2 rejects the object form). With BYOC on,genome_idon an affinity-list item andpersona_nameon chat start arenullfor a BYOC instance; affinity-list items gaininstance_id. See docs/migrating/v2-3-0-life-events-and-byoc.md. - Store: migrations
0073(v1 event metadata andchat_messages_event_key_uidxremoved),0074(index for the memory export) and0075(persona_instances.genome_idnullable,byoc_key). Runmigrate, then serve. The v2.2.2 image, deployed without runningmigrate, is the rollback target: it reads the new kinds as absent, and with BYOC instances present it answers500on the affinity list for a user with one. No older image runs past0073. - Crates:
eros-engine-core:PersonaGenome.idandPersonaInstance.genome_idareOption<Uuid>;EventKindgains ten variants, which breaks exhaustive matches; newEventKind::is_offline,EventKind::is_false_alarm,events::is_told,needs::next_change.eros-engine-store:InstanceGate.genome_id/genome_nameandUserAffinity.genome_idare optional;MemberRefusalgainsByoc;EventRepo::unexplained_awayis renamedunexplained_offline; newByocInstance,PersonaRepo::create_byoc_instance/load_byoc_instance,EventRepo::unresolved_scare,MemoryRepo::list_profile_changes.
Docker: ghcr.io/etherfunlab/eros-engine:2.3.0