ktalk-cli 2.1.0__tar.gz → 3.0.2__tar.gz

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 (124) hide show
  1. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/.gitignore +4 -0
  2. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/PKG-INFO +55 -93
  3. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/README.md +54 -92
  4. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/pyproject.toml +1 -1
  5. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/src/ktalk_cli/auth.py +20 -71
  6. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/src/ktalk_cli/calendar_reader.py +2 -2
  7. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/src/ktalk_cli/cli.py +15 -1
  8. ktalk_cli-3.0.2/src/ktalk_cli/cli_doctor.py +147 -0
  9. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/src/ktalk_cli/cli_sync.py +11 -26
  10. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/src/ktalk_cli/cli_token.py +4 -9
  11. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/src/ktalk_cli/client.py +55 -124
  12. ktalk_cli-3.0.2/src/ktalk_cli/config.py +187 -0
  13. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/src/ktalk_cli/contacts.py +2 -2
  14. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/src/ktalk_cli/download.py +6 -30
  15. ktalk_cli-3.0.2/src/ktalk_cli/endpoints.py +84 -0
  16. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/src/ktalk_cli/formatters.py +10 -4
  17. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/src/ktalk_cli/host_config.py +4 -0
  18. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/src/ktalk_cli/meeting_body.py +40 -23
  19. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/src/ktalk_cli/meeting_scheduling.py +2 -2
  20. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/src/ktalk_cli/pagination.py +0 -15
  21. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/src/ktalk_cli/rooms.py +4 -4
  22. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/src/ktalk_cli/token_file.py +14 -0
  23. ktalk_cli-3.0.2/tests/test_auth_modes.py +84 -0
  24. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/test_calendar.py +3 -24
  25. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/test_cli_content.py +11 -7
  26. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/test_cli_host_config_wiring.py +70 -0
  27. ktalk_cli-3.0.2/tests/test_config.py +244 -0
  28. ktalk_cli-3.0.2/tests/test_diagnostics.py +111 -0
  29. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/test_download.py +7 -56
  30. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/test_formatters.py +67 -0
  31. ktalk_cli-3.0.2/tests/test_fr42_single_credential_source.py +114 -0
  32. ktalk_cli-3.0.2/tests/test_fr43_legacy_key_removal_warning.py +151 -0
  33. ktalk_cli-3.0.2/tests/test_fr44_auth_status_accepted_rejected.py +220 -0
  34. ktalk_cli-3.0.2/tests/test_fr47_missing_fields_completeness.py +146 -0
  35. ktalk_cli-3.0.2/tests/test_fr48_doctor_summary_diagnostics.py +464 -0
  36. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/test_meeting_cancel.py +6 -28
  37. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/test_meeting_scheduling.py +2 -24
  38. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/test_pagination.py +5 -16
  39. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/test_reconciliation.py +16 -16
  40. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/test_rooms.py +2 -22
  41. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/test_search_contacts.py +6 -39
  42. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/test_secret_masking.py +26 -16
  43. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/test_token_file.py +18 -33
  44. ktalk_cli-2.1.0/src/ktalk_cli/config.py +0 -152
  45. ktalk_cli-2.1.0/src/ktalk_cli/endpoints.py +0 -145
  46. ktalk_cli-2.1.0/tests/test_auth_modes.py +0 -243
  47. ktalk_cli-2.1.0/tests/test_config.py +0 -137
  48. ktalk_cli-2.1.0/tests/test_diagnostics.py +0 -224
  49. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/LICENSE +0 -0
  50. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/src/ktalk_cli/CLAUDE.md +0 -0
  51. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/src/ktalk_cli/__init__.py +0 -0
  52. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/src/ktalk_cli/cli_contacts.py +0 -0
  53. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/src/ktalk_cli/cli_content.py +0 -0
  54. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/src/ktalk_cli/cli_meeting.py +0 -0
  55. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/src/ktalk_cli/cli_meeting_args.py +0 -0
  56. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/src/ktalk_cli/cli_meeting_confirm.py +0 -0
  57. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/src/ktalk_cli/cli_meetings_read.py +0 -0
  58. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/src/ktalk_cli/cli_sanction.py +0 -0
  59. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/src/ktalk_cli/cli_store.py +0 -0
  60. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/src/ktalk_cli/confirmation.py +0 -0
  61. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/src/ktalk_cli/contour_diagnostics.py +0 -0
  62. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/src/ktalk_cli/enrichment.py +0 -0
  63. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/src/ktalk_cli/meeting_cancel.py +0 -0
  64. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/src/ktalk_cli/reconciliation.py +0 -0
  65. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/src/ktalk_cli/registry.py +0 -0
  66. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/src/ktalk_cli/store.py +0 -0
  67. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/src/ktalk_cli/store_migration.py +0 -0
  68. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/src/ktalk_cli/transcript_identity.py +0 -0
  69. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/src/ktalk_cli/write_journal.py +0 -0
  70. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/src/ktalk_cli/write_sanction.py +0 -0
  71. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/conftest.py +0 -0
  72. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/fixtures/access-info-expired.json +0 -0
  73. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/fixtures/access-info-full.json +0 -0
  74. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/fixtures/archive-8col.md +0 -0
  75. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/fixtures/archive-dup-id.md +0 -0
  76. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/fixtures/archive-escaped-pipe-7col.md +0 -0
  77. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/fixtures/archive-page1.json +0 -0
  78. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/fixtures/archive-page2-empty.json +0 -0
  79. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/fixtures/archive-pipe-in-name.md +0 -0
  80. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/fixtures/calendar-item-session.json +0 -0
  81. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/fixtures/chat-messages-session.json +0 -0
  82. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/fixtures/conference-history-session-oversized.json +0 -0
  83. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/fixtures/conference-history-session.json +0 -0
  84. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/fixtures/error-body-problem-json.json +0 -0
  85. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/fixtures/error-body-validation.json +0 -0
  86. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/fixtures/recording-detail-session-full-participants.json +0 -0
  87. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/fixtures/recording-detail-session-oversized-partial.json +0 -0
  88. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/fixtures/recording-detail-with-qualities.json +0 -0
  89. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/fixtures/recording-list-item-session.json +0 -0
  90. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/fixtures/recordings-list-apikey-page1.json +0 -0
  91. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/fixtures/recordings-list-apikey-page2.json +0 -0
  92. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/fixtures/registry-archive-2026-04.md +0 -0
  93. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/fixtures/registry.md +0 -0
  94. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/fixtures/room-detail-session.json +0 -0
  95. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/test_adr022_ktalk_cli_rename.py +0 -0
  96. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/test_archive.py +0 -0
  97. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/test_chat.py +0 -0
  98. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/test_cli.py +0 -0
  99. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/test_cli_config_show.py +0 -0
  100. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/test_cli_export_store_isolation.py +0 -0
  101. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/test_cli_meeting.py +0 -0
  102. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/test_cli_meeting_sanctioned.py +0 -0
  103. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/test_cli_meetings_surface.py +0 -0
  104. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/test_cli_migrate_to_central_store.py +0 -0
  105. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/test_client.py +0 -0
  106. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/test_concurrency.py +0 -0
  107. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/test_confirmation.py +0 -0
  108. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/test_contour_diagnostics.py +0 -0
  109. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/test_enrichment.py +0 -0
  110. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/test_fr19_auth_status.py +0 -0
  111. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/test_fr21_no_vault_layout.py +0 -0
  112. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/test_fr39_calendar_inclusive_end.py +0 -0
  113. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/test_fr40_timezone_format.py +0 -0
  114. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/test_fr41_last_synced.py +0 -0
  115. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/test_host_config.py +0 -0
  116. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/test_issue3_null_id_fallback.py +0 -0
  117. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/test_meeting_body.py +0 -0
  118. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/test_migration.py +0 -0
  119. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/test_nfr17_identity_verification.py +0 -0
  120. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/test_registry.py +0 -0
  121. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/test_store.py +0 -0
  122. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/test_store_migration.py +0 -0
  123. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/test_write_journal.py +0 -0
  124. {ktalk_cli-2.1.0 → ktalk_cli-3.0.2}/tests/test_write_sanction.py +0 -0
