Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
# Changelog

## Unreleased

### Added

- `get_timeline` accepts `status="active"` to return only currently
authoritative memories (server `GET /v1/timeline?status=active`, v1.5.0+);
sent only when supplied, so the default is unchanged.

## 1.5.0 (2026-08-30)

### Added — `get_timeline` can page, and can page from the recent end
Expand Down
6 changes: 6 additions & 0 deletions statewave/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -793,6 +793,7 @@ def get_timeline(
limit: int | None = None,
offset: int | None = None,
newest_first: bool | None = None,
status: str | None = None,
timeout: float | None = None,
) -> Timeline:
"""Get chronological subject timeline.
Expand All @@ -813,6 +814,8 @@ def get_timeline(
params["offset"] = offset
if newest_first is not None:
params["newest_first"] = "true" if newest_first else "false"
if status is not None:
params["status"] = status
return self._request(
"GET", "/v1/timeline", params=params, model=Timeline,
timeout=timeout,
Expand Down Expand Up @@ -1486,6 +1489,7 @@ async def get_timeline(
limit: int | None = None,
offset: int | None = None,
newest_first: bool | None = None,
status: str | None = None,
timeout: float | None = None,
) -> Timeline:
"""Get chronological subject timeline.
Expand All @@ -1506,6 +1510,8 @@ async def get_timeline(
params["offset"] = offset
if newest_first is not None:
params["newest_first"] = "true" if newest_first else "false"
if status is not None:
params["status"] = status
return await self._request(
"GET", "/v1/timeline", params=params, model=Timeline,
timeout=timeout,
Expand Down
18 changes: 18 additions & 0 deletions tests/test_timeline.py
Original file line number Diff line number Diff line change
Expand Up @@ -296,3 +296,21 @@ def test_sync_and_async_get_timeline_signatures_agree():
for name, sync_param in sync_params.items():
assert sync_param.kind == async_params[name].kind, name
assert sync_param.default == async_params[name].default, name


def test_get_timeline_sends_status_when_supplied():
client = StatewaveClient(retry=NO_RETRY)
mock_req = MagicMock(return_value=_resp(200, _TIMELINE_RESPONSE))
with patch.object(client._http, "request", mock_req):
client.get_timeline("subj-1", status="active")

assert mock_req.call_args.kwargs["params"]["status"] == "active"


def test_get_timeline_omits_status_by_default():
client = StatewaveClient(retry=NO_RETRY)
mock_req = MagicMock(return_value=_resp(200, _TIMELINE_RESPONSE))
with patch.object(client._http, "request", mock_req):
client.get_timeline("subj-1")

assert "status" not in mock_req.call_args.kwargs["params"]