langgraph-events 0.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. langgraph_events-0.2.0/.github/workflows/ci.yml +34 -0
  2. langgraph_events-0.2.0/.github/workflows/docs.yml +35 -0
  3. langgraph_events-0.2.0/.github/workflows/publish.yml +46 -0
  4. langgraph_events-0.2.0/.gitignore +12 -0
  5. langgraph_events-0.2.0/.pdm-python +1 -0
  6. langgraph_events-0.2.0/.pre-commit-config.yaml +52 -0
  7. langgraph_events-0.2.0/.python-version +1 -0
  8. langgraph_events-0.2.0/CHANGELOG.md +48 -0
  9. langgraph_events-0.2.0/CLAUDE.md +24 -0
  10. langgraph_events-0.2.0/CONTRIBUTING.md +67 -0
  11. langgraph_events-0.2.0/LICENSE +21 -0
  12. langgraph_events-0.2.0/PKG-INFO +92 -0
  13. langgraph_events-0.2.0/README.md +66 -0
  14. langgraph_events-0.2.0/docs/agui.md +240 -0
  15. langgraph_events-0.2.0/docs/api.md +96 -0
  16. langgraph_events-0.2.0/docs/checkpointer-evolution.md +30 -0
  17. langgraph_events-0.2.0/docs/concepts.md +212 -0
  18. langgraph_events-0.2.0/docs/control-flow.md +108 -0
  19. langgraph_events-0.2.0/docs/getting-started.md +105 -0
  20. langgraph_events-0.2.0/docs/index.md +44 -0
  21. langgraph_events-0.2.0/docs/patterns.md +45 -0
  22. langgraph_events-0.2.0/docs/reducers.md +74 -0
  23. langgraph_events-0.2.0/docs/streaming.md +68 -0
  24. langgraph_events-0.2.0/examples/content_pipeline.graph.md +12 -0
  25. langgraph_events-0.2.0/examples/content_pipeline.py +179 -0
  26. langgraph_events-0.2.0/examples/human_in_the_loop.graph.md +16 -0
  27. langgraph_events-0.2.0/examples/human_in_the_loop.py +212 -0
  28. langgraph_events-0.2.0/examples/map_reduce.graph.md +12 -0
  29. langgraph_events-0.2.0/examples/map_reduce.py +172 -0
  30. langgraph_events-0.2.0/examples/react_agent.graph.md +13 -0
  31. langgraph_events-0.2.0/examples/react_agent.py +197 -0
  32. langgraph_events-0.2.0/examples/reflection_loop.graph.md +13 -0
  33. langgraph_events-0.2.0/examples/reflection_loop.py +165 -0
  34. langgraph_events-0.2.0/examples/supervisor.graph.md +20 -0
  35. langgraph_events-0.2.0/examples/supervisor.py +248 -0
  36. langgraph_events-0.2.0/mkdocs.yml +28 -0
  37. langgraph_events-0.2.0/pyproject.toml +139 -0
  38. langgraph_events-0.2.0/scripts/generate_mermaid.py +116 -0
  39. langgraph_events-0.2.0/scripts/release.py +249 -0
  40. langgraph_events-0.2.0/scripts/validate_tests.py +252 -0
  41. langgraph_events-0.2.0/src/langgraph_events/__init__.py +69 -0
  42. langgraph_events-0.2.0/src/langgraph_events/_custom_event.py +89 -0
  43. langgraph_events-0.2.0/src/langgraph_events/_event.py +266 -0
  44. langgraph_events-0.2.0/src/langgraph_events/_event_log.py +112 -0
  45. langgraph_events-0.2.0/src/langgraph_events/_graph.py +886 -0
  46. langgraph_events-0.2.0/src/langgraph_events/_handler.py +193 -0
  47. langgraph_events-0.2.0/src/langgraph_events/_internal.py +367 -0
  48. langgraph_events-0.2.0/src/langgraph_events/_reducer.py +244 -0
  49. langgraph_events-0.2.0/src/langgraph_events/_types.py +20 -0
  50. langgraph_events-0.2.0/src/langgraph_events/agui/__init__.py +35 -0
  51. langgraph_events-0.2.0/src/langgraph_events/agui/_adapter.py +541 -0
  52. langgraph_events-0.2.0/src/langgraph_events/agui/_context.py +68 -0
  53. langgraph_events-0.2.0/src/langgraph_events/agui/_mappers.py +179 -0
  54. langgraph_events-0.2.0/src/langgraph_events/agui/_protocols.py +87 -0
  55. langgraph_events-0.2.0/src/langgraph_events/agui/_transport.py +61 -0
  56. langgraph_events-0.2.0/src/langgraph_events/py.typed +0 -0
  57. langgraph_events-0.2.0/tests/conftest.py +53 -0
  58. langgraph_events-0.2.0/tests/test_agui.py +2547 -0
  59. langgraph_events-0.2.0/tests/test_event.py +237 -0
  60. langgraph_events-0.2.0/tests/test_event_graph.py +3559 -0
  61. langgraph_events-0.2.0/tests/test_event_log.py +272 -0
  62. langgraph_events-0.2.0/tests/test_mermaid_sync.py +19 -0
  63. langgraph_events-0.2.0/tests/test_on_decorator.py +324 -0
  64. langgraph_events-0.2.0/todos.md +11 -0
  65. langgraph_events-0.2.0/uv.lock +2192 -0