@@ -25,5 +25,9 @@ docs/*.har
25
25
  *.db
26
26
  .beads-credential-key
27
27
  .beads/proxieddb/
28
+ # Аудиторский сайдкар взаимодействий агентов (bd, audit.enabled) — локальная
29
+ # телеметрия прогона, не состояние трекера: оно живёт в Dolt и уезжает через
30
+ # refs/dolt/data (sync.remote в .beads/config.yaml), а не через этот файл.
31
+ .beads/interactions.jsonl
28
32
  *.gate.lock*
29
33
  packaging/*/dist/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: ktalk-cli
3
- Version: 2.1.0
3
+ Version: 3.0.2
4
4
  Summary: CLI for accessing Kontur Talk (KTalk) recordings, transcripts and summaries
5
5
  Project-URL: Homepage, https://github.com/mdemyanov/ktalk-cli
6
6
  Project-URL: Repository, https://github.com/mdemyanov/ktalk-cli
@@ -45,11 +45,11 @@ CLI `ktalk` — интерфейс командной строки для тех
45
45
  - Саммари и протоколы встреч.
46
46
  - Полный состав участников записи (обходит лимит в 6 из списковых ответов).
47
47
  - Скачивание видеофайла записи.
48
- - Архив встреч и историю чата (только с персональным API-ключом).
49
- - Конфигурацию комнаты и календарь запланированных встреч (только с session token).
48
+ - Историю чата встречи.
49
+ - Конфигурацию комнаты и календарь запланированных встреч.
50
50
  - Предпросмотр и создание новой встречи — создание требует интерактивного
51
51
  терминала и явного подтверждения, см. «Планирование встречи» ниже.
52
- - Диагностику авторизации — какой ключ/токен активен и почему запрос не проходит.
52
+ - Диагностику авторизации — жив ли токен и почему запрос не проходит.
53
53
  - Операционный реестр обработки записей на SQLite — синхронизация, статусы,
54
54
  markdown-зеркало для git, см. «Реестр записей» ниже.
55
55
 
@@ -90,20 +90,27 @@ uv tool upgrade ktalk-cli
90
90
 
91
91
  ## Авторизация
92
92
 
93
- CLI поддерживает два способа авторизации: session token (кука браузера) и
94
- персональный API-ключ. Способы исключают друг друга: если задать обе переменные,
95
- побеждает `KTALK_PERSONAL_API_KEY` — `KTALK_SESSION_TOKEN` в этом случае вообще не
96
- читается. Не задать ни один — команда завершится понятной ошибкой.
93
+ **С версии 3.0.0 CLI работает только через session token** (кука браузера) — режим
94
+ персонального API-ключа (`KTALK_PERSONAL_API_KEY`) снят целиком (ADR-025): он
95
+ конкурировал с сессией молча (при обеих заданных переменных побеждал ключ без
96
+ объяснения в тексте отказа) и диагностика `auth-status` объявляла заведомо
97
+ невалидный ключ «валидным» на 403.
97
98
 
98
- Персональный API-ключ не привязан к браузерной сессии и не протухает без предупреждения,
99
- в отличие от session token. Берите его, если нужна стабильная работа без ручного
100
- обновления, а не только разовый запрос.
99
+ **Цена снятия для тех, кто держал постоянный ключ:** персональный ключ не протухал
100
+ без предупреждения, session token — протухает. Постоянная работа теперь требует
101
+ ручного обновления токена по мере его протухания (`ktalk token set -`, см. ниже) —
102
+ это не восстанавливается автоматически снятием ключа.
103
+
104
+ Переменная `KTALK_PERSONAL_API_KEY`, если она всё ещё задана в окружении, не
105
+ читается как credential ни на одном шаге — CLI печатает об этом одно предупреждение
106
+ на stderr при каждом вызове и продолжает работу на сессионном токене.
101
107
 
