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

agentik

Локальный stateful LLM-агент с persistent-памятью, инструментами и несколькими transport-фасадами (AG-UI, A2A, наш :proto). Реализован на Kotlin Multiplatform, выполняется как single JVM-jar. Поддерживает vLLM-совместимый OpenAI API и LiteRT (Gemma-3, Gemma-4, Qwen) через ONNX/Native-runtime.

Что внутри

agentik/
├── proto/             stateful KMP protocol: Agent / Conversation / Message / Event
├── server/            Ktor-фасад → /agentik (HTTP+JSON+SSE)
├── client/            Ktor-клиент → тот же /agentik, с KMP-native
├── skills/            парсер SKILL.md / *.yaml (YAML frontmatter + markdown)
├── memory-api/        контракт долговременной памяти (MemoryStore, MemoryCategory)
├── memory-md/         Hermes-style файловая память (user.md / world.md / ...)
├── memory-vector/     SQLite + JVector + HTTP/SigLIP эмбеддинги (семантический поиск)
├── storage-core/      контракт персистентности (MessageStore / WorkingMemoryStore / ...)
│                     (исторический, см. journal-api / context-api / reflection-api ниже)
├── ~~storage-inmemory/~~  ~~in-memory реализация для тестов и Android~~ — упразднён 2026-09-22
├── ~~storage-sqlite/~~    ~~SQLite реализация для production~~ — упразднён 2026-09-22
├── agent-toolsets/    ядро tool-calls с cooperative cancel + concurrency budget
├── agentik-cli/       JVM one-shot CLI-клиент (kotlinx.cli) к /agentik
├── ~~agentik-tui/~~  ~~Compose-for-Mosaic TUI-клиент (desktop)~~ — исключён 2026-09-17
└── standalone/        single-jar HTTP-сервер со всеми transport'ами и движками

Каждый подмодуль имеет собственный README.md с деталями (см. "Модули" ниже).

Quickstart

1. Скачать fatjar

CI артефакты доступны на Gitea через GitHub Actions artifacts на tag-релизах, либо соберите из исходников:

git clone https://git.binom.pw/subochev/agentik
cd agentik
./gradlew :standalone:shadowJar

Результат: standalone/build/libs/agentik-0.1.0-all.jar (~10–250 МБ, зависит от LLM-backend'а).

2. Запустить с OpenAI-compatible backend (vLLM / Ollama / OpenAI)

AGENTIK_LLM_BACKEND=openai \
AGENTIK_LLM_API_URL=http://192.168.88.135:8001/v1 \
AGENTIK_LLM_MODEL=Qwen3.8-27B-NVFP4 \
AGENTIK_LLM_CONTEXT_TOKENS=115000 \
java --enable-native-access=ALL-UNNAMED -jar agentik-0.1.0-all.jar

3. Запустить с локальной LiteRT-моделью (Gemma-4-E2B)

AGENTIK_LLM_BACKEND=google \
AGENTIK_GOOGLE_MODEL_PATH=/root/gemma-4-E2B-it.litertlm \
java --enable-native-access=ALL-UNNAMED -jar agentik-0.1.0-all.jar pull-model   # скачать
java --enable-native-access=ALL-UNNAMED -jar agentik-0.1.0-all.jar              # запустить

Больше деталей по env'ам — в standalone/README.md.

Подключиться

# CLI
java --enable-native-access=ALL-UNNAMED -jar agentik-cli-0.1.0-SNAPSHOT-all.jar --help

# curl
curl http://localhost:8080/health

Модули

  • Запускаемые:
    • :standalone — single-jar HTTP-сервер.
    • :agentik-cli — one-shot CLI-клиент (kotlinx.cli), JVM + 4 native.
  • Библиотеки (контракты и реализации):
    • :proto — stateful KMP-протокол.
    • :server — HTTP/SSE фасад :proto.
    • :client — Ktor-клиент :server.
    • :skills — парсер SKILL.md.
    • :memory-api — контракт памяти.
    • :memory-md — Hermes-style файл.
    • :memory-vector — SQLite + JVector.
    • :storage-core — контракт storage (исторический).
    • :storage-inmemory — упразднён 2026-09-22.
    • :storage-sqlite — упразднён 2026-09-22.
    • :agent-toolsets — тулы и диспетчер.

Где смотреть версии

Каталог gradle/libs.versions.toml. Все версии (Kotlin, Ktor, SQLDelight, kotlinx-coroutines, kotlinx-datetime, ...) сгруппированы в секции [versions]; все dep-aliases — в секции [libraries].

Версия самого agentik (cм. <version> в nexus.pom) — тоже в gradle.properties (через $AgentikVersion или env AGENTIK_VERSION). На tag-релизе (например v0.2.0) — CI подставляет версию из тега и публикует.

Публикация

./gradlew :<module>:publish → в caffeine (Nexus). Параметры через:

  • binom.repo.url (http://<your-nexus>/repository/caffeine/)
  • binom.repo.user
  • binom.repo.password

…или через переменные BINOM_REPO_URL, BINOM_REPO_USER, BINOM_REPO_PASSWORD (читаются в release workflow из secret'ов репозитория). Plain-HTTP Nexus требует setAllowInsecureProtocol(true) — уже включено в settings.gradle.kts.

CI/CD

Gitea Actions (https://git.binom.pw/subochev/agentik/actions):

  • .gitea/ci.yml — PR-build, прогон тестов, проверка shadowjar'ов.
  • .gitea/workflows/release.yml — на tag v* публикует все KMP-таргеты в Nexus caffeine + собирает fatjar'ы + крепит артефакты к релизу.

Что отличает от других агентских фреймворков

  • Stateful protocol — сервер сам владеет диалогом; переписка не пересобирается клиентом на каждый send (в отличие от AG-UI).
  • Все три транспорта в одном процессе — AG-UI, A2A, наш proto. Один fatjar — три API.
  • Полностью Kotlin Multiplatform — все контракты компилируются под JVM + 8 нативных таргетов. Можно встроить в iOS / Android / Desktop / CLI.
  • Прерывание tool-calls сохраняется в working memory — нет потери контекста, если пользователь нажал Ctrl-C во время долгого tool-вызова.

Лицензия

Apache-2.0 — смотрите LICENSE.

Участие в проекте

PR-ы приветствуются. Не забывайте синхронизировать версии в gradle/libs.versions.toml и обновлять per-module README при изменении API.

S
Description
No description provided
Readme 3.8 MiB
16 Latest
2026-09-23 12:59:58 +00:00
Languages
Kotlin 99.8%
Shell 0.2%