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) удалён.
160 lines
11 KiB
Kotlin
160 lines
11 KiB
Kotlin
val caffeineRepo = providers.gradleProperty("caffeineRepo").getOrElse("http://192.168.76.117/repository/caffeine")
|
||
|
||
pluginManagement {
|
||
repositories {
|
||
gradlePluginPortal()
|
||
mavenCentral()
|
||
google()
|
||
}
|
||
}
|
||
|
||
dependencyResolutionManagement {
|
||
repositories {
|
||
// Сначала mavenLocal — чтобы локально опубликованные версии
|
||
// (через publishToMavenLocal) перекрывали caffeine.
|
||
mavenLocal()
|
||
mavenCentral()
|
||
google()
|
||
// Home Nexus, репо "caffeine": pw.binom.* (a2a, text-embedding-kmp с v4,
|
||
// ksqlite до v0.1.1-SNAPSHOT — теперь в Maven Central, ...)
|
||
maven {
|
||
name = "caffeine"
|
||
url = uri(caffeineRepo)
|
||
setAllowInsecureProtocol(true)
|
||
}
|
||
}
|
||
}
|
||
|
||
rootProject.name = "agentik"
|
||
|
||
include(":standalone")
|
||
// Generic LLM-side tools: LlmReflector, SkillMiner, LlmMemoryReviewer,
|
||
// ContextCompactor + парсеры/промпты. Вынесены из :standalone (god class)
|
||
// — переиспользуемы в :agentik-cli / :agentik-tui и любых других клиентах.
|
||
include(":llm-tools")
|
||
// Generic MCP-bridge: McpConfig, McpRegistry, McpLiteToolAdapter. Вынесены
|
||
// из :standalone — MCP не специфичен для standalone'а, это generic мост
|
||
// между MCP-SDK и LiteTool.
|
||
include(":mcp-bridge")
|
||
// Собственный протокол agentik. Пока в нём пилим, потом вынесем.
|
||
include(":proto")
|
||
// Парсер скилов (YAML-frontmatter + markdown body, opencode-style).
|
||
include(":skills")
|
||
// Ktor-сервер, экспонирующий Agent по HTTP (SSE + JSON).
|
||
include(":server")
|
||
// Ktor-клиент, превращающий HTTP-фасад в `Agent`/`Conversation`.
|
||
include(":client")
|
||
// CLI-клиент поверх :client — REPL со slash-командами и стримингом ответов.
|
||
// KMP со всеми целями (jvm + весь натив), jvm-таргет собирается как shadowJar.
|
||
// include(":agentik-cli") — отключено 2026-09-21: пользователь временно вывел
|
||
// из сборки. Папка agentik-cli/ осталась на диске для возможного возврата.
|
||
// TUI-клиент поверх :client — Compose-style UI (Mosaic от Jake Wharton),
|
||
// рендерится в ANSI-терминал. KMP со всеми desktop-целями (без ios).
|
||
// include(":agentik-tui") — отключено 2026-09-17: пользователь признал TUI-подход неудачным.
|
||
// Папка agentik-tui/ оставлена на диске для возможного возврата; из сборки исключена.
|
||
|
||
// Встраиваемая долговременная память агента. `:memory-api` — интерфейсы,
|
||
// `:memory-md` — реализация на базе §-файлов (Hermes-style).
|
||
include(":memory-api")
|
||
include(":memory-md")
|
||
// Vector-бэкенд долговременной памяти поверх JVector (ANN-индекс) + SQLite
|
||
// для метаданных. JVM-only (JVector не имеет KMP-таргетов). На Android ART
|
||
// работает через Java 11 base classes (scalar fallback).
|
||
include(":memory-vector")
|
||
// Интерфейсы хранилища и разговорной истории. Контракты распределены по
|
||
// доменам: :journal-api (MutableJournalStore/MutableConversationStore),
|
||
// :context-api (ContextStore), :reflection-api (ReflectionStore).
|
||
// Реализации — :journal-ksqlite/:context-ksqlite/:reflection-ksqlite (ksqlite)
|
||
// и :journal-inmemory/:reflection-inmemory (in-memory).
|
||
//include(":message-store-api") — перенесено в :journal-api (ConversationRecord/ConversationStore/Ids)
|
||
// и :reflection-api (Reflection/ReflectionStore/ReflectionEvent/Ids)
|
||
// Модуль удалён с диска.
|
||
include(":reflection-api")
|
||
// Новые API-модули трёх сущностей (canonical имена):
|
||
// - :journal-api — append-only audit log (бывший :message-log-api)
|
||
// - :context-api — то что видит LLM (бывший :working-memory-api)
|
||
// - :outbox-api — bounded-tail event stream (бывший :event-store)
|
||
// Старые модули :message-log-api / :working-memory-api / :event-store
|
||
// остаются на диске — миграция consumers'ов по чуть-чуть, отдельно.
|
||
include(":journal-api")
|
||
include(":context-api")
|
||
include(":outbox-api")
|
||
// Общие типы содержимого сообщения (Content/MessageContext/MessageOrigin/
|
||
// TurnTokens). Вынесены в отдельный низкоуровневый модуль, чтобы ими
|
||
// пользовались И :proto, И :journal-api, И :outbox-api (message-события
|
||
// несут List<Content> + MessageContext) без дублирования типов и циклов
|
||
// в графе зависимостей.
|
||
include(":content-api")
|
||
// Bounded-tail event log с auto-TTL. Двухуровневое хранилище: этот модуль —
|
||
// короткий live tail + recent replay; полный audit log живёт в :message-store-api
|
||
// (там — MessageStore + ConversationStore). EventStore сам управляет eviction,
|
||
// никаких prune-методов наружу. KMP, без implementations пока.
|
||
//include(":event-store")
|
||
// KMP in-memory реализация MutableEventStore. ConcurrentLinkedDeque + TTL/size
|
||
// eviction. Для тестов, dev-режима, embedded-сценариев (Android core).
|
||
include(":outbox-inmemory")
|
||
include(":journal-inmemory")
|
||
// Гибридное хранилище памяти: .md файлы (single source of truth) +
|
||
// ksqlite vector-кэш (sqlite-vec vec0) + reconcile + hybrid search.
|
||
// Заменяет чисто-keyword :memory-md там, где нужен семантический поиск.
|
||
include(":memory-md-vector")
|
||
//include(":event-store-in-memory")
|
||
//include(":working-memory-api")
|
||
// SQLDelight-реализация store'ов из :journal-api и :context-api. JVM-only
|
||
// KMP-реализация EventStore поверх ksqlite (https://github.com/caffeine-mgn/ksqlite).
|
||
// Цель: проверить что pure-Kotlin SQLite с sqlite-vec заменяет SQLDelight+JVector
|
||
// на KMP-таргетах (JVM + linuxX64 + mingwX64). Apple targets auto-disabled на
|
||
// Linux — собираются локально на macOS. Пока покрывает только EventStore;
|
||
// остальные store'ы мигрируют после стабилизации ksqlite и реального
|
||
// использования на Android-агенте.
|
||
// ksqlite-реализация :context-api (ContextStore / working_memory table).
|
||
// Минимальный модуль: только таблица `working_memory` + 2 индекса.
|
||
include(":context-ksqlite")
|
||
// ksqlite-реализация :journal-api (JournalStore / message table,
|
||
// ConversationStore / conversation table). Минимальный модуль:
|
||
// таблицы `message` + `conversation` + индексы.
|
||
include(":journal-ksqlite")
|
||
// ksqlite-реализация :outbox-api (CursorStore / outbox_cursor table).
|
||
// Персистентная позиция счётчика событий агента — переживает рестарт, чтобы
|
||
// клиент продолжал инкрементально (см. PersistentOffsetSequencer).
|
||
include(":outbox-ksqlite")
|
||
// ksqlite-реализация :reflection-api (ReflectionStore / reflection table).
|
||
// Минимальный модуль: только таблица `reflection` + 2 индекса.
|
||
include(":reflection-ksqlite")
|
||
// in-memory реализация :reflection-api (ReflectionStore). Используется в
|
||
// тестах, dev-режиме и embedded-сценариях. Чистый KMP (9 таргетов),
|
||
// никакого I/O.
|
||
include(":reflection-inmemory")
|
||
// Ядро механики toolsets: ToolsetRegistry + ToolsetDispatchPolicy + встроенные
|
||
// тулы enable_toolset/disable_toolset. KMP, не зависит от :standalone, может быть
|
||
// переиспользован в Android-сборке. Интеграция с ChatAgent — commit 5+.
|
||
include(":agent-toolsets")
|
||
// API-модуль vector-index: интерфейсы ANN-индекса, общие для любых бэкендов
|
||
// (JVector, sqlite-vec, inmemory, ...). Pure KMP, без реализаций.
|
||
include(":vector-index-api")
|
||
// JVector-реализация `MutableVectorIndexStore`. JVM-only — JVector публикуется
|
||
// только под JVM (нет KMP-таргетов). In-RAM (без persistence в v1).
|
||
include(":vector-index-jvector")
|
||
// ksqlite-реализация `MutableVectorIndexStore`. KMP (все 9 целей) — brute-force
|
||
// ANN: SELECT всех записей + cosine similarity в Kotlin. Persistence — обычная
|
||
// SQLite БД. Подходит для small-to-medium масштабов; для больших — sqlite-vec
|
||
// или JVector (выше).
|
||
include(":vector-index-ksqlite")
|
||
// Расширяемый слой поверх :proto: `MutableAgent` (наследник Agent + install/uninstall
|
||
// компонентов), `Component` (install(MutableAgent)/uninstall(MutableAgent)) и три
|
||
// capability-провайдера (system-prompt, tools, event-listener). Каждый компонент
|
||
// сам регистрирует свои capability в MutableAgent при install и снимает их при
|
||
// uninstall. KMP, все 9 целей; чистый API-слой, без реализаций.
|
||
include(":agent-api")
|
||
// Skill-подсистема как компонент: тулы skill_save/skill_delete/skill_read +
|
||
// SkillMiningComponent, слушающий outbox (Event.ConversationClosing /
|
||
// Event.CompactionTriggered) и добывающий новые скилы через SkillMiner.
|
||
include(":skill-mining")
|
||
// Референсная реализация спеки `SYNC-SYSTEM.md` — журнал событий с
|
||
// монотонным курсором + материализация + replace-resync, единый протокол
|
||
// для клиента и сервера. KMP с jvm/linuxX64/mingwX64 целями (ksqlite-
|
||
// ограничение). Тесты спеки в commonTest, интеграция с ksqlite — в jvmTest.
|
||
// Существующий код (outbox/journal/client/server) не трогаем; это чистый
|
||
// референс для последующей миграции.
|
||
include(":sync-core")
|