@dipertq/dsh-openviking-status 0.2.2 → 0.3.1
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 +1 -1
- package/lib/client.cjs +689 -12
- package/lib/client.cjs.map +1 -1
- package/lib/client.d.cts +242 -3
- package/lib/client.js +689 -12
- package/lib/client.js.map +1 -1
- package/lib/index.js +173 -1
- package/lib/index.js.map +1 -1
- package/package.json +1 -1
package/lib/client.d.cts
CHANGED
|
@@ -35,12 +35,139 @@ interface CommitOptions {
|
|
|
35
35
|
keep_recent_count?: number;
|
|
36
36
|
}
|
|
37
37
|
/**
|
|
38
|
-
* Результат операции коммита
|
|
38
|
+
* Результат операции коммита сессии.
|
|
39
|
+
*
|
|
40
|
+
* Коммит двухфазный: `task_id` — идентификатор фоновой задачи Phase 2
|
|
41
|
+
* (Memory Extraction). Пробрасывается из ответа демона как оптимизация —
|
|
42
|
+
* позволяет чипу мгновенно привязаться к задаче, не дожидаясь опроса списка.
|
|
39
43
|
*/
|
|
40
44
|
interface CommitResult {
|
|
41
45
|
ok: boolean;
|
|
42
46
|
error?: string;
|
|
47
|
+
/** Идентификатор фоновой задачи извлечения (Phase 2), если демон его вернул. */
|
|
48
|
+
task_id?: string;
|
|
49
|
+
/** Разрешённый `resource_id` формы `dsh-session-<uuid>`. */
|
|
50
|
+
resource_id?: string;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Статус жизненного цикла фоновой задачи извлечения (Phase 2).
|
|
54
|
+
* Дробного прогресса *внутри* задачи демон не отдаёт — только эти состояния.
|
|
55
|
+
*/
|
|
56
|
+
type ExtractionTaskStatus = "pending" | "running" | "completed" | "failed";
|
|
57
|
+
/**
|
|
58
|
+
* Одна фоновая задача Phase 2 (`task_type: session_commit`).
|
|
59
|
+
*
|
|
60
|
+
* Промежуточные `stage`/`operation`/`meta` демон держит пустыми (`null`/`{}`);
|
|
61
|
+
* `result`/`token_usage` заполняются только по завершении.
|
|
62
|
+
*/
|
|
63
|
+
interface ExtractionTask {
|
|
64
|
+
task_id: string;
|
|
65
|
+
status: ExtractionTaskStatus;
|
|
66
|
+
resource_id?: string;
|
|
67
|
+
created_at?: string;
|
|
68
|
+
updated_at?: string;
|
|
69
|
+
/** Итог завершённой задачи: сколько воспоминаний записано/отредактировано. */
|
|
70
|
+
memory_write?: number;
|
|
71
|
+
memory_edit?: number;
|
|
72
|
+
/** Расход токенов завершённой задачи. */
|
|
73
|
+
token_usage?: number;
|
|
74
|
+
/** Текст ошибки для `failed`. */
|
|
75
|
+
error?: string;
|
|
43
76
|
}
|
|
77
|
+
/**
|
|
78
|
+
* Разбивка задач сессии по статусам. Считается на клиенте из одного списка —
|
|
79
|
+
* `running` и `pending` учитываются раздельно (демон их не схлопывает).
|
|
80
|
+
*/
|
|
81
|
+
interface ExtractionBreakdown {
|
|
82
|
+
running: number;
|
|
83
|
+
pending: number;
|
|
84
|
+
completed: number;
|
|
85
|
+
failed: number;
|
|
86
|
+
total: number;
|
|
87
|
+
/** Первая *выполняющаяся* задача (для «Show log» живого извлечения). */
|
|
88
|
+
firstRunning: ExtractionTask | null;
|
|
89
|
+
/** Последняя *завершённая* задача (для строки last extraction). */
|
|
90
|
+
lastCompleted: ExtractionTask | null;
|
|
91
|
+
/** Последняя *провалившаяся* задача (для warning-глифа и текста ошибки). */
|
|
92
|
+
lastFailed: ExtractionTask | null;
|
|
93
|
+
}
|
|
94
|
+
/** Одно событие ленты `execution_events` задачи (для «Show log»). */
|
|
95
|
+
interface ExecutionEvent {
|
|
96
|
+
seq?: number;
|
|
97
|
+
recorded_at?: string;
|
|
98
|
+
kind?: string;
|
|
99
|
+
status?: string;
|
|
100
|
+
stage?: string | null;
|
|
101
|
+
operation?: string | null;
|
|
102
|
+
error?: string | null;
|
|
103
|
+
}
|
|
104
|
+
/** Исход чтения списка задач сессии. */
|
|
105
|
+
type TasksReadResult = {
|
|
106
|
+
status: "ok";
|
|
107
|
+
breakdown: ExtractionBreakdown;
|
|
108
|
+
tasks: ExtractionTask[];
|
|
109
|
+
} | {
|
|
110
|
+
status: "unauthorized";
|
|
111
|
+
} | {
|
|
112
|
+
status: "missing";
|
|
113
|
+
} | {
|
|
114
|
+
status: "unreachable";
|
|
115
|
+
detail?: string;
|
|
116
|
+
} | {
|
|
117
|
+
status: "error";
|
|
118
|
+
detail?: string;
|
|
119
|
+
};
|
|
120
|
+
/** Исход чтения одной задачи с лентой событий. */
|
|
121
|
+
type TaskEventsResult = {
|
|
122
|
+
status: "ok";
|
|
123
|
+
task: ExtractionTask;
|
|
124
|
+
events: ExecutionEvent[];
|
|
125
|
+
} | {
|
|
126
|
+
status: "unauthorized";
|
|
127
|
+
} | {
|
|
128
|
+
status: "missing";
|
|
129
|
+
} | {
|
|
130
|
+
status: "unreachable";
|
|
131
|
+
detail?: string;
|
|
132
|
+
} | {
|
|
133
|
+
status: "error";
|
|
134
|
+
detail?: string;
|
|
135
|
+
};
|
|
136
|
+
/** Верхняя граница `limit` списка задач у демона. */
|
|
137
|
+
declare const TASKS_LIMIT_CAP = 200;
|
|
138
|
+
/**
|
|
139
|
+
* Нормализовать временную метку в ISO-строку.
|
|
140
|
+
*
|
|
141
|
+
* Демон OpenViking отдаёт `created_at` / `updated_at` как числом секунд
|
|
142
|
+
* (Unix timestamp), так и ISO-строками в `created_at_iso` / `updated_at_iso`.
|
|
143
|
+
*/
|
|
144
|
+
declare function normalizeTimestamp(ts: unknown, isoFallback?: unknown): string | undefined;
|
|
145
|
+
/**
|
|
146
|
+
* Извлечь массив сырых задач из ответа демона OpenViking.
|
|
147
|
+
*
|
|
148
|
+
* OpenViking GET /api/v1/tasks возвращает `{ status: "ok", result: [ ... ] }`,
|
|
149
|
+
* где `result` — сам массив задач. Также поддерживаются варианты с `items`,
|
|
150
|
+
* `tasks`, вложенным `result.items` или плоским массивом в корне.
|
|
151
|
+
*/
|
|
152
|
+
declare function extractTaskList(data: unknown): unknown[];
|
|
153
|
+
/**
|
|
154
|
+
* Привести сырую задачу демона к {@link ExtractionTask}.
|
|
155
|
+
*
|
|
156
|
+
* `result` завершённой задачи несёт `memories_extracted{memory_write,memory_edit}`
|
|
157
|
+
* и `token_usage`; форма может лежать как в корне, так и во вложенном `result`.
|
|
158
|
+
*/
|
|
159
|
+
declare function normalizeExtractionTask(raw: Record<string, unknown>): ExtractionTask | null;
|
|
160
|
+
/**
|
|
161
|
+
* Свести список задач в разбивку по статусам.
|
|
162
|
+
*
|
|
163
|
+
* Список приходит отсортированным по убыванию времени, поэтому первая
|
|
164
|
+
* `completed`/`failed` — самая свежая. `running` и `pending` считаются
|
|
165
|
+
* раздельно: мигание чипа завязано строго на `running`, backlog — на
|
|
166
|
+
* `pending`/`failed`.
|
|
167
|
+
*/
|
|
168
|
+
declare function computeBreakdown(tasks: ExtractionTask[]): ExtractionBreakdown;
|
|
169
|
+
/** Нормализовать одно сырое событие ленты `execution_events`. */
|
|
170
|
+
declare function normalizeExecutionEvent(raw: Record<string, unknown>): ExecutionEvent;
|
|
44
171
|
/**
|
|
45
172
|
* Исход попытки прочитать сессию.
|
|
46
173
|
*
|
|
@@ -151,7 +278,24 @@ declare class OpenVikingClient {
|
|
|
151
278
|
* Инициация фиксации (коммита) накопленных токенов сессии в долговременную память
|
|
152
279
|
*/
|
|
153
280
|
commitSession(sessionId: string, options?: CommitOptions): Promise<CommitResult>;
|
|
281
|
+
/**
|
|
282
|
+
* Список задач Phase 2 (Memory Extraction) текущей сессии со сводной
|
|
283
|
+
* разбивкой по статусам.
|
|
284
|
+
*
|
|
285
|
+
* Через прокси: один запрос `GET /tasks?session=<id>`, разбивка считается
|
|
286
|
+
* здесь. Напрямую: разрешаем `resource_id` через кандидатов и запрашиваем
|
|
287
|
+
* `GET /api/v1/tasks?resource_id=<id>&task_type=session_commit&limit=200`.
|
|
288
|
+
*/
|
|
289
|
+
listTasks(sessionId: string): Promise<TasksReadResult>;
|
|
290
|
+
/**
|
|
291
|
+
* Лениво загрузить одну задачу с лентой `execution_events` для «Show log».
|
|
292
|
+
*/
|
|
293
|
+
fetchTaskEvents(taskId: string): Promise<TaskEventsResult>;
|
|
154
294
|
}
|
|
295
|
+
/**
|
|
296
|
+
* Нормализовать массив сырых задач, отбросив нераспознанные записи.
|
|
297
|
+
*/
|
|
298
|
+
declare function normalizeTaskList(raw: unknown): ExtractionTask[];
|
|
155
299
|
/**
|
|
156
300
|
* Экземпляр клиента по умолчанию с автоматическим определением конфигурации
|
|
157
301
|
*/
|
|
@@ -269,6 +413,63 @@ declare function inferCategory(uri: string): string | undefined;
|
|
|
269
413
|
declare function parseRecalledMemories(input: string | any[] | null | undefined): RecalledMemoriesResult;
|
|
270
414
|
|
|
271
415
|
declare const COMMIT_THRESHOLD = 20000;
|
|
416
|
+
/** Интервалы адаптивного поллинга: покой vs активная фаза извлечения. */
|
|
417
|
+
declare const POLL_INTERVAL_IDLE_MS = 15000;
|
|
418
|
+
declare const POLL_INTERVAL_ACTIVE_MS = 2500;
|
|
419
|
+
/**
|
|
420
|
+
* Определяет, находится ли опрос в активной фазе (2.5с вместо 15с).
|
|
421
|
+
*
|
|
422
|
+
* Активная фаза включается как при выполнении (`running >= 1`), так и при
|
|
423
|
+
* наличии задач в очереди (`pending >= 1`), чтобы успеть поймать запуск
|
|
424
|
+
* до завершения быстрой задачи.
|
|
425
|
+
*/
|
|
426
|
+
declare function shouldPollActive(breakdown?: ExtractionBreakdown | null): boolean;
|
|
427
|
+
/**
|
|
428
|
+
* Состояние точки статуса (StateDot).
|
|
429
|
+
*
|
|
430
|
+
* - `offline` — демон недоступен (красный).
|
|
431
|
+
* - `session-unreadable` — сессия за ключом, счётчики недоступны (жёлтый статичный).
|
|
432
|
+
* - `busy` — идёт извлечение памяти (`running >= 1`): акцентный пульс.
|
|
433
|
+
* - `extraction-failed` — последняя задача провалилась: жёлтый + warning-глиф.
|
|
434
|
+
* - `online-idle` — норма (зелёный).
|
|
435
|
+
*
|
|
436
|
+
* Мигание завязано *строго* на `running`: `pending`-only не пульсирует.
|
|
437
|
+
*/
|
|
438
|
+
type ChipDotState = "offline" | "session-unreadable" | "busy" | "extraction-failed" | "online-idle";
|
|
439
|
+
/**
|
|
440
|
+
* Свести состояние демона, сессии и разбивку задач Phase 2 к состоянию точки.
|
|
441
|
+
*
|
|
442
|
+
* Приоритет: недоступность демона → нечитаемая сессия → активное извлечение →
|
|
443
|
+
* провал последней задачи → норма. Провал показываем только когда *хвост*
|
|
444
|
+
* непуст (есть свежий `failed`) и при этом ничего не выполняется.
|
|
445
|
+
*/
|
|
446
|
+
declare function getChipDotState({ isOnline, sessionUnreadable, breakdown, }: {
|
|
447
|
+
isOnline: boolean;
|
|
448
|
+
sessionUnreadable: boolean;
|
|
449
|
+
breakdown?: ExtractionBreakdown | null;
|
|
450
|
+
}): ChipDotState;
|
|
451
|
+
/**
|
|
452
|
+
* Warning-глиф (circle-alert) для состояния `extraction-failed`.
|
|
453
|
+
*
|
|
454
|
+
* Инлайновый SVG, а не иконка из примитивов DSH: набор экспортируемых имён у
|
|
455
|
+
* примитивов не гарантирован, а отсутствующий глиф молча стал бы невидимым —
|
|
456
|
+
* ровно тот отказ, который прячется под работающим кодом. `currentColor`
|
|
457
|
+
* наследует цвет предупреждения от родителя.
|
|
458
|
+
*/
|
|
459
|
+
declare function WarningGlyph({ size, testId, }: {
|
|
460
|
+
size?: number;
|
|
461
|
+
testId?: string;
|
|
462
|
+
}): React.JSX.Element;
|
|
463
|
+
/**
|
|
464
|
+
* Оптимистично добавить `running`-задачу в разбивку после коммита.
|
|
465
|
+
*
|
|
466
|
+
* Точка пульсирует мгновенно по `task_id` из ответа коммита; следующий опрос
|
|
467
|
+
* списка заменит эту заглушку реальной задачей. Если такой `task_id` уже есть в
|
|
468
|
+
* списке (гонка с опросом) — оставляем как есть.
|
|
469
|
+
*/
|
|
470
|
+
declare function seedRunningTask(prev: TasksReadResult | null, taskId: string, resourceId?: string): TasksReadResult;
|
|
471
|
+
/** Цвет точки для состояния StateDot. */
|
|
472
|
+
declare function getDotColorForState(state: ChipDotState): string;
|
|
272
473
|
/**
|
|
273
474
|
* Селектор поверх снимка диалога — стандартный проп слотов со скоупом сессии.
|
|
274
475
|
* Штатные чипы статистики DSH читают узлы ровно так же.
|
|
@@ -288,6 +489,8 @@ interface OpenVikingStatusChipProps {
|
|
|
288
489
|
initialHealth?: HealthStatus;
|
|
289
490
|
initialSessionData?: SessionStatus;
|
|
290
491
|
initialSessionRead?: SessionReadResult;
|
|
492
|
+
/** Стартовая разбивка задач Phase 2 — для рендера вне слота и тестов. */
|
|
493
|
+
initialTasksRead?: TasksReadResult;
|
|
291
494
|
initialOpen?: boolean;
|
|
292
495
|
}
|
|
293
496
|
/**
|
|
@@ -342,11 +545,32 @@ interface OpenVikingStatusPopoverProps {
|
|
|
342
545
|
endpoint?: string;
|
|
343
546
|
isCommitting?: boolean;
|
|
344
547
|
commitError?: string | null;
|
|
548
|
+
/** Разбивка задач Phase 2 (Memory Extraction) текущей сессии. */
|
|
549
|
+
breakdown?: ExtractionBreakdown | null;
|
|
550
|
+
/** Клиент для ленивой загрузки `execution_events` в «Show log». */
|
|
551
|
+
client?: OpenVikingClient;
|
|
345
552
|
onCommitNow?: () => Promise<void> | void;
|
|
346
553
|
onClose?: () => void;
|
|
347
554
|
className?: string;
|
|
348
555
|
style?: React.CSSProperties;
|
|
349
556
|
}
|
|
557
|
+
/**
|
|
558
|
+
* Длительность задачи между двумя таймстампами, человекочитаемо (`4.2s`, `1m 12s`).
|
|
559
|
+
*/
|
|
560
|
+
declare function formatDuration(startIso?: string, endIso?: string): string | undefined;
|
|
561
|
+
/**
|
|
562
|
+
* Строка last extraction для завершённой задачи:
|
|
563
|
+
* `<write> written, <edit> edited · <duration> · <relative-time>`.
|
|
564
|
+
*
|
|
565
|
+
* Части опускаются, если данных нет: длительность требует обоих таймстампов,
|
|
566
|
+
* относительное время — `updated_at`.
|
|
567
|
+
*/
|
|
568
|
+
declare function formatExtractionSummary(task: ExtractionTask, now?: number): string;
|
|
569
|
+
/**
|
|
570
|
+
* Строка backlog `N pending / M failed`, только когда хвост непуст.
|
|
571
|
+
* Возвращает `null`, когда всё завершено (строку рисовать не нужно).
|
|
572
|
+
*/
|
|
573
|
+
declare function formatBacklog(breakdown?: ExtractionBreakdown | null): string | null;
|
|
350
574
|
/**
|
|
351
575
|
* Расчет процента заполнения пула накопленных токенов (0% - 100%).
|
|
352
576
|
*/
|
|
@@ -392,13 +616,28 @@ declare function getCategoryBadgeStyle(_category?: string): React.CSSProperties;
|
|
|
392
616
|
declare function handleEscapeKey(event: {
|
|
393
617
|
key: string;
|
|
394
618
|
}, onClose?: () => void): boolean;
|
|
619
|
+
/**
|
|
620
|
+
* Блок Phase 2 (Memory Extraction) рядом с `Commit Now`.
|
|
621
|
+
*
|
|
622
|
+
* - `running` → indeterminate-бар + `Extracting…` (без фейкового процента).
|
|
623
|
+
* - `completed` → строка last extraction + ровная зелёная точка.
|
|
624
|
+
* - backlog `N pending / M failed` — только когда хвост непуст.
|
|
625
|
+
* - `failed` → warning-глиф + текст ошибки.
|
|
626
|
+
* - «Show log» лениво тянет `execution_events` и рендерит ленту переходов.
|
|
627
|
+
*
|
|
628
|
+
* Глобальную очередь демона (Requeued и т.п.) блок не показывает намеренно.
|
|
629
|
+
*/
|
|
630
|
+
declare function ExtractionSection({ breakdown, client, }: {
|
|
631
|
+
breakdown?: ExtractionBreakdown | null;
|
|
632
|
+
client?: OpenVikingClient;
|
|
633
|
+
}): React.JSX.Element | null;
|
|
395
634
|
/**
|
|
396
635
|
* Панель детального состояния контекстной памяти OpenViking (Status Popover).
|
|
397
636
|
*
|
|
398
637
|
* Оформление повторяет диалог статистики сессии DSH: та же поверхность, тень,
|
|
399
638
|
* радиус, отступы и кегль.
|
|
400
639
|
*/
|
|
401
|
-
declare function OpenVikingStatusPopover({ sessionId, health, sessionData, sessionRead, recalledResult, endpoint, isCommitting, commitError, onCommitNow, onClose, className, style, }: OpenVikingStatusPopoverProps): React.JSX.Element;
|
|
640
|
+
declare function OpenVikingStatusPopover({ sessionId, health, sessionData, sessionRead, recalledResult, endpoint, isCommitting, commitError, breakdown, client, onCommitNow, onClose, className, style, }: OpenVikingStatusPopoverProps): React.JSX.Element;
|
|
402
641
|
|
|
403
642
|
interface OpenVikingConfigData {
|
|
404
643
|
endpoint: string;
|
|
@@ -429,4 +668,4 @@ declare const inject: string[];
|
|
|
429
668
|
*/
|
|
430
669
|
declare function apply(ctx: any): void;
|
|
431
670
|
|
|
432
|
-
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, PROXY_OPENVIKING_ENDPOINT, 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 };
|
|
671
|
+
export { COMMIT_THRESHOLD, type ChipDotState, type CommitOptions, type CommitResult, DEFAULT_OPENVIKING_ENDPOINT, type ExecutionEvent, type ExtractionBreakdown, ExtractionSection, type ExtractionTask, type ExtractionTaskStatus, type HealthStatus, OpenVikingClient, type OpenVikingConfigData, type OpenVikingHealth, type OpenVikingSessionData, OpenVikingSettingsSection, type OpenVikingSettingsSectionProps, OpenVikingStatusChip, type OpenVikingStatusChipProps, OpenVikingStatusPopover, type OpenVikingStatusPopoverProps, POLL_INTERVAL_ACTIVE_MS, POLL_INTERVAL_IDLE_MS, PROXY_OPENVIKING_ENDPOINT, type PeerId, type PendingTokens, type RecalledMemoriesResult, type RecalledMemoryItem, type SessionReadResult, type SessionStatus, TASKS_LIMIT_CAP, THEME, type TaskEventsResult, type TasksReadResult, type ThemeRole, type UseChat, WarningGlyph, apply, chatNodesToText, checkHealth, commitSession, computeBreakdown, defaultOpenVikingClient, extractTaskList, fetchSession, formatBacklog, formatDaemonVersion, formatDuration, formatEndpoint, formatExtractionSummary, formatMemoryLeafName, formatPendingTokens, formatRelativeTime, formatStatusLabel, formatTooltipTitle, getCategoryBadgeStyle, getChipDotState, getDotColorForState, getProgressBarColor, getProgressBarPercent, getSession, getStatusIndicatorColor, handleEscapeKey, inferCategory, inject, name, normalizeExecutionEvent, normalizeExtractionTask, normalizeTaskList, normalizeTimestamp, parseRecalledMemories, resolveApiKey, resolveEndpoint, seedRunningTask, shouldPollActive, themeVar, truncateSessionId };
|