b5b21d146a
ci / JVM build + tests (push) Failing after 2m11s
- :agentik-cli переписан с REPL на one-shot subcommands:
conv-ls / conv-new / conv-show / conv-delete / conv-rename /
msgs / send / interrupt / info. Аргумент-парсер — kotlinx.cli 0.3.6
(clikt 5.x отвергнут из-за upstream-бага duplicate symbol
selfAndAncestors между clikt и clikt-mordant, issue #598).
- :client: events() переведён с httpClient.get() на
prepareGet()+execute{} — get() дожидается полного тела, а SSE
не закрывается никогда, поэтому подписка висела вечно. (Это
же объясняет, почему TUI agent.events() фактически был
нерабочим на реальном сервере.)
- :client KMP-конверсия (jvm + 5 desktop-native) уже была в
коммите 9d826a4, здесь она просто подтверждена в статусе
green по всем таргетам.
- REPL-инфраструктура (CliPlatform, EventRenderer, Main,
SessionRepository, SlashCommand + 3 теста) удалена.
- agentik-cli/README переписан под subcommand-формат,
root README обновлён (убран дубликат строки, agentik-tui
убран из 'Запускаемые модули').
Smoke (на 192.168.76.166): info / conv-ls / conv-new /
conv-rename / conv-show / conv-delete / msgs / send
(стримит response-events до event End) / interrupt
(выводит event Interrupted).
124 lines
4.3 KiB
Markdown
124 lines
4.3 KiB
Markdown
# `:agentik-cli` — JVM CLI клиент к `/agentik`
|
||
|
||
## Что это
|
||
|
||
JVM-only **one-shot subcommand CLI** к серверу `:standalone` через
|
||
`:client` по HTTP+SSE. Один вызов — одна команда: стримы ответа
|
||
`send` идёт в stdout построчно, никакого embedded-REPL.
|
||
|
||
Решает: быстрый способ дёрнуть агента из shell-скрипта или руками,
|
||
не поднимая отдельную TUI-сессию.
|
||
|
||
## Подкоманды
|
||
|
||
```
|
||
agentik-cli <subcommand> [options]
|
||
|
||
Subcommands:
|
||
conv-ls Список диалогов агента
|
||
conv-new Создать диалог; печатает id
|
||
conv-show Метаданные диалога
|
||
conv-delete Удалить диалог
|
||
conv-rename Переименовать диалог
|
||
msgs Показать сообщения диалога
|
||
send Отправить user-ход и стримить ответ
|
||
interrupt Прервать текущий ход диалога
|
||
info Показать server URL и agent id
|
||
```
|
||
|
||
`--server URL` и `--id ID` (env: `AGENTIK_SERVER`, `AGENTIK_AGENT_ID`)
|
||
задаются **после** имени subcommand'а — kotlinx.cli не шарит опции
|
||
родителя в subcommand. Пример:
|
||
|
||
```bash
|
||
agentik-cli conv-ls --server http://192.168.76.166:8080/agentik
|
||
agentik-cli conv-new --server http://localhost:8080/agentik
|
||
agentik-cli send --server http://localhost:8080/agentik conv-abc "привет"
|
||
```
|
||
|
||
## Как запустить
|
||
|
||
### Из готового fatjar
|
||
|
||
```bash
|
||
java --enable-native-access=ALL-UNNAMED \
|
||
-jar agentik-cli-0.1.0-SNAPSHOT-all.jar --help
|
||
```
|
||
|
||
### Через Gradle
|
||
|
||
```bash
|
||
./gradlew :agentik-cli:shadowJar
|
||
java -jar agentik-cli/build/libs/agentik-cli-0.1.0-SNAPSHOT-all.jar info
|
||
```
|
||
|
||
## Примеры
|
||
|
||
```bash
|
||
# Список диалогов (таблица)
|
||
agentik-cli conv-ls --server http://localhost:8080/agentik
|
||
|
||
# Создать диалог
|
||
ID=$(agentik-cli conv-new --server http://localhost:8080/agentik)
|
||
echo "new conv: $ID"
|
||
|
||
# Переименовать
|
||
agentik-cli conv-rename --server http://localhost:8080/agentik "$ID" "мой чат"
|
||
|
||
# Отправить ход и стримить ответ
|
||
agentik-cli send --server http://localhost:8080/agentik "$ID" "2+2"
|
||
|
||
# Показать последние N сообщений
|
||
agentik-cli msgs --server http://localhost:8080/agentik "$ID" --limit 10
|
||
|
||
# Прервать активный ход
|
||
agentik-cli interrupt --server http://localhost:8080/agentik "$ID"
|
||
|
||
# Удалить
|
||
agentik-cli conv-delete --server http://localhost:8080/agentik "$ID"
|
||
```
|
||
|
||
## Формат вывода `send`
|
||
|
||
Каждое SSE-событие печатается отдельной строкой `event <Type> ...` —
|
||
пригодно для парсинга через `awk`/`jq`-обёртки:
|
||
|
||
```
|
||
event StartReasoning
|
||
event StartResponse TEXT
|
||
event AppendText \n\n
|
||
event AppendText Привет!
|
||
event End
|
||
```
|
||
|
||
Терминальные события (`End`, `Interrupted`, `Error`) тоже
|
||
печатаются; CLI выходит сразу после `End`.
|
||
|
||
## Почему JVM-only (а не KMP)
|
||
|
||
Аргумент-парсер: `kotlinx.cli` 0.3.6 (JetBrains, KMP) — единственный
|
||
зрелый вариант, который линкуется нативно под `linuxX64`/`linuxArm64`
|
||
без upstream-багов. Альтернативы:
|
||
|
||
- **clikt-multiplatform 5.x** имеет upstream-баг: `clikt` и
|
||
`clikt-mordant` оба объявляют `selfAndAncestors` в commonMain, и
|
||
Kotlin/Native linker падает на дубликате символа
|
||
(issue [ajalt/clikt#598](https://github.com/ajalt/clikt/issues/598),
|
||
workaround — `kotlin.native.cacheKind.linuxX64=none`, что замедляет
|
||
сборку на порядки). Поэтому clikt отвергнут в пользу kotlinx.cli.
|
||
- **picocli** — JVM-only.
|
||
- **kotlinx-args** — мёртвый репозиторий.
|
||
|
||
Нативные бинари `:agentik-cli` отложены до стабилизации
|
||
arg-parser-ситуации.
|
||
|
||
## Тесты
|
||
|
||
```bash
|
||
./gradlew :agentik-cli:jvmTest
|
||
```
|
||
|
||
## Версии
|
||
|
||
`gradle/libs.versions.toml` → `[versions] agentik-agentik-cli`.
|