docs: per-module README + root navigation hub + CI/release workflows
ci / JVM build + tests (push) Failing after 1m57s

- README.md в каждом подмодуле: для библиотек — описание проблемы,
  подключение через maven-central/caffeine, версии в gradle/libs.versions.toml.
  Для запускаемых модулей — команды запуска + переменные среды с дефолтами.
- Корневой README.md переписан как навигационный хаб: что это, где клиенты,
  где серверы, как собрать, как опубликовать.
- build.gradle.kts: per-module POM-description через единую карту в rootProject.extra
  (порядок важен — нужно ДО apply плагина KMP, поэтому beforeEvaluate в subprojects).
- .gitea/workflows/ci.yml (новый): build + jvmTest + shadowJar на PR/push main.
- .gitea/workflows/release.yml (обновлён): публикует библиотеки в caffeine
  Nexus + собирает 3 fatjar'а и крепит их к release как бинарные ассеты.
This commit is contained in:
2026-09-16 16:24:03 +03:00
parent e68db11aaa
commit 0fdc12695e
18 changed files with 1279 additions and 364 deletions
+67
View File
@@ -0,0 +1,67 @@
# :client — `pw.binom.agentik.client`
**Ktor-клиент, превращающий HTTP-фасад `:server` обратно в `Agent`/`Conversation` из `:proto`.**
Подходит для JVM-приложений (CLI, desktop, integration-тесты).
## Какую проблему решает
После того, как `:server` выставляет агента по HTTP, встаёт задача: дать
вызывающей стороне **тот же интерфейс**, что был на сервере — а не отдельный
REST-клиент с хендшейкингом SSE, парсингом полей, ручной постраничной подгрузкой.
`:client` — обёртка: `AgentikAgent(baseUrl).createConversation()` возвращает
`Conversation`, идентичный серверному, а вызовы `send/getMessages/events`
прозрачно ездят по HTTP.
## Использование
```kotlin
import pw.binom.agentik.client.AgentikAgent
val agent = AgentikAgent(id = "ops-bot", baseUrl = "http://localhost:8080/agentik")
val conv = agent.createConversation(temp = false)
conv.events(after = Clock.System.now()).collect { ev ->
when (ev) {
is Event.AppendText -> print(ev.body)
is Event.End -> println()
else -> Unit
}
}
conv.send(listOf(Content.Text("Привет. Сколько будет 2+2?")))
// ... события стримятся в collect выше
conv.close()
```
Для фоновой подписки (reconnect-safe):
```kotlin
// Долгая живая подписка на события диалога.
conv.events(after = lastSeen).collect { ev ->
if (ev is Event.End) lastSeen = ev.date
}
```
## Подключение
```kotlin
implementation("pw.binom.agentik:client:$version")
// Транзитивно тянет :proto + ktor-client-core/cio/... + kotlinx-serialization.
```
## SSE-парсер
Внутри — самописный парсер SSE (режет поток на `data:` строки, буферизует
частичные, переживает keep-alive-комментарии). Зависимости — `ktor-client-cio`
по умолчанию; если нужен другой engine — подмените через `AgentikAgent(engineFactory = …)`.
## Где смотреть версии
- `:client` синхронизирован с `:proto`/`server` — `version` из `gradle.properties`
- релизы: `https://git.binom.pw/subochev/agentik/releases`
## Сборка
```bash
./gradlew :client:build
```
JVM-only (ktor-client-engine-cio — JVM).