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
5 changes: 4 additions & 1 deletion libs/code/deepagents_code/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -8410,7 +8410,10 @@ async def _ensure_transcript_spacers(self, container: Container) -> None:

if not container.query(f"#{_MESSAGE_TOP_SPACER_ID}"):
top = Static("", id=_MESSAGE_TOP_SPACER_ID, classes=_MESSAGE_SPACER_CLASS)
first = container.children[0] if container.children else None
first = next(
(child for child in container.children if child.parent is container),
None,
)
if first is None:
await container.mount(top)
else:
Expand Down
21 changes: 21 additions & 0 deletions libs/code/tests/unit_tests/test_app.py
Original file line number Diff line number Diff line change
Expand Up @@ -14338,6 +14338,27 @@ async def test_chat_scroll_does_not_focus_on_click(self) -> None:
class TestMessageTimestampFooters:
"""Tests for toggleable message timestamp footers."""

async def test_spacer_mount_skips_detached_footer_anchor(self) -> None:
"""Spacer recreation tolerates a footer still listed during removal."""
from deepagents_code.app import _MESSAGE_TOP_SPACER_ID

app = DeepAgentsApp()
async with app.run_test() as pilot:
await pilot.pause()
messages = app.query_one("#messages", Container)
footer = Static("", id="stale-timestamp-footer")
message = AppMessage("new", id="new-message")
await messages.mount(footer, message)
footer._detach()

await app._ensure_transcript_spacers(messages)

top = app.query_one(f"#{_MESSAGE_TOP_SPACER_ID}", Static)
assert top.parent is messages
assert messages.children.index(top) < messages.children.index(message)
footer._parent = messages
await footer.remove()

@staticmethod
def _sync_tz() -> None:
if hasattr(time, "tzset"):
Expand Down