102
108
  ### Session token
103
109
 
104
- Session token — токен вашей браузерной сессии Толка. Быстрый способ начать, но
105
- токен живёт недолго и протухает без предупреждения — при регулярном
106
- использовании удобнее персональный API-ключ (ниже).
110
+ Session token — токен вашей браузерной сессии Толка. Единственный поддерживаемый
111
+ источник credential (ADR-025). Живёт недолго и протухает без предупреждения — при
112
+ регулярной работе повторяйте те же два шага ниже, когда команда начнёт отказывать
113
+ кодом авторизации.
107
114
 
108
115
  **Два шага.** На вкладке, где вы залогинены в `https://your-domain.ktalk.ru`, откройте
109
116
  DevTools (`F12`, или `Cmd+Option+I` на Mac) → **Console** и выполните:
@@ -133,9 +140,11 @@ ktalk auth-status # жива ли авторизация — реальны
133
140
 
134
141
  | # | Источник | Комментарий |
135
142
  |---|---|---|
136
- | 1 | `KTALK_PERSONAL_API_KEY` | режим персонального ключа, сессия дальше не читается |
137
- | 2 | `KTALK_SESSION_TOKEN` (окружение или `.env` в рабочей директории) | заданное явно сильнее лежащего на диске |
138
- | 3 | `~/.config/ktalk-mcp/token` | дефолтный путь для повседневной работы |
143
+ | 1 | `KTALK_SESSION_TOKEN` (окружение или `.env` в рабочей директории) | заданное явно сильнее лежащего на диске |
144
+ | 2 | `~/.config/ktalk-mcp/token` | дефолтный путь для повседневной работы |
145
+
146
+ Ни один запрос не несёт заголовок `X-Auth-Token` — единственный транспорт credential
147
+ теперь query-параметр `sessionToken`.
139
148
 
140
149
  > Путь `~/.config/ktalk-mcp/token` не переименован вместе с пакетом и остаётся
