fix: handle scheduled prompts on session deletion

This commit is contained in:
2026-06-11 08:26:33 -04:00
parent 4169e7fc28
commit 88a52d0e6d
2 changed files with 43 additions and 2 deletions
+7 -1
View File
@@ -423,7 +423,8 @@ class SessionService:
self, session_id: int, prompt: str, due_at: datetime
) -> ScheduledPrompt:
"""Create or replace the pending scheduled prompt for a session."""
if not prompt.strip():
prompt = prompt.strip()
if not prompt:
raise ServiceError("Prompt cannot be empty")
with self.factory() as db:
sess = db.get(Session, session_id)
@@ -504,6 +505,11 @@ class SessionService:
force,
)
scheduled = (
db.query(ScheduledPrompt).filter_by(session_id=session_id).one_or_none()
)
if scheduled is not None:
db.delete(scheduled)
db.delete(sess)
db.commit()
+36 -1
View File
@@ -100,7 +100,7 @@ def test_schedule_prompt_creates_pending_row(service, db):
sess = _seed_session(db)
due_at = datetime(2026, 6, 11, 12)
prompt = service.schedule_prompt(sess.id, "run the tests", due_at)
prompt = service.schedule_prompt(sess.id, " run the tests ", due_at)
assert prompt.session_id == sess.id
assert prompt.prompt == "run the tests"
@@ -704,6 +704,27 @@ async def test_sync_window_labels_covers_all_projects(factory, db, tmux, harness
assert labelled == {"hqt-1", "hqt-2"}
@pytest.mark.asyncio
async def test_sync_window_labels_includes_pending_scheduled_prompt(
factory, db, tmux, harnesses
):
"""sync_window_labels returns SessionInfo with pending scheduled prompt metadata."""
from hqt.tmux.runner import WindowInfo
service = SessionService(factory=factory, tmux=tmux, harnesses=harnesses)
result = await service.create_session(project_id=1, harness_name="claude-code")
due_at = datetime(2026, 6, 11, 12)
service.schedule_prompt(result.session.id, "run the tests", due_at)
tmux.poll_info.return_value = {"hqt-1": WindowInfo(alive=False, last_activity=0)}
tmux.set_window_label = AsyncMock()
infos = await service.sync_window_labels()
assert infos[0].scheduled_prompt is not None
assert infos[0].scheduled_prompt.prompt == "run the tests"
assert infos[0].scheduled_prompt.status == "pending"
# ---------------------------------------------------------------------------
# Item 3: real-configurator integration-seam test
# ---------------------------------------------------------------------------
@@ -1499,6 +1520,20 @@ async def test_delete_session_remove_worktree_false_skips_removal(
assert db.get(Session, sess_id) is None
@pytest.mark.asyncio
async def test_delete_session_deletes_scheduled_prompt(service, db):
sess = _seed_session(db)
sess_id = sess.id
due_at = datetime(2026, 6, 11, 12)
service.schedule_prompt(sess_id, "run the tests", due_at)
await service.delete_session(sess_id)
db.expire_all()
assert db.get(Session, sess_id) is None
assert db.query(ScheduledPrompt).filter_by(session_id=sess_id).one_or_none() is None
@pytest.mark.asyncio
async def test_worktree_state_for_plain_session_returns_none(
service, db, tmux, harnesses, fake_worktree