Files
agentik/settings.gradle.kts
T
subochev 5bdc517988 Добавляет Cursor/OffsetSequencer в :outbox-api и интегрирует PersistentOffsetSequencer через :outbox-ksqlite.
Введение монотонного 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) удалён.
2026-10-02 01:16:15 +03:00

160 lines
11 KiB
Kotlin
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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")