@dipertq/dsh-openviking-status 0.1.7 → 0.2.0

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.
package/lib/client.d.cts CHANGED
@@ -40,6 +40,36 @@ interface CommitResult {
40
40
  ok: boolean;
41
41
  error?: string;
42
42
  }
43
+ /**
44
+ * Исход попытки прочитать сессию.
45
+ *
46
+ * Причина неудачи важна: при `auth_mode: api_key` демон отвечает на `/health`
47
+ * и отказывает на сессии, и «нечитаемо» нельзя показывать как «накоплено ноль».
48
+ */
49
+ type SessionReadResult =
50
+ /** Сессия прочитана. */
51
+ {
52
+ status: "ok";
53
+ session: SessionStatus;
54
+ }
55
+ /** Демон требует ключ, которого у клиента нет. */
56
+ | {
57
+ status: "unauthorized";
58
+ }
59
+ /** Демон не знает такой сессии. */
60
+ | {
61
+ status: "missing";
62
+ }
63
+ /** До демона не удалось достучаться. */
64
+ | {
65
+ status: "unreachable";
66
+ detail?: string;
67
+ }
68
+ /** Демон ответил ошибкой или неожиданным телом. */
69
+ | {
70
+ status: "error";
71
+ detail?: string;
72
+ };
43
73
  /**
44
74
  * Синонимы доменных понятий из CONTEXT.md
45
75
  */
@@ -61,10 +91,25 @@ declare function resolveApiKey(apiKey?: string): string | undefined;
61
91
  * Клиент REST API для взаимодействия с сессиями демона OpenViking
62
92
  */
