L'appairage ne survivait pas au redémarrage et son code, permanent, était imprimé sur la sortie standard. Un appareil appairé devient une entité persistante, nommée et révocable, derrière un code désormais éphémère. - B1 : port DeviceSessionStore et adapter FsDeviceSessionStore, entités de domaine (PairedDevice, DeviceId, SessionTokenHash, DeviceName). Les tokens sont hachés en SHA-256 et comparés en temps constant (subtle) : le store ne peut pas rejouer une session qu'il a servie. Cookie Max-Age 400 j à renouvellement glissant, lastSeenAtMs throttlé. - B2 : code éphémère en mémoire, TTL 10 min et usage unique, toute génération invalidant la précédente. POST /api/pairing-code authentifiée, flag --new-code. Le code est retiré du boot et l'eprintln! qui l'imprimait est supprimé. - B3 : endpoints devices (list/rename/revoke/revoke-all/logout), event DeviceRevoked et ActiveConnectionRegistry par device_id, fermant sans délai les WebSockets d'un appareil révoqué. - B4 : port PairAttemptLimiter et adapter mémoire, rate-limit par origine et global sur horloge injectée, donc testable sans attente réelle. La normalisation du code passe côté serveur : elle absorbe la dette #76, que la seule normalisation frontend de #75 ne faisait que masquer. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
42 lines
1.5 KiB
Rust
42 lines
1.5 KiB
Rust
//! Filesystem-backed persistence stores (ARCHITECTURE §5, §9.2).
|
|
//!
|
|
//! L2 ships [`FsProjectStore`], implementing the domain [`ProjectStore`] port:
|
|
//! the known-projects **registry** and the **workspace** are stored as plain
|
|
//! JSON files in the app data directory (machine-local, outside any project).
|
|
|
|
mod background_task;
|
|
mod context;
|
|
mod device_session;
|
|
mod embedder;
|
|
mod live_state;
|
|
mod memory;
|
|
mod permission;
|
|
mod profile;
|
|
mod project;
|
|
mod skill;
|
|
mod template;
|
|
mod vector;
|
|
mod window_state;
|
|
|
|
pub use background_task::{BackgroundTaskReconcileReport, FsBackgroundTaskStore};
|
|
pub use context::IdeaiContextStore;
|
|
pub use device_session::FsDeviceSessionStore;
|
|
#[cfg(feature = "vector-onnx")]
|
|
pub use embedder::OnnxEmbedder;
|
|
#[cfg(feature = "vector-http")]
|
|
pub use embedder::{detect_ollama, HttpEmbedder, DEFAULT_LOCAL_EMBED_ENDPOINT};
|
|
pub use embedder::{
|
|
embedder_from_profile, onnx_model_is_cached, EmbedderEnvProbe, FsEmbedderPromptStore,
|
|
HashEmbedder, OnnxModelInfo, StubEmbedder, DEFAULT_OLLAMA_BASE_URL, ONNX_CACHE_SUBDIR,
|
|
RECOMMENDED_ONNX_MODELS, VECTOR_HTTP_ENABLED, VECTOR_ONNX_ENABLED,
|
|
};
|
|
pub use live_state::FsLiveStateStore;
|
|
pub use memory::{index_token_size, FsMemoryStore, NaiveMemoryRecall};
|
|
pub use permission::FsPermissionStore;
|
|
pub use profile::{FsEmbedderProfileStore, FsProfileStore};
|
|
pub use project::FsProjectStore;
|
|
pub use skill::FsSkillStore;
|
|
pub use template::FsTemplateStore;
|
|
pub use vector::{should_use_vector, AdaptiveMemoryRecall, VectorMemoryRecall};
|
|
pub use window_state::FsWindowStateStore;
|