- on resume, the CLI and propagate re-passed the initial state to a thread with
an existing checkpoint; nodes do not re-run, but the message reducer appended
the initial messages again, duplicating them in the resumed state
- feed None on resume (checkpoint_input) so LangGraph continues the interrupted
run, and wrap the CLI stream in try/finally so the checkpointer tears down even
if the stream raises
- correct the _fetch_returns docstring to the 4-tuple return #1249
- checkpoint setup lived only inside propagate(); the CLI streamed the
checkpointer-less graph with no thread_id, so --checkpoint neither saved nor
resumed a run
- extract the lifecycle into reusable begin_checkpoint / end_checkpoint /
clear_checkpoint_on_success (checkpoint_scope wraps them for propagate) and use
them around the CLI stream #1249