8f616f359f
ci / JVM build + tests (pull_request) Failing after 54s
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]
2.6 KiB
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).