@@ -0,0 +1,34 @@
1
+ name: CI
2
+
3
+ on:
4
+ pull_request:
5
+ push:
6
+ branches: [main]
7
+
8
+ jobs:
9
+ lint:
10
+ runs-on: ubuntu-latest
11
+ steps:
12
+ - uses: actions/checkout@v4
13
+ - uses: astral-sh/ruff-action@v3
14
+ with:
15
+ args: check src/ tests/
16
+ - uses: astral-sh/ruff-action@v3
17
+ with:
18
+ args: format --check src/ tests/
19
+
20
+ typecheck:
21
+ runs-on: ubuntu-latest
22
+ steps:
23
+ - uses: actions/checkout@v4
24
+ - uses: astral-sh/setup-uv@v5
25
+ - run: uv sync --group dev
26
+ - run: uv run mypy src/
27
+
28
+ test:
29
+ runs-on: ubuntu-latest
30
+ steps:
31
+ - uses: actions/checkout@v4
32
+ - uses: astral-sh/setup-uv@v5
33
+ - run: uv sync --group dev
34
+ - run: uv run pytest tests/
@@ -0,0 +1,35 @@
1
+ name: Docs
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+ workflow_dispatch:
9
+
10
+ permissions:
11
+ contents: read
12
+ pages: write
13
+ id-token: write
14
+
15
+ concurrency:
16
+ group: pages
17
+ cancel-in-progress: false
18
+
19
+ jobs:
20
+ deploy:
21
+ environment:
22
+ name: github-pages
23
+ url: ${{ steps.deployment.outputs.page_url }}
24
+ runs-on: ubuntu-latest
25
+ steps:
26
+ - uses: actions/checkout@v4
27
+ - uses: astral-sh/setup-uv@v5
28
+ - run: uv sync --group docs --frozen
29
+ - run: uv run mkdocs build --strict
30
+ - uses: actions/configure-pages@v5
31
+ - uses: actions/upload-pages-artifact@v3
32
+ with:
33
+ path: site
34
+ - id: deployment
35
+ uses: actions/deploy-pages@v4
@@ -0,0 +1,46 @@
1
+ name: Publish
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v[0-9]+.[0-9]+.[0-9]+*"
7
+
8
+ jobs:
9
+ build:
10
+ name: Build and validate
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - uses: actions/checkout@v4
14
+ - uses: astral-sh/setup-uv@v5
15
+ - run: uv sync --group dev
16
+ - name: Verify tag matches package version
17
+ run: |
18
+ TAG="${GITHUB_REF#refs/tags/v}"
19
+ PKG=$(grep '^version' pyproject.toml | head -1 | cut -d'"' -f2)
20
+ if [ "$TAG" != "$PKG" ]; then
21
+ echo "::error::Tag v$TAG does not match pyproject.toml version $PKG"
22
+ exit 1
23
+ fi
24
+ - run: uv run ruff check src/ tests/
25
+ - run: uv run mypy src/
26
+ - run: uv run pytest tests/
27
+ - run: uv build
28
+ - uses: actions/upload-artifact@v4
29
+ with:
30
+ name: dist
31
+ path: dist/
32
+
33
+ publish:
34
+ name: Publish to PyPI
35
+ needs: build
36
+ runs-on: ubuntu-latest
37
+ environment: pypi
38
+ permissions:
39
+ id-token: write
40
+ steps:
41
+ - uses: astral-sh/setup-uv@v5
42
+ - uses: actions/download-artifact@v4
43
+ with:
44
+ name: dist
45
+ path: dist/
46
+ - run: uv publish --trusted-publishing always
@@ -0,0 +1,12 @@
1
+ __pycache__/
2
+ *.pyc
3
+ *.egg-info/
4
+ dist/
5
+ build/
6
+ .pytest_cache/
7
+ .mypy_cache/
8
+ .venv/
9
+ .coverage
10
+ .claude/
11
+ .worktrees/
12
+ site/
@@ -0,0 +1 @@
1
+ /Users/paulsoares/Development/langgraph-events/.venv/bin/python
@@ -0,0 +1,52 @@
1
+ default_language_version:
2
+ python: python3.11
3
+
4
+ repos:
5
+ - repo: https://github.com/astral-sh/ruff-pre-commit
6
+ rev: v0.15.2
7
+ hooks:
8
+ - id: ruff
9
+ args: [--fix, --exit-non-zero-on-fix]
10
+ - id: ruff-format
11
+
12
+ - repo: local
13
+ hooks:
14
+ - id: validate-tests
15
+ name: validate tests
16
+ entry: bash -c "uv run python scripts/validate_tests.py"
17
+ language: system
18
+ pass_filenames: false
19
+ always_run: true
20
+ - id: mypy
21
+ name: mypy
22
+ language: system
23
+ entry: uv run mypy src/
24
+ types: [python]
25
+ pass_filenames: false
26
+ require_serial: true
27
+
28
+ - id: jscpd
29
+ name: jscpd
30
+ language: system
31
+ entry: npx jscpd src/ tests/ --min-tokens 30 --min-lines 2 --threshold 5
32
+ types: [python]
33
+ pass_filenames: false
34
+ require_serial: true
35
+ files: ^(src/|tests/)
36
+
37
+ - id: mermaid-graphs
38
+ name: mermaid-graphs
39
+ language: system
40
+ entry: uv run python scripts/generate_mermaid.py
41
+ pass_filenames: false
42
+ require_serial: true
43
+ files: ^examples/.*\.py$
44
+
45
+ - id: pytest
46
+ name: pytest
47
+ language: system
48
+ entry: bash -c 'uv run coverage run -m pytest && uv run coverage report'
49
+ types: [python]
50
+ pass_filenames: false
51
+ require_serial: true
52
+ files: ^(src/|tests/)
@@ -0,0 +1 @@
1
+ 3.11
@@ -0,0 +1,48 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [Unreleased]
9
+
10
+ ## [0.2.0] - 2026-04-06
11
+
12
+ ### Added
13
+ - Field-level dispatch for `@on` decorator
14
+ - AG-UI protocol adapter with `langgraph-events[agui]` optional dependency
15
+ - Custom event emit helpers (`emit_custom`, `aemit_custom`, `emit_state_snapshot`, `aemit_state_snapshot`)
16
+ - First-class `StateSnapshotFrame` for state snapshot streaming
17
+ - `SKIP` sentinel for scalar reducer no-op returns
18
+ - Graceful `Halted` subtypes (`MaxRoundsExceeded`, `Cancelled`) and `OrphanedEventWarning`
19
+ - LLM token streaming (`LLMToken`, `LLMStreamEnd` frames)
20
+ - MkDocs documentation site on GitHub Pages
21
+
22
+ ### Changed
23
+ - Restructured docs for better DX (split concepts, grouped API reference)
24
+ - `Interrupted` is now a bare marker class — subclass with typed fields
25
+
26
+ ### Fixed
27
+ - AG-UI adapter message deduplication and ID reconciliation
28
+ - `connect()` yielding no events for new threads
29
+ - Resume interrupt detection for interrupts created during resume
30
+
31
+ ## [0.1.0] - 2026-02-20
32
+
33
+ ### Added
34
+ - Core `Event`, `EventGraph`, and `@on` decorator
35
+ - `Reducer` and `ScalarReducer` for custom state channels
36
+ - `EventLog` with query methods (`first`, `count`, `after`, `before`, `select`)
37
+ - Multi-subscription `@on(A, B)` and `Scatter` for fan-out
38
+ - `Auditable` and `MessageEvent` base events
39
+ - `SystemPromptSet` event for system prompts
40
+ - Config and store injection for handlers
41
+ - `Interrupted` / `Resumed` events for human-in-the-loop
42
+ - Mermaid diagram generation
43
+ - BDD-style test suite with pytest-describe
44
+ - CI workflow (lint, typecheck, test)
45
+
46
+ [Unreleased]: https://github.com/cadance-io/langgraph-events/compare/v0.2.0...HEAD
47
+ [0.2.0]: https://github.com/cadance-io/langgraph-events/compare/v0.1.0...v0.2.0
48
+ [0.1.0]: https://github.com/cadance-io/langgraph-events/releases/tag/v0.1.0
@@ -0,0 +1,24 @@
1
+ # langgraph-events
2
+
3
+ Event-driven abstraction for LangGraph. State IS events.
4
+
5
+ ## Commands
6
+
7
+ - **Tests:** `uv run pytest tests/`
8
+ - **Lint:** `uv run ruff check src/ tests/`
9
+ - **Format:** `uv run ruff format src/ tests/`
10
+ - **Type check:** `uv run mypy src/`
11
+
12
+ ## Structure
13
+
14
+ - `src/langgraph_events/` — library source
15
+ - `tests/` — BDD-style with pytest-describe (`describe_`/`when_`/`it_`)
16
+ - `examples/` — usage examples
17
+
18
+ ## Conventions
19
+
20
+ - Python 3.10+, line length 88
21
+ - Use `uv` to run all tooling (not bare `python` or `pytest`)
22
+ - Ruff for linting and formatting (config in pyproject.toml)
23
+ - mypy strict mode
24
+ - Tests: `describe_` groups by API surface, `when_` mirrors code branches, `it_` names the assertion. Test each behavior once at the API boundary where it's consumed. Shared event classes in `conftest.py`; scenario-specific events inline. Event classes used as handler type annotations must be defined at module level (not inside `describe_`/`when_` blocks) so Python can resolve forward references at runtime.
@@ -0,0 +1,67 @@
1
+ # Contributing
2
+
3
+ ## Development
4
+
5
+ ```bash
6
+ uv sync --group dev
7
+ uv run pytest tests/
8
+ uv run ruff check src/ tests/
9
+ uv run ruff format src/ tests/
10
+ uv run mypy src/
11
+ ```
12
+
13
+ ## Releasing
14
+
15
+ ### One-time setup
16
+
17
+ Before the first release, the repo owner must:
18
+
19
+ 1. **Register trusted publishers on PyPI** — go to [pypi.org/manage/account/publishing](https://pypi.org/manage/account/publishing/) and add a pending trusted publisher:
20
+ - Project name: `langgraph-events`
21
+ - Owner: `cadance-io`
22
+ - Repository: `langgraph-events`
23
+ - Workflow: `publish.yml`
24
+ - Environment: `pypi`
25
+
26
+ 2. **Create GitHub environment** — go to repo Settings → Environments and create `pypi`
27
+
28
+ ### Cutting a release
29
+
30
+ 1. Make sure `CHANGELOG.md` has entries under `[Unreleased]`.
31
+
32
+ 2. Run the release script:
33
+
34
+ ```bash
35
+ # Preview changes
36
+ uv run python scripts/release.py minor --dry-run
37
+
38
+ # Cut the release (bumps version, stamps changelog, commits, tags)
39
+ uv run python scripts/release.py minor
40
+ ```
41
+
42
+ The script accepts `major`, `minor`, `patch`, or an explicit version like `1.0.0`.
43
+
44
+ 3. Push to trigger the publish workflow:
45
+
46
+ ```bash
47
+ git push origin main v0.3.0
48
+ ```
49
+
50
+ The workflow builds the package and publishes to PyPI.
51
+
52
+ ### What the release script does
53
+
54
+ `scripts/release.py` automates:
55
+
56
+ - Bumps version in `pyproject.toml`, `README.md`, `docs/index.md`
57
+ - Stamps `[Unreleased]` in `CHANGELOG.md` with the new version and today's date
58
+ - Updates changelog footer comparison links
59
+ - Runs `uv lock` to sync `uv.lock`
60
+ - Commits with message `release: vX.Y.Z`
61
+ - Creates git tag `vX.Y.Z`
62
+
63
+ Preflight checks ensure you're on `main`, working tree is clean, `[Unreleased]` has content, and the tag doesn't already exist.
64
+
65
+ ### Changelog
66
+
67
+ We use [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) format. Add entries under `[Unreleased]` as you work — the release script moves them to the new version section automatically.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 cadance-io
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,92 @@
1
+ Metadata-Version: 2.4
2
+ Name: langgraph-events
3
+ Version: 0.2.0
4
+ Summary: Opinionated event-driven abstraction for LangGraph. State IS events.
5
+ Project-URL: Homepage, https://cadance-io.github.io/langgraph-events/
6
+ Project-URL: Repository, https://github.com/cadance-io/langgraph-events
7
+ Project-URL: Documentation, https://cadance-io.github.io/langgraph-events/
8
+ Project-URL: Changelog, https://github.com/cadance-io/langgraph-events/blob/main/CHANGELOG.md
9
+ Author: cadance-io
10
+ License-Expression: MIT
11
+ License-File: LICENSE
12
+ Keywords: event-driven,events,langgraph,state-machine
13
+ Classifier: Development Status :: 3 - Alpha
14
+ Classifier: License :: OSI Approved :: MIT License
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Typing :: Typed
21
+ Requires-Python: >=3.10
22
+ Requires-Dist: langgraph>=0.2.0
23
+ Provides-Extra: agui
24
+ Requires-Dist: ag-ui-protocol>=0.1.0; extra == 'agui'
25
+ Description-Content-Type: text/markdown
26
+
27
+ # langgraph-events
28
+
29
+ Opinionated event-driven abstraction for LangGraph. **State IS events.**
30
+
31
+ > [!CAUTION]
32
+ > **Experimental (v0.2.0)** - This is an early-stage personal project, not a supported product. The API will change without notice or migration path.
33
+
34
+ ## Quick Start
35
+
36
+ ```python
37
+ from langgraph_events import Event, EventGraph, on
38
+
39
+
40
+ class MessageReceived(Event):
41
+ text: str
42
+
43
+
44
+ class ReplyProduced(Event):
45
+ text: str
46
+
47
+
48
+ @on(MessageReceived)
49
+ def reply(event: MessageReceived) -> ReplyProduced:
50
+ return ReplyProduced(text=f"Echo: {event.text}")
51
+
52
+
53
+ graph = EventGraph([reply])
54
+ log = graph.invoke(MessageReceived(text="hello"))
55
+ print(log.latest(ReplyProduced))
56
+ ```
57
+
58
+ ## Installation
59
+
60
+ ```bash
61
+ pip install langgraph-events
62
+
63
+ # With AG-UI adapter support
64
+ pip install "langgraph-events[agui]"
65
+
66
+ # From source (development)
67
+ pip install git+https://github.com/cadance-io/langgraph-events.git
68
+ ```
69
+
70
+ ## Documentation
71
+
72
+ - Docs site (GitHub Pages): <https://cadance-io.github.io/langgraph-events/>
73
+ - Local docs index: [`docs/index.md`](docs/index.md)
74
+ - Getting started: [`docs/getting-started.md`](docs/getting-started.md)
75
+ - Core concepts: [`docs/concepts.md`](docs/concepts.md)
76
+ - Patterns: [`docs/patterns.md`](docs/patterns.md)
77
+ - API reference: [`docs/api.md`](docs/api.md)
78
+ - AG-UI adapter: [`docs/agui.md`](docs/agui.md)
79
+ - Checkpointer and graph evolution: [`docs/checkpointer-evolution.md`](docs/checkpointer-evolution.md)
80
+
81
+ ## Development
82
+
83
+ ```bash
84
+ uv sync --group dev
85
+ uv run pytest tests/
86
+ uv run ruff check src/ tests/
87
+ uv run mypy src/
88
+ ```
89
+
90
+ ## License
91
+
92
+ MIT - see [`LICENSE`](LICENSE).
@@ -0,0 +1,66 @@
1
+ # langgraph-events
2
+
3
+ Opinionated event-driven abstraction for LangGraph. **State IS events.**
4
+
5
+ > [!CAUTION]
6
+ > **Experimental (v0.2.0)** - This is an early-stage personal project, not a supported product. The API will change without notice or migration path.
7
+
8
+ ## Quick Start
9
+
10
+ ```python
11
+ from langgraph_events import Event, EventGraph, on
12
+
13
+
14
+ class MessageReceived(Event):
15
+ text: str
16
+
17
+
18
+ class ReplyProduced(Event):
19
+ text: str
20
+
21
+
22
+ @on(MessageReceived)
23
+ def reply(event: MessageReceived) -> ReplyProduced:
24
+ return ReplyProduced(text=f"Echo: {event.text}")
25
+
26
+
27
+ graph = EventGraph([reply])
28
+ log = graph.invoke(MessageReceived(text="hello"))
29
+ print(log.latest(ReplyProduced))
30
+ ```
31
+
32
+ ## Installation
33
+
34
+ ```bash
35
+ pip install langgraph-events
36
+
37
+ # With AG-UI adapter support
38
+ pip install "langgraph-events[agui]"
39
+
40
+ # From source (development)
41
+ pip install git+https://github.com/cadance-io/langgraph-events.git
42
+ ```
43
+
44
+ ## Documentation
45
+
46
+ - Docs site (GitHub Pages): <https://cadance-io.github.io/langgraph-events/>
47
+ - Local docs index: [`docs/index.md`](docs/index.md)
48
+ - Getting started: [`docs/getting-started.md`](docs/getting-started.md)
49
+ - Core concepts: [`docs/concepts.md`](docs/concepts.md)
50
+ - Patterns: [`docs/patterns.md`](docs/patterns.md)
51
+ - API reference: [`docs/api.md`](docs/api.md)
52
+ - AG-UI adapter: [`docs/agui.md`](docs/agui.md)
53
+ - Checkpointer and graph evolution: [`docs/checkpointer-evolution.md`](docs/checkpointer-evolution.md)
54
+
55
+ ## Development
56
+
57
+ ```bash
58
+ uv sync --group dev
59
+ uv run pytest tests/
60
+ uv run ruff check src/ tests/
61
+ uv run mypy src/
62
+ ```
63
+
64
+ ## License
65
+
66
+ MIT - see [`LICENSE`](LICENSE).