feat(infrastructure,backend,app-tauri,frontend): tools MCP workspace natifs read-only idea_workspace_map/list/read/search, activés par défaut et configurables dans les permissions MCP et les templates — #341 (QA verte)

This commit is contained in:
2026-09-12 19:17:09 +02:00
parent ea42d95f2e
commit 7b712f2b62
16 changed files with 1503 additions and 80 deletions

View File

@ -111,16 +111,17 @@ use infrastructure::{
FsPluginStorageStore, FsProfileStore, FsProjectPluginSettingsStore, FsProjectSettingsStore,
FsProjectStore, FsProviderSessionStore, FsScheduledProjectTaskStore, FsSecretStore,
FsSkillStore, FsSprintStore, FsSystemPermissionStore, FsTemplateStore, FsUserSettingsStore,
FsWindowStateStore, Git2Repository, HeuristicHandoffSummarizer, HfModelArtifactDownloader,
HttpOpenAiCompatibleProbe, HttpProviderModelCatalogue, IdeaiContextStore,
InMemoryConversationRegistry, InMemoryMailbox, InMemoryPairAttemptLimiter, LlamaCppRuntime,
LocalEnvironmentReader, LocalFileSystem, LocalManagedProcess, LocalProcessSpawner,
ManagedTempToolProvider, McpServer, MediatedInbox, NaiveMemoryRecall, OrchestratorWatchHandle,
PortablePtyAdapter, ProcessCliVersionReader, ReadOnlyRuntimePermissionProbe, RwFileGuard,
StructuredSessionFactory, SystemClock, SystemMillisClock, TemplateToolProvider,
TicketAssistantEnvironmentPreparer, TicketToolProvider, TokioBroadcastEventBus, TokioScheduler,
ToolPolicyRegistry, UuidGenerator, VectorMemoryRecall, DEFAULT_OLLAMA_BASE_URL,
ONNX_CACHE_SUBDIR, RECOMMENDED_ONNX_MODELS, VECTOR_HTTP_ENABLED, VECTOR_ONNX_ENABLED,
FsWindowStateStore, FsWorkspaceToolProvider, Git2Repository, HeuristicHandoffSummarizer,
HfModelArtifactDownloader, HttpOpenAiCompatibleProbe, HttpProviderModelCatalogue,
IdeaiContextStore, InMemoryConversationRegistry, InMemoryMailbox, InMemoryPairAttemptLimiter,
LlamaCppRuntime, LocalEnvironmentReader, LocalFileSystem, LocalManagedProcess,
LocalProcessSpawner, ManagedTempToolProvider, McpServer, MediatedInbox, NaiveMemoryRecall,
OrchestratorWatchHandle, PortablePtyAdapter, ProcessCliVersionReader,
ReadOnlyRuntimePermissionProbe, RwFileGuard, StructuredSessionFactory, SystemClock,
SystemMillisClock, TemplateToolProvider, TicketAssistantEnvironmentPreparer,
TicketToolProvider, TokioBroadcastEventBus, TokioScheduler, ToolPolicyRegistry, UuidGenerator,
VectorMemoryRecall, WorkspaceToolProvider, DEFAULT_OLLAMA_BASE_URL, ONNX_CACHE_SUBDIR,
RECOMMENDED_ONNX_MODELS, VECTOR_HTTP_ENABLED, VECTOR_ONNX_ENABLED,
};
pub mod dto;
@ -2184,6 +2185,8 @@ pub struct BackendCore {
pub(crate) managed_temp_tool_provider: Arc<dyn ManagedTempToolProvider>,
/// MCP provider for public plugin administration tools.
pub(crate) plugin_tool_provider: Arc<dyn PluginToolProvider>,
/// MCP provider for the read-only `idea_workspace_*` tools.
pub(crate) workspace_tool_provider: Arc<dyn WorkspaceToolProvider>,
/// Open an ephemeral AI assistant chat bound to one ticket.
pub open_ticket_assistant: Arc<OpenTicketAssistant>,
/// Close an ephemeral AI assistant chat bound to one ticket.
@ -3112,6 +3115,8 @@ impl BackendCore {
let managed_temp_tool_binder = Arc::new(LateBoundManagedTempToolProvider::new());
let managed_temp_tool_provider: Arc<dyn ManagedTempToolProvider> =
managed_temp_tool_binder.clone();
let workspace_tool_provider: Arc<dyn WorkspaceToolProvider> =
Arc::new(FsWorkspaceToolProvider::new());
let tool_policy_registry = Arc::new(ToolPolicyRegistry::new());
let tool_policy_store = Arc::clone(&tool_policy_registry) as Arc<dyn AgentToolPolicyStore>;
let system_permission_store = Arc::new(FsSystemPermissionStore::new(Arc::clone(&fs_port)));
@ -4296,16 +4301,19 @@ impl BackendCore {
.with_spawn_background_command(Arc::clone(&spawn_background_command))
.with_scheduled_project_tasks(Arc::clone(&scheduled_project_tasks)),
);
openai_tool_invoker.bind(Arc::new(AppOpenAiToolInvoker::new(
Arc::clone(&orchestrator_service),
Arc::clone(&store_port),
Arc::clone(&tool_policy_registry) as Arc<dyn AgentToolPolicyStore>,
Arc::clone(&mcp_tool_permission_store_port),
Arc::clone(&ticket_tool_provider),
Arc::clone(&template_tool_provider),
Arc::clone(&managed_temp_tool_provider),
Arc::clone(&plugin_tool_provider),
)) as Arc<dyn ToolInvoker>);
openai_tool_invoker.bind(Arc::new(
AppOpenAiToolInvoker::new(
Arc::clone(&orchestrator_service),
Arc::clone(&store_port),
Arc::clone(&tool_policy_registry) as Arc<dyn AgentToolPolicyStore>,
Arc::clone(&mcp_tool_permission_store_port),
Arc::clone(&ticket_tool_provider),
Arc::clone(&template_tool_provider),
Arc::clone(&managed_temp_tool_provider),
Arc::clone(&plugin_tool_provider),
)
.with_workspace_tools(Arc::clone(&workspace_tool_provider)),
) as Arc<dyn ToolInvoker>);
let stop_live_agent = Arc::new(
StopAgentRuntime::new(Arc::clone(&live_sessions), Arc::clone(&close_terminal))
@ -4444,6 +4452,7 @@ impl BackendCore {
ticket_tool_provider,
template_tool_provider,
managed_temp_tool_provider,
workspace_tool_provider,
open_ticket_assistant,
close_ticket_assistant,
tool_policy_registry,
@ -4793,6 +4802,7 @@ impl BackendCore {
.with_template_tools(Arc::clone(&self.template_tool_provider))
.with_managed_temp_tools(Arc::clone(&self.managed_temp_tool_provider))
.with_plugin_tools(Arc::clone(&self.plugin_tool_provider))
.with_workspace_tools(Arc::clone(&self.workspace_tool_provider))
.with_tool_policies(Arc::clone(&self.tool_policy_registry))
.with_mcp_tool_permissions(Arc::clone(&self.mcp_tool_permission_store)),
endpoint,