63
93
  declare class OpenVikingClient {
64
- readonly endpoint: string;
65
- readonly apiKey?: string;
94
+ endpoint: string;
95
+ apiKey?: string;
66
96
  private resolvedSessionIds;
67
97
  constructor(endpoint?: string, apiKey?: string);
98
+ /**
99
+ * Обновление конфигурации клиента на лету (например, после сохранения настроек в UI).
100
+ */
101
+ updateConfig(config: {
102
+ endpoint?: string;
103
+ apiKey?: string;
104
+ }): void;
105
+ /**
106
+ * Очистить кэш разрешенных идентификаторов сессий.
107
+ */
108
+ clearResolvedSessions(): void;
109
+ /**
110
+ * Проверка, работает ли клиент через DSH Web Server proxy.
111
+ */
112
+ private isProxy;
68
113
  /**
69
114
  * Формирование заголовков запроса, включая опциональный заголовок авторизации
70
115
  */
@@ -79,8 +124,18 @@ declare class OpenVikingClient {
79
124
  */
80
125
  checkHealth(): Promise<HealthStatus>;
81
126
  /**
82
- * Получение метаданных сессии по идентификатору с автоматическим разрешением префикса.
83
- * При сетевых сбоях или ошибках авторизации возвращает null, не выбрасывая исключений.
127
+ * Чтение метаданных сессии с явной причиной неудачи.
128
+ *
129
+ * Демон может работать с `auth_mode: api_key`: тогда `/health` остаётся
130
+ * открытым, а сессия отвечает 401. Схлопывать это в «нет данных» нельзя —
131
+ * иначе интерфейс покажет живой индикатор рядом с нулями и умолчит о том,
132
+ * что счётчики просто недоступны.
133
+ */
134
+ readSession(sessionId: string): Promise<SessionReadResult>;
135
+ /**
136
+ * Получение метаданных сессии по идентификатору.
137
+ * Обёртка над {@link readSession} для вызывающих, которым причина неудачи
138
+ * не нужна: любая неудача сводится к null.
84
139
  */
85
140
  fetchSession(sessionId: string): Promise<SessionStatus | null>;
86
141
  /**
@@ -113,6 +168,66 @@ declare function getSession(sessionId: string, endpoint?: string, apiKey?: strin
113
168
  */
114
169
  declare function commitSession(sessionId: string, options?: CommitOptions, endpoint?: string, apiKey?: string): Promise<CommitResult>;
115
170
 
171
+ /**
172
+ * Соответствие «визуальная роль → свойство темы DSH».
173
+ *
174
+ * Плагин стилизуется инлайново, поэтому каждое обращение к теме — строка
175
+ * `var(--dsw-…)`. CSS-переменные падают на fallback молча, и опечатка в имени
176
+ * выглядит как работающий код: именно так плагин однажды уехал на шестнадцать
177
+ * несуществующих свойств и перестал следовать теме вовсе, сохранив осмысленный
178
+ * вид.
179
+ *
180
+ * Единая таблица делает набор имён проверяемым как данные (`tests/theme.test.ts`
181
+ * сверяет их с тем, что объявляет `@deepseek-ai/dsh-client-ui-theme`), а заодно
182
+ * не даёт разойтись значениям между чипом и поповером.
183
+ *
184
+ * Значения подобраны по штатным компонентам DSH: чип повторяет `StatsPills`,
185
+ * панель — диалог статистики сессии из `@deepseek-ai/dsh-client-ui-chat`.
186
+ */
187
+ declare const THEME: {
188
+ /** Фон всплывающей панели — тот же, что у меню и диалогов DSH. */
189
+ readonly panelSurface: "--dsw-specific-menu";
190
+ /** Тень панели. */
191
+ readonly panelElevation: "--dsw-elevation-prominent";
192
+ /** Контур панели; задаётся через переменную тени, а не через border. */
193
+ readonly panelStroke: "--dsw-alias-border-l1";
194
+ /** Заголовки и акцентный текст. */
195
+ readonly labelPrimary: "--dsw-alias-label-primary";
196
+ /** Основной текст панели. */
197
+ readonly labelSecondary: "--dsw-alias-label-secondary";
198
+ /** Приглушённый текст: подписи, значения, текст чипа в покое. */
199
+ readonly labelTertiary: "--dsw-alias-label-tertiary";
200
+ /** Разделительная линия внутри панели. */
201
+ readonly hairline: "--dsw-alias-border-l2";
202
+ /** Подсветка интерактивного элемента под курсором. */
203
+ readonly hoverBackground: "--dsw-alias-interactive-bg-hover";
204
+ /** Подсветка нажатого элемента. */
205
+ readonly activeBackground: "--dsw-alias-interactive-bg-active";
206
+ /** Демон доступен. */
207
+ readonly stateSuccess: "--dsw-alias-state-success-primary";
208
+ /** Демон недоступен или сессия нечитаема. */
209
+ readonly stateError: "--dsw-alias-state-error-primary";
210
+ /** Идёт коммит, либо накоплено близко к порогу. */
211
+ readonly stateWarning: "--dsw-alias-state-warn-primary";
212
+ /** Утопленная поверхность: дорожка прогресс-бара. */
213
+ readonly insetSurface: "--dsw-alias-bg-layer-2";
214
+ /** Заливка основной кнопки действий. */
215
+ readonly buttonPrimaryFill: "--dsw-alias-button-primary-fill";
216
+ /** Цвет текста на основной кнопке действий. */
217
+ readonly buttonPrimaryText: "--dsw-alias-label-primary-inverted";
218
+ /** Моноширинный шрифт для идентификаторов и путей. */
219
+ readonly fontMono: "--dsw-font-markdown-code-font-family";
220
+ };
221
+ /** Роль в карте темы. */
222
+ type ThemeRole = keyof typeof THEME;
223
+ /**
224
+ * Ссылка на свойство темы для инлайнового стиля.
225
+ *
226
+ * Намеренно без fallback: подставленное значение скрыло бы отсутствующее
227
+ * свойство и вернуло бы ровно тот сбой, ради которого заведена эта карта.
228
+ */
229
+ declare function themeVar(role: ThemeRole): string;
230
+
116
231
  interface RecalledMemoryItem {
117
232
  uri: string;
118
233
  category?: string;
@@ -149,15 +264,25 @@ declare function inferCategory(uri: string): string | undefined;
149
264
  declare function parseRecalledMemories(input: string | any[] | null | undefined): RecalledMemoriesResult;
150
265
 
151
266
  declare const COMMIT_THRESHOLD = 20000;
267
+ /**
268
+ * Селектор поверх снимка диалога — стандартный проп слотов со скоупом сессии.
269
+ * Штатные чипы статистики DSH читают узлы ровно так же.
270
+ */
271
+ type UseChat = (selector: (snapshot: any) => any) => any;
152
272
  interface OpenVikingStatusChipProps {
153
273
  sessionId: string;
154
- messages?: any[];
274
+ /** Стандартный проп слота: доступ к снимку текущего диалога. */
275
+ useChat?: UseChat;
276
+ /** Узлы диалога напрямую — для вызова вне слота и для тестов. */
277
+ messages?: unknown;
278
+ /** Готовый текст диалога; приоритетнее остальных источников. */
155
279
  contextText?: string;
156
280
  client?: OpenVikingClient;
157
281
  onCommit?: () => void;
158
282
  className?: string;
159
283
  initialHealth?: HealthStatus;
160
284
  initialSessionData?: SessionStatus;
285
+ initialSessionRead?: SessionReadResult;
161
286
  initialOpen?: boolean;
162
287
  }
163
288
  /**
@@ -173,39 +298,41 @@ declare function formatStatusLabel(isOnline: boolean, recalledCount: number, pen
173
298
  /**
174
299
  * Формирование доступного заголовка / подсказки (title / aria-label).
175
300
  */
176
- declare function formatTooltipTitle({ isOnline, isCommitting, recalledCount, pendingTokens, }: {
301
+ declare function formatTooltipTitle({ isOnline, isCommitting, recalledCount, pendingTokens, sessionUnreadable, }: {
177
302
  isOnline: boolean;
178
303
  isCommitting?: boolean;
179
304
  recalledCount: number;
180
305
  pendingTokens: number;
306
+ sessionUnreadable?: boolean;
181
307
  }): string;
182
308
  /**
183
- * Определение цвета индикатора состояния:
184
- * - Офлайн: красный
185
- * - Коммит: желтый / янтарный
186
- * - Онлайн: зеленый
309
+ * Состояние индикатора: офлайн, нечитаемая сессия, коммит или норма.
187
310
  */
188
- declare function getStatusIndicatorColor(isOnline: boolean, isCommitting?: boolean): string;
311
+ declare function getStatusIndicatorColor(isOnline: boolean, isCommitting?: boolean, sessionUnreadable?: boolean): string;
189
312
  /**
190
- * Определение свечения индикатора:
191
- * Мягкое свечение только при статусе Online.
192
- */
193
- declare function getStatusGlow(isOnline: boolean, isCommitting?: boolean): string;
194
- /**
195
- * Извлечение сообщений сессии из глобального хранилища DSH (Redux store или window fallback).
313
+ * Извлечение текста из снимка диалога DSH.
314
+ *
315
+ * Узлы разнородны: текст лежит то в `content` строкой, то массивом блоков, то
316
+ * в `text`. Парсер воспоминаний работает по тексту, поэтому снимок сводится к
317
+ * одной строке, а неизвестные формы просто пропускаются.
196
318
  */
197
- declare function getFallbackSessionMessages(sessionId: string): any[] | undefined;
319
+ declare function chatNodesToText(nodes: unknown): string;
198
320
  /**
199
- * Status Chip UI-компонент отображения состояния памяти OpenViking.
200
- * Формат в соответствии с CONTEXT.md:
201
- * 🟢 OV: <recalled> rec · <pending>k pend (или OV offline при недоступности сервиса).
321
+ * Status Chip: состояние памяти OpenViking в строке статистики под композером.
322
+ *
323
+ * Внешняя обёртка над {@link StatusChipView}: выбирает источник диалога.
324
+ * `useChat` — стандартный проп слота и сам по себе хук, поэтому вызывать его
325
+ * условно нельзя; развилка сделана выбором компонента, а не условием внутри
326
+ * одного.
202
327
  */
203
- declare function OpenVikingStatusChip({ sessionId, messages, contextText, client, onCommit, className, initialHealth, initialSessionData, initialOpen, }: OpenVikingStatusChipProps): React.JSX.Element;
328
+ declare function OpenVikingStatusChip(props: OpenVikingStatusChipProps): React.JSX.Element;
204
329
 
205
330
  interface OpenVikingStatusPopoverProps {
206
331
  sessionId: string;
207
332
  health: HealthStatus | null;
208
333
  sessionData: SessionStatus | null;
334
+ /** Исход чтения сессии: отличает «нет доступа» от «накоплено ноль». */
335
+ sessionRead?: SessionReadResult | null;
209
336
  recalledResult?: RecalledMemoriesResult;
210
337
  endpoint?: string;
211
338
  isCommitting?: boolean;
@@ -220,24 +347,27 @@ interface OpenVikingStatusPopoverProps {
220
347
  */
221
348
  declare function getProgressBarPercent(pendingTokens: number, threshold?: number): number;
222
349
  /**
223
- * Цветовой сдвиг шкалы токенов:
224
- * - зеленый (< 80%)
225
- * - желтый / янтарный (>= 80%)
350
+ * Цветовой сдвиг шкалы токенов: предупреждение при приближении к порогу.
226
351
  */
227
352
  declare function getProgressBarColor(percent: number): string;
353
+ /**
354
+ * Версия демона для показа в бейдже.
355
+ *
356
+ * OpenViking отдаёт `version` уже с префиксом (`v0.4.20`), а собственный `v`
357
+ * сверху давал `vv0.4.20`. Нормализуем, а не срезаем: префикс добавляется
358
+ * только если его нет, поэтому оба соглашения демона выглядят одинаково.
359
+ */
360
+ declare function formatDaemonVersion(version?: string): string | undefined;
228
361
  /**
229
362
  * Форматирование относительного времени для метки последнего коммита (например, "2m ago").
230
363
  */
231
364
  declare function formatRelativeTime(isoOrTimestamp?: string | number | null, now?: number): string | undefined;
232
365
  /**
233
366
  * Извлечение имени конечного файла или относительного пути из viking:// URI.
234
- * Например:
235
- * viking://user/dsh/memories/preferences/user/code_style.md -> user/code_style.md
236
- * viking://user/dsh/memories/entities/project/wrench_board.md -> project/wrench_board.md
237
367
  */
238
368
  declare function formatMemoryLeafName(uri: string): string;
239
369
  /**
240
- * Форматирование адреса эндпоинта для отображения (удаляет протокол http:// / https://).
370
+ * Форматирование адреса эндпоинта для отображения (удаляет протокол).
241
371
  */
242
372
  declare function formatEndpoint(endpoint?: string): string;
243
373
  /**
@@ -245,9 +375,12 @@ declare function formatEndpoint(endpoint?: string): string;
245
375
  */
246
376
  declare function truncateSessionId(id: string, maxLen?: number): string;
247
377
  /**
248
- * Получение стилей бейджа категории воспоминания.
378
+ * Стиль бейджа категории.
379
+ *
380
+ * Эталонная панель DSH не кодирует категории цветом, а подходящих цветовых
381
+ * свойств тема не объявляет — поэтому все бейджи одинаковые и приглушённые.
249
382
  */
250
- declare function getCategoryBadgeStyle(category?: string): React.CSSProperties;
383
+ declare function getCategoryBadgeStyle(_category?: string): React.CSSProperties;
251
384
  /**
252
385
  * Обработка нажатия клавиши Escape для закрытия панели.
253
386
  */
@@ -256,8 +389,24 @@ declare function handleEscapeKey(event: {
256
389
  }, onClose?: () => void): boolean;
257
390
  /**
258
391
  * Панель детального состояния контекстной памяти OpenViking (Status Popover).
392
+ *
393
+ * Оформление повторяет диалог статистики сессии DSH: та же поверхность, тень,
394
+ * радиус, отступы и кегль.
259
395
  */
260
- declare function OpenVikingStatusPopover({ sessionId, health, sessionData, recalledResult, endpoint, isCommitting, commitError, onCommitNow, onClose, className, style, }: OpenVikingStatusPopoverProps): React.JSX.Element;
396
+ declare function OpenVikingStatusPopover({ sessionId, health, sessionData, sessionRead, recalledResult, endpoint, isCommitting, commitError, onCommitNow, onClose, className, style, }: OpenVikingStatusPopoverProps): React.JSX.Element;
397
+
398
+ interface OpenVikingConfigData {
399
+ endpoint: string;
400
+ hasApiKey: boolean;
401
+ source: "env" | "ovcli" | "ov" | "settings" | "default";
402
+ }
403
+ interface OpenVikingSettingsSectionProps {
404
+ initialConfig?: OpenVikingConfigData;
405
+ onConfigSaved?: (config: OpenVikingConfigData) => void;
406
+ className?: string;
407
+ style?: React.CSSProperties;
408
+ }
409
+ declare function OpenVikingSettingsSection({ initialConfig, onConfigSaved, className, style, }: OpenVikingSettingsSectionProps): React.JSX.Element;
261
410
 
262
411
  type OpenVikingSessionData = SessionStatus;
263
412
  type OpenVikingHealth = HealthStatus;
@@ -268,10 +417,11 @@ declare const inject: string[];
268
417
  /**
269
418
  * Точка входа клиентского плагина DSH.
270
419
  *
271
- * Занимает одну ячейку в `conversation.input.right` — списочном слоте строки
272
- * ввода со скоупом сессии. Скоуп означает, что `sessionId` приходит в компонент
273
- * как стандартный проп: доставать его из глобального стора не требуется.
420
+ * 1. Занимает ячейку в `conversation.composer.dock` — чип со статусом OpenViking
421
+ * под композером чата.
422
+ * 2. Регистрирует раздел `settings.section` страницу настроек OpenViking Status
423
+ * в меню настроек DSH Desktop и Web.
274
424
  */
275
425
  declare function apply(ctx: any): void;
276
426
 
277
- export { COMMIT_THRESHOLD, type CommitOptions, type CommitResult, DEFAULT_OPENVIKING_ENDPOINT, type HealthStatus, OpenVikingClient, type OpenVikingHealth, type OpenVikingSessionData, OpenVikingStatusChip, type OpenVikingStatusChipProps, OpenVikingStatusPopover, type OpenVikingStatusPopoverProps, type PeerId, type PendingTokens, type RecalledMemoriesResult, type RecalledMemoryItem, type SessionStatus, apply, checkHealth, commitSession, defaultOpenVikingClient, fetchSession, formatEndpoint, formatMemoryLeafName, formatPendingTokens, formatRelativeTime, formatStatusLabel, formatTooltipTitle, getCategoryBadgeStyle, getFallbackSessionMessages, getProgressBarColor, getProgressBarPercent, getSession, getStatusGlow, getStatusIndicatorColor, handleEscapeKey, inferCategory, inject, name, parseRecalledMemories, resolveApiKey, resolveEndpoint, truncateSessionId };
427
+ export { COMMIT_THRESHOLD, type CommitOptions, type CommitResult, DEFAULT_OPENVIKING_ENDPOINT, type HealthStatus, OpenVikingClient, type OpenVikingConfigData, type OpenVikingHealth, type OpenVikingSessionData, OpenVikingSettingsSection, type OpenVikingSettingsSectionProps, OpenVikingStatusChip, type OpenVikingStatusChipProps, OpenVikingStatusPopover, type OpenVikingStatusPopoverProps, type PeerId, type PendingTokens, type RecalledMemoriesResult, type RecalledMemoryItem, type SessionReadResult, type SessionStatus, THEME, type ThemeRole, type UseChat, apply, chatNodesToText, checkHealth, commitSession, defaultOpenVikingClient, fetchSession, formatDaemonVersion, formatEndpoint, formatMemoryLeafName, formatPendingTokens, formatRelativeTime, formatStatusLabel, formatTooltipTitle, getCategoryBadgeStyle, getProgressBarColor, getProgressBarPercent, getSession, getStatusIndicatorColor, handleEscapeKey, inferCategory, inject, name, parseRecalledMemories, resolveApiKey, resolveEndpoint, themeVar, truncateSessionId };