fix: rabbit review 001 - persist Streamlit failures, guard Jupyter lifecycle

- st_demo: persist failure in call history, clear active_handle,
  and disable Run while call active to avoid overwriting handle
- JupyterApp.shutdown: gather all shutdowns with return_exceptions=True
  and re-raise as BaseExceptionGroup so one failure doesn't leak kernels
- messages: fallback known-but-malformed messages to UnknownJupyterMessage
  via ValidationError, make Unknown channel permissive (str) for nuance
- transport: record reader failures as terminal state (_reader_failure)
  and fail fast from execute/messages_for instead of hanging
- shell: don't reset execution_count to 0 when IPython returns None
- README: use ipython_shell imports

Skipped non-urgent/deferred items: line(), get_shell_2, test renames,
import laziness, call-ID bounding, settle window config (worth doing later).
This commit is contained in:
lda committed 2026-08-31 15:59:23 +07:00 Verified
1 parent 32d628677c
commit c2c41ea9ce
6 files changed
+53 -9

No files matched your search

+2 -1
View File
@@ -87,7 +87,8 @@ class Shell:
else:
self.status = "ready"
self.last_used_at = datetime.now(UTC).isoformat()
self._last_execution_count = call_result.execution_count or 0
if call_result.execution_count is not None:
self._last_execution_count = call_result.execution_count
return call_result, events
def describe(self) -> ShellInfo: