Skip to content

Comments

feat: checkpoint-based state, breakpoint system, and multi-agent streaming fixes#186

Merged
cristipufu merged 4 commits intomainfrom
fix/breakpoint-infinite-loop
Feb 20, 2026
Merged

feat: checkpoint-based state, breakpoint system, and multi-agent streaming fixes#186
cristipufu merged 4 commits intomainfrom
fix/breakpoint-infinite-loop

Conversation

@cristipufu
Copy link
Member

@cristipufu cristipufu commented Feb 20, 2026

Summary

feat: replace session-based state with checkpoints, add breakpoint system

  • Replace SqliteSessionStore with checkpoint-based persistence using the Agent Framework's CheckpointStorage protocol (SqliteCheckpointStorage, ScopedCheckpointStorage)
  • Add executor-level breakpoints that work with all agent types (RawAgent, Agent) by wrapping executor.execute() instead of using middleware
  • Add HITL interrupt support, resumable storage with KV store, and session persistence via runtime_kv table
  • Update samples: replace quickstart-agent/multi-agent with quickstart-workflow/hitl-workflow/concurrent

feat: exclude handoff tools from graph tool nodes

  • Handoff tools (handoff_to_) are already represented as edges between agent nodes — filter them out so the graph only shows non-handoff tools in tool nodes

fix: extract tool state events from executor_completed when output events are filtered

  • In multi-agent workflows like GroupChat, participant agents are not output executors, so their tool call output events get dropped. Fall back to extracting tool events from executor_completed data when no output events were seen for that executor

fix: resolve breakpoint infinite loop in debug streaming with cyclic topologies

  • Add checkpoint advancement detection to _get_breakpoint_skip() to correctly handle cyclic graphs (GroupChat, handoffs) where executors are visited on every cycle
  • Merge interrupt.py into breakpoints.py (AgentInterruptException, BreakpointMiddleware)
  • Add breakpoint integration tests for all sample topologies (group-chat, quickstart-workflow, concurrent, handoff, hitl-workflow)
  • Move agent-framework-orchestrations to main dependencies, bump version to 0.0.5

Test plan

  • All 95 tests pass
  • mypy --config-file pyproject.toml . → 0 errors
  • ruff check . → 0 errors
  • Integration tests cover all sample topologies with cyclic/acyclic graphs

🤖 Generated with Claude Code

cristipufu and others added 3 commits February 20, 2026 14:54
…stem

- Replace SqliteSessionStore with checkpoint-based persistence using
  the Agent Framework's CheckpointStorage protocol (SqliteCheckpointStorage,
  ScopedCheckpointStorage)
- Add executor-level breakpoints that work with all agent types (RawAgent,
  Agent) by wrapping executor.execute() instead of using middleware
- Fix concurrent breakpoint infinite loop by accumulating skip_nodes set
  across resumes instead of tracking a single skip_node
- Fix wildcard breakpoint resolution for ["*"] list format from debug bridge
- Fix spurious start executor STARTED events on breakpoint resume
- Add HITL interrupt support, resumable storage with KV store, and
  session persistence via runtime_kv table
- Update samples: replace quickstart-agent/multi-agent with
  quickstart-workflow/hitl-workflow/concurrent
- Rewrite tests for checkpoint storage, streaming, and breakpoints (80 tests)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Handoff tools (handoff_to_<executor>) are already represented as edges
between agent nodes, so showing them as tool nodes is redundant. Filter
them out so the graph only shows non-handoff tools in tool nodes.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ents are filtered

The agent framework's Workflow filters output events to only include
those from "output executors". In multi-agent workflows like GroupChat,
participant agents are not output executors, so their tool call output
events get dropped — causing missing tool state events in the runtime.

Fall back to extracting tool events from executor_completed data when
no output events were seen for that executor, with dedup tracking to
avoid double-emitting in the normal (unfiltered) case.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@cristipufu cristipufu force-pushed the fix/breakpoint-infinite-loop branch 3 times, most recently from 372f332 to ebb332d Compare February 20, 2026 16:53
…topologies

- Add checkpoint advancement detection to _get_breakpoint_skip() to correctly
  handle cyclic graphs (GroupChat, handoffs) where executors are visited on
  every cycle
- Merge interrupt.py contents into breakpoints.py (AgentInterruptException,
  BreakpointMiddleware)
- Add breakpoint integration tests for all sample topologies (group-chat,
  quickstart-workflow, concurrent, handoff, hitl-workflow)
- Move agent-framework-orchestrations to main dependencies
- Bump version to 0.0.5
- Fix all mypy errors across src and tests
- Add LangChain integration to root README.md
- Add .vscode/ to .gitignore

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@cristipufu cristipufu force-pushed the fix/breakpoint-infinite-loop branch from ebb332d to 99f4086 Compare February 20, 2026 16:55
@cristipufu cristipufu changed the title fix: resolve breakpoint infinite loop in debug streaming fix: breakpoint infinite loop, merge interrupt into breakpoints, fix mypy/ruff, add LangChain to README Feb 20, 2026
@cristipufu cristipufu changed the title fix: breakpoint infinite loop, merge interrupt into breakpoints, fix mypy/ruff, add LangChain to README feat: checkpoint-based state, breakpoint system, and multi-agent streaming fixes Feb 20, 2026
@cristipufu cristipufu merged commit 33b5d67 into main Feb 20, 2026
46 checks passed
@cristipufu cristipufu deleted the fix/breakpoint-infinite-loop branch February 20, 2026 16:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant