Adds a durable persistence layer for @copilotkit/bot, replacing the
in-memory-only ActionStore with a pluggable StateStore.
- StateStore interface (kv/list/lock/dedup/queue) with a shared
conformance suite; MemoryStore default plus @copilotkit/bot-store-redis
and @copilotkit/bot-store-postgres backends.
- createBot({ store }): typed per-thread state via Standard Schema,
action snapshots persisted through the store, per-conversation turn
lock (onLockConflict drop|force), and inbound-event dedup keyed on a
stable eventId. ActionStore is kept as a deprecated alias.
- Cross-platform transcripts (bot.transcripts + identity resolver) with
age-bounded retention (prune on append + filter on read), and
runAgent({ transcript: true }) to auto-inject history and capture the
reply.
- createBot({ components }) re-registers components so durable actions
re-fire after a restart; restart-durability demo in examples/slack.
- Dedup is marked seen only after the turn lock is acquired, so a turn
dropped on lock-conflict does not burn its eventId (no lost retries).
- Release lockstep: bot-store-redis/postgres version with bot + bot-ui.
- webhook: don't let GET / health shadow the verify handshake when WHATSAPP_PATH=/
- adapters: fail loud on a malformed PORT instead of binding NaN
- tests: cover the id-only senderContext branch, the 404-regression for the
health route, and the PORT guard
- docs: update README senderContext snippets to the 2-arg signature
- render: walk the real renderToIR tree — read text nodes' `value` and recurse
into nested containers, so card text and buttons inside <Actions> render
(previously produced zero payloads → silent no-send)
- render: value-only buttons (awaitChoice HITL confirm/cancel) now render,
encoding the value in the reply id so the engine's waiter resolves
- adapter: native WhatsApp typing indicator on every inbound (read receipt +
typing_indicator); supportsTyping = true
- ingress: resolve quote-replies — the webhook sends only the quoted message's
id, so look it up in history and prepend its text to the turn
- adapter: record every outbound message (text + cards) in history keyed by its
wamid, so quote-replies to the bot's own messages resolve too
- tests: +9 covering the renderToIR shape, value-only buttons, typing, quote
resolution, and outbound recording (71 total)