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
34 changes: 28 additions & 6 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,33 @@
# Changelog

## 0.0.1a5 (2026-04-07)

Port fidelity release — 10 critical/high bugs fixed from systematic TS comparison.

### Critical fixes
- Slack: multi-workspace token now persists into async tasks (ContextVar fix)
- Discord: slash command deferred responses now resolve correctly
- Discord: file attachments no longer silently dropped
- WhatsApp: media downloads work again (auth header restored)
- Chat: `on_lock_conflict="force"` now works

### High fixes
- Discord: emoji normalized through resolver (reaction matching works)
- Teams: webhook options passed to reaction events
- Google Chat: subscription errors propagate to concurrent waiters
- Linear: fetch_thread metadata includes both key casings
- Streaming markdown `_remend` rewritten with proper delimiter tracking
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The _remend implementation in streaming_markdown.py (referenced here) has several issues that affect its fidelity:

  1. Inline Code Spans: It does not account for backticks (`). Markers like * or _ inside inline code are incorrectly counted for balancing, which leads to broken markdown when a stream contains literal markdown characters inside code spans.
  2. Code Fence Mismatch: It always appends \n\``to close unclosed code fences, even if the fence was opened with~~~`.
  3. Link Parentheses: It balances brackets [] for links but ignores the parentheses () for the URL part. A partially streamed link like [text](url will not be correctly closed.

The implementation should be updated to strip inline code content before counting markers and to track the specific fence character used.


### Other improvements
- CLAUDE.md agent guidance file
- Parser: spaced thematic breaks (`* * *`) and trailing `#` stripping
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The trailing # stripping logic in markdown_parser.py (line 455) is implemented using .rstrip("#"). This is overly aggressive and will incorrectly strip meaningful characters from headings that legitimately end with a hash character, such as C# or F#. According to the CommonMark specification, a closing sequence of # characters must be preceded by a space to be considered a closing sequence. The implementation should be updated to respect this requirement.

- BaseFormatConverter: card fallback text generation
- All PR review comments addressed

## 0.0.1a4 (2026-04-06)

Initial alpha release.
Security hardening + launch documentation.

## 0.0.1a3 (2026-04-06)

- Core SDK: Chat orchestrator, Thread, Channel, Message, Cards, Modals, Emoji
- 8 adapters: Slack, Discord, Teams, Telegram, WhatsApp, Google Chat, GitHub, Linear
- 3 state backends: Memory, Redis, PostgreSQL
- 2,477 tests passing, 79% coverage
- Security hardened: JWT verification, SSRF protection, timing-safe comparisons
Initial alpha release — 8 adapters, 3 state backends, 2,467 tests.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

Multi-platform async chat SDK for Python. Port of [Vercel Chat](https://github.com/vercel/chat).

> **Status: Alpha (0.0.1a4)** — API may change. Not yet tested in production.
> **Status: Alpha (0.0.1a5)** — API may change. Not yet tested in production.

## Why chat-sdk?

Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "chat-sdk"
version = "0.0.1a4"
version = "0.0.1a5"
description = "Multi-platform async chat SDK for Python — port of Vercel Chat"
readme = "README.md"
license = {text = "MIT"}
Expand Down
Loading