Skip to content

Slack chart replies via Slack's current upload API; a failed command stops its typing indicator - #36

Merged
robdevops merged 3 commits into
mainfrom
claude/kind-newton-ad0z2q
Oct 14, 2026
Merged

robdevops merged 3 commits into
mainfrom
claude/kind-newton-ad0z2q

Conversation

@robdevops

Copy link
Copy Markdown
Owner

Slack charts

Slack retired files.upload, so Slack replies had been sent as text. Charts in Slack replies are now uploaded into the channel with Slack's current flow:

  1. files.getUploadURLExternal returns an upload URL.
  2. The chart's bytes are POSTed to that URL.
  3. files.completeUploadExternal shares the file in the channel, with the report as its message.
  • Failures: if any step fails (missing scope, bot not in the channel, Slack down), the reply goes out as text and the log names Slack's error. After a read timeout on the last step nothing more is sent, since the chart may have arrived.
  • Scheduled reports still reach Slack through the incoming webhook, which takes text only.
  • Telegram is unchanged; its upload code moved into telegram_photo().
  • README: asks for the chat:write, files:write and files:read scopes, and notes that scopes added to an installed app need Reinstall to Workspace.

Tested against simulated Slack responses only: Slack can't be reached from the dev sandbox.

Typing indicator

A command that raised after starting its typing indicator never stopped it, so "typing…" stayed up for up to 20 seconds and could come back after the error reply. process_request now stops the indicators its request started before reporting the failure. The test fixture fails any test that leaves an indicator running.

Tests

260 pass (.venv/bin/python -m unittest discover -s tests).

🤖 Generated with Claude Code

https://claude.ai/code/session_01JVEkZofdPjQ4jtXFKipeUX


Generated by Claude Code

…ror line goes out

A command that raised after starting its typing indicator never stopped it, so "typing…" kept showing for up to 20 seconds and
could come back after the error reply. Each request now keeps the indicators it starts; process_request stops them before
reporting the failure (and in any case when the request ends). The test fixture now fails any test that leaves an indicator running.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JVEkZofdPjQ4jtXFKipeUX
…oad API

Slack retired files.upload, so Slack replies had been sent as text. Charts in Slack replies are now uploaded into the channel the
way Slack takes files today: files.getUploadURLExternal for an upload URL, the bytes POSTed there, then files.completeUploadExternal
to share the file in the channel with the report as its message. If a step fails (a missing scope, not in the channel, Slack down)
the reply goes out as text and the log says why; after a read timeout on the last step nothing more is sent, since the chart may
have arrived. Scheduled reports still reach Slack through the incoming webhook, which takes text only. Telegram's sendPhoto is
unchanged, moved into telegram_photo(). The README asks for the chat:write, files:write and files:read scopes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JVEkZofdPjQ4jtXFKipeUX
@robdevops
robdevops enabled auto-merge October 14, 2026 06:16
@robdevops
robdevops merged commit c2c0486 into main Oct 14, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants