feat(tickets): création d'un assistant IA de ticket (backend + frontend)
Ajoute le chat assistant IA attaché à un ticket (#8). Backend Rust : - use cases OpenTicketAssistant/CloseTicketAssistant + tests - politique d'outils par agent (domain/agent_tool_policy) et policy MCP - store de contexte assistant + gabarit default_ticket_assistant.md + tests - events TicketAssistantOpened/Closed - commandes Tauri open_ticket_chat/close_ticket_chat et câblage state/lib/events Frontend : - gateway (ports, adapters ticket + mock, domain) - hook useTicketAssistant + composant TicketAssistantPanel - intégration dans TicketDetail Tests verts : vitest tickets.test.tsx (23), cargo test application::ticket_assistant (1), infrastructure::assistant_context_store (2). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@ -28,6 +28,7 @@ use async_trait::async_trait;
|
||||
use thiserror::Error;
|
||||
|
||||
use crate::agent::AgentManifest;
|
||||
use crate::agent_tool_policy::AgentToolPolicy;
|
||||
use crate::background_task::{
|
||||
BackgroundTask, BackgroundTaskKind, BackgroundTaskResult, BackgroundTaskWakePolicy,
|
||||
};
|
||||
@ -123,6 +124,43 @@ pub struct PreparedContext {
|
||||
pub project_root: String,
|
||||
}
|
||||
|
||||
/// Errors returned while preparing the IdeA-owned ticket assistant context.
|
||||
#[derive(Debug, Clone, PartialEq, Eq, Error)]
|
||||
pub enum AssistantContextError {
|
||||
/// The context source was missing and no embedded default could be used.
|
||||
#[error("assistant context not found")]
|
||||
NotFound,
|
||||
/// The context could not be read or rendered.
|
||||
#[error("assistant context store failed: {0}")]
|
||||
Store(String),
|
||||
}
|
||||
|
||||
/// Provides the IdeA-owned context used by ticket assistant sessions.
|
||||
#[async_trait]
|
||||
pub trait AssistantContextProvider: Send + Sync {
|
||||
/// Renders a prepared context for a ticket assistant bound to `issue`.
|
||||
///
|
||||
/// # Errors
|
||||
/// [`AssistantContextError`] when the context cannot be read or rendered.
|
||||
async fn prepare_ticket_assistant_context(
|
||||
&self,
|
||||
project: &Project,
|
||||
issue: &Issue,
|
||||
) -> Result<PreparedContext, AssistantContextError>;
|
||||
}
|
||||
|
||||
/// Stores requester-scoped MCP tool policies for ephemeral assistant sessions.
|
||||
pub trait AgentToolPolicyStore: Send + Sync {
|
||||
/// Sets or replaces the policy for `requester`.
|
||||
fn set_policy(&self, requester: String, policy: AgentToolPolicy);
|
||||
|
||||
/// Returns the policy for `requester`, if any.
|
||||
fn get_policy(&self, requester: &str) -> Option<AgentToolPolicy>;
|
||||
|
||||
/// Clears the policy for `requester`.
|
||||
fn clear_policy(&self, requester: &str);
|
||||
}
|
||||
|
||||
/// Enriched, **best-effort** details about a conversation, specific to a CLI's
|
||||
/// on-disk transcript format (CONTEXT §T6).
|
||||
///
|
||||
|
||||
Reference in New Issue
Block a user