personas: elevate to server with per-persona fact scoping
Move personas off the mobile client into ImageApi as first-class records, and scope entity_facts by persona so each one builds its own voice over a shared entity graph. The new include_all_memories flag lets a persona opt back into the full hive-mind pool for human browsing of /knowledge/*; agentic generation always stays in-voice. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
use crate::database::schema::{
|
||||
entities, entity_facts, entity_photo_links, favorites, image_exif, libraries, photo_insights,
|
||||
users, video_preview_clips,
|
||||
entities, entity_facts, entity_photo_links, favorites, image_exif, libraries, personas,
|
||||
photo_insights, users, video_preview_clips,
|
||||
};
|
||||
use serde::Serialize;
|
||||
|
||||
@@ -238,6 +238,11 @@ pub struct InsertEntityFact {
|
||||
pub confidence: f32,
|
||||
pub status: String,
|
||||
pub created_at: i64,
|
||||
/// Which persona authored this fact. Shared entities, persona-tagged
|
||||
/// facts: each persona accumulates its own voice over the same
|
||||
/// real-world referents. Defaults to `'default'` for legacy rows
|
||||
/// (see migration 2026-05-09-000000).
|
||||
pub persona_id: String,
|
||||
}
|
||||
|
||||
#[derive(Serialize, Queryable, Clone, Debug)]
|
||||
@@ -252,6 +257,7 @@ pub struct EntityFact {
|
||||
pub confidence: f32,
|
||||
pub status: String,
|
||||
pub created_at: i64,
|
||||
pub persona_id: String,
|
||||
}
|
||||
|
||||
#[derive(Insertable)]
|
||||
@@ -274,6 +280,34 @@ pub struct EntityPhotoLink {
|
||||
pub role: String,
|
||||
}
|
||||
|
||||
// --- Personas ---
|
||||
|
||||
#[derive(Insertable)]
|
||||
#[diesel(table_name = personas)]
|
||||
pub struct InsertPersona<'a> {
|
||||
pub user_id: i32,
|
||||
pub persona_id: &'a str,
|
||||
pub name: &'a str,
|
||||
pub system_prompt: &'a str,
|
||||
pub is_built_in: bool,
|
||||
pub include_all_memories: bool,
|
||||
pub created_at: i64,
|
||||
pub updated_at: i64,
|
||||
}
|
||||
|
||||
#[derive(Serialize, Queryable, Clone, Debug)]
|
||||
pub struct Persona {
|
||||
pub id: i32,
|
||||
pub user_id: i32,
|
||||
pub persona_id: String,
|
||||
pub name: String,
|
||||
pub system_prompt: String,
|
||||
pub is_built_in: bool,
|
||||
pub include_all_memories: bool,
|
||||
pub created_at: i64,
|
||||
pub updated_at: i64,
|
||||
}
|
||||
|
||||
#[derive(Insertable)]
|
||||
#[diesel(table_name = video_preview_clips)]
|
||||
pub struct InsertVideoPreviewClip {
|
||||
|
||||
Reference in New Issue
Block a user