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
+66
View File
@@ -0,0 +1,66 @@
# :server — `pw.binom.agentik.server`
**Ktor-маршруты, превращающие `pw.binom.agentik.proto.Agent` в HTTP+JSON+SSE фасад.**
Подключается к любому `Application` через `Route.agentikAgent(...)`, монтируется
под заданным `path` (по умолчанию `/agentik`).
## Какую проблему решает
`:proto` — это чистый Kotlin-контракт (Agent/Conversation). Чтобы по нему
говорить с удалённым сервером нужен мост. `:server` — этот мост, но **только
маршруты**: без привязки к конкретному engine (CIO/Netty), без агрегации
прочих протоколов (AG-UI/A2A), без инициализации БД/памяти. Один extension-метод
на `Route`, и ваш Agent доступен по HTTP.
## Что отдаёт
| Метод | Путь | Назначение |
|---|---|---|
| `GET` | `/health` (через `:standalone`) | liveness |
| `POST` | `/agentik/conversations` | создать диалог |
| `GET` | `/agentik/conversations` | список диалогов (постраничный) |
| `GET` | `/agentik/conversations/{id}` | конкретный диалог |
| `POST` | `/agentik/conversations/{id}/rename` | переименовать |
| `DELETE` | `/agentik/conversations/{id}` | удалить |
| `POST` | `/agentik/conversations/{id}/messages` | отправить сообщение |
| `GET` | `/agentik/conversations/{id}/events` | SSE-стрим событий |
| `GET` | `/agentik/conversations/{id}/messages` | backfill истории (с `after`) |
Wire-форма — `kotlinx.serialization` JSON со `snake_case`-дискриминаторами
(`"kind":"start_response"`, `"kind":"user_message"`, и т.п.). `Instant`
сериализуется ISO-8601 строкой (`agentikJson` в `Serialization.kt`).
## Подключение
```kotlin
// your-application/build.gradle.kts
implementation("pw.binom.agentik:server:$version")
implementation("io.ktor:ktor-server-core:2.3.x") // или любой совместимый
implementation("io.ktor:ktor-server-cio:2.3.x") // engine — ваш выбор
// ваш код
import pw.binom.agentik.server.agentikAgent
fun Application.module() {
install(ContentNegotiation) { json(agentikJson) }
routing {
agentikAgent(agent = myAgent) // mount на /agentik
agentikAgent(agent = myAgent, path = "/v1/agent") // или под другим путём
}
}
```
## Где смотреть версии
- `pw.binom.agentik:proto` (см. `:proto/README.md`)
- `pw.binom.agentik:server` — `version` берётся из `gradle.properties` (`version=0.1.0`)
- история релизов: `https://git.binom.pw/subochev/agentik/releases`
## Сборка
```bash
./gradlew :server:build
./gradlew :server:jvmTest
```
KMP-таргеты: те же, что у `:proto` (jvm + 8 нативов).