@softomnitel/omnicall-kit 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/README.md +58 -2
  2. package/package.json +1 -1
package/README.md CHANGED
@@ -39,6 +39,7 @@ console.log(snapshot.revision);
39
39
  - [Основные понятия](#основные-понятия)
40
40
  - [Состояния и события](#состояния-и-события)
41
41
  - [API Reference](#api-reference)
42
+ - [Форматы успешных ответов](#форматы-успешных-ответов)
42
43
  - [Рецепты](#рецепты)
43
44
  - [Ошибки и FAQ](#ошибки-и-faq)
44
45
  - [Миграция и совместимость](#миграция-и-совместимость)
@@ -66,7 +67,7 @@ npm install @softomnitel/omnicall-kit
66
67
  закрытом npm registry:
67
68
 
68
69
  ```bash
69
- npm install @softomnitel/omnicall-kit@0.1.2
70
+ npm install @softomnitel/omnicall-kit@0.1.3
70
71
  ```
71
72
 
72
73
  Пакет ESM-only. Импортируйте его через `import`, а не `require`.
@@ -101,7 +102,7 @@ const client = createOmniCallClient({
101
102
  url: 'ws://127.0.0.1:17341/omnicall/v1/ws',
102
103
  origin: window.location.origin,
103
104
  application: { name: 'my-crm', version: '1.0.0' },
104
- sdkVersion: '0.1.2',
105
+ sdkVersion: '0.1.3',
105
106
  requestedProfile: 'call_controller',
106
107
  requestedCapabilities: [
107
108
  'session.read.redacted',
@@ -206,6 +207,61 @@ console.log(result.callId, result.revision);
206
207
  Не повторяйте автоматически `originate`, `hangup`, `logout` или
207
208
  `activateProfile` после reconnect. Эти действия могут сработать дважды.
208
209
 
210
+ ## Форматы успешных ответов
211
+
212
+ Асинхронная команда либо завершается типизированным успешным результатом, либо
213
+ отклоняет `Promise` с `OmniCallClientError`. Ошибка никогда не приходит как
214
+ частично успешный объект. Поле `revision` в успешном результате — версия Desktop
215
+ после команды; перед следующей мутацией всё равно получите свежий snapshot, если
216
+ события или другая вкладка могли изменить состояние.
217
+
218
+ | Команда | Успешный ответ | Как обрабатывать |
219
+ | --- | --- | --- |
220
+ | `calls.*` | `{ callId, revision }` | Команда принята для этого звонка. Фазу звонка показывайте по событию или snapshot, а не предполагаемому результату команды. |
221
+ | `operator.getReasons()` | `{ reasons: [{ id, label, kind }], revision }` | Фильтруйте по `kind`; в следующую команду передавайте выбранный числовой `id`. |
222
+ | `operator.changeStatus()` | `{ accepted: true, kind, targetStatus, reasonId, revision }` | Обязательно ветвитесь по `kind`: `applied` меняет статус сейчас, `reserved` только бронирует `targetStatus`/`reasonId` до конца обращения. |
223
+ | `operator.finishAppeal()` | Та же форма, что у `changeStatus()` | Разрешён только при `post_call_processing`; применяет бронь либо Desktop-default Ready. |
224
+ | `account.logout()` | `{ loggedOut: true, revision }` | Очищайте UI сессии после ответа/события или подтверждающего snapshot. `interaction_required` — это отклонение Promise, а не вариант успеха. |
225
+ | `account.activateProfile()` | `{ activated: true, mode, profileLabel?, alreadyAuthenticated?, revision }` | `alreadyAuthenticated: true` — успешный no-op. В ответе никогда нет пароля или ключа OCP. |
226
+ | `window.show()` / `hide()` / `getState()` | `{ visible, revision }` | Используйте фактическое `visible`; `show()` и `getState()` не требуют `expectedRevision`. |
227
+
228
+ ### Смена статуса и резервирование
229
+
230
+ `changeStatus()` — единственная публичная команда для намерения Ready/Break.
231
+ Не создавайте отдельный reserve API и не решайте на стороне CRM, занят ли оператор:
232
+ Desktop сам выбирает результат.
233
+
234
+ ```ts
235
+ const result = await client.operator.changeStatus({
236
+ target: 'break',
237
+ reasonId: 12,
238
+ expectedRevision: await getRevision()
239
+ });
240
+
241
+ if (result.kind === 'applied') {
242
+ // targetStatus применён сейчас; обновление UI всё равно подтвердят событие/snapshot.
243
+ } else {
244
+ // Бронь после текущего обращения: текущий статус-chip не становится Break.
245
+ // result.targetStatus и result.reasonId — забронированные значения.
246
+ }
247
+ ```
248
+
249
+ При `kind: 'reserved'` текущий публичный статус может остаться `unknown` во
250
+ время звонка или стать `post_call_processing` после него. Долгоживущую бронь
251
+ восстанавливайте только из свежего
252
+ `snapshot.sections.operator?.reservedTarget` /
253
+ `reservedReasonId` или `operator:status-changed`, особенно после reconnect.
254
+
255
+ Когда snapshot показывает `post_call_processing`, вызовите
256
+ `finishAppeal({ expectedRevision })`. Его успешный ответ имеет ту же форму:
257
+ `kind: 'applied'`, `targetStatus` и `reasonId` — значения, фактически применённые
258
+ Desktop. Вне post-call команда отклоняется `conflict`
259
+ (`failure_kind: 'not_in_post_call_processing'`); ждите корректный snapshot, а не
260
+ повторяйте запрос в цикле.
261
+
262
+ `error.details` остаётся расширяемым объектом. Не разбирайте его произвольные
263
+ поля: используйте type guard и `read*Details` из раздела API Reference.
264
+
209
265
  ## Состояния и события
210
266
 
211
267
  ### Состояния подключения
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@softomnitel/omnicall-kit",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "description": "Browser client for OmniCall Desktop local protocol (OmniCallClient read path + call control)",
5
5
  "type": "module",
6
6
  "private": false,