fix(plugins): diagnostics crash minimales pour l'install de plugin (backend)
Écran noir hello-plugin (#120) récidivant après 3 fixes déjà mergés sans capturer la cause réelle : on ne pouvait pas savoir si le crash venait de l'install, du reconcile MCP ou d'un panic silencieux. Ajoute un panic hook qui logge thread/location/backtrace, trace les étapes install/reconcile/ asset-protocol dans idea.log, et remplace les `.expect()` du superviseur MCP plugin par une erreur typée au lieu d'un panic sur mutex empoisonné. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@ -502,10 +502,18 @@ async fn install_from_staged(
|
||||
) -> Result<PluginInstallResult, AppError> {
|
||||
let review = review_staged(packages, validator, &staged).await?;
|
||||
let plugin_id = review.manifest.id.clone();
|
||||
crate::diag!(
|
||||
"[plugins] install staged reviewed plugin={} version={} hash={} source={}",
|
||||
plugin_id.as_str(),
|
||||
review.manifest.version.as_str(),
|
||||
review.content_hash,
|
||||
review.source.kind()
|
||||
);
|
||||
packages
|
||||
.commit_install(staged, &plugin_id)
|
||||
.await
|
||||
.map_err(map_store)?;
|
||||
crate::diag!("[plugins] install committed plugin={}", plugin_id.as_str());
|
||||
let mut registry = registry_store.load_registry().await.map_err(map_registry)?;
|
||||
let mut entry = PluginRegistryEntry {
|
||||
id: plugin_id.clone(),
|
||||
@ -530,6 +538,11 @@ async fn install_from_staged(
|
||||
.save_registry(®istry)
|
||||
.await
|
||||
.map_err(map_registry)?;
|
||||
crate::diag!(
|
||||
"[plugins] install registry saved plugin={} lifecycle={:?}",
|
||||
plugin_id.as_str(),
|
||||
entry.lifecycle_state
|
||||
);
|
||||
events.publish(DomainEvent::PluginInstalled {
|
||||
plugin_id: plugin_id.clone(),
|
||||
version: review.manifest.version.clone(),
|
||||
@ -537,7 +550,21 @@ async fn install_from_staged(
|
||||
let (active_servers, invalid_plugins) =
|
||||
active_mcp_specs(packages, validator, ®istry).await?;
|
||||
persist_invalid_runtime_plugins(registry_store, &mut registry, invalid_plugins).await;
|
||||
let _ = mcp.reconcile(active_servers).await;
|
||||
let active_server_count = active_servers.len();
|
||||
match mcp.reconcile(active_servers).await {
|
||||
Ok(statuses) => crate::diag!(
|
||||
"[plugins] install MCP reconcile ok plugin={} requested={} statuses={}",
|
||||
plugin_id.as_str(),
|
||||
active_server_count,
|
||||
statuses.servers.len()
|
||||
),
|
||||
Err(err) => crate::diag!(
|
||||
"[plugins] install MCP reconcile failed plugin={} requested={} error={}",
|
||||
plugin_id.as_str(),
|
||||
active_server_count,
|
||||
err
|
||||
),
|
||||
}
|
||||
let admin = admin_from_descriptor(
|
||||
PluginDescriptor {
|
||||
manifest: review.manifest.clone(),
|
||||
@ -846,7 +873,19 @@ impl ReconcilePluginMcpServers {
|
||||
active_mcp_specs(self.packages.as_ref(), self.validator.as_ref(), ®istry).await?;
|
||||
persist_invalid_runtime_plugins(self.registry.as_ref(), &mut registry, invalid_plugins)
|
||||
.await;
|
||||
self.mcp.reconcile(specs).await.map_err(map_mcp)
|
||||
let requested = specs.len();
|
||||
let result = self.mcp.reconcile(specs).await.map_err(map_mcp);
|
||||
match &result {
|
||||
Ok(statuses) => crate::diag!(
|
||||
"[plugins] MCP reconcile ok requested={} statuses={}",
|
||||
requested,
|
||||
statuses.servers.len()
|
||||
),
|
||||
Err(err) => {
|
||||
crate::diag!("[plugins] MCP reconcile failed requested={requested} error={err}")
|
||||
}
|
||||
}
|
||||
result
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user