Files
lda Verified c2c41ea9ce 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).
2026-08-31 15:59:23 +07:00

903 B

IPython demo

The application-facing API is:

from ipython_shell import App, CallOptions

app = App()
call = app.run_code(
    "print('hello'); 2 + 2",
    shell_name="new",
    options=CallOptions(collapsed=False),
)

call contains the submitted code, call_id, shell_name, typed options, a typed result, and ordered typed events. Event sequences are stable within a call, so a frontend can use (call_id, sequence) as its idempotency and React key pair.

For MIME output, retain the complete bundle and choose a renderer in the UI. The initial preference is text/html, JavaScript, text/latex, then text/plain, with image MIME types handled by their image renderers. HTML must be sanitized, and JavaScript should be treated as untrusted unless the host explicitly opts into a sandboxed execution policy.

Run the JSON showcase with:

uv run ipython-demo