@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/README.md +19 -3
- package/lib/client.cjs +385 -367
- package/lib/client.cjs.map +1 -1
- package/lib/client.d.cts +156 -34
- package/lib/client.js +382 -367
- package/lib/client.js.map +1 -1
- package/package.json +3 -2
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
|
-
*
|
|
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
|
-
|
|
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
|
-
*
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
* Извлечение сообщений сессии из глобального хранилища DSH (Redux store или window fallback).
|
|
294
|
+
* Извлечение текста из снимка диалога DSH.
|
|
295
|
+
*
|
|
296
|
+
* Узлы разнородны: текст лежит то в `content` строкой, то массивом блоков, то
|
|
297
|
+
* в `text`. Парсер воспоминаний работает по тексту, поэтому снимок сводится к
|
|
298
|
+
* одной строке, а неизвестные формы просто пропускаются.
|
|
196
299
|
*/
|
|
197
|
-
declare function
|
|
300
|
+
declare function chatNodesToText(nodes: unknown): string;
|
|
198
301
|
/**
|
|
199
|
-
* Status Chip
|
|
200
|
-
*
|
|
201
|
-
*
|
|
302
|
+
* Status Chip: состояние памяти OpenViking в строке статистики под композером.
|
|
303
|
+
*
|
|
304
|
+
* Внешняя обёртка над {@link StatusChipView}: выбирает источник диалога.
|
|
305
|
+
* `useChat` — стандартный проп слота и сам по себе хук, поэтому вызывать его
|
|
306
|
+
* условно нельзя; развилка сделана выбором компонента, а не условием внутри
|
|
307
|
+
* одного.
|
|
202
308
|
*/
|
|
203
|
-
declare function OpenVikingStatusChip(
|
|
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
|
-
* Форматирование адреса эндпоинта для отображения (удаляет протокол
|
|
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(
|
|
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
|
-
* Занимает
|
|
272
|
-
*
|
|
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,
|
|
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 };
|