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]
78 lines
2.6 KiB
Markdown
78 lines
2.6 KiB
Markdown
# `: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
|
|
kotlin {
|
|
sourceSets.commonMain.dependencies {
|
|
api("pw.binom.agentik:storage-core:0.1.0")
|
|
}
|
|
}
|
|
```
|
|
|
|
## Версии
|
|
|
|
`gradle/libs.versions.toml` → `[versions] agentik-storage-core`.
|
|
|
|
## Что в API
|
|
|
|
```kotlin
|
|
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](../../docs/INTERRUPT-DESIGN.md)).
|