141
150
  > таким намеренно: он выбран независимо от имени дистрибутива (каталог
@@ -156,57 +165,20 @@ ktalk auth-status # жива ли авторизация — реальны
156
165
  > ошибку авторизации, повторите те же два шага — `ktalk token set -` перезаписывает
157
166
  > файл, права переставлять не нужно.
158
167
 
159
- ### Персональный API-ключ
160
-
161
- Персональный API-ключ выдаётся в админке Толка на конкретного пользователя на
162
- настраиваемый срок и не зависит от того, открыт ли браузер. Передаётся заголовком
163
- `X-Auth-Token`, а не в URL — секрет не попадает в query-параметры и логи веб-сервера.
164
-
165
- Выпускается и ротируется в разделе **Управление → API-ключи** админки Толка (UI-шаг,
166
- CLI-эквивалента нет; экранные шаги здесь не расписываем — актуальный порядок действий
167
- смотрите в справке Контура:
168
- [«Персональный API-ключ доступа в Толке»](https://support.kontur.ru/talk/86797)).
169
- Значение ключа показывается один раз в течение часа после создания — не скопировали
170
- вовремя, придётся выпускать новый.
171
-
172
- **Не путайте с ключом пространства.** В Толке есть второй, отдельный ключ —
173
- пространственный, с заголовком `X-API-Key`, выдаётся не на пользователя, а на всё
174
- пространство целиком. `ktalk-cli` работает только с персональным ключом
175
- (`X-Auth-Token`); ключ пространства не поддерживается — переменная называется
176
- `KTALK_PERSONAL_API_KEY`, а не `KTALK_API_KEY`, намеренно, чтобы их не перепутать.
177
-
178
- При выпуске ключа в админке выбираются права (scope). Не хватает прав — запрос вернёт
179
- 403, и по виду это неотличимо от «ключ невалиден», хотя ключ рабочий (подробнее —
180
- «Диагностика авторизации» ниже).
181
-
182
- | Право (scope) | Даёт доступ к |
183
- |---|---|
184
- | `application.recording.read` | Список записей, детали, транскрипт, саммари, скачивание файла, участники |
185
- | `application.reporting.read` | Архив встреч, чат встречи, отчёты по участникам |
186
- | `application.applications.read` | Опционально. Без него `ktalk auth-status` не покажет состав прав и срок действия ключа — только «ключ живой / не живой» |
187
-
188
- > **Если реестр `ktalk` уже накопил записи в session-режиме,** перед первым `ktalk sync`
189
- > после переключения на персональный ключ обязательно выполните `ktalk sync --dry-run`.
190
- > Внутренний и официальный контуры API отдают идентификаторы записей по-разному, и без
191
- > сверки первый боевой sync под ключом рискует задвоить весь реестр. Команда только
192
- > сверяет id и ничего не пишет — см. таблицу команд реестра ниже.
193
-
194
168
  ### Переменные окружения
195
169
 
196
170
  ```bash
197
- export KTALK_PERSONAL_API_KEY="ваш_персональный_api_ключ"
198
- # или
199
171
  export KTALK_SESSION_TOKEN="ваш_session_token"
200
172
  export KTALK_BASE_URL="https://your-domain.ktalk.ru"
201
173
  ```
202
174
 
203
- Для session-режима переменная не обязательна: без неё читается файл
204
- `~/.config/ktalk-mcp/token` (см. «Session token»).
175
+ Переменная не обязательна: без неё читается файл `~/.config/ktalk-mcp/token`
176
+ (см. «Session token»).
205
177
 
206
178
  Также поддерживается файл `.env` в рабочей директории:
207
179
 
208
180
  ```env
209
- KTALK_PERSONAL_API_KEY=ваш_персональный_api_ключ
181
+ KTALK_SESSION_TOKEN=ваш_session_token
210
182
  KTALK_BASE_URL=https://your-domain.ktalk.ru
211
183
  ```
212
184
 
@@ -221,16 +193,17 @@ ktalk auth-status
221
193
  Диагностика различает два случая, которые снаружи выглядят одинаково — просто ошибка, —
222
194
  но чинятся по-разному:
223
195
 
224
- - **401** — ключ или токен невалиден либо истёк. Перевыпустите его.
225
- - **403** — ключ рабочий, но конкретному запросу не хватает прав (scope). Отредактируйте
226
- права ключа в админке Толка (см. таблицу в разделе «Персональный API-ключ» выше) —
227
- перевыпускать ключ не нужно.
196
+ - **401** — токен невалиден либо истёк. Обновите его: `ktalk token set -` (или
197
+ переменную `KTALK_SESSION_TOKEN`, если она задана).
198
+ - **403** — токен рабочий, но у текущей сессии нет прав на эту операцию.
199
+ Перевыпускать токен не нужно.
228
200
 
229
- У session token понятия scope нет — диагностика в этом режиме пробным запросом списка
230
- записей сообщает только «токен работает / не работает», без прав и срока действия.
201
+ У session token понятия scope и срока действия нет — диагностика выполняет реальный
202
+ пробный запрос (список записей), а не имитацию без сети.
231
203
 
232
- Режим ключа не проверен полностью на боевом окружении — команда описывает задуманное
233
- поведение, а не гарантию для любого ключа.
204
+ `--json`-ответ — `{"alive": bool, "note": str | None}`. Отказ пробного запроса виден
205
+ по обоим каналам сразу: поле `alive: false` в теле ответа И ненулевой код возврата
206
+ процесса — полагаться только на один из двух нельзя.
234
207
 
235
208
  ## Команды чтения записей и справочников
236
209
 
@@ -255,10 +228,10 @@ ktalk auth-status
255
228
  | `ktalk get-summary-type <recording_key> --type shortSummary\|protocol` | Саммари одного типа. |
256
229
  | `ktalk get-participants <recording_key>` | Полный состав участников, включая анонимных — обходит лимит в 6, который отдают `get-recording`/`list-recordings`. |
257
230
  | `ktalk download-recording <recording_key> --target PATH [--quality Q]` | Скачивает видеофайл потоково, без буферизации в памяти. Существующий файл не перезаписывается; `--quality` не указано — берётся дефолт для записи (например `900p`). |
258
- | `ktalk list-archive --from ISO --to ISO [--room-name N]` | Архив встреч за период. Только режим персонального ключа (право `application.reporting.read`). Читает всё окно на клиенте, без постраничного чтения. |
259
- | `ktalk get-chat-messages [--recording-key K \| --conference-key K] [--channel C]` | Сообщения чата встречи; один из двух ключей обязателен. Только режим персонального ключа. Канал не указан — определяется автоматически. |
260
- | `ktalk get-room <room_name>` | Конфигурация комнаты — политики аудио/видео/демонстрации, модераторы, SIP, чат, маскирование. Только режим session token. **Побочный эффект:** если комнаты с таким именем ещё нет, она создаётся. |
261
- | `ktalk list-calendar --start ISO --end ISO [--room-name N]` | Встречи за окно дат, видимые активной авторизации — это не «ваш личный календарь», а всё, что видит текущая авторизация, включая чужие встречи. Только режим session token. Сервер лимитирует один запрос семью днями и сотней встреч на сегмент — команда сама режет произвольное окно на сегменты; при упоре в потолок ответ предупреждает о возможно неполной выдаче. |
231
+ | `ktalk list-archive --from ISO --to ISO [--room-name N]` | Архив встреч за период. **Недоступна** — архив никогда не имел рабочего пути под session token; команда отказывает до сети с явным сообщением на каждый вызов (ADR-025). |
232
+ | `ktalk get-chat-messages [--recording-key K \| --conference-key K] [--channel C]` | Сообщения чата встречи; один из двух ключей обязателен. Канал не указан — определяется автоматически. |
233
+ | `ktalk get-room <room_name>` | Конфигурация комнаты — политики аудио/видео/демонстрации, модераторы, SIP, чат, маскирование. **Побочный эффект:** если комнаты с таким именем ещё нет, она создаётся. |
234
+ | `ktalk list-calendar --start ISO --end ISO [--room-name N]` | Встречи за окно дат, видимые активной авторизации — это не «ваш личный календарь», а всё, что видит текущая авторизация, включая чужие встречи. Сервер лимитирует один запрос семью днями и сотней встреч на сегмент — команда сама режет произвольное окно на сегменты; при упоре в потолок ответ предупреждает о возможно неполной выдаче. |
262
235
 
263
236
  ## Планирование встречи
264
237
 
@@ -271,8 +244,8 @@ ktalk auth-status
271
244
  перед отправкой печатает предпросмотр и требует набрать слово `да`.
272
245
  - Предпросмотр без создания — `ktalk create-meeting-preview`, не делает ни
273
246
  одного сетевого запроса.
274
- - Обе команды работают только в режиме session token — в режиме персонального
275
- ключа создание встречи не подтверждено ни разу и потому отключено.
247
+ - Обе команды используют session token — единственный оставшийся режим
248
+ авторизации (ADR-025).
276
249
 
277
250
  **Ни одно поле не имеет значения по умолчанию** (кроме описания встречи — пустая
278
251
  строка, если не задано). Тема, начало, конец, часовой пояс, комната, участники,
@@ -326,33 +299,22 @@ ktalk create-meeting-confirm \
326
299
 
327
300
  ## API
328
301
 
329
- CLI работает с KTalk Web API. Набор путей, которые вызывает клиент, зависит от
330
- активного режима авторизации (см. «Авторизация» выше):
331
-
332
- - **Session-режим** — авторизация query-параметром `sessionToken`, используется
333
- внутренний контур API.
334
- - **Режим персонального ключа** — авторизация заголовком `X-Auth-Token`, используются
335
- официальные пути интеграторского API (`talk.public.api-api-2.json`).
336
-
337
- Транскрипт и саммари используют один и тот же путь в обоих режимах:
302
+ CLI работает с KTalk Web API через единственный (session token) режим авторизации
303
+ (см. «Авторизация» выше) — query-параметр `sessionToken`, внутренний недокументированный
304
+ контур API:
338
305
 
339
306
  | Эндпоинт | Описание |
340
307
  |----------|----------|
308
+ | `GET /api/recordings` | Список записей |
309
+ | `GET /api/recordings/{id}` | Детали записи |
341
310
  | `GET /api/recordings/{id}/transcript` | Транскрипт |
342
311
  | `GET /api/recordings/v2/{id}/summary` | Полное саммари (v2) |
343
312
  | `GET /api/recordings/{id}/summary/{type}` | Саммари по типу |
344
313
 
345
- Список записей и детали записи используют разные пути в session- и api-key-режимах.
346
- Архив встреч, чат, полный состав участников, скачивание файла и диагностика ключа
347
- доступны только в режиме персонального ключа (нужные права — в таблице раздела
348
- «Персональный API-ключ» выше).
349
-
350
- Комната, календарь и создание встречи работают только в режиме session token — в
351
- режиме персонального ключа эти операции отказывают осознанно, а не по случайному
352
- пробелу: путь на api-key либо не подтверждён вовсе, либо ведёт себя необъяснимо
353
- непоследовательно при проверке.
314
+ Архив встреч (`list-archive`) недоступен: под session token у него нет и никогда не
315
+ было рабочего пути (ADR-025) — команда отказывает до сети с явным сообщением.
354
316
 
355
- > OpenAPI спецификация `talk.public.api-api-2.json` включена как справочник, но содержит расхождения с реальным API (пути, формат авторизации, структура ответов).
317
+ > OpenAPI спецификация `talk.public.api-api-2.json` включена как справочник, но содержит расхождения с реальным API (пути, формат авторизации, структура ответов). Пути, достижимые только под снятым режимом персонального ключа (`X-Auth-Token`), больше не применимы к этому CLI.
356
318
 
357
319
  ## Реестр записей (`ktalk`)
358
320
 
@@ -375,10 +337,10 @@ CLI работает с KTalk Web API. Набор путей, которые в
375
337
 
376
338
  | Команда | Назначение |
377
339
  |---|---|
378
- | `ktalk sync [--days 7] [--json] [--dry-run]` | Загрузить записи из KTalk, upsert новых (`new`), экспирировать `new` старше N дней → `skipped`, показать дашборд. Идемпотентно. `--dry-run` — сверить id с реестром без записи, ничего не пишет (обязателен перед первым `sync` в режиме персонального ключа — см. «Персональный API-ключ»). |
340
+ | `ktalk sync [--days 7] [--json] [--dry-run]` | Загрузить записи из KTalk, upsert новых (`new`), экспирировать `new` старше N дней → `skipped`, показать дашборд. Идемпотентно. `--dry-run` — сверить id с реестром без записи, ничего не пишет. |
379
341
  | `ktalk token set <значение\|->` | Записать session-токен в `~/.config/ktalk-mcp/token` (`0600`). `-` — прочитать из stdin: `pbpaste \| ktalk token set -`. Значение не печатается. |
380
342
  | `ktalk token status [--json]` | Есть ли файл токена, его права и маска значения. |
381
- | `ktalk auth-status [--json]` | Диагностика активной авторизации — жив ли ключ/токен, какие права у ключа. См. «Диагностика авторизации». |
343
+ | `ktalk auth-status [--json]` | Диагностика активной авторизации — жив ли токен. См. «Диагностика авторизации». |
382
344
  | `ktalk dashboard [--json]` | Дашборд: новые записи, статистика по статусам. |
383
345
  | `ktalk list [--status S] [--json]` | Список записей с фильтром по статусу. |
384
346
  | `ktalk show <id> [--json]` | Детали записи: участники, статус, пути, длительность. |
@@ -406,7 +368,7 @@ uv run pytest -v
406
368
  # Линтинг
407
369
  uv run ruff check .
408
370
 
409
- # Локальный запуск CLI (session token или KTALK_PERSONAL_API_KEY — см. «Авторизация»)
371
+ # Локальный запуск CLI (session token — см. «Авторизация»)
410
372
  KTALK_SESSION_TOKEN=... KTALK_BASE_URL=... uv run ktalk auth-status
411
373
  ```
412
374
 
@@ -22,11 +22,11 @@ CLI `ktalk` — интерфейс командной строки для тех
22
22
  - Саммари и протоколы встреч.
23
23
  - Полный состав участников записи (обходит лимит в 6 из списковых ответов).
24
24
  - Скачивание видеофайла записи.
25
- - Архив встреч и историю чата (только с персональным API-ключом).
26
- - Конфигурацию комнаты и календарь запланированных встреч (только с session token).
25
+ - Историю чата встречи.
26
+ - Конфигурацию комнаты и календарь запланированных встреч.
27
27
  - Предпросмотр и создание новой встречи — создание требует интерактивного
28
28
  терминала и явного подтверждения, см. «Планирование встречи» ниже.
29
- - Диагностику авторизации — какой ключ/токен активен и почему запрос не проходит.
29
+ - Диагностику авторизации — жив ли токен и почему запрос не проходит.
30
30
  - Операционный реестр обработки записей на SQLite — синхронизация, статусы,
31
31
  markdown-зеркало для git, см. «Реестр записей» ниже.
32
32
 
@@ -67,20 +67,27 @@ uv tool upgrade ktalk-cli
67
67
 
68
68
  ## Авторизация
69
69
 
70
- CLI поддерживает два способа авторизации: session token (кука браузера) и
71
- персональный API-ключ. Способы исключают друг друга: если задать обе переменные,
72
- побеждает `KTALK_PERSONAL_API_KEY` — `KTALK_SESSION_TOKEN` в этом случае вообще не
73
- читается. Не задать ни один — команда завершится понятной ошибкой.
70
+ **С версии 3.0.0 CLI работает только через session token** (кука браузера) — режим
71
+ персонального API-ключа (`KTALK_PERSONAL_API_KEY`) снят целиком (ADR-025): он
72
+ конкурировал с сессией молча (при обеих заданных переменных побеждал ключ без
73
+ объяснения в тексте отказа) и диагностика `auth-status` объявляла заведомо
74
+ невалидный ключ «валидным» на 403.
74
75
 
75
- Персональный API-ключ не привязан к браузерной сессии и не протухает без предупреждения,
76
- в отличие от session token. Берите его, если нужна стабильная работа без ручного
77
- обновления, а не только разовый запрос.
76
+ **Цена снятия для тех, кто держал постоянный ключ:** персональный ключ не протухал
77
+ без предупреждения, session token — протухает. Постоянная работа теперь требует
78
+ ручного обновления токена по мере его протухания (`ktalk token set -`, см. ниже) —
79
+ это не восстанавливается автоматически снятием ключа.
80
+
81
+ Переменная `KTALK_PERSONAL_API_KEY`, если она всё ещё задана в окружении, не
82
+ читается как credential ни на одном шаге — CLI печатает об этом одно предупреждение
83
+ на stderr при каждом вызове и продолжает работу на сессионном токене.
78
84
 
79
85
  ### Session token
80
86
 
81
- Session token — токен вашей браузерной сессии Толка. Быстрый способ начать, но
82
- токен живёт недолго и протухает без предупреждения — при регулярном
83
- использовании удобнее персональный API-ключ (ниже).
87
+ Session token — токен вашей браузерной сессии Толка. Единственный поддерживаемый
88
+ источник credential (ADR-025). Живёт недолго и протухает без предупреждения — при
89
+ регулярной работе повторяйте те же два шага ниже, когда команда начнёт отказывать
90
+ кодом авторизации.
84
91
 
85
92
  **Два шага.** На вкладке, где вы залогинены в `https://your-domain.ktalk.ru`, откройте
86
93
  DevTools (`F12`, или `Cmd+Option+I` на Mac) → **Console** и выполните:
@@ -110,9 +117,11 @@ ktalk auth-status # жива ли авторизация — реальны
110
117
 
111
118
  | # | Источник | Комментарий |
112
119
  |---|---|---|
113
- | 1 | `KTALK_PERSONAL_API_KEY` | режим персонального ключа, сессия дальше не читается |
114
- | 2 | `KTALK_SESSION_TOKEN` (окружение или `.env` в рабочей директории) | заданное явно сильнее лежащего на диске |
115
- | 3 | `~/.config/ktalk-mcp/token` | дефолтный путь для повседневной работы |
120
+ | 1 | `KTALK_SESSION_TOKEN` (окружение или `.env` в рабочей директории) | заданное явно сильнее лежащего на диске |
121
+ | 2 | `~/.config/ktalk-mcp/token` | дефолтный путь для повседневной работы |
122
+
123
+ Ни один запрос не несёт заголовок `X-Auth-Token` — единственный транспорт credential
124
+ теперь query-параметр `sessionToken`.
116
125
 
117
126
  > Путь `~/.config/ktalk-mcp/token` не переименован вместе с пакетом и остаётся
118
127
  > таким намеренно: он выбран независимо от имени дистрибутива (каталог
@@ -133,57 +142,20 @@ ktalk auth-status # жива ли авторизация — реальны
133
142
  > ошибку авторизации, повторите те же два шага — `ktalk token set -` перезаписывает
134
143
  > файл, права переставлять не нужно.
135
144
 
136
- ### Персональный API-ключ
137
-
138
- Персональный API-ключ выдаётся в админке Толка на конкретного пользователя на
139
- настраиваемый срок и не зависит от того, открыт ли браузер. Передаётся заголовком
140
- `X-Auth-Token`, а не в URL — секрет не попадает в query-параметры и логи веб-сервера.
141
-
142
- Выпускается и ротируется в разделе **Управление → API-ключи** админки Толка (UI-шаг,
143
- CLI-эквивалента нет; экранные шаги здесь не расписываем — актуальный порядок действий
144
- смотрите в справке Контура:
145
- [«Персональный API-ключ доступа в Толке»](https://support.kontur.ru/talk/86797)).
146
- Значение ключа показывается один раз в течение часа после создания — не скопировали
147
- вовремя, придётся выпускать новый.
148
-
149
- **Не путайте с ключом пространства.** В Толке есть второй, отдельный ключ —
150
- пространственный, с заголовком `X-API-Key`, выдаётся не на пользователя, а на всё
151
- пространство целиком. `ktalk-cli` работает только с персональным ключом
152
- (`X-Auth-Token`); ключ пространства не поддерживается — переменная называется
153
- `KTALK_PERSONAL_API_KEY`, а не `KTALK_API_KEY`, намеренно, чтобы их не перепутать.
154
-
155
- При выпуске ключа в админке выбираются права (scope). Не хватает прав — запрос вернёт
156
- 403, и по виду это неотличимо от «ключ невалиден», хотя ключ рабочий (подробнее —
157
- «Диагностика авторизации» ниже).
158
-
159
- | Право (scope) | Даёт доступ к |
160
- |---|---|
161
- | `application.recording.read` | Список записей, детали, транскрипт, саммари, скачивание файла, участники |
162
- | `application.reporting.read` | Архив встреч, чат встречи, отчёты по участникам |
163
- | `application.applications.read` | Опционально. Без него `ktalk auth-status` не покажет состав прав и срок действия ключа — только «ключ живой / не живой» |
164
-
165
- > **Если реестр `ktalk` уже накопил записи в session-режиме,** перед первым `ktalk sync`
166
- > после переключения на персональный ключ обязательно выполните `ktalk sync --dry-run`.
167
- > Внутренний и официальный контуры API отдают идентификаторы записей по-разному, и без
168
- > сверки первый боевой sync под ключом рискует задвоить весь реестр. Команда только
169
- > сверяет id и ничего не пишет — см. таблицу команд реестра ниже.
170
-
171
145
  ### Переменные окружения
172
146
 
173
147
  ```bash
174
- export KTALK_PERSONAL_API_KEY="ваш_персональный_api_ключ"
175
- # или
176
148
  export KTALK_SESSION_TOKEN="ваш_session_token"
177
149
  export KTALK_BASE_URL="https://your-domain.ktalk.ru"
178
150
  ```
179
151
 
180
- Для session-режима переменная не обязательна: без неё читается файл
181
- `~/.config/ktalk-mcp/token` (см. «Session token»).
152
+ Переменная не обязательна: без неё читается файл `~/.config/ktalk-mcp/token`
153
+ (см. «Session token»).
182
154
 
183
155
  Также поддерживается файл `.env` в рабочей директории:
184
156
 
185
157
  ```env
186
- KTALK_PERSONAL_API_KEY=ваш_персональный_api_ключ
158
+ KTALK_SESSION_TOKEN=ваш_session_token
187
159
  KTALK_BASE_URL=https://your-domain.ktalk.ru
188
160
  ```
189
161
 
@@ -198,16 +170,17 @@ ktalk auth-status
198
170
  Диагностика различает два случая, которые снаружи выглядят одинаково — просто ошибка, —
199
171
  но чинятся по-разному:
200
172
 
201
- - **401** — ключ или токен невалиден либо истёк. Перевыпустите его.
202
- - **403** — ключ рабочий, но конкретному запросу не хватает прав (scope). Отредактируйте
203
- права ключа в админке Толка (см. таблицу в разделе «Персональный API-ключ» выше) —
204
- перевыпускать ключ не нужно.
173
+ - **401** — токен невалиден либо истёк. Обновите его: `ktalk token set -` (или
174
+ переменную `KTALK_SESSION_TOKEN`, если она задана).
175
+ - **403** — токен рабочий, но у текущей сессии нет прав на эту операцию.
176
+ Перевыпускать токен не нужно.
205
177
 
206
- У session token понятия scope нет — диагностика в этом режиме пробным запросом списка
207
- записей сообщает только «токен работает / не работает», без прав и срока действия.
178
+ У session token понятия scope и срока действия нет — диагностика выполняет реальный
179
+ пробный запрос (список записей), а не имитацию без сети.
208
180
 
209
- Режим ключа не проверен полностью на боевом окружении — команда описывает задуманное
210
- поведение, а не гарантию для любого ключа.
181
+ `--json`-ответ — `{"alive": bool, "note": str | None}`. Отказ пробного запроса виден
182
+ по обоим каналам сразу: поле `alive: false` в теле ответа И ненулевой код возврата
183
+ процесса — полагаться только на один из двух нельзя.
211
184
 
212
185
  ## Команды чтения записей и справочников
213
186
 
@@ -232,10 +205,10 @@ ktalk auth-status
232
205
  | `ktalk get-summary-type <recording_key> --type shortSummary\|protocol` | Саммари одного типа. |
233
206
  | `ktalk get-participants <recording_key>` | Полный состав участников, включая анонимных — обходит лимит в 6, который отдают `get-recording`/`list-recordings`. |
234
207
  | `ktalk download-recording <recording_key> --target PATH [--quality Q]` | Скачивает видеофайл потоково, без буферизации в памяти. Существующий файл не перезаписывается; `--quality` не указано — берётся дефолт для записи (например `900p`). |
235
- | `ktalk list-archive --from ISO --to ISO [--room-name N]` | Архив встреч за период. Только режим персонального ключа (право `application.reporting.read`). Читает всё окно на клиенте, без постраничного чтения. |
236
- | `ktalk get-chat-messages [--recording-key K \| --conference-key K] [--channel C]` | Сообщения чата встречи; один из двух ключей обязателен. Только режим персонального ключа. Канал не указан — определяется автоматически. |
237
- | `ktalk get-room <room_name>` | Конфигурация комнаты — политики аудио/видео/демонстрации, модераторы, SIP, чат, маскирование. Только режим session token. **Побочный эффект:** если комнаты с таким именем ещё нет, она создаётся. |
238
- | `ktalk list-calendar --start ISO --end ISO [--room-name N]` | Встречи за окно дат, видимые активной авторизации — это не «ваш личный календарь», а всё, что видит текущая авторизация, включая чужие встречи. Только режим session token. Сервер лимитирует один запрос семью днями и сотней встреч на сегмент — команда сама режет произвольное окно на сегменты; при упоре в потолок ответ предупреждает о возможно неполной выдаче. |
208
+ | `ktalk list-archive --from ISO --to ISO [--room-name N]` | Архив встреч за период. **Недоступна** — архив никогда не имел рабочего пути под session token; команда отказывает до сети с явным сообщением на каждый вызов (ADR-025). |
209
+ | `ktalk get-chat-messages [--recording-key K \| --conference-key K] [--channel C]` | Сообщения чата встречи; один из двух ключей обязателен. Канал не указан — определяется автоматически. |
210
+ | `ktalk get-room <room_name>` | Конфигурация комнаты — политики аудио/видео/демонстрации, модераторы, SIP, чат, маскирование. **Побочный эффект:** если комнаты с таким именем ещё нет, она создаётся. |
211
+ | `ktalk list-calendar --start ISO --end ISO [--room-name N]` | Встречи за окно дат, видимые активной авторизации — это не «ваш личный календарь», а всё, что видит текущая авторизация, включая чужие встречи. Сервер лимитирует один запрос семью днями и сотней встреч на сегмент — команда сама режет произвольное окно на сегменты; при упоре в потолок ответ предупреждает о возможно неполной выдаче. |
239
212
 
240
213
  ## Планирование встречи
241
214
 
@@ -248,8 +221,8 @@ ktalk auth-status
248
221
  перед отправкой печатает предпросмотр и требует набрать слово `да`.
249
222
  - Предпросмотр без создания — `ktalk create-meeting-preview`, не делает ни
250
223
  одного сетевого запроса.
251
- - Обе команды работают только в режиме session token — в режиме персонального
252
- ключа создание встречи не подтверждено ни разу и потому отключено.
224
+ - Обе команды используют session token — единственный оставшийся режим
225
+ авторизации (ADR-025).
253
226
 
254
227
  **Ни одно поле не имеет значения по умолчанию** (кроме описания встречи — пустая
255
228
  строка, если не задано). Тема, начало, конец, часовой пояс, комната, участники,
@@ -303,33 +276,22 @@ ktalk create-meeting-confirm \
303
276
 
304
277
  ## API
305
278
 
306
- CLI работает с KTalk Web API. Набор путей, которые вызывает клиент, зависит от
307
- активного режима авторизации (см. «Авторизация» выше):
308
-
309
- - **Session-режим** — авторизация query-параметром `sessionToken`, используется
310
- внутренний контур API.
311
- - **Режим персонального ключа** — авторизация заголовком `X-Auth-Token`, используются
312
- официальные пути интеграторского API (`talk.public.api-api-2.json`).
313
-
314
- Транскрипт и саммари используют один и тот же путь в обоих режимах:
279
+ CLI работает с KTalk Web API через единственный (session token) режим авторизации
280
+ (см. «Авторизация» выше) — query-параметр `sessionToken`, внутренний недокументированный
281
+ контур API:
315
282
 
316
283
  | Эндпоинт | Описание |
317
284
  |----------|----------|
285
+ | `GET /api/recordings` | Список записей |
286
+ | `GET /api/recordings/{id}` | Детали записи |
318
287
  | `GET /api/recordings/{id}/transcript` | Транскрипт |
319
288
  | `GET /api/recordings/v2/{id}/summary` | Полное саммари (v2) |
320
289
  | `GET /api/recordings/{id}/summary/{type}` | Саммари по типу |
321
290
 
322
- Список записей и детали записи используют разные пути в session- и api-key-режимах.
323
- Архив встреч, чат, полный состав участников, скачивание файла и диагностика ключа
324
- доступны только в режиме персонального ключа (нужные права — в таблице раздела
325
- «Персональный API-ключ» выше).
326
-
327
- Комната, календарь и создание встречи работают только в режиме session token — в
328
- режиме персонального ключа эти операции отказывают осознанно, а не по случайному
329
- пробелу: путь на api-key либо не подтверждён вовсе, либо ведёт себя необъяснимо
330
- непоследовательно при проверке.
291
+ Архив встреч (`list-archive`) недоступен: под session token у него нет и никогда не
292
+ было рабочего пути (ADR-025) — команда отказывает до сети с явным сообщением.
331
293
 
332
- > OpenAPI спецификация `talk.public.api-api-2.json` включена как справочник, но содержит расхождения с реальным API (пути, формат авторизации, структура ответов).
294
+ > OpenAPI спецификация `talk.public.api-api-2.json` включена как справочник, но содержит расхождения с реальным API (пути, формат авторизации, структура ответов). Пути, достижимые только под снятым режимом персонального ключа (`X-Auth-Token`), больше не применимы к этому CLI.
333
295
 
334
296
  ## Реестр записей (`ktalk`)
335
297
 
@@ -352,10 +314,10 @@ CLI работает с KTalk Web API. Набор путей, которые в
352
314
 
353
315
  | Команда | Назначение |
354
316
  |---|---|
355
- | `ktalk sync [--days 7] [--json] [--dry-run]` | Загрузить записи из KTalk, upsert новых (`new`), экспирировать `new` старше N дней → `skipped`, показать дашборд. Идемпотентно. `--dry-run` — сверить id с реестром без записи, ничего не пишет (обязателен перед первым `sync` в режиме персонального ключа — см. «Персональный API-ключ»). |
317
+ | `ktalk sync [--days 7] [--json] [--dry-run]` | Загрузить записи из KTalk, upsert новых (`new`), экспирировать `new` старше N дней → `skipped`, показать дашборд. Идемпотентно. `--dry-run` — сверить id с реестром без записи, ничего не пишет. |
356
318
  | `ktalk token set <значение\|->` | Записать session-токен в `~/.config/ktalk-mcp/token` (`0600`). `-` — прочитать из stdin: `pbpaste \| ktalk token set -`. Значение не печатается. |
357
319
  | `ktalk token status [--json]` | Есть ли файл токена, его права и маска значения. |
358
- | `ktalk auth-status [--json]` | Диагностика активной авторизации — жив ли ключ/токен, какие права у ключа. См. «Диагностика авторизации». |
320
+ | `ktalk auth-status [--json]` | Диагностика активной авторизации — жив ли токен. См. «Диагностика авторизации». |
359
321
  | `ktalk dashboard [--json]` | Дашборд: новые записи, статистика по статусам. |
360
322
  | `ktalk list [--status S] [--json]` | Список записей с фильтром по статусу. |
361
323
  | `ktalk show <id> [--json]` | Детали записи: участники, статус, пути, длительность. |
@@ -383,7 +345,7 @@ uv run pytest -v
383
345
  # Линтинг
384
346
  uv run ruff check .
385
347
 
386
- # Локальный запуск CLI (session token или KTALK_PERSONAL_API_KEY — см. «Авторизация»)
348
+ # Локальный запуск CLI (session token — см. «Авторизация»)
387
349
  KTALK_SESSION_TOKEN=... KTALK_BASE_URL=... uv run ktalk auth-status
388
350
  ```
389
351
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "ktalk-cli"
3
- version = "2.1.0"
3
+ version = "3.0.2"
4
4
  description = "CLI for accessing Kontur Talk (KTalk) recordings, transcripts and summaries"
5
5
  readme = "README.md"
6
6
  license = "MIT"