Files
SubochevAV 8f616f359f
ci / JVM build + tests (pull_request) Failing after 54s
docs: per-module READMEs (run vs library) + root navigation hub
Every subproject now has README.md:
- 3 runnable modules (:standalone, :agentik-cli, :agentik-tui):
  quickstart, env table, parameters, known limits
- 11 library modules: what it is, which problem solves, how to
  wire it in, where versions live

Root README.md is the navigation hub (Quickstart, Modules table,
publish + CI/CD notes).

Also: ci.yml prunes the :memory-vector -x excludes now that
text-embedding-kmp artifacts are published to caffeine.

518 tests green.

Verified publish pipeline: :proto:publish to caffeine produces
pom.module + per-target klibs + sources for all 9 KMP targets.

🤖 Generated with [opencode]
2026-09-16 20:44:16 +03:00
..

:memory-md — файловое хранилище памяти (JVM-only)

Что это

Реализация MemoryStore поверх обычных файлов в формате [Hermes-style]:

  • ~/.agentik/memory/user.md
  • ~/.agentik/memory/world.md
  • ~/.agentik/memory/preference.md

Каждая секция — это ## <heading> + содержимое. Ревьювер ищет по заголовкам/словам по ключевому совпадению. Префетчер лениво подгружает секции, наиболее вероятно относящиеся к текущему ходу.

Решает: простой, прозрачный, git-дружелюбный формат памяти. Пользователь может сам cat ~/.agentik/memory/world.md и отредактировать.

Где используется

  • :standalone подключает вместо :memory-vector когда AGENTIK_MEMORY_BACKEND=md.
  • Дефолт, когда ANN-эмбеддинги слишком дороги или не нужны.

Как подключить

dependencies {
    implementation("pw.binom.agentik:memory-md:0.1.0")
    implementation("pw.binom.agentik:memory-api:0.1.0")  // контракт
}

val memory: MemoryStore = openMdMemorySystem(Path("~/.agentik/memory"))
memory.save(MemoryCategory.USER, "User prefers tasks short.")
memory.query(MemoryCategory.USER, "preferences").forEach(::println)

Версии

gradle/libs.versions.toml → [versions] agentik-memory-md.

Как устроен формат

# user.md

## 2026-09-14T10:00:00Z — first session
Имя пользователя — Сережа.
Любит короткие ответы.

## 2026-09-15T18:20:00Z — task preferences
Не присылать пустые репро.

Каждая запись начинается с заголовка второго уровня и содержит в первой строке заголовка timestamp и короткое название. Так достигается уникальность и читаемость через cat.

Тесты

./gradlew :memory-md:jvmTest

Покрывают: round-trip save/load, фильтрацию по категории, keyword-search, перезапись, конкурентный доступ (файловая блокировка).

Чего здесь НЕТ

  • Никаких эмбеддингов. Простой keyword-match (простая substring + TF-IDF-эвристика на русских/латинских словах).
  • Никакого ANN. Для семантического поиска используйте :memory-vector.

Текущий статус

Используется продакшеном. Подходит для долговременного "дневникового" хранения.