Files
agentik/storage-sqlite
subochev 0fdc12695e
ci / JVM build + tests (push) Failing after 1m57s
docs: per-module README + root navigation hub + CI/release workflows
- README.md в каждом подмодуле: для библиотек — описание проблемы,
  подключение через maven-central/caffeine, версии в gradle/libs.versions.toml.
  Для запускаемых модулей — команды запуска + переменные среды с дефолтами.
- Корневой README.md переписан как навигационный хаб: что это, где клиенты,
  где серверы, как собрать, как опубликовать.
- build.gradle.kts: per-module POM-description через единую карту в rootProject.extra
  (порядок важен — нужно ДО apply плагина KMP, поэтому beforeEvaluate в subprojects).
- .gitea/workflows/ci.yml (новый): build + jvmTest + shadowJar на PR/push main.
- .gitea/workflows/release.yml (обновлён): публикует библиотеки в caffeine
  Nexus + собирает 3 fatjar'а и крепит их к release как бинарные ассеты.
2026-09-16 16:24:03 +03:00
..

:storage-sqlite — pw.binom.agentik.storage.sqlite

SQLDelight-реализация всех 4 сторов из :storage-core поверх SQLite. JVM-only (SQLDelight пока не публикует KMP-драйверы за пределами JVM/Android).

Какую проблему решает

Прод-запуск :standalone должен переживать рестарт. In-memory не подходит — нужна реальная БД. SQLite выбран потому что:

  • Один файл (AGENTIK_DB_PATH) — легко бэкапить, переносить, инспектить.
  • WAL — запись не блокирует чтение; диалоги не фризят при compaction.
  • Без отдельного сервиса — в отличие от PostgreSQL/MySQL не нужно ничего поднимать рядом.

Схема

SQLDelight .sq-файлы в src/main/sqldelight/:

  • Conversation.sq — conversations (id, title, created_at, updated_at, is_temporal)
  • Message.sq — messages (id, conversation_id, role, content, working_memory_index, date)
  • WorkingMemory.sq — working_memory (id, conversation_id, entry_kind, payload_json, index, instant)
  • Reflection.sq — reflection (id, conversation_id, score, weak_points_json, created_at)

SqliteStores (фасад) собирает все 4 стора в StorageBundle поверх общего SQLite-driver. Каждый store — отдельный класс, с тред-безопасностью через Mutex на запись.

Подключение

plugins {
    kotlin("jvm")
    alias(libs.plugins.sqldelight)
}

dependencies {
    implementation("pw.binom.agentik:storage-sqlite:$version")
    // Транзитивно: :storage-core + sqldelight-runtime/coroutines + sqlite-driver
}

// Использование
val driver = JdbcSqliteDriver("jdbc:sqlite:agentik.db")
SqliteStores.Schema.migrate(driver)               // CREATE TABLE IF NOT EXISTS + ALTER
val bundle = SqliteStores.fromDriver(driver, clock = Clock.System)

:standalone инициализирует бэкенд автоматически по AGENTIK_DB_PATH.

Где смотреть версии

  • version из gradle.properties (version=0.1.0)
  • релизы: https://git.binom.pw/subochev/agentik/releases

Сборка

./gradlew :storage-sqlite:build

JVM-only. Тянет :storage-core + app.cash.sqldelight:runtime + app.cash.sqldelight:coroutines-extensions + app.cash.sqldelight:sqlite-driver.