@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/README.md +11 -3
- package/lib/client.cjs +1103 -367
- package/lib/client.cjs.map +1 -1
- package/lib/client.d.cts +186 -36
- package/lib/client.js +1100 -367
- package/lib/client.js.map +1 -1
- package/lib/index.d.ts +32 -4
- package/lib/index.js +1206 -5
- package/lib/index.js.map +1 -1
- package/package.json +6 -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
|
*/
|
|
@@ -61,10 +91,25 @@ declare function resolveApiKey(apiKey?: string): string | undefined;
|
|
|
61
91
|
* Клиент REST API для взаимодействия с сессиями демона OpenViking
|
|
62
92
|
*/
|
|
63
93
|
declare class OpenVikingClient {
|
|
64
|
-
|
|
65
|
-
|
|
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
|
-
*
|
|
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
|
-
|
|
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
|
-
*
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
* Извлечение сообщений сессии из глобального хранилища DSH (Redux store или window fallback).
|
|
313
|
+
* Извлечение текста из снимка диалога DSH.
|
|
314
|
+
*
|
|
315
|
+
* Узлы разнородны: текст лежит то в `content` строкой, то массивом блоков, то
|
|
316
|
+
* в `text`. Парсер воспоминаний работает по тексту, поэтому снимок сводится к
|
|
317
|
+
* одной строке, а неизвестные формы просто пропускаются.
|
|
196
318
|
*/
|
|
197
|
-
declare function
|
|
319
|
+
declare function chatNodesToText(nodes: unknown): string;
|
|
198
320
|
/**
|
|
199
|
-
* Status Chip
|
|
200
|
-
*
|
|
201
|
-
*
|
|
321
|
+
* Status Chip: состояние памяти OpenViking в строке статистики под композером.
|
|
322
|
+
*
|
|
323
|
+
* Внешняя обёртка над {@link StatusChipView}: выбирает источник диалога.
|
|
324
|
+
* `useChat` — стандартный проп слота и сам по себе хук, поэтому вызывать его
|
|
325
|
+
* условно нельзя; развилка сделана выбором компонента, а не условием внутри
|
|
326
|
+
* одного.
|
|
202
327
|
*/
|
|
203
|
-
declare function OpenVikingStatusChip(
|
|
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
|
-
* Форматирование адреса эндпоинта для отображения (удаляет протокол
|
|
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(
|
|
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
|
-
* Занимает
|
|
272
|
-
*
|
|
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,
|
|
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 };
|