feat(memory): config embedders (LOT C2) + suggestion contextuelle (LOT C3) + contexte projet partagé
- LOT C2 (§14.5.3) : use cases de configuration des embedders déclaratifs (List/Save/Delete + DescribeEmbedderEngines : modèles ONNX recommandés, environnement local détecté, stratégies compilées). UI EmbedderSettings. - LOT C3 (§14.5.5) : suggestion contextuelle best-effort à l'activation quand la mémoire dépasse le budget de recall sans embedder configuré (event EmbedderSuggested, anti-spam 1×/session, « ne plus demander »). - Contexte projet partagé .ideai/CONTEXT.md (model-agnostic) injecté à tous les agents/profils au lancement, avant la persona. UI ProjectContextPanel. Tests : backend workspace vert (0 échec) ; frontend 306/306. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@ -53,8 +53,14 @@ fn template_dto_serialises_camelcase() {
|
||||
ProfileId::from_uuid(Uuid::from_u128(2)).to_string()
|
||||
);
|
||||
// no snake_case leak
|
||||
assert!(v.get("content_md").is_none(), "no snake_case leak for contentMd");
|
||||
assert!(v.get("default_profile_id").is_none(), "no snake_case leak for defaultProfileId");
|
||||
assert!(
|
||||
v.get("content_md").is_none(),
|
||||
"no snake_case leak for contentMd"
|
||||
);
|
||||
assert!(
|
||||
v.get("default_profile_id").is_none(),
|
||||
"no snake_case leak for defaultProfileId"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@ -98,7 +104,9 @@ fn template_list_dto_empty() {
|
||||
#[test]
|
||||
fn create_template_output_maps_to_template_dto() {
|
||||
let tmpl = make_template(5, 6);
|
||||
let out = CreateTemplateOutput { template: tmpl.clone() };
|
||||
let out = CreateTemplateOutput {
|
||||
template: tmpl.clone(),
|
||||
};
|
||||
let dto = TemplateDto::from(out);
|
||||
assert_eq!(dto.0.id, tmpl.id);
|
||||
}
|
||||
@ -107,7 +115,9 @@ fn create_template_output_maps_to_template_dto() {
|
||||
fn update_template_output_maps_to_template_dto() {
|
||||
let tmpl = make_template(7, 8);
|
||||
let bumped = tmpl.with_updated_content(MarkdownDoc::new("# Updated".to_owned()));
|
||||
let out = UpdateTemplateOutput { template: bumped.clone() };
|
||||
let out = UpdateTemplateOutput {
|
||||
template: bumped.clone(),
|
||||
};
|
||||
let dto = TemplateDto::from(out);
|
||||
assert_eq!(dto.0.version, TemplateVersion(2));
|
||||
assert_eq!(dto.0.id, bumped.id);
|
||||
@ -132,7 +142,10 @@ fn agent_drift_dto_serialises_camelcase() {
|
||||
assert_eq!(v["from"], 1u64);
|
||||
assert_eq!(v["to"], 3u64);
|
||||
// no snake_case leak
|
||||
assert!(v.get("agent_id").is_none(), "no snake_case leak for agentId");
|
||||
assert!(
|
||||
v.get("agent_id").is_none(),
|
||||
"no snake_case leak for agentId"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
||||
Reference in New Issue
Block a user