feat(infra): tmp partagé inter-projets géré par IdeA (handles opaques, leases, GC, projection sandbox) — #189 (QA verte)

- Domaine: port ManagedTempStore + modèle (handle opaque, kind Directory/File, état Active/Released, allocation/lease, expiry).
- Application: use cases Allocate/Resolve/Release/GcManagedTemp, horodatés via Clock.
- Infrastructure: impl FS FsManagedTempStore sous app_data_dir/managed-tmp (root global inter-projets, métadonnées par handle, GC des leases expirés/libérés).
- Exposition MCP contrôlée (ManagedTempToolProvider, catalogue) + câblage sandbox: les agents résolvent un handle au lieu d'inventer un path libre.
- Tests: application/infrastructure managed_temp.
This commit is contained in:
2026-08-13 13:34:33 +02:00
parent d7dfbcdfcb
commit fdca55ecd4
22 changed files with 2000 additions and 72 deletions

View File

@ -12,11 +12,12 @@ use std::sync::{Arc, Mutex};
use backend::BackendCore;
use domain::PersistedPluginLayoutWindow;
use infrastructure::{TemplateToolProvider, TicketToolProvider};
use infrastructure::{ManagedTempToolProvider, TemplateToolProvider, TicketToolProvider};
use serde::{Deserialize, Serialize};
use crate::chat::ChatBridge;
use crate::embedded_server::EmbeddedServerController;
use crate::managed_temp::AppManagedTempToolProvider;
use crate::pty::PtyBridge;
use crate::templates::AppTemplateToolProvider;
use crate::tickets::AppTicketToolProvider;
@ -90,6 +91,13 @@ impl AppState {
update: Arc::clone(&core.update_template),
delete: Arc::clone(&core.delete_template),
}) as Arc<dyn TemplateToolProvider>);
core.managed_temp_tool_binder
.bind(Arc::new(AppManagedTempToolProvider {
allocate: Arc::clone(&core.allocate_managed_temp),
resolve: Arc::clone(&core.resolve_managed_temp),
release: Arc::clone(&core.release_managed_temp),
gc: Arc::clone(&core.gc_managed_temp),
}) as Arc<dyn ManagedTempToolProvider>);
Self {
core,