5bdc517988
Введение монотонного offset'а как персистентного состояния агента:
offset'ы переживают рестарт standalone-агента, клиент продолжает
синхронизацию инкрементально, без полной re-sync с нуля.
outbox-api:
- Cursor (offset: Long) — курсор в журнале событий агента.
- OffsetSequencer — интерфейс резервирования уникального offset.
- CursorStore — персистентное хранилище текущего offset'а.
- PersistentOffsetSequencer — декоратор над любым OutboxStore,
обновляет CursorStore на каждом append (atomic transaction).
- OutboxGapException — клиент запросил after < earliestCursor() →
сервер не может удовлетворить, клиент обязан делать full resync.
- DurableEvent переименован из Event.kt → DurableEvent.kt (Event.kt
был общим sealed-типом, теперь это термин из спеки).
- MutableOutboxStore и OutboxStore теперь читают offset через
CursorStore вместо in-memory counter'а.
outbox-inmemory:
- InMemoryOffsetSequencer — для тестов и dev-режима.
- InMemoryOutboxStore теперь принимает OffsetSequencer в конструкторе.
outbox-ksqlite (новый модуль):
- KsqliteCursorStore — таблица outbox_cursor (agent_id TEXT PK,
offset INTEGER NOT NULL DEFAULT 0, updated_at INTEGER NOT NULL).
- KsqliteCursorStoreTest — 4 теста (set/get, monotonic, concurrent).
proto + server:
- Snapshot.proto — server-state snapshot endpoint для клиентов,
которым нужна полная материализация (использование TBD).
- Routes.kt + SnapshotRouteTest — endpoint /agentik/snapshot (GET).
journal-ksqlite:
- KsqliteJournalStore.listFlow/append — без изменений по API,
нотации минимальные (codecs).
standalone:
- DurableLog (бывший ChatAgent-orchestration) — атомарный commit
события в OutboxStore + PersistentOffsetSequencer + materialization
(через Reducer) одной транзакцией.
- SqliteStores — добавляет KsqliteCursorStore в bundle, единая
shared-connection для всех ksqlite-сторов standalone-агента.
- ChatAgent / ConversationLoop / ConversationEvents / ReflectionScheduler /
ToolDispatcher — переход на новые абстракции.
- standalone/build.gradle.kts — implementation(project(':outbox-ksqlite'))
включено (раньше было закомментировано — модуль только создавался).
client:
- AgentikAgent / AgentClient / HttpEventStore / HttpJournalStore /
ReconnectingOutbox — используют Cursor через transport API.
- client/README.md — синхронизирован с новым поведением (468 строк
diff — это в основном оформление и примеры).
kotlinx-io: 0.8.0 → 0.9.1 в libs.versions.toml (см. sync-core tests).
SYNC-SYSTEM.md (в корне) — спецификация, на которую ссылается и
:sync-core (эта сессия), и эта Cursor-абстракция в outbox-api.
Тесты: standalone 132, journal-ksqlite 25, outbox-inmemory 20,
outbox-ksqlite 4, client 10, sync-core 74 — все зелёные на jvm;
sync-core linuxX64 74 тоже зелёный.
sync2/ (заброшенный stub с одним build.gradle.kts) удалён.
128 lines
8.3 KiB
TOML
128 lines
8.3 KiB
TOML
[versions]
|
||
kotlin = "2.4.20"
|
||
kotlinx-serialization = "1.11.0"
|
||
kotlinx-coroutines = "1.11.0"
|
||
kotlinx-io = "0.9.1"
|
||
ktor = "3.1.3"
|
||
a2a = "1.0.0-SNAPSHOT"
|
||
kaml = "0.104.0"
|
||
litert = "13"
|
||
sqldelight = "2.3.2"
|
||
shadow = "8.3.5"
|
||
jvector = "3.0.6"
|
||
text-embedding-kmp = "5"
|
||
kotlin-logging = "3.0.5"
|
||
logback = "1.5.18"
|
||
mosaic = "0.18.0"
|
||
clikt = "5.0.3"
|
||
kotlinx-cli = "0.3.6"
|
||
ksqlite = "0.1.4"
|
||
junit = "4.13.2"
|
||
|
||
[plugins]
|
||
kotlin-multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" }
|
||
kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }
|
||
kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }
|
||
# JetBrains Compose Compiler plugin — обязательно для @Composable в KMP-проектах
|
||
# с Compose Multiplatform 1.8+; без него @Composable-лямбды ломаются (Function0 вместо Function2).
|
||
kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
|
||
sqldelight = { id = "app.cash.sqldelight", version.ref = "sqldelight" }
|
||
shadow = { id = "com.gradleup.shadow", version.ref = "shadow" }
|
||
|
||
[libraries]
|
||
# --- A2A (pw.binom.a2a) — shared: KMP (jvm + linuxX64); client/server: JVM-only ---
|
||
a2a-shared = { module = "pw.binom.a2a:shared", version.ref = "a2a" }
|
||
a2a-client = { module = "pw.binom.a2a:client", version.ref = "a2a" }
|
||
a2a-server = { module = "pw.binom.a2a:server", version.ref = "a2a" }
|
||
|
||
# --- YAML для парсинга скилов (opencode-style frontmatter). KMP. ---
|
||
kaml = { module = "com.charleskorn.kaml:kaml", version.ref = "kaml" }
|
||
|
||
# --- litert-kmp (pw.binom.litert) — universal LLM wrapper ---
|
||
litert-api = { module = "pw.binom.litert:litert-api", version.ref = "litert" }
|
||
litert-openai = { module = "pw.binom.litert:litert-openai", version.ref = "litert" }
|
||
litert-google = { module = "pw.binom.litert:litert-google", version.ref = "litert" }
|
||
# liteTool(liteToolRaw) DSL: типизированные LiteTool через @Serializable args.
|
||
# https://git.binom.pw/subochev/litert-kmp/src/branch/main/litert-tools-kotlinx-serialization
|
||
litert-tools-kotlinx-serialization = { module = "pw.binom.litert:litert-tools-kotlinx-serialization", version.ref = "litert" }
|
||
|
||
# --- SQLDelight (app.cash.sqldelight) — KMP SQLite, JDBC driver ---
|
||
sqldelight-runtime = { module = "app.cash.sqldelight:runtime", version.ref = "sqldelight" }
|
||
sqldelight-sqlite-driver = { module = "app.cash.sqldelight:sqlite-driver", version.ref = "sqldelight" }
|
||
sqldelight-coroutines = { module = "app.cash.sqldelight:coroutines-extensions", version.ref = "sqldelight" }
|
||
|
||
# --- Ktor (сервер) ---
|
||
ktor-server-core = { module = "io.ktor:ktor-server-core", version.ref = "ktor" }
|
||
ktor-server-sse = { module = "io.ktor:ktor-server-sse", version.ref = "ktor" }
|
||
ktor-server-cio = { module = "io.ktor:ktor-server-cio", version.ref = "ktor" }
|
||
ktor-server-netty = { module = "io.ktor:ktor-server-netty", version.ref = "ktor" }
|
||
ktor-server-content-negotiation = { module = "io.ktor:ktor-server-content-negotiation", version.ref = "ktor" }
|
||
ktor-serialization-kotlinx-json = { module = "io.ktor:ktor-serialization-kotlinx-json", version.ref = "ktor" }
|
||
ktor-client-core = { module = "io.ktor:ktor-client-core", version.ref = "ktor" }
|
||
ktor-client-cio = { module = "io.ktor:ktor-client-cio", version.ref = "ktor" }
|
||
ktor-client-curl = { module = "io.ktor:ktor-client-curl", version.ref = "ktor" }
|
||
ktor-client-content-negotiation = { module = "io.ktor:ktor-client-content-negotiation", version.ref = "ktor" }
|
||
ktor-server-test-host = { module = "io.ktor:ktor-server-test-host", version.ref = "ktor" }
|
||
ktor-client-sse = { module = "io.ktor:ktor-client-sse", version.ref = "ktor" }
|
||
|
||
# --- Model Context Protocol (MCP) ---
|
||
mcp-sdk-client = { module = "io.modelcontextprotocol:kotlin-sdk-client", version = "0.15.0" }
|
||
|
||
# --- CLI: clikt (ajalt). KMP, native Linux/macOS/Windows включая linuxArm64. ---
|
||
# https://ajalt.github.io/clikt/
|
||
# Артефакт один и тот же — `com.github.ajalt.clikt:clikt` — Gradle module
|
||
# metadata резолвит per-target variant (clikt-jvm / clikt-linuxarm64 / ...).
|
||
clikt = { module = "com.github.ajalt.clikt:clikt-core", version.ref = "clikt" }
|
||
kotlinx-cli = { module = "org.jetbrains.kotlinx:kotlinx-cli", version.ref = "kotlinx-cli" }
|
||
|
||
# --- TUI: Mosaic (Jetpack Compose → ANSI-терминал), jvm + desktop-native. ---
|
||
# https://github.com/JakeWharton/mosaic
|
||
mosaic-runtime = { module = "com.jakewharton.mosaic:mosaic-runtime", version.ref = "mosaic" }
|
||
mosaic-runtime-jvm = { module = "com.jakewharton.mosaic:mosaic-runtime-jvm", version.ref = "mosaic" }
|
||
mosaic-runtime-macosx64 = { module = "com.jakewharton.mosaic:mosaic-runtime-macosx64", version.ref = "mosaic" }
|
||
mosaic-runtime-macosarm64 = { module = "com.jakewharton.mosaic:mosaic-runtime-macosarm64", version.ref = "mosaic" }
|
||
mosaic-runtime-linuxx64 = { module = "com.jakewharton.mosaic:mosaic-runtime-linuxx64", version.ref = "mosaic" }
|
||
mosaic-runtime-linuxarm64 = { module = "com.jakewharton.mosaic:mosaic-runtime-linuxarm64", version.ref = "mosaic" }
|
||
mosaic-runtime-mingwx64 = { module = "com.jakewharton.mosaic:mosaic-runtime-mingwx64", version.ref = "mosaic" }
|
||
mosaic-tty-terminal = { module = "com.jakewharton.mosaic:mosaic-tty-terminal", version.ref = "mosaic" }
|
||
|
||
kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" }
|
||
|
||
# --- commons ---
|
||
kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlinx-coroutines" }
|
||
kotlinx-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "kotlinx-coroutines" }
|
||
kotlinx-serialization-core = { module = "org.jetbrains.kotlinx:kotlinx-serialization-core", version.ref = "kotlinx-serialization" }
|
||
kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinx-serialization" }
|
||
kotlinx-io-core = { module = "org.jetbrains.kotlinx:kotlinx-io-core", version.ref = "kotlinx-io" }
|
||
|
||
# --- kMMIO (dev.karmakrafts.kmmio) — резерв под будущую vector-DB, пока не используется ---
|
||
# kmmio-core = { module = "dev.karmakrafts.kmmio:kmmio-core", version = "2.3.1" }
|
||
|
||
# --- ksqlite (pw.binom.db) — KMP SQLite со встроенным sqlite-vec (https://github.com/caffeine-mgn/ksqlite).
|
||
# Тянется как обычная `implementation(libs.ksqlite)` — Gradle Module Metadata резолвит per-target
|
||
# variant (ksqlite-jvm / ksqlite-linuxx64 / ksqlite-mingwx64 / ...).
|
||
ksqlite = { module = "pw.binom.db:ksqlite", version.ref = "ksqlite" }
|
||
|
||
# --- JUnit 4 — legacy test framework (используется в :client для совместимости с ktor-server-test-host). ---
|
||
junit = { module = "junit:junit", version.ref = "junit" }
|
||
|
||
# --- JVector (io.github.jbellis) — embedded ANN-индекс для vector-бэкенда памяти. JVM-only. ---
|
||
jvector = { module = "io.github.jbellis:jvector", version.ref = "jvector" }
|
||
|
||
# --- text-embedding-kmp (pw.binom.ai.embeddingtext) — on-device SigLIP2 эмбеддинг через ONNX. ---
|
||
# `api` — KMP с jvm + android + linuxX64/Arm64 + macos + ios + mingwX64
|
||
# (с 2026-09-21, когда мы добавили нативные цели в text-embedding-kmp:api).
|
||
# Версия 5 — первый релиз с реальными нативными klib-вариантами в caffeine
|
||
# (v4 имел только jvm+android, что ломало native-resolve в :memory-md-vector).
|
||
# Используется из :memory-md-vector и :memory-vector напрямую через
|
||
# `libs.text.embedding.api` (без суффикса `-jvm` — Gradle сам выберет
|
||
# нужный variant под target).
|
||
# `siglip` — JVM+Android only (onnx-runtime), подключается в jvmMain.
|
||
text-embedding-api = { module = "pw.binom.ai.embeddingtext:api", version.ref = "text-embedding-kmp" }
|
||
text-embedding-siglip = { module = "pw.binom.ai.embeddingtext:siglip-jvm", version.ref = "text-embedding-kmp" }
|
||
|
||
# --- Логирование: kotlin-logging (тонкая обёртка над slf4j-api) + logback-classic (binding). ---
|
||
# KMP-артефакт (он же `kotlin-logging-jvm` существует отдельно как JVM-only build).
|
||
kotlin-logging = { module = "io.github.microutils:kotlin-logging", version.ref = "kotlin-logging" }
|
||
logback-classic = { module = "ch.qos.logback:logback-classic", version.ref = "logback" }
|