remove :message-store-api and migrate functionality to :journal-api and :reflection-api
ci / JVM build + tests (push) Failing after 59s
ci / JVM build + tests (push) Failing after 59s
- Removed `:message-store-api` module and associated classes (ConversationStore, ReflectionStore, Ids, etc.). - Migrated reusable components to `:journal-api` (conversation-related) and `:reflection-api` (reflection-related). - Updated imports and module dependencies across all projects to reflect new structure. - Adjusted build scripts and tests for compatibility with the new APIs.
This commit is contained in:
@@ -21,7 +21,8 @@ kotlin {
|
|||||||
|
|
||||||
sourceSets {
|
sourceSets {
|
||||||
commonMain.dependencies {
|
commonMain.dependencies {
|
||||||
api(project(":message-store-api"))
|
api(project(":journal-api"))
|
||||||
|
api(project(":reflection-api"))
|
||||||
api(project(":context-api"))
|
api(project(":context-api"))
|
||||||
|
|
||||||
// litert-kmp: LiteTool интерфейс (sync describe/invoke)
|
// litert-kmp: LiteTool интерфейс (sync describe/invoke)
|
||||||
|
|||||||
@@ -25,7 +25,8 @@ kotlin {
|
|||||||
implementation(libs.kotlinx.serialization.json)
|
implementation(libs.kotlinx.serialization.json)
|
||||||
|
|
||||||
api(project(":context-api"))
|
api(project(":context-api"))
|
||||||
api(project(":message-store-api"))
|
api(project(":journal-api"))
|
||||||
|
api(project(":reflection-api"))
|
||||||
// :context-api ссылается на Content / MessageContext из
|
// :context-api ссылается на Content / MessageContext из
|
||||||
// :message-log-api (старый canonical). Транзитивно через api,
|
// :message-log-api (старый canonical). Транзитивно через api,
|
||||||
// но фиксируем явно чтобы тестовый код видел Content без
|
// но фиксируем явно чтобы тестовый код видел Content без
|
||||||
|
|||||||
+1
-1
@@ -4,7 +4,7 @@ import kotlinx.serialization.json.Json
|
|||||||
import pw.binom.agentik.context.ContextStore
|
import pw.binom.agentik.context.ContextStore
|
||||||
import pw.binom.agentik.context.WorkingMemoryEntry
|
import pw.binom.agentik.context.WorkingMemoryEntry
|
||||||
import pw.binom.agentik.context.WorkingMemoryRow
|
import pw.binom.agentik.context.WorkingMemoryRow
|
||||||
import pw.binom.agentik.messageStore.Ids
|
import pw.binom.agentik.journal.Ids
|
||||||
import pw.binom.db.ksqlite.SQLiteConnection
|
import pw.binom.db.ksqlite.SQLiteConnection
|
||||||
import pw.binom.db.ksqlite.SQLitePreparedStatement
|
import pw.binom.db.ksqlite.SQLitePreparedStatement
|
||||||
import kotlin.time.Clock
|
import kotlin.time.Clock
|
||||||
|
|||||||
@@ -19,7 +19,8 @@ kotlin {
|
|||||||
sourceSets {
|
sourceSets {
|
||||||
commonMain.dependencies {
|
commonMain.dependencies {
|
||||||
api(project(":memory-api"))
|
api(project(":memory-api"))
|
||||||
api(project(":message-store-api"))
|
api(project(":journal-api"))
|
||||||
|
api(project(":reflection-api"))
|
||||||
api(project(":context-api"))
|
api(project(":context-api"))
|
||||||
api(project(":skills"))
|
api(project(":skills"))
|
||||||
api(libs.litert.api)
|
api(libs.litert.api)
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import pw.binom.agentik.memory.MemoryStore
|
|||||||
import pw.binom.agentik.memory.MemoryStoreEvent
|
import pw.binom.agentik.memory.MemoryStoreEvent
|
||||||
import pw.binom.agentik.memory.NewMemoryNote
|
import pw.binom.agentik.memory.NewMemoryNote
|
||||||
import pw.binom.agentik.memory.ReviewedTurn
|
import pw.binom.agentik.memory.ReviewedTurn
|
||||||
import pw.binom.agentik.messageStore.Ids
|
import pw.binom.agentik.journal.Ids
|
||||||
import pw.binom.litert.LiteLlm
|
import pw.binom.litert.LiteLlm
|
||||||
import kotlin.time.Clock
|
import kotlin.time.Clock
|
||||||
import kotlin.time.Instant
|
import kotlin.time.Instant
|
||||||
|
|||||||
@@ -5,8 +5,8 @@ import kotlinx.coroutines.withContext
|
|||||||
import pw.binom.agentik.memory.ConversationTurn
|
import pw.binom.agentik.memory.ConversationTurn
|
||||||
import pw.binom.litert.LiteConversationConfig
|
import pw.binom.litert.LiteConversationConfig
|
||||||
import pw.binom.litert.LiteLlm
|
import pw.binom.litert.LiteLlm
|
||||||
import pw.binom.agentik.messageStore.Ids
|
import pw.binom.agentik.journal.Ids
|
||||||
import pw.binom.agentik.messageStore.Reflection
|
import pw.binom.agentik.reflection.Reflection
|
||||||
import kotlin.time.Clock
|
import kotlin.time.Clock
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -57,7 +57,7 @@ class LlmReflector(
|
|||||||
val parsed = ReflectionParser.parse(raw)
|
val parsed = ReflectionParser.parse(raw)
|
||||||
?: return@withContext null
|
?: return@withContext null
|
||||||
Reflection(
|
Reflection(
|
||||||
id = Ids.reflection(),
|
id = pw.binom.agentik.reflection.Ids.new(),
|
||||||
conversationId = null, // будет проставлен caller'ом ChatConversation
|
conversationId = null, // будет проставлен caller'ом ChatConversation
|
||||||
createdAt = clock.now(),
|
createdAt = clock.now(),
|
||||||
turnsAnalyzed = turns.size,
|
turnsAnalyzed = turns.size,
|
||||||
|
|||||||
@@ -1,39 +0,0 @@
|
|||||||
plugins {
|
|
||||||
alias(libs.plugins.kotlin.multiplatform)
|
|
||||||
alias(libs.plugins.kotlin.serialization)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Public API для append-only storage агента (audit log, replay-after-disconnect,
|
|
||||||
// conversation metadata). Этот модуль НЕ содержит working memory — он для
|
|
||||||
// тонких клиентов, которые хотят только события/сообщения без тяжёлой
|
|
||||||
// runtime-логики.
|
|
||||||
//
|
|
||||||
// Зависимости:
|
|
||||||
// - kotlinx.coroutines / serialization (KMP).
|
|
||||||
// - БЕЗ :storage-core — мы его полностью выпиливаем, интерфейсы переезжают сюда.
|
|
||||||
|
|
||||||
kotlin {
|
|
||||||
jvmToolchain(21)
|
|
||||||
|
|
||||||
jvm()
|
|
||||||
macosX64()
|
|
||||||
macosArm64()
|
|
||||||
iosX64()
|
|
||||||
iosArm64()
|
|
||||||
iosSimulatorArm64()
|
|
||||||
linuxX64()
|
|
||||||
linuxArm64()
|
|
||||||
mingwX64()
|
|
||||||
|
|
||||||
sourceSets {
|
|
||||||
commonMain.dependencies {
|
|
||||||
api(libs.kotlinx.coroutines.core)
|
|
||||||
api(libs.kotlinx.serialization.core)
|
|
||||||
api(libs.kotlinx.serialization.json)
|
|
||||||
}
|
|
||||||
commonTest.dependencies {
|
|
||||||
implementation(kotlin("test"))
|
|
||||||
implementation(libs.kotlinx.coroutines.test)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-14
@@ -1,14 +0,0 @@
|
|||||||
package pw.binom.agentik.messageStore
|
|
||||||
|
|
||||||
import kotlin.time.Instant
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Snapshot диалога. В таблице `conversation` хранится как есть.
|
|
||||||
*/
|
|
||||||
data class ConversationRecord(
|
|
||||||
val id: String,
|
|
||||||
val title: String?,
|
|
||||||
val isTemporal: Boolean,
|
|
||||||
val createdAt: Instant,
|
|
||||||
val updatedAt: Instant,
|
|
||||||
)
|
|
||||||
-27
@@ -1,27 +0,0 @@
|
|||||||
package pw.binom.agentik.messageStore
|
|
||||||
|
|
||||||
import kotlin.time.Instant
|
|
||||||
|
|
||||||
/**
|
|
||||||
* CRUD по таблице `conversation`.
|
|
||||||
*/
|
|
||||||
interface ConversationStore : AutoCloseable {
|
|
||||||
|
|
||||||
/** Создать или обновить snapshot диалога. */
|
|
||||||
suspend fun upsert(record: ConversationRecord)
|
|
||||||
|
|
||||||
/** Диалог по id, или `null`. */
|
|
||||||
suspend fun get(id: String): ConversationRecord?
|
|
||||||
|
|
||||||
/** Удалить диалог (вместе с его сообщениями и working memory). */
|
|
||||||
suspend fun delete(id: String): Boolean
|
|
||||||
|
|
||||||
/** Список диалогов, отсортированный по `updatedAt` DESC. */
|
|
||||||
suspend fun list(offset: Int, limit: Int): List<ConversationRecord>
|
|
||||||
|
|
||||||
/** Переименовать диалог; `null` для сброса заголовка. Возвращает новый `updatedAt` или `null`, если не найден. */
|
|
||||||
suspend fun rename(id: String, title: String?): Instant?
|
|
||||||
|
|
||||||
/** Обновить `updatedAt` диалога (например, после отправки сообщения). */
|
|
||||||
suspend fun touch(id: String, now: Instant)
|
|
||||||
}
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
package pw.binom.agentik.messageStore
|
|
||||||
|
|
||||||
import kotlin.uuid.Uuid
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Генератор id. Использует `kotlin.uuid.Uuid` из stdlib (KMP: jvm + native),
|
|
||||||
* чтобы не зависеть от `java.util.UUID` и подготовить код к linuxX64-сборке.
|
|
||||||
*
|
|
||||||
* Сохраняет формат `<prefix>-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx` —
|
|
||||||
* `:server` его парсит как opaque string, без знания внутренней структуры.
|
|
||||||
*/
|
|
||||||
object Ids {
|
|
||||||
fun new(prefix: String): String = "$prefix-${Uuid.random()}"
|
|
||||||
fun reflection(): String = new("refl")
|
|
||||||
}
|
|
||||||
-51
@@ -1,51 +0,0 @@
|
|||||||
package pw.binom.agentik.messageStore
|
|
||||||
|
|
||||||
import kotlinx.coroutines.flow.Flow
|
|
||||||
import kotlin.time.Instant
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Self-reflection запись — что агент "думает" о качестве своих последних ходов.
|
|
||||||
*
|
|
||||||
* - [score]: 1..5 (самооценка качества)
|
|
||||||
* - [weakSpots]: конкретные слабые места ("медленно ищу в Y", "путаю A и B")
|
|
||||||
* - [summary]: свободный комментарий в markdown (что заметил, что улучшить)
|
|
||||||
*
|
|
||||||
* Источник: one-shot LLM-размышление после каждых N ходов (см. AGENTIK_REFLECTION_INTERVAL).
|
|
||||||
* Используется в `ChatAgent.buildSystemPrompt` как "слабые места за последнее время".
|
|
||||||
*/
|
|
||||||
data class Reflection(
|
|
||||||
val id: String,
|
|
||||||
val conversationId: String?,
|
|
||||||
val createdAt: Instant,
|
|
||||||
val turnsAnalyzed: Int,
|
|
||||||
val score: Int,
|
|
||||||
val summary: String,
|
|
||||||
val weakSpots: List<String>,
|
|
||||||
)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Хранилище рефлексий. Backed by SQLDelight `reflection` таблицу (impl в
|
|
||||||
* `:storage-sqlite`) или in-memory (impl в `:storage-inmemory`).
|
|
||||||
*
|
|
||||||
* Рефлексии — append-only: старые записи удаляются [deleteOlderThan] (cleanup)
|
|
||||||
* или архивируются через [Curator]-подобный процесс, но не редактируются.
|
|
||||||
*/
|
|
||||||
interface ReflectionStore : AutoCloseable {
|
|
||||||
suspend fun insert(reflection: Reflection)
|
|
||||||
suspend fun get(id: String): Reflection?
|
|
||||||
/** Самые свежие рефлексии (по всему агенту). */
|
|
||||||
suspend fun listRecent(limit: Int = 10): List<Reflection>
|
|
||||||
/** Рефлексии для конкретного диалога. */
|
|
||||||
suspend fun listForConversation(conversationId: String, limit: Int = 10): List<Reflection>
|
|
||||||
suspend fun deleteOlderThan(cutoff: Instant)
|
|
||||||
suspend fun count(): Int
|
|
||||||
|
|
||||||
/** Стрим новых рефлексий для подписчиков (для UI в будущем). */
|
|
||||||
fun events(): Flow<ReflectionEvent> = kotlinx.coroutines.flow.emptyFlow()
|
|
||||||
|
|
||||||
override fun close()
|
|
||||||
}
|
|
||||||
|
|
||||||
sealed interface ReflectionEvent {
|
|
||||||
data class Created(val reflection: Reflection) : ReflectionEvent
|
|
||||||
}
|
|
||||||
+6
-3
@@ -64,10 +64,13 @@ include(":memory-vector")
|
|||||||
// Интерфейсы хранилища и разговорной истории: MessageStore / WorkingMemoryStore /
|
// Интерфейсы хранилища и разговорной истории: MessageStore / WorkingMemoryStore /
|
||||||
// ConversationStore / ReflectionStore + StorageBundle агрегатор. Реализации —
|
// ConversationStore / ReflectionStore + StorageBundle агрегатор. Реализации —
|
||||||
// в :storage-inmemory / :storage-sqlite / :storage-android (последний deferred).
|
// в :storage-inmemory / :storage-sqlite / :storage-android (последний deferred).
|
||||||
// In-memory реализация store'ов из :message-store-api и :working-memory-api. KMP,
|
// In-memory реализация store'ов из :journal-api и :context-api. KMP,
|
||||||
// IO-зависимостей. Используется в тестах (быстрый setup, без JDBC) и будет
|
// IO-зависимостей. Используется в тестах (быстрый setup, без JDBC) и будет
|
||||||
// использоваться в Android-сборке (JVector/SQLite не подходят для ART out-of-box).
|
// использоваться в Android-сборке (JVector/SQLite не подходят для ART out-of-box).
|
||||||
include(":message-store-api")
|
//include(":message-store-api") — перенесено в :journal-api (ConversationRecord/ConversationStore/Ids)
|
||||||
|
// и :reflection-api (Reflection/ReflectionStore/ReflectionEvent/Ids)
|
||||||
|
// Модуль удалён с диска.
|
||||||
|
include(":reflection-api")
|
||||||
//include(":message-log-api")
|
//include(":message-log-api")
|
||||||
//include(":message-log-ksqlite")
|
//include(":message-log-ksqlite")
|
||||||
// Новые API-модули трёх сущностей (canonical имена):
|
// Новые API-модули трёх сущностей (canonical имена):
|
||||||
@@ -90,7 +93,7 @@ include(":outbox-inmemory")
|
|||||||
//include(":event-store-in-memory")
|
//include(":event-store-in-memory")
|
||||||
//include(":working-memory-api")
|
//include(":working-memory-api")
|
||||||
include(":storage-inmemory")
|
include(":storage-inmemory")
|
||||||
// SQLDelight-реализация store'ов из :message-store-api и :working-memory-api. JVM-only
|
// SQLDelight-реализация store'ов из :journal-api и :context-api. JVM-only
|
||||||
// KMP-реализация EventStore поверх ksqlite (https://github.com/caffeine-mgn/ksqlite).
|
// KMP-реализация EventStore поверх ksqlite (https://github.com/caffeine-mgn/ksqlite).
|
||||||
// Цель: проверить что pure-Kotlin SQLite с sqlite-vec заменяет SQLDelight+JVector
|
// Цель: проверить что pure-Kotlin SQLite с sqlite-vec заменяет SQLDelight+JVector
|
||||||
// на KMP-таргетах (JVM + linuxX64 + mingwX64). Apple targets auto-disabled на
|
// на KMP-таргетах (JVM + linuxX64 + mingwX64). Apple targets auto-disabled на
|
||||||
|
|||||||
@@ -41,10 +41,10 @@ kotlin {
|
|||||||
commonMain.dependencies {
|
commonMain.dependencies {
|
||||||
implementation(project(":proto"))
|
implementation(project(":proto"))
|
||||||
implementation(project(":server"))
|
implementation(project(":server"))
|
||||||
implementation(project(":message-store-api"))
|
|
||||||
implementation(project(":journal-api"))
|
implementation(project(":journal-api"))
|
||||||
implementation(project(":outbox-api"))
|
implementation(project(":outbox-api"))
|
||||||
implementation(project(":context-api"))
|
implementation(project(":context-api"))
|
||||||
|
implementation(project(":reflection-api"))
|
||||||
|
|
||||||
// Commons
|
// Commons
|
||||||
implementation(libs.kotlinx.coroutines.core)
|
implementation(libs.kotlinx.coroutines.core)
|
||||||
@@ -67,10 +67,10 @@ kotlin {
|
|||||||
if (!skipVectorMemory) {
|
if (!skipVectorMemory) {
|
||||||
implementation(project(":memory-vector"))
|
implementation(project(":memory-vector"))
|
||||||
}
|
}
|
||||||
implementation(project(":message-store-api"))
|
|
||||||
implementation(project(":journal-api"))
|
implementation(project(":journal-api"))
|
||||||
implementation(project(":outbox-api"))
|
implementation(project(":outbox-api"))
|
||||||
implementation(project(":context-api"))
|
implementation(project(":context-api"))
|
||||||
|
implementation(project(":reflection-api"))
|
||||||
implementation(project(":storage-ksqlite"))
|
implementation(project(":storage-ksqlite"))
|
||||||
|
|
||||||
// Новый единый канал событий агента — заменил старые
|
// Новый единый канал событий агента — заменил старые
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import io.ktor.server.routing.post
|
|||||||
import kotlinx.serialization.json.buildJsonObject
|
import kotlinx.serialization.json.buildJsonObject
|
||||||
import kotlinx.serialization.json.put
|
import kotlinx.serialization.json.put
|
||||||
import pw.binom.agentik.memory.ConversationTurn
|
import pw.binom.agentik.memory.ConversationTurn
|
||||||
import pw.binom.agentik.messageStore.ReflectionStore
|
import pw.binom.agentik.reflection.ReflectionStore
|
||||||
import pw.binom.agentik.proto.Agent
|
import pw.binom.agentik.proto.Agent
|
||||||
import pw.binom.agentik.standalone.agent.ChatConversation
|
import pw.binom.agentik.standalone.agent.ChatConversation
|
||||||
import pw.binom.agentik.llm.tools.LlmReflector
|
import pw.binom.agentik.llm.tools.LlmReflector
|
||||||
|
|||||||
@@ -317,7 +317,7 @@ private fun runServer() {
|
|||||||
// и interval > 0. Загружаем top-K последних рефлексий из SQLite в system prompt.
|
// и interval > 0. Загружаем top-K последних рефлексий из SQLite в system prompt.
|
||||||
val reflector: pw.binom.agentik.llm.tools.LlmReflector? =
|
val reflector: pw.binom.agentik.llm.tools.LlmReflector? =
|
||||||
if (config.reflection.interval > 0) LlmReflector(llm = llm) else null
|
if (config.reflection.interval > 0) LlmReflector(llm = llm) else null
|
||||||
val recentReflections: List<pw.binom.agentik.messageStore.Reflection> =
|
val recentReflections: List<pw.binom.agentik.reflection.Reflection> =
|
||||||
if (config.reflection.topK > 0) kotlinx.coroutines.runBlocking {
|
if (config.reflection.topK > 0) kotlinx.coroutines.runBlocking {
|
||||||
sqliteStores.reflections.listRecent(config.reflection.topK)
|
sqliteStores.reflections.listRecent(config.reflection.topK)
|
||||||
} else emptyList()
|
} else emptyList()
|
||||||
|
|||||||
+1
-1
@@ -13,7 +13,7 @@ import pw.binom.agentik.memory.MemoryReviewer
|
|||||||
import pw.binom.agentik.memory.MemoryStore
|
import pw.binom.agentik.memory.MemoryStore
|
||||||
import pw.binom.agentik.skills.SkillStore
|
import pw.binom.agentik.skills.SkillStore
|
||||||
import pw.binom.agentik.journal.Content
|
import pw.binom.agentik.journal.Content
|
||||||
import pw.binom.agentik.messageStore.ReflectionStore
|
import pw.binom.agentik.reflection.ReflectionStore
|
||||||
import pw.binom.agentik.context.WorkingMemoryEntry
|
import pw.binom.agentik.context.WorkingMemoryEntry
|
||||||
import pw.binom.agentik.context.ContextStore
|
import pw.binom.agentik.context.ContextStore
|
||||||
import pw.binom.agentik.llm.tools.LlmReflector
|
import pw.binom.agentik.llm.tools.LlmReflector
|
||||||
|
|||||||
@@ -27,11 +27,11 @@ import pw.binom.agentik.skills.SkillCatalog
|
|||||||
import pw.binom.agentik.skills.renderSystemPromptSection
|
import pw.binom.agentik.skills.renderSystemPromptSection
|
||||||
import pw.binom.agentik.standalone.agent.memory.MemoryToolsFactory
|
import pw.binom.agentik.standalone.agent.memory.MemoryToolsFactory
|
||||||
import pw.binom.agentik.standalone.llm.LlmConfig
|
import pw.binom.agentik.standalone.llm.LlmConfig
|
||||||
import pw.binom.agentik.messageStore.ConversationRecord
|
import pw.binom.agentik.journal.ConversationRecord
|
||||||
import pw.binom.agentik.messageStore.ConversationStore
|
import pw.binom.agentik.journal.ConversationStore
|
||||||
import pw.binom.agentik.messageStore.Ids
|
import pw.binom.agentik.journal.Ids
|
||||||
import pw.binom.agentik.messageStore.Reflection
|
import pw.binom.agentik.reflection.Reflection
|
||||||
import pw.binom.agentik.messageStore.ReflectionStore
|
import pw.binom.agentik.reflection.ReflectionStore
|
||||||
import pw.binom.agentik.journal.MutableJournalStore
|
import pw.binom.agentik.journal.MutableJournalStore
|
||||||
import pw.binom.agentik.context.ContextStore
|
import pw.binom.agentik.context.ContextStore
|
||||||
import pw.binom.agentik.toolsets.DisableToolsetTool
|
import pw.binom.agentik.toolsets.DisableToolsetTool
|
||||||
@@ -250,7 +250,7 @@ class ChatAgent(
|
|||||||
|
|
||||||
override fun createConversation(temp: Boolean): ProtoConversation {
|
override fun createConversation(temp: Boolean): ProtoConversation {
|
||||||
val now = now()
|
val now = now()
|
||||||
val id = pw.binom.agentik.messageStore.Ids.new("conv")
|
val id = pw.binom.agentik.journal.Ids.new("conv")
|
||||||
val rec = ConversationRecord(
|
val rec = ConversationRecord(
|
||||||
id = id,
|
id = id,
|
||||||
title = null,
|
title = null,
|
||||||
|
|||||||
@@ -25,13 +25,13 @@ import pw.binom.agentik.memory.MemoryStore
|
|||||||
import pw.binom.agentik.proto.Content as ProtoContent
|
import pw.binom.agentik.proto.Content as ProtoContent
|
||||||
import pw.binom.agentik.proto.Conversation as ProtoConversation
|
import pw.binom.agentik.proto.Conversation as ProtoConversation
|
||||||
import pw.binom.agentik.outbox.Event as ProtoEvent
|
import pw.binom.agentik.outbox.Event as ProtoEvent
|
||||||
import pw.binom.agentik.messageStore.ReflectionStore
|
import pw.binom.agentik.reflection.ReflectionStore
|
||||||
import pw.binom.agentik.proto.Message as ProtoMessage
|
import pw.binom.agentik.proto.Message as ProtoMessage
|
||||||
import pw.binom.agentik.proto.MessageContext as ProtoMessageContext
|
import pw.binom.agentik.proto.MessageContext as ProtoMessageContext
|
||||||
import pw.binom.agentik.skills.SkillStore
|
import pw.binom.agentik.skills.SkillStore
|
||||||
import pw.binom.agentik.journal.Content
|
import pw.binom.agentik.journal.Content
|
||||||
import pw.binom.agentik.messageStore.ConversationRecord
|
import pw.binom.agentik.journal.ConversationRecord
|
||||||
import pw.binom.agentik.messageStore.ConversationStore
|
import pw.binom.agentik.journal.ConversationStore
|
||||||
import pw.binom.agentik.journal.MessageContext
|
import pw.binom.agentik.journal.MessageContext
|
||||||
import pw.binom.agentik.journal.MessageOrigin
|
import pw.binom.agentik.journal.MessageOrigin
|
||||||
import pw.binom.agentik.journal.MessageRecord
|
import pw.binom.agentik.journal.MessageRecord
|
||||||
@@ -482,7 +482,7 @@ class ConversationLoop(
|
|||||||
private fun now(): Instant =
|
private fun now(): Instant =
|
||||||
Instant.fromEpochMilliseconds(System.currentTimeMillis())
|
Instant.fromEpochMilliseconds(System.currentTimeMillis())
|
||||||
|
|
||||||
private fun newId(prefix: String): String = pw.binom.agentik.messageStore.Ids.new(prefix)
|
private fun newId(prefix: String): String = pw.binom.agentik.journal.Ids.new(prefix)
|
||||||
|
|
||||||
private fun encodeArgsJson(arguments: Map<String, Any?>): String {
|
private fun encodeArgsJson(arguments: Map<String, Any?>): String {
|
||||||
val el = JsonElement.serializer()
|
val el = JsonElement.serializer()
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
package pw.binom.agentik.standalone.agent
|
package pw.binom.agentik.standalone.agent
|
||||||
|
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import pw.binom.agentik.messageStore.ConversationRecord
|
import pw.binom.agentik.journal.ConversationRecord
|
||||||
import pw.binom.litert.LiteConversation
|
import pw.binom.litert.LiteConversation
|
||||||
import java.util.concurrent.atomic.AtomicReference
|
import java.util.concurrent.atomic.AtomicReference
|
||||||
import pw.binom.agentik.toolsets.NamedTool
|
import pw.binom.agentik.toolsets.NamedTool
|
||||||
|
|||||||
+1
-1
@@ -5,7 +5,7 @@ import kotlin.test.assertFalse
|
|||||||
import kotlin.test.assertTrue
|
import kotlin.test.assertTrue
|
||||||
import kotlin.time.Instant
|
import kotlin.time.Instant
|
||||||
import pw.binom.agentik.skills.SkillCatalog
|
import pw.binom.agentik.skills.SkillCatalog
|
||||||
import pw.binom.agentik.messageStore.Reflection
|
import pw.binom.agentik.reflection.Reflection
|
||||||
|
|
||||||
class ChatAgentReflectionTest {
|
class ChatAgentReflectionTest {
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
package pw.binom.agentik.standalone.persistence
|
package pw.binom.agentik.standalone.persistence
|
||||||
import pw.binom.agentik.journal.MessageContext
|
import pw.binom.agentik.journal.MessageContext
|
||||||
import pw.binom.agentik.journal.MessageOrigin
|
import pw.binom.agentik.journal.MessageOrigin
|
||||||
import pw.binom.agentik.messageStore.ConversationRecord
|
import pw.binom.agentik.journal.ConversationRecord
|
||||||
import pw.binom.agentik.journal.MessageRecord
|
import pw.binom.agentik.journal.MessageRecord
|
||||||
import pw.binom.agentik.journal.Content
|
import pw.binom.agentik.journal.Content
|
||||||
import pw.binom.agentik.context.WorkingMemoryEntry
|
import pw.binom.agentik.context.WorkingMemoryEntry
|
||||||
|
|||||||
@@ -20,8 +20,8 @@ kotlin {
|
|||||||
|
|
||||||
sourceSets {
|
sourceSets {
|
||||||
commonMain.dependencies {
|
commonMain.dependencies {
|
||||||
api(project(":message-store-api"))
|
|
||||||
api(project(":journal-api"))
|
api(project(":journal-api"))
|
||||||
|
api(project(":reflection-api"))
|
||||||
api(project(":context-api"))
|
api(project(":context-api"))
|
||||||
}
|
}
|
||||||
commonTest.dependencies {
|
commonTest.dependencies {
|
||||||
|
|||||||
+2
-2
@@ -3,8 +3,8 @@ package pw.binom.agentik.storage.inmemory
|
|||||||
import kotlinx.coroutines.sync.Mutex
|
import kotlinx.coroutines.sync.Mutex
|
||||||
import kotlinx.coroutines.sync.withLock
|
import kotlinx.coroutines.sync.withLock
|
||||||
import kotlin.time.Clock
|
import kotlin.time.Clock
|
||||||
import pw.binom.agentik.messageStore.ConversationRecord
|
import pw.binom.agentik.journal.ConversationRecord
|
||||||
import pw.binom.agentik.messageStore.ConversationStore
|
import pw.binom.agentik.journal.ConversationStore
|
||||||
import kotlin.time.Instant
|
import kotlin.time.Instant
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
+3
-3
@@ -5,9 +5,9 @@ import kotlinx.coroutines.flow.MutableSharedFlow
|
|||||||
import kotlinx.coroutines.flow.asSharedFlow
|
import kotlinx.coroutines.flow.asSharedFlow
|
||||||
import kotlinx.coroutines.sync.Mutex
|
import kotlinx.coroutines.sync.Mutex
|
||||||
import kotlinx.coroutines.sync.withLock
|
import kotlinx.coroutines.sync.withLock
|
||||||
import pw.binom.agentik.messageStore.Reflection
|
import pw.binom.agentik.reflection.Reflection
|
||||||
import pw.binom.agentik.messageStore.ReflectionEvent
|
import pw.binom.agentik.reflection.ReflectionEvent
|
||||||
import pw.binom.agentik.messageStore.ReflectionStore
|
import pw.binom.agentik.reflection.ReflectionStore
|
||||||
import kotlin.time.Instant
|
import kotlin.time.Instant
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
+2
-2
@@ -2,8 +2,8 @@ package pw.binom.agentik.storage.inmemory
|
|||||||
|
|
||||||
import pw.binom.agentik.context.ContextStore
|
import pw.binom.agentik.context.ContextStore
|
||||||
import pw.binom.agentik.journal.MutableJournalStore
|
import pw.binom.agentik.journal.MutableJournalStore
|
||||||
import pw.binom.agentik.messageStore.ConversationStore
|
import pw.binom.agentik.journal.ConversationStore
|
||||||
import pw.binom.agentik.messageStore.ReflectionStore
|
import pw.binom.agentik.reflection.ReflectionStore
|
||||||
import kotlin.time.Clock
|
import kotlin.time.Clock
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
+1
-1
@@ -2,7 +2,7 @@ package pw.binom.agentik.storage.inmemory
|
|||||||
|
|
||||||
import kotlinx.coroutines.sync.Mutex
|
import kotlinx.coroutines.sync.Mutex
|
||||||
import kotlinx.coroutines.sync.withLock
|
import kotlinx.coroutines.sync.withLock
|
||||||
import pw.binom.agentik.messageStore.Ids
|
import pw.binom.agentik.journal.Ids
|
||||||
import pw.binom.agentik.context.WorkingMemoryEntry
|
import pw.binom.agentik.context.WorkingMemoryEntry
|
||||||
import pw.binom.agentik.context.WorkingMemoryRow
|
import pw.binom.agentik.context.WorkingMemoryRow
|
||||||
import pw.binom.agentik.context.ContextStore
|
import pw.binom.agentik.context.ContextStore
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
package pw.binom.agentik.storage.inmemory
|
package pw.binom.agentik.storage.inmemory
|
||||||
|
|
||||||
import pw.binom.agentik.messageStore.ConversationRecord
|
import pw.binom.agentik.journal.ConversationRecord
|
||||||
import kotlin.test.Test
|
import kotlin.test.Test
|
||||||
import kotlin.test.assertEquals
|
import kotlin.test.assertEquals
|
||||||
import kotlin.test.assertNotNull
|
import kotlin.test.assertNotNull
|
||||||
|
|||||||
+2
-2
@@ -1,7 +1,7 @@
|
|||||||
package pw.binom.agentik.storage.inmemory
|
package pw.binom.agentik.storage.inmemory
|
||||||
|
|
||||||
import pw.binom.agentik.messageStore.Reflection
|
import pw.binom.agentik.reflection.Reflection
|
||||||
import pw.binom.agentik.messageStore.ReflectionEvent
|
import pw.binom.agentik.reflection.ReflectionEvent
|
||||||
import kotlin.test.Test
|
import kotlin.test.Test
|
||||||
import kotlin.test.assertEquals
|
import kotlin.test.assertEquals
|
||||||
import kotlin.test.assertNotNull
|
import kotlin.test.assertNotNull
|
||||||
|
|||||||
@@ -35,8 +35,8 @@ kotlin {
|
|||||||
implementation("pw.binom.db:ksqlite:0.1.1-SNAPSHOT")
|
implementation("pw.binom.db:ksqlite:0.1.1-SNAPSHOT")
|
||||||
implementation(libs.kotlinx.serialization.json)
|
implementation(libs.kotlinx.serialization.json)
|
||||||
|
|
||||||
api(project(":message-store-api"))
|
|
||||||
api(project(":journal-api"))
|
api(project(":journal-api"))
|
||||||
|
api(project(":reflection-api"))
|
||||||
api(project(":context-api"))
|
api(project(":context-api"))
|
||||||
}
|
}
|
||||||
commonTest.dependencies {
|
commonTest.dependencies {
|
||||||
|
|||||||
+2
-2
@@ -2,8 +2,8 @@ package pw.binom.agentik.storage.ksqlite
|
|||||||
|
|
||||||
import kotlin.time.Clock
|
import kotlin.time.Clock
|
||||||
import kotlin.time.Instant
|
import kotlin.time.Instant
|
||||||
import pw.binom.agentik.messageStore.ConversationRecord
|
import pw.binom.agentik.journal.ConversationRecord
|
||||||
import pw.binom.agentik.messageStore.ConversationStore
|
import pw.binom.agentik.journal.ConversationStore
|
||||||
import pw.binom.db.ksqlite.SQLiteConnection
|
import pw.binom.db.ksqlite.SQLiteConnection
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.sync.Mutex
|
import kotlinx.coroutines.sync.Mutex
|
||||||
|
|||||||
+3
-3
@@ -1,8 +1,8 @@
|
|||||||
package pw.binom.agentik.storage.ksqlite
|
package pw.binom.agentik.storage.ksqlite
|
||||||
|
|
||||||
import pw.binom.agentik.messageStore.Reflection
|
import pw.binom.agentik.reflection.Reflection
|
||||||
import pw.binom.agentik.messageStore.ReflectionEvent
|
import pw.binom.agentik.reflection.ReflectionEvent
|
||||||
import pw.binom.agentik.messageStore.ReflectionStore
|
import pw.binom.agentik.reflection.ReflectionStore
|
||||||
import pw.binom.db.ksqlite.SQLiteConnection
|
import pw.binom.db.ksqlite.SQLiteConnection
|
||||||
import pw.binom.db.ksqlite.SQLitePreparedStatement
|
import pw.binom.db.ksqlite.SQLitePreparedStatement
|
||||||
import pw.binom.db.ksqlite.SQLiteResultSet
|
import pw.binom.db.ksqlite.SQLiteResultSet
|
||||||
|
|||||||
+2
-2
@@ -2,8 +2,8 @@ package pw.binom.agentik.storage.ksqlite
|
|||||||
|
|
||||||
import pw.binom.agentik.context.ContextStore
|
import pw.binom.agentik.context.ContextStore
|
||||||
import pw.binom.agentik.journal.MutableJournalStore
|
import pw.binom.agentik.journal.MutableJournalStore
|
||||||
import pw.binom.agentik.messageStore.ConversationStore
|
import pw.binom.agentik.journal.ConversationStore
|
||||||
import pw.binom.agentik.messageStore.ReflectionStore
|
import pw.binom.agentik.reflection.ReflectionStore
|
||||||
import pw.binom.db.ksqlite.SQLiteConnection
|
import pw.binom.db.ksqlite.SQLiteConnection
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
+1
-1
@@ -4,7 +4,7 @@ import kotlinx.serialization.json.Json
|
|||||||
import pw.binom.agentik.context.WorkingMemoryEntry
|
import pw.binom.agentik.context.WorkingMemoryEntry
|
||||||
import pw.binom.agentik.context.WorkingMemoryRow
|
import pw.binom.agentik.context.WorkingMemoryRow
|
||||||
import pw.binom.agentik.context.ContextStore
|
import pw.binom.agentik.context.ContextStore
|
||||||
import pw.binom.agentik.messageStore.Ids
|
import pw.binom.agentik.journal.Ids
|
||||||
import pw.binom.db.ksqlite.SQLiteConnection
|
import pw.binom.db.ksqlite.SQLiteConnection
|
||||||
import pw.binom.db.ksqlite.SQLitePreparedStatement
|
import pw.binom.db.ksqlite.SQLitePreparedStatement
|
||||||
import kotlin.time.Clock
|
import kotlin.time.Clock
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
package pw.binom.agentik.storage.ksqlite
|
package pw.binom.agentik.storage.ksqlite
|
||||||
|
|
||||||
import kotlinx.coroutines.test.runTest
|
import kotlinx.coroutines.test.runTest
|
||||||
import pw.binom.agentik.messageStore.ConversationRecord
|
import pw.binom.agentik.journal.ConversationRecord
|
||||||
import kotlin.test.AfterTest
|
import kotlin.test.AfterTest
|
||||||
import kotlin.test.BeforeTest
|
import kotlin.test.BeforeTest
|
||||||
import kotlin.test.Test
|
import kotlin.test.Test
|
||||||
|
|||||||
+1
-1
@@ -19,7 +19,7 @@ class KsqliteMessageStoreTest {
|
|||||||
stores = KsqliteStores.inMemory("msg-${kotlin.random.Random.nextLong()}")
|
stores = KsqliteStores.inMemory("msg-${kotlin.random.Random.nextLong()}")
|
||||||
kotlinx.coroutines.runBlocking {
|
kotlinx.coroutines.runBlocking {
|
||||||
stores.conversations.upsert(
|
stores.conversations.upsert(
|
||||||
pw.binom.agentik.messageStore.ConversationRecord(
|
pw.binom.agentik.journal.ConversationRecord(
|
||||||
"conv1", null, false,
|
"conv1", null, false,
|
||||||
Instant.parse("2026-09-15T10:00:00Z"),
|
Instant.parse("2026-09-15T10:00:00Z"),
|
||||||
Instant.parse("2026-09-15T10:00:00Z"),
|
Instant.parse("2026-09-15T10:00:00Z"),
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
package pw.binom.agentik.storage.ksqlite
|
package pw.binom.agentik.storage.ksqlite
|
||||||
|
|
||||||
import kotlinx.coroutines.test.runTest
|
import kotlinx.coroutines.test.runTest
|
||||||
import pw.binom.agentik.messageStore.Reflection
|
import pw.binom.agentik.reflection.Reflection
|
||||||
import kotlin.test.AfterTest
|
import kotlin.test.AfterTest
|
||||||
import kotlin.test.BeforeTest
|
import kotlin.test.BeforeTest
|
||||||
import kotlin.test.Test
|
import kotlin.test.Test
|
||||||
|
|||||||
+1
-1
@@ -88,7 +88,7 @@ class SchemaMigrationTest {
|
|||||||
// bundle работает end-to-end — conversation upsert + message append +
|
// bundle работает end-to-end — conversation upsert + message append +
|
||||||
// list. Никаких "no such table" или подобного.
|
// list. Никаких "no such table" или подобного.
|
||||||
stores.conversations.upsert(
|
stores.conversations.upsert(
|
||||||
pw.binom.agentik.messageStore.ConversationRecord(
|
pw.binom.agentik.journal.ConversationRecord(
|
||||||
id = "c1", title = "t", isTemporal = false,
|
id = "c1", title = "t", isTemporal = false,
|
||||||
createdAt = kotlin.time.Instant.parse("2026-09-15T10:00:00Z"),
|
createdAt = kotlin.time.Instant.parse("2026-09-15T10:00:00Z"),
|
||||||
updatedAt = kotlin.time.Instant.parse("2026-09-15T10:00:00Z"),
|
updatedAt = kotlin.time.Instant.parse("2026-09-15T10:00:00Z"),
|
||||||
|
|||||||
Reference in New Issue
Block a user