@dipertq/dsh-openviking-status 0.1.7 → 0.1.8

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
  */
@@ -79,8 +109,18 @@ declare class OpenVikingClient {
79
109
  */
80
110
  checkHealth(): Promise<HealthStatus>;
81
111
  /**
82
- * Получение метаданных сессии по идентификатору с автоматическим разрешением префикса.
83
- * При сетевых сбоях или ошибках авторизации возвращает null, не выбрасывая исключений.
112
+ * Чтение метаданных сессии с явной причиной неудачи.
113
+ *
114
+ * Демон может работать с `auth_mode: api_key`: тогда `/health` остаётся
115
+ * открытым, а сессия отвечает 401. Схлопывать это в «нет данных» нельзя —
116
+ * иначе интерфейс покажет живой индикатор рядом с нулями и умолчит о том,
117
+ * что счётчики просто недоступны.
118
+ */
119
+ readSession(sessionId: string): Promise<SessionReadResult>;
120
+ /**
121
+ * Получение метаданных сессии по идентификатору.
122
+ * Обёртка над {@link readSession} для вызывающих, которым причина неудачи
123
+ * не нужна: любая неудача сводится к null.
84
124
  */
85
125
  fetchSession(sessionId: string): Promise<SessionStatus | null>;
86
126
  /**
@@ -113,6 +153,62 @@ declare function getSession(sessionId: string, endpoint?: string, apiKey?: strin
113
153
  */
114
154
  declare function commitSession(sessionId: string, options?: CommitOptions, endpoint?: string, apiKey?: string): Promise<CommitResult>;
115
155
 
156
+ /**
157
+ * Соответствие «визуальная роль → свойство темы DSH».
158
+ *
159
+ * Плагин стилизуется инлайново, поэтому каждое обращение к теме — строка
160
+ * `var(--dsw-…)`. CSS-переменные падают на fallback молча, и опечатка в имени
161
+ * выглядит как работающий код: именно так плагин однажды уехал на шестнадцать
162
+ * несуществующих свойств и перестал следовать теме вовсе, сохранив осмысленный
163
+ * вид.
164
+ *
165
+ * Единая таблица делает набор имён проверяемым как данные (`tests/theme.test.ts`
166
+ * сверяет их с тем, что объявляет `@deepseek-ai/dsh-client-ui-theme`), а заодно
167
+ * не даёт разойтись значениям между чипом и поповером.
168
+ *
169
+ * Значения подобраны по штатным компонентам DSH: чип повторяет `StatsPills`,
170
+ * панель — диалог статистики сессии из `@deepseek-ai/dsh-client-ui-chat`.
171
+ */
172
+ declare const THEME: {
173
+ /** Фон всплывающей панели — тот же, что у меню и диалогов DSH. */
174
+ readonly panelSurface: "--dsw-specific-menu";
175
+ /** Тень панели. */
176
+ readonly panelElevation: "--dsw-elevation-prominent";
177
+ /** Контур панели; задаётся через переменную тени, а не через border. */
178
+ readonly panelStroke: "--dsw-alias-border-l1";
179
+ /** Заголовки и акцентный текст. */
180
+ readonly labelPrimary: "--dsw-alias-label-primary";
181
+ /** Основной текст панели. */
182
+ readonly labelSecondary: "--dsw-alias-label-secondary";
183
+ /** Приглушённый текст: подписи, значения, текст чипа в покое. */
184
+ readonly labelTertiary: "--dsw-alias-label-tertiary";
185
+ /** Разделительная линия внутри панели. */
186
+ readonly hairline: "--dsw-alias-border-l2";
187
+ /** Подсветка интерактивного элемента под курсором. */
188
+ readonly hoverBackground: "--dsw-alias-interactive-bg-hover";
189
+ /** Подсветка нажатого элемента. */
190
+ readonly activeBackground: "--dsw-alias-interactive-bg-active";
191
+ /** Демон доступен. */
192
+ readonly stateSuccess: "--dsw-alias-state-success-primary";
193
+ /** Демон недоступен или сессия нечитаема. */
194
+ readonly stateError: "--dsw-alias-state-error-primary";
195
+ /** Идёт коммит, либо накоплено близко к порогу. */
196
+ readonly stateWarning: "--dsw-alias-state-warn-primary";
197
+ /** Утопленная поверхность: дорожка прогресс-бара. */
198
+ readonly insetSurface: "--dsw-alias-bg-layer-2";
199
+ /** Моноширинный шрифт для идентификаторов и путей. */
200
+ readonly fontMono: "--dsw-font-markdown-code-font-family";
201
+ };
202
+ /** Роль в карте темы. */
203
+ type ThemeRole = keyof typeof THEME;
204
+ /**
205
+ * Ссылка на свойство темы для инлайнового стиля.
206
+ *
207
+ * Намеренно без fallback: подставленное значение скрыло бы отсутствующее
208
+ * свойство и вернуло бы ровно тот сбой, ради которого заведена эта карта.
209
+ */
210
+ declare function themeVar(role: ThemeRole): string;
211
+
116
212
  interface RecalledMemoryItem {
117
213
  uri: string;
118
214
  category?: string;
@@ -149,15 +245,25 @@ declare function inferCategory(uri: string): string | undefined;
149
245
  declare function parseRecalledMemories(input: string | any[] | null | undefined): RecalledMemoriesResult;
150
246
 
151
247
  declare const COMMIT_THRESHOLD = 20000;
248
+ /**
249
+ * Селектор поверх снимка диалога — стандартный проп слотов со скоупом сессии.
250
+ * Штатные чипы статистики DSH читают узлы ровно так же.
251
+ */
252
+ type UseChat = (selector: (snapshot: any) => any) => any;
152
253
  interface OpenVikingStatusChipProps {
153
254
  sessionId: string;
154
- messages?: any[];
255
+ /** Стандартный проп слота: доступ к снимку текущего диалога. */
256
+ useChat?: UseChat;
257
+ /** Узлы диалога напрямую — для вызова вне слота и для тестов. */
258
+ messages?: unknown;
259
+ /** Готовый текст диалога; приоритетнее остальных источников. */
155
260
  contextText?: string;
156
261
  client?: OpenVikingClient;
157
262
  onCommit?: () => void;
158
263
  className?: string;
159
264
  initialHealth?: HealthStatus;
160
265
  initialSessionData?: SessionStatus;
266
+ initialSessionRead?: SessionReadResult;
161
267
  initialOpen?: boolean;
162
268
  }
163
269
  /**
@@ -173,39 +279,41 @@ declare function formatStatusLabel(isOnline: boolean, recalledCount: number, pen
173
279
  /**
174
280
  * Формирование доступного заголовка / подсказки (title / aria-label).
175
281
  */
176
- declare function formatTooltipTitle({ isOnline, isCommitting, recalledCount, pendingTokens, }: {
282
+ declare function formatTooltipTitle({ isOnline, isCommitting, recalledCount, pendingTokens, sessionUnreadable, }: {
177
283
  isOnline: boolean;
178
284
  isCommitting?: boolean;
179
285
  recalledCount: number;
180
286
  pendingTokens: number;
287
+ sessionUnreadable?: boolean;
181
288
  }): string;
182
289
  /**
183
- * Определение цвета индикатора состояния:
184
- * - Офлайн: красный
185
- * - Коммит: желтый / янтарный
186
- * - Онлайн: зеленый
290
+ * Состояние индикатора: офлайн, нечитаемая сессия, коммит или норма.
187
291
  */
188
- declare function getStatusIndicatorColor(isOnline: boolean, isCommitting?: boolean): string;
292
+ declare function getStatusIndicatorColor(isOnline: boolean, isCommitting?: boolean, sessionUnreadable?: boolean): string;
189
293
  /**
190
- * Определение свечения индикатора:
191
- * Мягкое свечение только при статусе Online.
192
- */
193
- declare function getStatusGlow(isOnline: boolean, isCommitting?: boolean): string;
194
- /**
195
- * Извлечение сообщений сессии из глобального хранилища DSH (Redux store или window fallback).
294
+ * Извлечение текста из снимка диалога DSH.
295
+ *
296
+ * Узлы разнородны: текст лежит то в `content` строкой, то массивом блоков, то
297
+ * в `text`. Парсер воспоминаний работает по тексту, поэтому снимок сводится к
298
+ * одной строке, а неизвестные формы просто пропускаются.
196
299
  */
197
- declare function getFallbackSessionMessages(sessionId: string): any[] | undefined;
300
+ declare function chatNodesToText(nodes: unknown): string;
198
301
  /**
199
- * Status Chip UI-компонент отображения состояния памяти OpenViking.
200
- * Формат в соответствии с CONTEXT.md:
201
- * 🟢 OV: <recalled> rec · <pending>k pend (или OV offline при недоступности сервиса).
302
+ * Status Chip: состояние памяти OpenViking в строке статистики под композером.
303
+ *
304
+ * Внешняя обёртка над {@link StatusChipView}: выбирает источник диалога.
305
+ * `useChat` — стандартный проп слота и сам по себе хук, поэтому вызывать его
306
+ * условно нельзя; развилка сделана выбором компонента, а не условием внутри
307
+ * одного.
202
308
  */
203
- declare function OpenVikingStatusChip({ sessionId, messages, contextText, client, onCommit, className, initialHealth, initialSessionData, initialOpen, }: OpenVikingStatusChipProps): React.JSX.Element;
309
+ declare function OpenVikingStatusChip(props: OpenVikingStatusChipProps): React.JSX.Element;
204
310
 
205
311
  interface OpenVikingStatusPopoverProps {
206
312
  sessionId: string;
207
313
  health: HealthStatus | null;
208
314
  sessionData: SessionStatus | null;
315
+ /** Исход чтения сессии: отличает «нет доступа» от «накоплено ноль». */
316
+ sessionRead?: SessionReadResult | null;
209
317
  recalledResult?: RecalledMemoriesResult;
210
318
  endpoint?: string;
211
319
  isCommitting?: boolean;
@@ -220,24 +328,27 @@ interface OpenVikingStatusPopoverProps {
220
328
  */
221
329
  declare function getProgressBarPercent(pendingTokens: number, threshold?: number): number;
222
330
  /**
223
- * Цветовой сдвиг шкалы токенов:
224
- * - зеленый (< 80%)
225
- * - желтый / янтарный (>= 80%)
331
+ * Цветовой сдвиг шкалы токенов: предупреждение при приближении к порогу.
226
332
  */
227
333
  declare function getProgressBarColor(percent: number): string;
334
+ /**
335
+ * Версия демона для показа в бейдже.
336
+ *
337
+ * OpenViking отдаёт `version` уже с префиксом (`v0.4.20`), а собственный `v`
338
+ * сверху давал `vv0.4.20`. Нормализуем, а не срезаем: префикс добавляется
339
+ * только если его нет, поэтому оба соглашения демона выглядят одинаково.
340
+ */
341
+ declare function formatDaemonVersion(version?: string): string | undefined;
228
342
  /**
229
343
  * Форматирование относительного времени для метки последнего коммита (например, "2m ago").
230
344
  */
231
345
  declare function formatRelativeTime(isoOrTimestamp?: string | number | null, now?: number): string | undefined;
232
346
  /**
233
347
  * Извлечение имени конечного файла или относительного пути из 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
348
  */
238
349
  declare function formatMemoryLeafName(uri: string): string;
239
350
  /**
240
- * Форматирование адреса эндпоинта для отображения (удаляет протокол http:// / https://).
351
+ * Форматирование адреса эндпоинта для отображения (удаляет протокол).
241
352
  */
242
353
  declare function formatEndpoint(endpoint?: string): string;
243
354
  /**
@@ -245,9 +356,12 @@ declare function formatEndpoint(endpoint?: string): string;
245
356
  */
246
357
  declare function truncateSessionId(id: string, maxLen?: number): string;
247
358
  /**
248
- * Получение стилей бейджа категории воспоминания.
359
+ * Стиль бейджа категории.
360
+ *
361
+ * Эталонная панель DSH не кодирует категории цветом, а подходящих цветовых
362
+ * свойств тема не объявляет — поэтому все бейджи одинаковые и приглушённые.
249
363
  */
250
- declare function getCategoryBadgeStyle(category?: string): React.CSSProperties;
364
+ declare function getCategoryBadgeStyle(_category?: string): React.CSSProperties;
251
365
  /**
252
366
  * Обработка нажатия клавиши Escape для закрытия панели.
253
367
  */
@@ -256,8 +370,11 @@ declare function handleEscapeKey(event: {
256
370
  }, onClose?: () => void): boolean;
257
371
  /**
258
372
  * Панель детального состояния контекстной памяти OpenViking (Status Popover).
373
+ *
374
+ * Оформление повторяет диалог статистики сессии DSH: та же поверхность, тень,
375
+ * радиус, отступы и кегль.
259
376
  */
260
- declare function OpenVikingStatusPopover({ sessionId, health, sessionData, recalledResult, endpoint, isCommitting, commitError, onCommitNow, onClose, className, style, }: OpenVikingStatusPopoverProps): React.JSX.Element;
377
+ declare function OpenVikingStatusPopover({ sessionId, health, sessionData, sessionRead, recalledResult, endpoint, isCommitting, commitError, onCommitNow, onClose, className, style, }: OpenVikingStatusPopoverProps): React.JSX.Element;
261
378
 
262
379
  type OpenVikingSessionData = SessionStatus;
263
380
  type OpenVikingHealth = HealthStatus;
@@ -268,10 +385,15 @@ declare const inject: string[];
268
385
  /**
269
386
  * Точка входа клиентского плагина DSH.
270
387
  *
271
- * Занимает одну ячейку в `conversation.input.right` — списочном слоте строки
272
- * ввода со скоупом сессии. Скоуп означает, что `sessionId` приходит в компонент
273
- * как стандартный проп: доставать его из глобального стора не требуется.
388
+ * Занимает ячейку в `conversation.composer.dock` — списочном слоте строки
389
+ * статистики под композером, где уже живут чипы вроде «24 turns 645 steps».
390
+ * Там место пассивным показаниям; внутри композера чип читался как управляющий
391
+ * элемент.
392
+ *
393
+ * Слот со скоупом сессии, поэтому `sessionId` и `useChat` приходят стандартными
394
+ * пропами. Свой `id` обязателен: чужой занял бы и заменил ячейку соседа, а
395
+ * `order` выше нуля ставит чип после штатной статистики.
274
396
  */
275
397
  declare function apply(ctx: any): void;
276
398
 
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 };
399
+ 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 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 };