* Initial work on postgres state store
* Run fix
* Replace pre-written CHANGELOG with proper changeset
The CHANGELOG was manually written with a version entry. This repo uses
Changesets to manage versioning, so add a proper changeset file instead.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Add missing @vitest/coverage-v8 dev dependency
The vitest config specifies coverage provider "v8" but the package
was missing from devDependencies.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Drop drizzle-orm, use raw postgres queries
The adapter only needs 3 simple tables with basic CRUD. drizzle-orm is
a full ORM that adds significant dependency weight for no real benefit
here. The ensureSchema() method was already using raw queries. This
halves the dependency surface to just the postgres driver.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Add comprehensive unit tests for postgres state adapter
Test factory function edge cases (missing URL, env var fallbacks,
custom keyPrefix) and ensureConnected guard for all state operations.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Document expired row cleanup limitation for postgres adapter
Unlike Redis, Postgres doesn't auto-delete expired rows. Document the
opportunistic cleanup behavior and provide SQL for periodic cleanup.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Remove stale drizzle keyword from package.json
drizzle-orm was removed in a prior commit but the keyword remained.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix expiresAt parsing in acquireLock
The postgres library returns timestamptz columns as JavaScript Date
objects, not strings. Wrapping in new Date() was unnecessary overhead.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Document lock atomicity difference vs Redis adapters
The Postgres ON CONFLICT approach relies on row-level locking rather
than a single atomic SET NX PX like Redis. Note this for users who
need high-contention distributed locking.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Use crypto.randomUUID() for lock token generation
Math.random() is not cryptographically secure and has a higher
collision risk in distributed environments. crypto.randomUUID() is
available in Node 16+ and provides better uniqueness guarantees.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Delete CHANGELOG.md
* Add comprehensive unit tests for postgres state adapter
Mock the postgres module and SQL client to achieve 100% coverage
across statements, branches, functions, and lines. Tests cover
factory function, connection lifecycle, subscriptions, locking,
cache operations, and the owned-client disconnect path.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Add setIfNotExists method and merge with main
Implement the setIfNotExists method added to the StateAdapter
interface since this branch diverged. Uses INSERT ... ON CONFLICT
DO NOTHING with RETURNING to atomically check-and-set.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Add postgres to state docs navigation and memory adapter callout
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Migrate postgres state adapter from postgres to pg (node-postgres)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Rename state-postgres to state-pg and align version to 4.17.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Hayden Bleasel <hello@haydenbleasel.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* Add support for telegram bot
* Add support for action buttons in telegram
* Use markdown parse mode
* Add more tests
* Fix linting issues
* Fixes
* Fixes
* Don't reverse order messages for AI and always answer for telegram
* Add telegram integration test
* Update telegram.json