diff --git a/client/src/commonMain/kotlin/pw/binom/agentik/client/AgentikAgent.kt b/client/src/commonMain/kotlin/pw/binom/agentik/client/AgentikAgent.kt index 3453ffa..e2c6052 100644 --- a/client/src/commonMain/kotlin/pw/binom/agentik/client/AgentikAgent.kt +++ b/client/src/commonMain/kotlin/pw/binom/agentik/client/AgentikAgent.kt @@ -20,12 +20,43 @@ import pw.binom.agentik.proto.Agent * ) * val conv = agent.createConversation(temp = false) * conv.send(listOf(Content.Text("hi"))) - * conv.events(Instant.DISTANT_PAST).collect { ... } + * agent.outbox.conversationEvents(Instant.DISTANT_PAST, conv.id) + * .map { it.event } + * .collect { ... } * agent.close() // закрывает HttpClient * ``` * - * [id] пробрасывается в `Agent.id` — сервер про идентичность агента не знает, - * поэтому клиент должен её знать сам (или взять из конфига). + * ## Что клиент должен хранить локально (persistence) + * + * Либа **не** имеет `SettingsRepository` / `Config` — это намеренно: + * UI-фреймворки хранят настройки по-разному (JSON-файл, Keychain, + * `SharedPreferences`, Android DataStore, NSUserDefaults, ...). Либа + * не навязывает формат, но вот минимальный набор, который клиент должен + * сериализовать у себя, чтобы пережить перезапуск: + * + * | Поле | Что это | Где взять | + * |---|---|---| + * | `id` | Идентичность клиента в логах сервера (X-Client-Id header). Не user-id в агенте, не device-id, а произвольная строка клиента — обычно `-`. Сервер использует для log multiplexing и не интерпретирует. | Генерируется клиентом при первом запуске, сохраняется локально | + * | `baseUrl` | URL сервера (`http://host:8080/agentik`). Должен включать path-prefix фасада, не только хост. | Из настроек пользователя / дефолт | + * | `token` | Bearer-токен. `null` = анонимный доступ (если сервер разрешает). | Из настроек пользователя / secure-storage | + * + * Опционально (для UX): + * | Поле | Зачем | + * |---|---| + * | `engineFactory` | Зависит от платформы (`CIO` JVM/Native, `OkHttp` JVM, `Darwin` iOS/macOS). Выбор — обычно compile-time. | + * + * Пример минимального persistence-файла (для UI, который хранит JSON): + * + * ```json + * { + * "clientId": "my-android-app-550e8400-e29b-41d4-a716-446655440000", + * "baseUrl": "https://agent.example.com/agentik", + * "token": "s3cret" + * } + * ``` + * + * `clientId` генерируется один раз при первой установке (`UUID.randomUUID().toString()`) + * и больше не меняется — иначе сломается log multiplexing на сервере. * * **Lifecycle**: [Agent] — `AutoCloseable`. `agent.close()` закрывает * HttpClient (идемпотентно). После этого `createConversation` /