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

@ -10,7 +10,7 @@ use domain::ports::{
ModelServerError, ProcessError, PtyError, RemoteError, RuntimeError, SecretStoreError,
StoreError,
};
use domain::{AgentId, NodeId};
use domain::{AgentId, ManagedTempError, NodeId};
use domain::{IssueStoreError, SprintStoreError};
/// Errors surfaced by application use cases.
@ -178,6 +178,16 @@ impl From<ChatAttachmentStoreError> for AppError {
}
}
impl From<ManagedTempError> for AppError {
fn from(e: ManagedTempError) -> Self {
match e {
ManagedTempError::NotFound => Self::NotFound("managed temp".to_owned()),
ManagedTempError::Invalid(message) => Self::Invalid(message),
ManagedTempError::Store(message) => Self::Store(message),
}
}
}
impl From<MemoryError> for AppError {
fn from(e: MemoryError) -> Self {
match e {