v0.2.0
Co-Authored-By: Claude Opus 4.8 (1M context) noreply@anthropic.com
Tests: tests/feedback-fixes.test.ts (6 new; full bun run check green)
DataDict-needs-type-not-interface constraint, and the new APIs
-
docs: getter↔dialogData flow, headless getter contract, the
backed by external state
-
feat: Select({ selected, selectedMark }) — auto-✓ for stateless selects
rendering the target window (back-compat with the bare ShowMode arg)
-
feat: switchTo(state, { data, mode }) — merge into dialogData before
-
feat: DialogManager.setData(patch) — merge dialog data + persist, no render
ctx.from.id no longer crash when re-rendered from background()
-
fix: headlessCtx synthesizes
from: { id: chatId }so getters reading
feat: harden background() renders and add data-navigation APIsAddresses production feedback on the background()/headless seam:
chore(release): v0.2.0Co-Authored-By: Claude Opus 4.8 (1M context) noreply@anthropic.com
Co-Authored-By: Claude Opus 4.8 (1M context) noreply@anthropic.com
Tests: answer-binding (stale + handled taps with a this-dependent answer).
and route the success-path spinner close through the same helper.
Now call it bound on ctx inside try/catch (catches sync throw + rejection),
bot's onError (surfaced as a prod crash on stale/denied taps and timeouts).
and .catch() only catches rejections, so the throw escaped past it into the
this.bot.api.answerCallbackQuery, so the detached call threw SYNCHRONOUSLY —
undefined. gramio's answer is a prototype alias delegating to
fix: bind answer in silentAnswer so detached call can't crash the botsilentAnswer detached the method (const a = ctx.answer; a()), so this was
Full Changelog: v0.1.0...v0.2.0