Files
agentik/storage-core/README.md
T
SubochevAV 8f616f359f
ci / JVM build + tests (pull_request) Failing after 54s
docs: per-module READMEs (run vs library) + root navigation hub
Every subproject now has README.md:
- 3 runnable modules (:standalone, :agentik-cli, :agentik-tui):
  quickstart, env table, parameters, known limits
- 11 library modules: what it is, which problem solves, how to
  wire it in, where versions live

Root README.md is the navigation hub (Quickstart, Modules table,
publish + CI/CD notes).

Also: ci.yml prunes the :memory-vector -x excludes now that
text-embedding-kmp artifacts are published to caffeine.

518 tests green.

Verified publish pipeline: :proto:publish to caffeine produces
pom.module + per-target klibs + sources for all 9 KMP targets.

🤖 Generated with [opencode]
2026-09-16 20:44:16 +03:00

2.6 KiB

:storage-core — контракт хранилища (KMP, jvm + native)

Что это

Интерфейсы persistence-уровня для :standalone:

  • MessageStore — append-only история сообщений по диалогу.
  • WorkingMemoryStore — rolling buffer текущего хода (AssistantMessage, ToolExchange, UserMessage, system-prompt) для fast-recovery при reconnect/relance.
  • ConversationStore — метаданные диалогов (id, title, model, timestamps).
  • ReflectionStore — LLM-reflections (свободная форма заметок хранителя).

Решает: позволяет запустить агента на Android-in-memory, на desktop-SQLite, или на production-SQLite, не переписывая логику. Контракт минимален и async-friendly.

Где используется

  • :storage-inmemory — для тестов и Android.
  • :storage-sqlite — прод (Desktop / server / однодесктопный Android-development).

Как подключить

kotlin {
    sourceSets.commonMain.dependencies {
        api("pw.binom.agentik:storage-core:0.1.0")
    }
}

Версии

gradle/libs.versions.toml → [versions] agentik-storage-core.

Что в API

interface MessageStore {
    suspend fun append(conversationId: String, message: Message): Unit
    suspend fun after(conversationId: String, instant: Instant, limit: Int = 100): List<Message>
}

interface WorkingMemoryStore {
    suspend fun save(conv: String, entry: WorkingMemoryEntry): Unit
    fun load(conv: String): Flow<WorkingMemoryEntry>   // cold flow
    suspend fun clear(conv: String): Unit
}

sealed interface WorkingMemoryEntry {
    val id: String
    val date: Instant
    class UserMessage(...) : WorkingMemoryEntry
    class AssistantMessage(...) : WorkingMemoryEntry
    class ToolExchange(val toolName: String, val toolArgsJson: String, val resultText: String, val wasCancelled: Boolean) : WorkingMemoryEntry
    class SystemPrompt(...) : WorkingMemoryEntry
}

Тесты

Контрактные тесты (общие для всех имплементаций) — в :storage-sqlite и :storage-inmemory.

Чего здесь НЕТ

  • Никакого HTTP / SSE.
  • Никакой конкретной БД. Backend'ы в :storage-*.

Текущий статус

Используется продакшеном. Контракт зафиксирован после interrupt-имплементации (см. INTERRUPT-DESIGN.md).