forked from Rockachopa/Timmy-time-dashboard
## What Manually integrated unique code from two stale PRs that were **not** superseded by merged work. ### PR #399 (kimi/issue-362) — WebSocket heartbeat ping - 15-second ping loop detects dead iPad/Safari connections - `_heartbeat()` coroutine launched as background task per WS client - `ping_task` properly cancelled on disconnect ### PR #408 (kimi/issue-322) — Conversation commitment tracking - Regex extraction of commitments from Timmy replies (`I'll` / `I will` / `Let me`) - `_record_commitments()` stores with dedup + cap at 10 - `_tick_commitments()` increments message counter per commitment - `_build_commitment_context()` surfaces overdue commitments as grounding context - Wired into `_bark_and_broadcast()` and `_generate_bark()` - Public API: `get_commitments()`, `close_commitment()`, `reset_commitments()` ### Tests 22 new tests covering both features: extraction, recording, dedup, caps, tick/context, integration, heartbeat ping, dead connection handling. --- This PR rescues unique code from stale PRs #399 and #408. The other two stale PRs (#402, #411) were already superseded by merged work and should be closed. Co-authored-by: Perplexity Computer <perplexity@tower.dev> Reviewed-on: http://localhost:3000/rockachopa/Timmy-time-dashboard/pulls/415 Co-authored-by: Perplexity Computer <perplexity@tower.local> Co-committed-by: Perplexity Computer <perplexity@tower.local>