Update runtimed to fix compatibility issue with the Ark kernel (#40889)

Closes #40888

This updates runtimed to the latest version, which handles the
"starting" variant of `execution_state`. It actually handles a bunch of
other variants that are not documented in the protocol (see
https://jupyter-client.readthedocs.io/en/stable/messaging.html#kernel-status),
like "starting", "terminating", etc. I added implementations for these
variants as well.

Release Notes:

- Fixed issue that prevented the Ark kernel from working in Zed
(#40888).

---------

Co-authored-by: Conrad Irwin <conrad.irwin@gmail.com>
This commit is contained in:
Lionel Henry
2025-11-13 19:35:45 +00:00
committed by GitHub
co-authored by Conrad Irwin
parent e91be9e98e
commit fa0c7500c1
6 changed files with 109 additions and 54 deletions
+7
View File
@@ -213,6 +213,13 @@ impl From<&Kernel> for KernelStatus {
Kernel::RunningKernel(kernel) => match kernel.execution_state() {
ExecutionState::Idle => KernelStatus::Idle,
ExecutionState::Busy => KernelStatus::Busy,
ExecutionState::Unknown => KernelStatus::Error,
ExecutionState::Starting => KernelStatus::Starting,
ExecutionState::Restarting => KernelStatus::Restarting,
ExecutionState::Terminating => KernelStatus::ShuttingDown,
ExecutionState::AutoRestarting => KernelStatus::Restarting,
ExecutionState::Dead => KernelStatus::Error,
ExecutionState::Other(_) => KernelStatus::Error,
},
Kernel::StartingKernel(_) => KernelStatus::Starting,
Kernel::ErroredLaunch(_) => KernelStatus::Error,
+7
View File
@@ -476,6 +476,13 @@ impl ExecutionView {
self.status = ExecutionStatus::Executing;
}
ExecutionState::Idle => self.status = ExecutionStatus::Finished,
ExecutionState::Unknown => self.status = ExecutionStatus::Unknown,
ExecutionState::Starting => self.status = ExecutionStatus::ConnectingToKernel,
ExecutionState::Restarting => self.status = ExecutionStatus::Restarting,
ExecutionState::Terminating => self.status = ExecutionStatus::ShuttingDown,
ExecutionState::AutoRestarting => self.status = ExecutionStatus::Restarting,
ExecutionState::Dead => self.status = ExecutionStatus::Shutdown,
ExecutionState::Other(_) => self.status = ExecutionStatus::Unknown,
}
cx.notify();
return;
+7
View File
@@ -673,6 +673,13 @@ impl Render for Session {
Kernel::RunningKernel(kernel) => match kernel.execution_state() {
ExecutionState::Idle => Color::Success,
ExecutionState::Busy => Color::Modified,
ExecutionState::Unknown => Color::Modified,
ExecutionState::Starting => Color::Modified,
ExecutionState::Restarting => Color::Modified,
ExecutionState::Terminating => Color::Disabled,
ExecutionState::AutoRestarting => Color::Modified,
ExecutionState::Dead => Color::Disabled,
ExecutionState::Other(_) => Color::Modified,
},
Kernel::StartingKernel(_) => Color::Modified,
Kernel::ErroredLaunch(_) => Color::Error,
@@ -388,16 +388,55 @@ fn session_state(session: Entity<Session>, cx: &mut App) -> ReplMenuState {
}
};
match &session.kernel {
Kernel::Restarting => ReplMenuState {
tooltip: format!("Restarting {}", kernel_name).into(),
icon_is_animating: true,
popover_disabled: true,
let transitional =
|tooltip: SharedString, animating: bool, popover_disabled: bool| ReplMenuState {
tooltip,
icon_is_animating: animating,
popover_disabled,
icon_color: Color::Muted,
indicator: Some(Indicator::dot().color(Color::Muted)),
status: session.kernel.status(),
..fill_fields()
},
};
let starting = || transitional(format!("{} is starting", kernel_name).into(), true, true);
let restarting = || transitional(format!("Restarting {}", kernel_name).into(), true, true);
let shutting_down = || {
transitional(
format!("{} is shutting down", kernel_name).into(),
false,
true,
)
};
let auto_restarting = || {
transitional(
format!("Auto-restarting {}", kernel_name).into(),
true,
true,
)
};
let unknown = || transitional(format!("{} state unknown", kernel_name).into(), false, true);
let other = |state: &str| {
transitional(
format!("{} state: {}", kernel_name, state).into(),
false,
true,
)
};
let shutdown = || ReplMenuState {
tooltip: "Nothing running".into(),
icon: IconName::ReplNeutral,
icon_color: Color::Default,
icon_is_animating: false,
popover_disabled: false,
indicator: None,
status: KernelStatus::Shutdown,
..fill_fields()
};
match &session.kernel {
Kernel::Restarting => restarting(),
Kernel::RunningKernel(kernel) => match &kernel.execution_state() {
ExecutionState::Idle => ReplMenuState {
tooltip: format!("Run code on {} ({})", kernel_name, kernel_language).into(),
@@ -413,16 +452,15 @@ fn session_state(session: Entity<Session>, cx: &mut App) -> ReplMenuState {
status: session.kernel.status(),
..fill_fields()
},
ExecutionState::Unknown => unknown(),
ExecutionState::Starting => starting(),
ExecutionState::Restarting => restarting(),
ExecutionState::Terminating => shutting_down(),
ExecutionState::AutoRestarting => auto_restarting(),
ExecutionState::Dead => shutdown(),
ExecutionState::Other(state) => other(state),
},
Kernel::StartingKernel(_) => ReplMenuState {
tooltip: format!("{} is starting", kernel_name).into(),
icon_is_animating: true,
popover_disabled: true,
icon_color: Color::Muted,
indicator: Some(Indicator::dot().color(Color::Muted)),
status: session.kernel.status(),
..fill_fields()
},
Kernel::StartingKernel(_) => starting(),
Kernel::ErroredLaunch(e) => ReplMenuState {
tooltip: format!("Error with kernel {}: {}", kernel_name, e).into(),
popover_disabled: false,
@@ -430,23 +468,7 @@ fn session_state(session: Entity<Session>, cx: &mut App) -> ReplMenuState {
status: session.kernel.status(),
..fill_fields()
},
Kernel::ShuttingDown => ReplMenuState {
tooltip: format!("{} is shutting down", kernel_name).into(),
popover_disabled: true,
icon_color: Color::Muted,
indicator: Some(Indicator::dot().color(Color::Muted)),
status: session.kernel.status(),
..fill_fields()
},
Kernel::Shutdown => ReplMenuState {
tooltip: "Nothing running".into(),
icon: IconName::ReplNeutral,
icon_color: Color::Default,
icon_is_animating: false,
popover_disabled: false,
indicator: None,
status: KernelStatus::Shutdown,
..fill_fields()
},
Kernel::ShuttingDown => shutting_down(),
Kernel::Shutdown => shutdown(),
}
}