# Floors are the versions this harness is actually tested against - not a guess.
# Ceilings stop the next breaking release from arriving unannounced: the next
# major, or for a 0.x package the next minor, which is where those break.
#
# `pip install -r requirements-lock.txt` instead for the exact set that was tested.

# Only `list()` and the streaming chat client are used, and both have been
# stable across every 0.x release, so this one gets the wider ceiling.
ollama>=0.6.2,<1.0
prompt_toolkit>=3.0.53,<4.0
# Renamed from `duckduckgo_search` at 9.0. The old name still works and is
# still accepted, but it warns on every client it builds; installing this one
# is what stops that.
ddgs>=9.0,<10.0
requests>=2.34.2,<3.0
beautifulsoup4>=4.15.0,<5.0
psutil>=7.2.2,<8.0
# Only `open`, `convert`, `resize` and `save` are used, to shrink an image to
# what the APIs accept. Without it images still work; one over the ceiling is
# refused rather than resized (`images.PILLOW_AVAILABLE`).
pillow>=11.4.0,<13.0
tree-sitter>=0.26.0,<0.27
tree-sitter-python>=0.25.0,<0.26
tree-sitter-javascript>=0.25.0,<0.26
tree-sitter-typescript>=0.23.2,<0.24
tree-sitter-java>=0.23.5,<0.24
tree-sitter-c>=0.24.2,<0.25
tree-sitter-cpp>=0.23.4,<0.24
tree-sitter-go>=0.25.0,<0.26
tree-sitter-rust>=0.24.2,<0.25
tree-sitter-c-sharp>=0.23.5,<0.24
# Attacca only (`aetheris[attacca]`): the Zyris websocket and its msgpack frames.
# 16.1.1 is the newest that installs on Python 3.10; 17 needs 3.11.
websockets>=16.1.1,<18.0
msgpack>=1.2.3,<2.0
# Keyring only (`aetheris[keyring]`): API keys in the OS keyring instead of
# providers.json. Without it, or without a usable backend, keys stay in the file.
keyring>=25.7.0,<26.0
