diff --git a/CHANGELOG.md b/CHANGELOG.md
index e8bfa16..56cd5d8 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,6 +8,16 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/)
and this project adheres to [Semantic Versioning](http://semver.org/).
+## [2.5.0] - 2026-03-05
+
+### Added
+- Unified search provider tools
+- Suggest tools for the user based on their interaction
+
+### Changed
+- ny_py_api updated to 0.24.2
+
+
## [2.4.0] - 2026-02-26
### Added
diff --git a/Makefile b/Makefile
index 22046bb..4865094 100644
--- a/Makefile
+++ b/Makefile
@@ -4,7 +4,7 @@
APP_ID := context_agent
APP_NAME := Nextcloud Context Agent
-APP_VERSION := 2.4.0
+APP_VERSION := 2.5.0
JSON_INFO := "{\"id\":\"$(APP_ID)\",\"name\":\"$(APP_NAME)\",\"daemon_config_name\":\"manual_install\",\"version\":\"$(APP_VERSION)\",\"secret\":\"12345\",\"port\":9081}"
diff --git a/appinfo/info.xml b/appinfo/info.xml
index 94a288e..a22af75 100644
--- a/appinfo/info.xml
+++ b/appinfo/info.xml
@@ -28,7 +28,7 @@ Positive:
* The software for this app is open source, no trained AI model is used
]]>
- 2.4.0
+ 2.5.0
MIT
Marcel Klehr
ContextAgent
@@ -45,7 +45,7 @@ Positive:
ghcr.io
nextcloud/context_agent
- 2.3.0
+ 2.5.0
diff --git a/poetry.lock b/poetry.lock
index c0c4c4d..4c92de9 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -310,27 +310,28 @@ files = [
[[package]]
name = "caldav"
-version = "1.3.6"
+version = "3.0.0"
description = "CalDAV (RFC4791) client library"
optional = false
-python-versions = "*"
+python-versions = ">=3.10"
groups = ["main"]
files = [
- {file = "caldav-1.3.6-py3-none-any.whl", hash = "sha256:ec48bae60d23ad8c409508048033fbe40f7bf4e6e3bc1112eaac71085a92f9e7"},
- {file = "caldav-1.3.6.tar.gz", hash = "sha256:33966ea6ca012b4618278f01ee471528583714814965f9147bb7fc7c157a9d9e"},
+ {file = "caldav-3.0.0-py3-none-any.whl", hash = "sha256:98830afb47fada371dd07042b4d0a071d9e4987ef23048f63215479d267ea681"},
+ {file = "caldav-3.0.0.tar.gz", hash = "sha256:002f0c675c5fbe8d8e87387e19fb1a8ef6ee74e41ecf31978fe37b48869be841"},
]
[package.dependencies]
-icalendar = "*"
+dnspython = "*"
+icalendar = ">6.0.0"
+icalendar-searcher = ">=1.0.5,<2"
lxml = "*"
-pytz = "*"
+niquests = "*"
+python-dateutil = "*"
+pyyaml = "*"
recurring-ical-events = ">=2.0.0"
-requests = "*"
-tzlocal = "*"
-vobject = "*"
[package.extras]
-test = ["coverage", "pytest", "pytest-coverage", "sphinx", "xandikos"]
+test = ["coverage", "deptry (>=0.24.0) ; python_version >= \"3.10\"", "httpx", "manuel", "proxy-py", "pyfakefs", "pytest", "pytest-asyncio", "radicale", "tzlocal", "vobject", "xandikos (>=0.3.3)"]
[[package]]
name = "certifi"
@@ -818,6 +819,18 @@ websockets = ">=15.0.1"
[package.extras]
openai = ["openai (>=1.102.0)"]
+[[package]]
+name = "filelock"
+version = "3.25.0"
+description = "A platform independent file lock."
+optional = false
+python-versions = ">=3.10"
+groups = ["main"]
+files = [
+ {file = "filelock-3.25.0-py3-none-any.whl", hash = "sha256:5ccf8069f7948f494968fc0713c10e5c182a9c9d9eef3a636307a20c2490f047"},
+ {file = "filelock-3.25.0.tar.gz", hash = "sha256:8f00faf3abf9dc730a1ffe9c354ae5c04e079ab7d3a683b7c32da5dd05f26af3"},
+]
+
[[package]]
name = "frozenlist"
version = "1.6.0"
@@ -1092,6 +1105,26 @@ tzdata = "*"
[package.extras]
test = ["coverage", "hypothesis", "pytest", "pytz"]
+[[package]]
+name = "icalendar-searcher"
+version = "1.0.5"
+description = "Search, filter and sort iCalendar components"
+optional = false
+python-versions = "<4.0,>=3.10"
+groups = ["main"]
+files = [
+ {file = "icalendar_searcher-1.0.5-py3-none-any.whl", hash = "sha256:66f6f5ece50041ceda5ea91995cd2ed80fa0b065a42b3b3f420f89343614b2a3"},
+ {file = "icalendar_searcher-1.0.5.tar.gz", hash = "sha256:abd99bf1ac9c9d675d84151101db4883a97e9958755708804c55abd30df58f6c"},
+]
+
+[package.dependencies]
+icalendar = ">=6.0"
+recurring-ical-events = ">=3.8.0"
+
+[package.extras]
+collation = ["pyicu"]
+dev = ["deptry (>=0.24.0)", "pre-commit", "pyicu", "pytest (>=8.0.0,<10.0.0)", "ruff"]
+
[[package]]
name = "ics"
version = "0.7.2"
@@ -2062,19 +2095,20 @@ files = [
[[package]]
name = "nc-py-api"
-version = "0.22.0"
+version = "0.24.2"
description = "Nextcloud Python Framework"
optional = false
python-versions = ">=3.10"
groups = ["main"]
files = [
- {file = "nc_py_api-0.22.0-py3-none-any.whl", hash = "sha256:a4c797dd075984678bccf662a3dbfa9295c0829c4a3695ae0299465a32f3e25c"},
- {file = "nc_py_api-0.22.0.tar.gz", hash = "sha256:68a86894dec264858e772e0304f47cb8ad6bbfa8356736e067bfaf55ca2cea6b"},
+ {file = "nc_py_api-0.24.2-py3-none-any.whl", hash = "sha256:671ffe28df1c0205b782e6bbbfc143c96a447a66f85332c906334e5022230362"},
+ {file = "nc_py_api-0.24.2.tar.gz", hash = "sha256:05a1f214577fc50e38ec2f8fb28c55d09246f93b81ac9bba4385185043d13bae"},
]
[package.dependencies]
-caldav = {version = "1.3.6", optional = true, markers = "extra == \"calendar\""}
+caldav = {version = ">=2.2.6", optional = true, markers = "extra == \"calendar\""}
fastapi = ">=0.109.2"
+filelock = ">=3.20.3,<4"
niquests = ">=3,<4"
pydantic = ">=2.1.1"
python-dotenv = ">=1"
@@ -2083,10 +2117,9 @@ xmltodict = ">=0.13"
[package.extras]
app = ["uvicorn[standard] (>=0.23.2)"]
bench = ["matplotlib", "numpy", "py-cpuinfo", "uvicorn[standard] (>=0.23.2)"]
-calendar = ["caldav (==1.3.6)"]
-dev = ["caldav (==1.3.6)", "coverage", "huggingface-hub", "matplotlib", "numpy", "pillow", "pre-commit", "py-cpuinfo", "pylint", "pytest", "pytest-asyncio", "uvicorn[standard] (>=0.23.2)"]
+calendar = ["caldav (>=2.2.6)"]
+dev = ["caldav (>=2.2.6)", "coverage", "huggingface-hub", "matplotlib", "numpy", "pillow", "pre-commit", "py-cpuinfo", "pylint", "pytest", "pytest-asyncio", "uvicorn[standard] (>=0.23.2)"]
dev-min = ["coverage", "huggingface-hub", "pillow", "pre-commit", "pylint", "pytest", "pytest-asyncio"]
-docs = ["autodoc-pydantic (>=2.0.1)", "caldav (==1.3.6)", "sphinx (<8)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-issues (>=3.0.1)", "sphinx-rtd-theme (<3)", "uvicorn[standard] (>=0.23.2)"]
[[package]]
name = "niquests"
@@ -3079,18 +3112,18 @@ files = [
[[package]]
name = "recurring-ical-events"
-version = "3.7.0"
+version = "3.8.1"
description = "Calculate recurrence times of events, todos, alarms and journals based on icalendar RFC5545."
optional = false
python-versions = ">=3.8"
groups = ["main"]
files = [
- {file = "recurring_ical_events-3.7.0-py3-none-any.whl", hash = "sha256:c4b575967938939df64d7a25cb84e0dd9b907f21b4842fcf44eab6e9acfabaec"},
- {file = "recurring_ical_events-3.7.0.tar.gz", hash = "sha256:abf635ec48dbfd8204dc5bea2d038a4c283a59161aab55ed140d03aa8494bb30"},
+ {file = "recurring_ical_events-3.8.1-py3-none-any.whl", hash = "sha256:3bb3aaa0c87a4d3ab5951360480686bd69f1512945f478be6a2c0f141da0bf78"},
+ {file = "recurring_ical_events-3.8.1.tar.gz", hash = "sha256:c3eb2490a00559fb963d2bdee39acf2f287c91c07dcea4ce80ade1c60a8c3acf"},
]
[package.dependencies]
-icalendar = ">=6.1.0,<7.0.0"
+icalendar = ">=6.1.0,<8.0.0"
python-dateutil = ">=2.8.1,<3.0.0"
tzdata = "*"
x-wr-timezone = {version = ">=1.0.0,<3.0.0", markers = "python_version >= \"3.9\""}
@@ -3616,24 +3649,6 @@ files = [
{file = "tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9"},
]
-[[package]]
-name = "tzlocal"
-version = "5.3.1"
-description = "tzinfo object for the local timezone"
-optional = false
-python-versions = ">=3.9"
-groups = ["main"]
-files = [
- {file = "tzlocal-5.3.1-py3-none-any.whl", hash = "sha256:eb1a66c3ef5847adf7a834f1be0800581b683b5608e74f86ecbcef8ab91bb85d"},
- {file = "tzlocal-5.3.1.tar.gz", hash = "sha256:cceffc7edecefea1f595541dbd6e990cb1ea3d19bf01b2809f362a03dd7921fd"},
-]
-
-[package.dependencies]
-tzdata = {version = "*", markers = "platform_system == \"Windows\""}
-
-[package.extras]
-devenv = ["check-manifest", "pytest (>=4.3)", "pytest-cov", "pytest-mock (>=3.3)", "zest.releaser"]
-
[[package]]
name = "urllib3"
version = "2.6.3"
@@ -4236,4 +4251,4 @@ cffi = ["cffi (>=1.11)"]
[metadata]
lock-version = "2.1"
python-versions = ">=3.11,<4"
-content-hash = "99c6c57cb9fec8197da94b0c9d5045b159bb0edbd82242ae794a238d365e0f97"
+content-hash = "d1d40563db19865cecaec75c2395fc0cb0e1e12d141c20921dd793254c4be3eb"
diff --git a/pyproject.toml b/pyproject.toml
index 35a87b5..316d7e3 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -10,7 +10,7 @@ package-mode = false
[tool.poetry.dependencies]
python = ">=3.11,<4"
-nc-py-api = {extras = ["calendar"], version = "^0.22.0"}
+nc-py-api = {extras = ["calendar"], version = "^0.24.2"}
langgraph = "1.*"
langchain = "^0.3.25"
ics = "^0.7.2"
diff --git a/test.env b/test.env
index 2215145..9a9907a 100644
--- a/test.env
+++ b/test.env
@@ -6,6 +6,6 @@ APP_HOST=0.0.0.0
APP_ID=context_agent
APP_PORT=9081
APP_SECRET=12345
-APP_VERSION=2.3.0
+APP_VERSION=2.5.0
NEXTCLOUD_URL=http://localhost:8080
COMPUTE_DEVICE=CPU