mirror of
https://github.com/turnstonelabs/turnstone.git
synced 2026-08-12 23:12:23 -06:00
0d3516d6e0
Combines the substantive bot.py fixes flagged in both review trails on PR #355. Discord parity items grouped here too since they're the same surface (slack/bot.py). From Copilot: - _notify_reply_routes was read on StreamEndEvent but never popped on the success path. Result: one notification reply pinned every later response for that ws_id to the notification thread until the bot restarted. Pop after read; combine the surrounding ifs (SIM102). - PlanReviewEvent embedded raw event.content inside a triple-backtick mrkdwn fence without escaping. A plan with ``` (very common — plans often quote code) would break the fence and let later content render as live markup, including unintended Slack mentions/links. Rewrite _sanitize_slack_preview to splice a zero-width space inside any ``` sequence (Slack stops recognizing it as a delimiter) instead of escaping every single backtick — keeps single-backtick code snippets readable while still protecting the fence. Apply to plan-review. - _send_approval_request joined unbounded tool_lines into one mrkdwn section, but Slack section.text caps at 3000 chars. Multi-tool batches with large previews silently failed chat_postMessage, leaving the user unable to approve/deny. Cap each preview to 600 chars under a 2700-char total budget; append "+N more" when truncated. From eous (parity with Discord): - Pass `client_type="chat"` from both `get_or_create_workstream` call sites (slash-command session + DM). Without it Slack-routed workstreams loaded the web-default prompt; the chat-specific system prompt now applies as it does for Discord. - Add `exc_info=True` to the eleven `log.debug(...)` exception handlers so underlying tracebacks are available when debug logging is on instead of being silently dropped. Level stays debug — these are benign-by-default sites (chat_update on a deleted message, etc.) so only the visibility changes. Typed-exception handlers (RemoteProtocolError, etc.) keep their bare debug log. - Module docstring on slack/__init__.py so pydoc / import errors have human-readable context. Tests: rewrite the sanitizer test to match the new (more permissive) single-backtick behaviour; add coverage for the triple-backtick neutralization + short-input passthrough; patch httpx.AsyncClient at all five TurnstoneSlackBot construction sites so each test doesn't leak an unclosed real client.