refactor(storage): split :storage-core into message-store-api + working-memory-api
ci / JVM build + tests (push) Failing after 2m5s

Разделяет монолитный :storage-core на 3 модуля с чёткими границами:

  :message-store-api   — MessageStore, ReflectionStore, EventStore, ConversationStore +
                          Content, Payload, MessageContext, Ids, MessageEvent
                          (audit log + event stream)
  :working-memory-api  — WorkingMemoryStore + WorkingMemoryEntry
                          (runtime context с compaction)
  :storage-bundle      — StorageBundle агрегатор, зависит от обоих
                          (только для server-side runtime)

Пакеты:
  pw.binom.agentik.storage.*  → УДАЛЕНО
  pw.binom.agentik.messageStore.*        — append-only API
  pw.binom.agentik.messageStore.events.* — EventStore + EventRecord
  pw.binom.agentik.workingMemory.*      — WM API
  pw.binom.agentik.storageBundle.*       — aggregator

Зачем:
  - Тонкий клиент может подтянуть ТОЛЬКО :message-store-api (~15KB, нет
    compaction-логики, нет MessageStore+WorkingMemoryStore cross-deps).
  - Android-agent в будущем подключит :message-store-api для audit log,
    серверный runtime — :storage-bundle со всем.
  - Компиляционные границы защищают от случайной зависимости от WM
    в read-only клиентах (раньше один :storage-core не давал такой
    гарантии).

Миграция:
  - Имплементации (:storage-inmemory, :storage-sqlite, :storage-ksqlite)
    обновили package + добавили deps на оба API модуля + :storage-bundle.
  - Тесты из :storage-core (PersistenceTest, SqliteStoresMigrationTest,
    TokenStatsTest) переехали в :standalone, получили testImplementation
    на оба API модуля и импорты новых типов.
  - 52 файла в :standalone, :agent-toolsets, :llm-tools, :server, :client,
    :agentik-cli обновили FQN.
  - :storage-core удалён.

Совместимость схем не меняется — все 5 impl'ов (3 backend × 5 store) хранят
данные в тех же таблицах, миграция между Sqlite и Ksqlite возможна через SQL dump.

Тесты:
  standalone         178 ✅
  agent-toolsets      36 ✅
  storage-inmemory    47 ✅
  storage-sqlite      17 ✅  (включая переехавшие persistence/* + tokenStats)
  storage-ksqlite     36 ✅
  ---
  Total: 314 tests, 0 failures
This commit is contained in:
2026-09-20 15:02:54 +03:00
parent dd7aec8df1
commit 2d9ad526bb
82 changed files with 341 additions and 403 deletions
+24
View File
@@ -0,0 +1,24 @@
plugins {
alias(libs.plugins.kotlin.multiplatform)
}
// Агрегатор всех 5 storage-интерфейсов (MessageStore + ReflectionStore +
// EventStore + ConversationStore + WorkingMemoryStore). Зависит от обоих API
// модулей. Нужен только server-side рантайму (`:standalone`, `:agentik-cli`,
// `:agent-toolsets`, будущий `:android-agent` core). Тонкие клиенты этот модуль
// НЕ подтягивают — они работают с одним только `:message-store-api`.
kotlin {
jvmToolchain(21)
jvm()
linuxX64()
mingwX64()
sourceSets {
commonMain.dependencies {
api(project(":message-store-api"))
api(project(":working-memory-api"))
}
}
}
@@ -0,0 +1,42 @@
package pw.binom.agentik.storageBundle
import pw.binom.agentik.messageStore.ConversationStore
import pw.binom.agentik.messageStore.MessageStore
import pw.binom.agentik.messageStore.ReflectionStore
import pw.binom.agentik.messageStore.events.EventStore
import pw.binom.agentik.workingMemory.WorkingMemoryStore
/**
* Агрегатор всех storage-интерфейсов для полного агент-рантайма.
*
* Зависит от **обоих** API модулей — `:message-store-api` и `:working-memory-api`.
* Тонкие клиенты, которым нужен только audit log, могут не подтягивать этот модуль
* и работать с [MessageStore] / [ReflectionStore] / [EventStore] / [ConversationStore]
* напрямую.
*
* **Реализации агрегата**:
* - [SqliteStorageBundle] — JVM-only, SQLDelight + SQLite. В `:storage-sqlite`.
* - [InMemoryStorageBundle] — KMP, Map-based. В `:storage-inmemory`.
*
* `SkillStore` НЕ входит — он в `:skills` (контент-файлы навыков), принимается
* отдельно в `ChatAgent`.
*
* AutoCloseable: один `close()` закрывает все store'ы; в реализациях без
* ресурсов (in-memory) — no-op.
*/
data class StorageBundle(
val conversationStore: ConversationStore,
val messageStore: MessageStore,
val workingMemoryStore: WorkingMemoryStore,
val reflectionStore: ReflectionStore,
val eventStore: EventStore? = null,
) : AutoCloseable {
override fun close() {
conversationStore.close()
messageStore.close()
workingMemoryStore.close()
reflectionStore.close()
eventStore?.close()
}
}