@yadsh/dsh-qa-surface 0.6.1 → 0.7.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 +163 -7
- package/capability-policy.json +1 -1
- package/lib/access/capability-catalog.js +144 -0
- package/lib/access/capability-catalog.js.map +1 -0
- package/lib/access/model.js +379 -0
- package/lib/access/model.js.map +1 -0
- package/lib/access/role-repository.js +195 -0
- package/lib/access/role-repository.js.map +1 -0
- package/lib/access/service.js +380 -0
- package/lib/access/service.js.map +1 -0
- package/lib/access/skill-metadata.js +234 -0
- package/lib/access/skill-metadata.js.map +1 -0
- package/lib/account-remotes.js +20 -10
- package/lib/account-remotes.js.map +1 -1
- package/lib/accounts/errors.js.map +1 -1
- package/lib/accounts/file.js.map +1 -1
- package/lib/accounts/store.js +202 -3
- package/lib/accounts/store.js.map +1 -1
- package/lib/admin/conversation-log.js +256 -0
- package/lib/admin/conversation-log.js.map +1 -0
- package/lib/admin/index.js +17 -0
- package/lib/admin/index.js.map +1 -0
- package/lib/admin/metrics.js +103 -0
- package/lib/admin/metrics.js.map +1 -0
- package/lib/admin/paging.js +23 -0
- package/lib/admin/paging.js.map +1 -0
- package/lib/admin/permissions.js +50 -0
- package/lib/admin/permissions.js.map +1 -0
- package/lib/admin/quality-store.js +485 -0
- package/lib/admin/quality-store.js.map +1 -0
- package/lib/admin/queue.js +107 -0
- package/lib/admin/queue.js.map +1 -0
- package/lib/admin/redaction.js +45 -0
- package/lib/admin/redaction.js.map +1 -0
- package/lib/admin/service.js +897 -0
- package/lib/admin/service.js.map +1 -0
- package/lib/admin/session-log.js +142 -0
- package/lib/admin/session-log.js.map +1 -0
- package/lib/cli.js +9 -6
- package/lib/cli.js.map +1 -1
- package/lib/client/QaSessionController.js +28 -2
- package/lib/client/QaSessionController.js.map +1 -1
- package/lib/client/QaSurface.js +143 -5
- package/lib/client/QaSurface.js.map +1 -1
- package/lib/client/QaTranscriptAdapter.js +1 -0
- package/lib/client/QaTranscriptAdapter.js.map +1 -1
- package/lib/client/admin/QaAdmin.js +458 -0
- package/lib/client/admin/QaAdmin.js.map +1 -0
- package/lib/client/admin/format.js +177 -0
- package/lib/client/admin/format.js.map +1 -0
- package/lib/client/admin/pages/Conversations.js +114 -0
- package/lib/client/admin/pages/Conversations.js.map +1 -0
- package/lib/client/admin/pages/Overview.js +24 -0
- package/lib/client/admin/pages/Overview.js.map +1 -0
- package/lib/client/admin/pages/Quality.js +71 -0
- package/lib/client/admin/pages/Quality.js.map +1 -0
- package/lib/client/admin/pages/Review.js +93 -0
- package/lib/client/admin/pages/Review.js.map +1 -0
- package/lib/client/admin/pages/Users.js +95 -0
- package/lib/client/admin/pages/Users.js.map +1 -0
- package/lib/client/admin/routes.js +143 -0
- package/lib/client/admin/routes.js.map +1 -0
- package/lib/client/admin/shared.js +91 -0
- package/lib/client/admin/shared.js.map +1 -0
- package/lib/client/admin/styles.js +111 -0
- package/lib/client/admin/styles.js.map +1 -0
- package/lib/client/components/QaChangelog.js +53 -0
- package/lib/client/components/QaChangelog.js.map +1 -1
- package/lib/client/components/QaHeader.js +3 -3
- package/lib/client/components/QaHeader.js.map +1 -1
- package/lib/client/components/QaMessage.js +61 -2
- package/lib/client/components/QaMessage.js.map +1 -1
- package/lib/client/create-session.js +1 -1
- package/lib/client/create-session.js.map +1 -1
- package/lib/client/index.js +48 -1
- package/lib/client/index.js.map +1 -1
- package/lib/client/role/RoleSelector.js +31 -0
- package/lib/client/role/RoleSelector.js.map +1 -0
- package/lib/client/session-sources.js +37 -1
- package/lib/client/session-sources.js.map +1 -1
- package/lib/client/settings/card.js +2 -2
- package/lib/client/settings/card.js.map +1 -1
- package/lib/client/settings/sections.js +0 -1
- package/lib/client/settings/sections.js.map +1 -1
- package/lib/client/settings-extensions/index.js +1 -0
- package/lib/client/settings-extensions/index.js.map +1 -1
- package/lib/client/settings-extensions/user-session.js +62 -0
- package/lib/client/settings-extensions/user-session.js.map +1 -0
- package/lib/client/styles.js +31 -0
- package/lib/client/styles.js.map +1 -1
- package/lib/client/types.js.map +1 -1
- package/lib/client.js +9993 -4848
- package/lib/client.js.map +1 -1
- package/lib/config-resolvers/defaults.js +0 -2
- package/lib/config-resolvers/defaults.js.map +1 -1
- package/lib/config.js +0 -249
- package/lib/config.js.map +1 -1
- package/lib/enforcement/skill-policy.js +172 -0
- package/lib/enforcement/skill-policy.js.map +1 -0
- package/lib/enforcement/tool-grants.js +151 -0
- package/lib/enforcement/tool-grants.js.map +1 -0
- package/lib/index.js +224 -42
- package/lib/index.js.map +1 -1
- package/lib/personal-skills/service.js +10 -3
- package/lib/personal-skills/service.js.map +1 -1
- package/lib/qa-tools/index.js +4 -0
- package/lib/qa-tools/index.js.map +1 -1
- package/lib/resolve-config.js +0 -2
- package/lib/resolve-config.js.map +1 -1
- package/lib/secure-session.js +71 -17
- package/lib/secure-session.js.map +1 -1
- package/lib/typert.host.js +2237 -202
- package/lib/typert.remote-client.d.ts +49 -3
- package/lib/typert.remote-client.js +1863 -183
- package/lib/types/access/capability-catalog.d.ts +37 -0
- package/lib/types/access/model.d.ts +60 -0
- package/lib/types/access/role-repository.d.ts +32 -0
- package/lib/types/access/service.d.ts +57 -0
- package/lib/types/access/skill-metadata.d.ts +53 -0
- package/lib/types/account-remotes.d.ts +6 -0
- package/lib/types/accounts/errors.d.ts +1 -1
- package/lib/types/accounts/file.d.ts +16 -5
- package/lib/types/accounts/store.d.ts +83 -3
- package/lib/types/admin/conversation-log.d.ts +39 -0
- package/lib/types/admin/index.d.ts +24 -0
- package/lib/types/admin/metrics.d.ts +29 -0
- package/lib/types/admin/paging.d.ts +33 -0
- package/lib/types/admin/permissions.d.ts +10 -0
- package/lib/types/admin/quality-store.d.ts +82 -0
- package/lib/types/admin/queue.d.ts +21 -0
- package/lib/types/admin/redaction.d.ts +29 -0
- package/lib/types/admin/service.d.ts +105 -0
- package/lib/types/admin/session-log.d.ts +53 -0
- package/lib/types/client/QaSessionController.d.ts +12 -1
- package/lib/types/client/QaSurface.d.ts +7 -1
- package/lib/types/client/admin/QaAdmin.d.ts +17 -0
- package/lib/types/client/admin/format.d.ts +43 -0
- package/lib/types/client/admin/pages/Conversations.d.ts +21 -0
- package/lib/types/client/admin/pages/Overview.d.ts +13 -0
- package/lib/types/client/admin/pages/Quality.d.ts +18 -0
- package/lib/types/client/admin/pages/Review.d.ts +15 -0
- package/lib/types/client/admin/pages/Users.d.ts +22 -0
- package/lib/types/client/admin/routes.d.ts +60 -0
- package/lib/types/client/admin/shared.d.ts +53 -0
- package/lib/types/client/admin/styles.d.ts +11 -0
- package/lib/types/client/components/QaHeader.d.ts +5 -1
- package/lib/types/client/components/QaMessage.d.ts +14 -1
- package/lib/types/client/create-session.d.ts +2 -0
- package/lib/types/client/role/RoleSelector.d.ts +14 -0
- package/lib/types/client/session-sources.d.ts +9 -0
- package/lib/types/client/settings/sections.d.ts +0 -1
- package/lib/types/client/settings-extensions/index.d.ts +2 -0
- package/lib/types/client/settings-extensions/user-session.d.ts +59 -0
- package/lib/types/client/types.d.ts +39 -2
- package/lib/types/enforcement/skill-policy.d.ts +29 -0
- package/lib/types/enforcement/tool-grants.d.ts +84 -0
- package/lib/types/index.d.ts +62 -14
- package/lib/types/qa-tools/index.d.ts +2 -0
- package/lib/types/secure-session.d.ts +10 -1
- package/lib/types/types.d.ts +568 -5
- package/package.json +2 -2
- package/lib/client/settings/sections/documents.js +0 -88
- package/lib/client/settings/sections/documents.js.map +0 -1
- package/lib/documents/artifacts/ids.js +0 -43
- package/lib/documents/artifacts/ids.js.map +0 -1
- package/lib/documents/artifacts/manifest.js +0 -66
- package/lib/documents/artifacts/manifest.js.map +0 -1
- package/lib/documents/artifacts/store.js +0 -169
- package/lib/documents/artifacts/store.js.map +0 -1
- package/lib/documents/capabilities.js +0 -93
- package/lib/documents/capabilities.js.map +0 -1
- package/lib/documents/config.js +0 -302
- package/lib/documents/config.js.map +0 -1
- package/lib/documents/defaults.js +0 -78
- package/lib/documents/defaults.js.map +0 -1
- package/lib/documents/errors.js +0 -101
- package/lib/documents/errors.js.map +0 -1
- package/lib/documents/index.js +0 -80
- package/lib/documents/index.js.map +0 -1
- package/lib/documents/inspect/facts.js +0 -161
- package/lib/documents/inspect/facts.js.map +0 -1
- package/lib/documents/inspect/zip.js +0 -108
- package/lib/documents/inspect/zip.js.map +0 -1
- package/lib/documents/markdown/directives.js +0 -135
- package/lib/documents/markdown/directives.js.map +0 -1
- package/lib/documents/markdown/frontmatter.js +0 -35
- package/lib/documents/markdown/frontmatter.js.map +0 -1
- package/lib/documents/markdown/normalize.js +0 -113
- package/lib/documents/markdown/normalize.js.map +0 -1
- package/lib/documents/orchestrator/assets.js +0 -243
- package/lib/documents/orchestrator/assets.js.map +0 -1
- package/lib/documents/orchestrator/convert-document.js +0 -186
- package/lib/documents/orchestrator/convert-document.js.map +0 -1
- package/lib/documents/orchestrator/create-document.js +0 -292
- package/lib/documents/orchestrator/create-document.js.map +0 -1
- package/lib/documents/orchestrator/extract-document.js +0 -162
- package/lib/documents/orchestrator/extract-document.js.map +0 -1
- package/lib/documents/orchestrator/inspect-document.js +0 -89
- package/lib/documents/orchestrator/inspect-document.js.map +0 -1
- package/lib/documents/orchestrator/runtime-deps.js +0 -59
- package/lib/documents/orchestrator/runtime-deps.js.map +0 -1
- package/lib/documents/orchestrator/scope.js +0 -132
- package/lib/documents/orchestrator/scope.js.map +0 -1
- package/lib/documents/providers/docling.js +0 -247
- package/lib/documents/providers/docling.js.map +0 -1
- package/lib/documents/providers/libreoffice.js +0 -130
- package/lib/documents/providers/libreoffice.js.map +0 -1
- package/lib/documents/providers/markitdown.js +0 -89
- package/lib/documents/providers/markitdown.js.map +0 -1
- package/lib/documents/providers/pandoc.js +0 -161
- package/lib/documents/providers/pandoc.js.map +0 -1
- package/lib/documents/providers/process.js +0 -164
- package/lib/documents/providers/process.js.map +0 -1
- package/lib/documents/providers/registry.js +0 -152
- package/lib/documents/providers/registry.js.map +0 -1
- package/lib/documents/providers/shared.js +0 -75
- package/lib/documents/providers/shared.js.map +0 -1
- package/lib/documents/runtime.js +0 -114
- package/lib/documents/runtime.js.map +0 -1
- package/lib/documents/security/file-types.js +0 -188
- package/lib/documents/security/file-types.js.map +0 -1
- package/lib/documents/security/limits.js +0 -78
- package/lib/documents/security/limits.js.map +0 -1
- package/lib/documents/security/mime.js +0 -43
- package/lib/documents/security/mime.js.map +0 -1
- package/lib/documents/security/paths.js +0 -133
- package/lib/documents/security/paths.js.map +0 -1
- package/lib/documents/templates/registry.js +0 -147
- package/lib/documents/templates/registry.js.map +0 -1
- package/lib/documents/templates/resolver.js +0 -59
- package/lib/documents/templates/resolver.js.map +0 -1
- package/lib/documents/tools/convert.js +0 -125
- package/lib/documents/tools/convert.js.map +0 -1
- package/lib/documents/tools/create.js +0 -187
- package/lib/documents/tools/create.js.map +0 -1
- package/lib/documents/tools/index.js +0 -41
- package/lib/documents/tools/index.js.map +0 -1
- package/lib/documents/tools/inspect.js +0 -135
- package/lib/documents/tools/inspect.js.map +0 -1
- package/lib/documents/tools/shared.js +0 -88
- package/lib/documents/tools/shared.js.map +0 -1
- package/lib/documents/tools/to-markdown.js +0 -125
- package/lib/documents/tools/to-markdown.js.map +0 -1
- package/lib/documents/types.js +0 -12
- package/lib/documents/types.js.map +0 -1
- package/lib/types/client/settings/sections/documents.d.ts +0 -13
- package/lib/types/documents/artifacts/ids.d.ts +0 -14
- package/lib/types/documents/artifacts/manifest.d.ts +0 -32
- package/lib/types/documents/artifacts/store.d.ts +0 -67
- package/lib/types/documents/capabilities.d.ts +0 -32
- package/lib/types/documents/config.d.ts +0 -27
- package/lib/types/documents/defaults.d.ts +0 -161
- package/lib/types/documents/errors.d.ts +0 -42
- package/lib/types/documents/index.d.ts +0 -63
- package/lib/types/documents/inspect/facts.d.ts +0 -43
- package/lib/types/documents/inspect/zip.d.ts +0 -28
- package/lib/types/documents/markdown/directives.d.ts +0 -39
- package/lib/types/documents/markdown/frontmatter.d.ts +0 -15
- package/lib/types/documents/markdown/normalize.d.ts +0 -30
- package/lib/types/documents/orchestrator/assets.d.ts +0 -55
- package/lib/types/documents/orchestrator/convert-document.d.ts +0 -25
- package/lib/types/documents/orchestrator/create-document.d.ts +0 -18
- package/lib/types/documents/orchestrator/extract-document.d.ts +0 -24
- package/lib/types/documents/orchestrator/inspect-document.d.ts +0 -12
- package/lib/types/documents/orchestrator/runtime-deps.d.ts +0 -43
- package/lib/types/documents/orchestrator/scope.d.ts +0 -52
- package/lib/types/documents/providers/docling.d.ts +0 -54
- package/lib/types/documents/providers/libreoffice.d.ts +0 -40
- package/lib/types/documents/providers/markitdown.d.ts +0 -28
- package/lib/types/documents/providers/pandoc.d.ts +0 -42
- package/lib/types/documents/providers/process.d.ts +0 -54
- package/lib/types/documents/providers/registry.d.ts +0 -68
- package/lib/types/documents/providers/shared.d.ts +0 -27
- package/lib/types/documents/runtime.d.ts +0 -59
- package/lib/types/documents/security/file-types.d.ts +0 -39
- package/lib/types/documents/security/limits.d.ts +0 -24
- package/lib/types/documents/security/mime.d.ts +0 -13
- package/lib/types/documents/security/paths.d.ts +0 -38
- package/lib/types/documents/templates/registry.d.ts +0 -50
- package/lib/types/documents/templates/resolver.d.ts +0 -30
- package/lib/types/documents/tools/convert.d.ts +0 -9
- package/lib/types/documents/tools/create.d.ts +0 -14
- package/lib/types/documents/tools/index.d.ts +0 -33
- package/lib/types/documents/tools/inspect.d.ts +0 -9
- package/lib/types/documents/tools/shared.d.ts +0 -77
- package/lib/types/documents/tools/to-markdown.d.ts +0 -12
- package/lib/types/documents/types.d.ts +0 -294
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Russian copy for the console's vocabulary. Kept in one module so the pages
|
|
3
|
+
* stay about layout, and so the wording an operator sees is edited in one
|
|
4
|
+
* place rather than hunted across components.
|
|
5
|
+
*/
|
|
6
|
+
export const ADMIN_ROLE_LABELS = {
|
|
7
|
+
admin: "Администратор",
|
|
8
|
+
reviewer: "Ревьюер",
|
|
9
|
+
user: "Пользователь",
|
|
10
|
+
};
|
|
11
|
+
export const FEEDBACK_RATING_LABELS = {
|
|
12
|
+
positive: "Полезно",
|
|
13
|
+
negative: "Проблема",
|
|
14
|
+
};
|
|
15
|
+
export const FEEDBACK_REASON_LABELS = {
|
|
16
|
+
incorrect: "Неверный ответ",
|
|
17
|
+
instruction_not_followed: "Не выполнил инструкцию",
|
|
18
|
+
missing_information: "Не хватает информации",
|
|
19
|
+
outdated_information: "Устаревшая информация",
|
|
20
|
+
tool_issue: "Проблема с инструментом",
|
|
21
|
+
too_verbose: "Слишком подробно",
|
|
22
|
+
too_short: "Слишком кратко",
|
|
23
|
+
other: "Другое",
|
|
24
|
+
};
|
|
25
|
+
export const REVIEW_STATUS_LABELS = {
|
|
26
|
+
unreviewed: "Не разобрано",
|
|
27
|
+
in_review: "В работе",
|
|
28
|
+
reviewed: "Разобрано",
|
|
29
|
+
needs_followup: "Нужно вернуться",
|
|
30
|
+
};
|
|
31
|
+
export const REVIEW_PRIORITY_LABELS = {
|
|
32
|
+
high: "Высокий",
|
|
33
|
+
normal: "Обычный",
|
|
34
|
+
low: "Низкий",
|
|
35
|
+
};
|
|
36
|
+
export const REVIEW_REASON_LABELS = {
|
|
37
|
+
negative_feedback: "Негативная оценка",
|
|
38
|
+
manual: "Отправлено на разбор",
|
|
39
|
+
tool_failure: "Сбой инструмента",
|
|
40
|
+
automatic: "Автоматически",
|
|
41
|
+
};
|
|
42
|
+
export const SEVERITY_LABELS = {
|
|
43
|
+
minor: "Незначительная",
|
|
44
|
+
major: "Существенная",
|
|
45
|
+
critical: "Критическая",
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Issue labels grouped by the taxonomy's own branches (spec §21). The groups
|
|
49
|
+
* are only a rendering concern: issue ids stay flat so aggregations never walk
|
|
50
|
+
* a tree.
|
|
51
|
+
*/
|
|
52
|
+
export const ISSUE_GROUPS = [
|
|
53
|
+
{
|
|
54
|
+
title: "Ответ",
|
|
55
|
+
issues: [
|
|
56
|
+
"answer.incorrect",
|
|
57
|
+
"answer.incomplete",
|
|
58
|
+
"answer.hallucination",
|
|
59
|
+
"answer.request_not_followed",
|
|
60
|
+
"answer.poor_formatting",
|
|
61
|
+
"answer.communication",
|
|
62
|
+
],
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
title: "Контекст",
|
|
66
|
+
issues: [
|
|
67
|
+
"context.missing_conversation",
|
|
68
|
+
"context.missing_knowledge",
|
|
69
|
+
"context.outdated_knowledge",
|
|
70
|
+
],
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
title: "Инструменты",
|
|
74
|
+
issues: [
|
|
75
|
+
"tool.wrong_selection",
|
|
76
|
+
"tool.should_have_been_used",
|
|
77
|
+
"tool.bad_arguments",
|
|
78
|
+
"tool.failure",
|
|
79
|
+
"tool.unavailable",
|
|
80
|
+
],
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
title: "Навыки и инструкции",
|
|
84
|
+
issues: [
|
|
85
|
+
"skill.missing",
|
|
86
|
+
"skill.wrong",
|
|
87
|
+
"skill.not_followed",
|
|
88
|
+
"skill.prompt_policy",
|
|
89
|
+
],
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
title: "Доступ",
|
|
93
|
+
issues: ["access.missing_capability", "access.excessive_capability"],
|
|
94
|
+
},
|
|
95
|
+
{ title: "Прочее", issues: ["other"] },
|
|
96
|
+
];
|
|
97
|
+
export const ISSUE_LABELS = Object.fromEntries([
|
|
98
|
+
["answer.incorrect", "Неверный ответ"],
|
|
99
|
+
["answer.incomplete", "Неполный ответ"],
|
|
100
|
+
["answer.hallucination", "Выдуманные факты"],
|
|
101
|
+
["answer.request_not_followed", "Не выполнена просьба"],
|
|
102
|
+
["answer.poor_formatting", "Плохое оформление"],
|
|
103
|
+
["answer.communication", "Стиль общения"],
|
|
104
|
+
["context.missing_conversation", "Потерян контекст диалога"],
|
|
105
|
+
["context.missing_knowledge", "Не хватает знаний"],
|
|
106
|
+
["context.outdated_knowledge", "Устаревшие знания"],
|
|
107
|
+
["tool.wrong_selection", "Выбран не тот инструмент"],
|
|
108
|
+
["tool.should_have_been_used", "Инструмент не использован"],
|
|
109
|
+
["tool.bad_arguments", "Неверные аргументы инструмента"],
|
|
110
|
+
["tool.failure", "Сбой инструмента"],
|
|
111
|
+
["tool.unavailable", "Инструмент недоступен"],
|
|
112
|
+
["skill.missing", "Не хватает навыка"],
|
|
113
|
+
["skill.wrong", "Выбран не тот навык"],
|
|
114
|
+
["skill.not_followed", "Навык не соблюдён"],
|
|
115
|
+
["skill.prompt_policy", "Проблема промпта или политики"],
|
|
116
|
+
["access.missing_capability", "Не хватает возможности"],
|
|
117
|
+
["access.excessive_capability", "Лишняя возможность"],
|
|
118
|
+
["other", "Другое"],
|
|
119
|
+
]);
|
|
120
|
+
export const TARGET_LABELS = {
|
|
121
|
+
prompt: "Промпт",
|
|
122
|
+
skill: "Навык",
|
|
123
|
+
tool: "Инструмент",
|
|
124
|
+
knowledge: "База знаний",
|
|
125
|
+
model: "Модель",
|
|
126
|
+
role: "Роль или возможности",
|
|
127
|
+
product_ux: "Интерфейс",
|
|
128
|
+
user_misunderstanding: "Недопонимание пользователя",
|
|
129
|
+
unknown: "Неизвестно",
|
|
130
|
+
};
|
|
131
|
+
export const TRANSCRIPT_UNAVAILABLE_LABELS = {
|
|
132
|
+
"storage-unavailable": "Хранилище разговоров недоступно на этом стенде.",
|
|
133
|
+
"not-found": "Журнал разговора не найден.",
|
|
134
|
+
unreadable: "Журнал разговора не читается: в нём есть событие, неизвестное этой сборке.",
|
|
135
|
+
};
|
|
136
|
+
/** Percent, or a dash when there is nothing to take a share of. */
|
|
137
|
+
export function formatRate(value) {
|
|
138
|
+
return value === null ? "—" : `${Math.round(value * 100)}%`;
|
|
139
|
+
}
|
|
140
|
+
/** Local date and time of an ISO stamp, or a dash for an unusable value. */
|
|
141
|
+
export function formatStamp(iso) {
|
|
142
|
+
if (iso === undefined || iso === "")
|
|
143
|
+
return "—";
|
|
144
|
+
const parsed = Date.parse(iso);
|
|
145
|
+
return Number.isNaN(parsed) ? "—" : new Date(parsed).toLocaleString("ru-RU");
|
|
146
|
+
}
|
|
147
|
+
/** Coarse "how long ago", which is what a triage list needs. */
|
|
148
|
+
export function formatRelative(iso, now = Date.now()) {
|
|
149
|
+
const parsed = Date.parse(iso);
|
|
150
|
+
if (Number.isNaN(parsed))
|
|
151
|
+
return "—";
|
|
152
|
+
const seconds = Math.max(0, Math.round((now - parsed) / 1000));
|
|
153
|
+
if (seconds < 60)
|
|
154
|
+
return "только что";
|
|
155
|
+
const minutes = Math.round(seconds / 60);
|
|
156
|
+
if (minutes < 60)
|
|
157
|
+
return `${minutes} мин назад`;
|
|
158
|
+
const hours = Math.round(minutes / 60);
|
|
159
|
+
if (hours < 24)
|
|
160
|
+
return `${hours} ч назад`;
|
|
161
|
+
const days = Math.round(hours / 24);
|
|
162
|
+
if (days < 30)
|
|
163
|
+
return `${days} дн назад`;
|
|
164
|
+
return formatStamp(iso);
|
|
165
|
+
}
|
|
166
|
+
/** Milliseconds as a short duration; tool timings are second-scale. */
|
|
167
|
+
export function formatDuration(ms) {
|
|
168
|
+
if (ms === undefined)
|
|
169
|
+
return "";
|
|
170
|
+
if (ms < 1_000)
|
|
171
|
+
return `${ms} мс`;
|
|
172
|
+
return `${(ms / 1_000).toFixed(1)} с`;
|
|
173
|
+
}
|
|
174
|
+
export function formatCount(value) {
|
|
175
|
+
return value.toLocaleString("ru-RU");
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/client/admin/format.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useState } from "react";
|
|
3
|
+
import { REVIEW_STATUS_LABELS, TRANSCRIPT_UNAVAILABLE_LABELS, formatCount, formatDuration, formatStamp, } from "../format.js";
|
|
4
|
+
import { Badge, Empty, FilterField, Pager, Stamp, adminErrorMessage, useAdminResource, } from "../shared.js";
|
|
5
|
+
import { ReviewPanel } from "./Review.js";
|
|
6
|
+
const PAGE_SIZE = 25;
|
|
7
|
+
/** Coarse status tone: what a triage list needs to scan at a glance. */
|
|
8
|
+
function statusTone(status) {
|
|
9
|
+
switch (status) {
|
|
10
|
+
case "reviewed":
|
|
11
|
+
return "positive";
|
|
12
|
+
case "needs_followup":
|
|
13
|
+
return "negative";
|
|
14
|
+
case "in_review":
|
|
15
|
+
return "warning";
|
|
16
|
+
default:
|
|
17
|
+
return "neutral";
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export function AdminConversations(props) {
|
|
21
|
+
const [search, setSearch] = useState("");
|
|
22
|
+
const [rating, setRating] = useState("");
|
|
23
|
+
const [reviewStatus, setReviewStatus] = useState("");
|
|
24
|
+
const [from, setFrom] = useState("");
|
|
25
|
+
const [to, setTo] = useState("");
|
|
26
|
+
const [rows, setRows] = useState([]);
|
|
27
|
+
const [cursor, setCursor] = useState(null);
|
|
28
|
+
const [total, setTotal] = useState(0);
|
|
29
|
+
const [error, setError] = useState();
|
|
30
|
+
const [loading, setLoading] = useState(true);
|
|
31
|
+
const load = useCallback(async (next, append) => {
|
|
32
|
+
setLoading(true);
|
|
33
|
+
const query = {
|
|
34
|
+
userId: props.userId ?? null,
|
|
35
|
+
search: search === "" ? null : search,
|
|
36
|
+
rating: rating === "" ? null : rating,
|
|
37
|
+
reviewStatus: reviewStatus === "" ? null : reviewStatus,
|
|
38
|
+
from: from === "" ? null : new Date(from).toISOString(),
|
|
39
|
+
to: to === "" ? null : new Date(`${to}T23:59:59.999Z`).toISOString(),
|
|
40
|
+
};
|
|
41
|
+
const result = await props.api.conversations(props.token, query, next, PAGE_SIZE);
|
|
42
|
+
setLoading(false);
|
|
43
|
+
if (!result.ok) {
|
|
44
|
+
setError(adminErrorMessage(result.error));
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
setError(undefined);
|
|
48
|
+
setTotal(result.value.total);
|
|
49
|
+
setCursor(result.value.nextCursor);
|
|
50
|
+
setRows((current) => append ? [...current, ...result.value.items] : result.value.items);
|
|
51
|
+
}, [
|
|
52
|
+
props.api,
|
|
53
|
+
props.token,
|
|
54
|
+
props.userId,
|
|
55
|
+
search,
|
|
56
|
+
rating,
|
|
57
|
+
reviewStatus,
|
|
58
|
+
from,
|
|
59
|
+
to,
|
|
60
|
+
]);
|
|
61
|
+
useEffect(() => {
|
|
62
|
+
void load(null, false);
|
|
63
|
+
}, [load]);
|
|
64
|
+
return (_jsxs("section", { className: "dsh-qa-admin__page", "aria-label": "\u0420\u0430\u0437\u0433\u043E\u0432\u043E\u0440\u044B", children: [_jsx("div", { className: "dsh-qa-admin__title-row", children: _jsxs("div", { children: [_jsx("h1", { children: "\u0420\u0430\u0437\u0433\u043E\u0432\u043E\u0440\u044B" }), _jsx("p", { children: props.userId === undefined
|
|
65
|
+
? "Все разговоры стенда."
|
|
66
|
+
: "Разговоры одного пользователя." })] }) }), _jsxs("div", { className: "dsh-qa-admin__filters", children: [_jsx(FilterField, { label: "\u041F\u043E\u0438\u0441\u043A", children: _jsx("input", { type: "search", value: search, placeholder: "\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A, \u0438\u043C\u044F \u0438\u043B\u0438 \u0430\u0434\u0440\u0435\u0441", onChange: (event) => setSearch(event.currentTarget.value) }) }), _jsx(FilterField, { label: "\u041E\u0446\u0435\u043D\u043A\u0430", children: _jsxs("select", { value: rating, onChange: (event) => setRating(event.currentTarget.value), children: [_jsx("option", { value: "", children: "\u041B\u044E\u0431\u0430\u044F" }), _jsx("option", { value: "positive", children: "\u0415\u0441\u0442\u044C \uD83D\uDC4D" }), _jsx("option", { value: "negative", children: "\u0415\u0441\u0442\u044C \uD83D\uDC4E" })] }) }), _jsx(FilterField, { label: "\u0420\u0430\u0437\u0431\u043E\u0440", children: _jsxs("select", { value: reviewStatus, onChange: (event) => setReviewStatus(event.currentTarget.value), children: [_jsx("option", { value: "", children: "\u041B\u044E\u0431\u043E\u0439" }), _jsx("option", { value: "unreviewed", children: "\u041D\u0435 \u0440\u0430\u0437\u043E\u0431\u0440\u0430\u043D\u043E" }), _jsx("option", { value: "reviewed", children: "\u0420\u0430\u0437\u043E\u0431\u0440\u0430\u043D\u043E" }), _jsx("option", { value: "needs_followup", children: "\u041D\u0443\u0436\u043D\u043E \u0432\u0435\u0440\u043D\u0443\u0442\u044C\u0441\u044F" })] }) }), _jsx(FilterField, { label: "\u0421 \u0434\u0430\u0442\u044B", children: _jsx("input", { type: "date", value: from, onChange: (event) => setFrom(event.currentTarget.value) }) }), _jsx(FilterField, { label: "\u041F\u043E \u0434\u0430\u0442\u0443", children: _jsx("input", { type: "date", value: to, onChange: (event) => setTo(event.currentTarget.value) }) })] }), error === undefined ? null : (_jsx("p", { className: "dsh-qa-admin__error", role: "alert", children: error })), rows.length === 0 ? (_jsx("p", { className: "dsh-qa-admin__empty", children: loading ? "Загружаю…" : "Ничего не нашлось." })) : (_jsxs("table", { className: "dsh-qa-admin__table", children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { children: "\u0420\u0430\u0437\u0433\u043E\u0432\u043E\u0440" }), _jsx("th", { children: "\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C" }), _jsx("th", { children: "\u041F\u0440\u043E\u0444\u0438\u043B\u044C" }), _jsx("th", { children: "\u041D\u0430\u0447\u0430\u0442" }), _jsx("th", { children: "\u0410\u043A\u0442\u0438\u0432\u043D\u043E\u0441\u0442\u044C" }), _jsx("th", { children: "\u0421\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F" }), _jsx("th", { children: "\u041E\u0446\u0435\u043D\u043A\u0438" }), _jsx("th", { children: "\u0420\u0430\u0437\u0431\u043E\u0440" }), _jsx("th", {})] }) }), _jsx("tbody", { children: rows.map((row) => (_jsxs("tr", { children: [_jsxs("td", { children: [_jsx("strong", { children: row.title ?? "Без заголовка" }), _jsx("small", { children: row.conversationId })] }), _jsx("td", { children: row.displayName }), _jsx("td", { children: row.subroleId === "" ? "—" : row.subroleId }), _jsx("td", { children: formatStamp(row.createdAt) }), _jsx("td", { children: _jsx(Stamp, { value: row.updatedAt }) }), _jsx("td", { children: formatCount(row.messageCount) }), _jsxs("td", { children: ["\uD83D\uDC4D ", formatCount(row.positiveFeedback), " \u00B7 \uD83D\uDC4E", " ", formatCount(row.negativeFeedback)] }), _jsx("td", { children: _jsx(Badge, { tone: statusTone(row.reviewStatus), children: REVIEW_STATUS_LABELS[row.reviewStatus] }) }), _jsx("td", { children: _jsx("button", { type: "button", onClick: () => props.onOpenConversation(row.conversationId), children: "\u041E\u0442\u043A\u0440\u044B\u0442\u044C" }) })] }, row.conversationId))) })] })), _jsx(Pager, { total: total, shown: rows.length, hasMore: cursor !== null, loading: loading, onMore: () => void load(cursor, true), onReset: () => void load(null, false) })] }));
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* The review viewer: the conversation as it happened, next to the reviewer's
|
|
70
|
+
* form. Tool calls collapse by default — a reviewer looking for "the tool
|
|
71
|
+
* failed" should not have to scroll past every argument to find it.
|
|
72
|
+
*/
|
|
73
|
+
export function AdminConversation(props) {
|
|
74
|
+
const resource = useAdminResource(() => props.api.conversation(props.token, props.conversationId), [props.api, props.token, props.conversationId]);
|
|
75
|
+
const detail = resource.data;
|
|
76
|
+
if (resource.error !== undefined) {
|
|
77
|
+
return (_jsxs("section", { className: "dsh-qa-admin__page", children: [_jsx("p", { className: "dsh-qa-admin__error", role: "alert", children: adminErrorMessage(resource.error) }), _jsx("button", { type: "button", onClick: props.onBack, children: "\u041A \u0441\u043F\u0438\u0441\u043A\u0443" })] }));
|
|
78
|
+
}
|
|
79
|
+
if (detail === undefined) {
|
|
80
|
+
return (_jsx("section", { className: "dsh-qa-admin__page", children: _jsx("p", { className: "dsh-qa-admin__empty", children: "\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u044E \u0440\u0430\u0437\u0433\u043E\u0432\u043E\u0440\u2026" }) }));
|
|
81
|
+
}
|
|
82
|
+
return (_jsxs("section", { className: "dsh-qa-admin__page", "aria-label": "\u0420\u0430\u0437\u0433\u043E\u0432\u043E\u0440", children: [_jsx("div", { className: "dsh-qa-admin__title-row", children: _jsxs("div", { children: [_jsx("button", { type: "button", onClick: props.onBack, children: "\u2190 \u0420\u0430\u0437\u0433\u043E\u0432\u043E\u0440\u044B" }), _jsx("h1", { children: detail.summary.title ?? "Без заголовка" }), _jsxs("p", { children: [detail.summary.displayName, " \u00B7", " ", detail.runtime.subroleId === ""
|
|
83
|
+
? "профиль неизвестен"
|
|
84
|
+
: detail.runtime.subroleId, " ", "\u00B7 ", formatStamp(detail.summary.createdAt), detail.runtime.model === undefined
|
|
85
|
+
? ""
|
|
86
|
+
: ` · ${detail.runtime.provider ?? ""} ${detail.runtime.model}`, detail.runtime.agentPreset === undefined
|
|
87
|
+
? ""
|
|
88
|
+
: ` · пресет ${detail.runtime.agentPreset}`, detail.runtime.adminPreview ? " · предпросмотр роли" : ""] })] }) }), _jsxs("div", { className: "dsh-qa-admin__conversation", children: [_jsxs("div", { className: "dsh-qa-admin__transcript", children: [detail.runtime.transcriptUnavailable === undefined ? null : (_jsx("p", { className: "dsh-qa-admin__error", role: "alert", children: TRANSCRIPT_UNAVAILABLE_LABELS[detail.runtime.transcriptUnavailable] })), _jsx(RuntimeFacts, { detail: detail }), detail.messages.length === 0 ? (_jsx(Empty, { children: "\u0421\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439 \u043D\u0435\u0442 \u2014 \u0440\u0430\u0437\u0433\u043E\u0432\u043E\u0440 \u043C\u043E\u0433 \u0431\u044B\u0442\u044C \u0441\u043E\u0437\u0434\u0430\u043D \u0438 \u043D\u0435 \u043D\u0430\u0447\u0430\u0442." })) : (detail.messages.map((message) => (_jsx(MessageRow, { message: message, highlighted: message.id === props.messageId }, message.id))))] }), _jsx(ReviewPanel, { api: props.api, token: props.token, detail: detail, canReview: props.canReview, onSaved: () => void resource.reload() })] })] }));
|
|
89
|
+
}
|
|
90
|
+
function RuntimeFacts(props) {
|
|
91
|
+
const { runtime, summary } = props.detail;
|
|
92
|
+
const tools = runtime.effectiveTools ?? [];
|
|
93
|
+
const skills = runtime.effectiveSkills ?? [];
|
|
94
|
+
const loaded = runtime.loadedSkills ?? [];
|
|
95
|
+
return (_jsxs("section", { className: "dsh-qa-admin__runtime", children: [_jsx("h2", { children: "\u0427\u0442\u043E \u0431\u044B\u043B\u043E \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u043E \u0442\u043E\u0433\u0434\u0430" }), _jsxs("dl", { className: "dsh-qa-admin__facts", children: [_jsx("dt", { children: "\u041E\u0442\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043E" }), _jsx("dd", { children: formatStamp(summary.createdAt) }), _jsx("dt", { children: "\u041F\u043E\u0441\u043B\u0435\u0434\u043D\u044F\u044F \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0441\u0442\u044C" }), _jsx("dd", { children: formatStamp(summary.updatedAt) }), _jsx("dt", { children: "\u0418\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u044B" }), _jsx("dd", { children: tools.length === 0
|
|
96
|
+
? "снимок не сохранён"
|
|
97
|
+
: `${formatCount(tools.length)}` }), _jsx("dt", { children: "\u041D\u0430\u0432\u044B\u043A\u0438" }), _jsx("dd", { children: skills.length === 0
|
|
98
|
+
? "снимок не сохранён"
|
|
99
|
+
: formatCount(skills.length) }), _jsx("dt", { children: "\u0417\u0430\u0433\u0440\u0443\u0436\u0435\u043D\u043D\u044B\u0435 \u043D\u0430\u0432\u044B\u043A\u0438" }), _jsx("dd", { children: loaded.length === 0 ? "—" : loaded.join(", ") })] }), tools.length === 0 ? null : (_jsxs("details", { children: [_jsxs("summary", { children: ["\u0418\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u044B \u0440\u0430\u0437\u0433\u043E\u0432\u043E\u0440\u0430 (", tools.length, ")"] }), _jsx("p", { className: "dsh-qa-admin__mono", children: tools.join(", ") })] })), skills.length === 0 ? null : (_jsxs("details", { children: [_jsxs("summary", { children: ["\u041D\u0430\u0432\u044B\u043A\u0438 \u0440\u0430\u0437\u0433\u043E\u0432\u043E\u0440\u0430 (", skills.length, ")"] }), _jsx("p", { className: "dsh-qa-admin__mono", children: skills.join(", ") })] }))] }));
|
|
100
|
+
}
|
|
101
|
+
function MessageRow(props) {
|
|
102
|
+
const [open, setOpen] = useState(false);
|
|
103
|
+
const { message } = props;
|
|
104
|
+
const feedback = message.feedback ?? [];
|
|
105
|
+
const reviews = message.reviews ?? [];
|
|
106
|
+
return (_jsxs("article", { className: `dsh-qa-admin__message dsh-qa-admin__message--${message.role}${props.highlighted ? " dsh-qa-admin__message--highlighted" : ""}`, id: `message-${message.id}`, children: [_jsxs("header", { children: [_jsx("strong", { children: message.role === "user"
|
|
107
|
+
? "Пользователь"
|
|
108
|
+
: message.role === "assistant"
|
|
109
|
+
? "Ассистент"
|
|
110
|
+
: "Система" }), _jsx("time", { title: String(message.time), children: formatStamp(new Date(message.time).toISOString()) }), message.model === undefined ? null : (_jsx("span", { className: "dsh-qa-admin__mono", children: message.model })), message.interrupted === true ? (_jsx(Badge, { tone: "warning", children: "\u041F\u0440\u0435\u0440\u0432\u0430\u043D" })) : null, message.usage === undefined ? null : (_jsxs("span", { className: "dsh-qa-admin__usage", children: [formatCount(message.usage.inputTokens), " \u2192", " ", formatCount(message.usage.outputTokens), " \u0442\u043E\u043A\u0435\u043D\u043E\u0432"] })), feedback.map((row) => (_jsxs(Badge, { tone: row.rating === "positive" ? "positive" : "negative", children: [row.rating === "positive" ? "👍" : "👎", row.reasons === undefined || row.reasons.length === 0
|
|
111
|
+
? ""
|
|
112
|
+
: ` ${row.reasons.length}`] }, row.id))), reviews.length === 0 ? null : (_jsxs(Badge, { tone: "neutral", children: ["\u0440\u0430\u0437\u043E\u0431\u0440\u0430\u043D\u043E: ", reviews[0]?.severity] }))] }), _jsx("p", { className: "dsh-qa-admin__message-text", children: message.text === "" ? "(пустой текст)" : message.text }), feedback.map((row) => row.comment === undefined ? null : (_jsxs("p", { className: "dsh-qa-admin__comment", children: ["\u041A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439: ", row.comment] }, `${row.id}:comment`))), (message.toolCalls ?? []).length === 0 ? null : (_jsxs("div", { className: "dsh-qa-admin__tools", children: [_jsxs("button", { type: "button", "aria-expanded": open, onClick: () => setOpen((value) => !value), children: [_jsx("svg", { className: `dsh-qa-admin__disclosure${open ? " dsh-qa-admin__disclosure--open" : ""}`, viewBox: "0 0 14 14", width: "14", height: "14", "aria-hidden": "true", children: _jsx("path", { d: "m3.5 5.25 3.5 3.5 3.5-3.5", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) }), "\u0432\u044B\u0437\u043E\u0432\u044B \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432 (", (message.toolCalls ?? []).length, ")"] }), open ? (_jsx("ol", { children: (message.toolCalls ?? []).map((call) => (_jsxs("li", { children: [_jsx("strong", { className: "dsh-qa-admin__mono", children: call.name }), call.error === undefined ? null : (_jsxs(Badge, { tone: "negative", children: ["\u0441\u0431\u043E\u0439: ", call.error] })), call.durationMs === undefined ? null : (_jsx("span", { children: formatDuration(call.durationMs) })), _jsx("pre", { children: call.arguments }), call.result === undefined ? null : _jsx("pre", { children: call.result })] }, call.callId))) })) : null] }))] }));
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=Conversations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Conversations.js","sourceRoot":"","sources":["../../../../src/client/admin/pages/Conversations.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useAdminResource } from "../shared.js";
|
|
3
|
+
import { FEEDBACK_REASON_LABELS, REVIEW_PRIORITY_LABELS, REVIEW_REASON_LABELS, formatCount, formatRate, formatRelative, } from "../format.js";
|
|
4
|
+
/**
|
|
5
|
+
* The overview answers the four questions the admin asks on arrival: is
|
|
6
|
+
* anything broken, are users happy, is a spike coming, what needs me now. It
|
|
7
|
+
* is deliberately not an observability dashboard — latency and tokens belong to
|
|
8
|
+
* the harness's own telemetry.
|
|
9
|
+
*/
|
|
10
|
+
function Metric(props) {
|
|
11
|
+
return (_jsxs("article", { className: "dsh-qa-admin__metric", children: [_jsx("span", { className: "dsh-qa-admin__metric-label", children: props.label }), _jsx("strong", { className: "dsh-qa-admin__metric-value", children: props.value }), props.hint === undefined ? null : (_jsx("small", { className: "dsh-qa-admin__metric-hint", children: props.hint }))] }));
|
|
12
|
+
}
|
|
13
|
+
export function AdminOverview(props) {
|
|
14
|
+
const { data, error, reload } = useAdminResource(() => props.api.overview(props.token), [props.api, props.token]);
|
|
15
|
+
return (_jsxs("section", { className: "dsh-qa-admin__page", "aria-label": "\u041E\u0431\u0437\u043E\u0440", children: [_jsxs("div", { className: "dsh-qa-admin__title-row", children: [_jsxs("div", { children: [_jsx("h1", { children: "\u041E\u0431\u0437\u043E\u0440" }), _jsx("p", { children: "\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0438, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435, \u043E\u0431\u0440\u0430\u0442\u043D\u0430\u044F \u0441\u0432\u044F\u0437\u044C \u0438 \u0440\u0430\u0437\u0431\u043E\u0440 \u043E\u0442\u0432\u0435\u0442\u043E\u0432." })] }), _jsx("button", { type: "button", onClick: () => void reload(), children: "\u041E\u0431\u043D\u043E\u0432\u0438\u0442\u044C" })] }), error === undefined ? null : (_jsx("p", { className: "dsh-qa-admin__error", role: "alert", children: error })), data === undefined ? (_jsx("p", { className: "dsh-qa-admin__empty", children: "\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u044E\u2026" })) : (_jsxs(_Fragment, { children: [_jsxs("div", { className: "dsh-qa-admin__metrics", children: [_jsx(Metric, { label: "\u0420\u0430\u0437\u0433\u043E\u0432\u043E\u0440\u044B", value: formatCount(data.metrics.conversations), hint: `${formatCount(data.metrics.activeUsers)} пользователей` }), _jsx(Metric, { label: "\u041E\u0446\u0435\u043D\u0451\u043D\u043D\u044B\u0435 \u043E\u0442\u0432\u0435\u0442\u044B", value: formatCount(data.metrics.ratedMessages), hint: `${formatRate(data.metrics.ratingRate)} от ответов` }), _jsx(Metric, { label: "\u041F\u043E\u043B\u043E\u0436\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0435 \u043E\u0446\u0435\u043D\u043A\u0438", value: formatRate(data.metrics.positiveRate), hint: `👍 ${formatCount(data.metrics.positiveRatings)} · 👎 ${formatCount(data.metrics.negativeRatings)}` }), _jsx(Metric, { label: "\u0416\u0434\u0443\u0442 \u0440\u0430\u0437\u0431\u043E\u0440\u0430", value: formatCount(data.metrics.unreviewedNegatives), hint: `разобрано: ${formatCount(data.metrics.reviewedItems)}` })] }), _jsxs("section", { className: "dsh-qa-admin__panel", children: [_jsx("h2", { children: "\u0422\u0440\u0435\u0431\u0443\u0435\u0442 \u0432\u043D\u0438\u043C\u0430\u043D\u0438\u044F" }), data.alerts.length === 0 ? (_jsx("p", { className: "dsh-qa-admin__empty", children: "\u041D\u0438\u0447\u0435\u0433\u043E \u0441\u0440\u043E\u0447\u043D\u043E\u0433\u043E: \u043D\u0435\u0440\u0430\u0437\u043E\u0431\u0440\u0430\u043D\u043D\u044B\u0445 \u043D\u0435\u0433\u0430\u0442\u0438\u0432\u043D\u044B\u0445 \u043E\u0446\u0435\u043D\u043E\u043A \u043D\u0435\u0442." })) : (_jsx("ul", { className: "dsh-qa-admin__alerts", children: data.alerts.map((alert, index) => (_jsx("li", { className: `dsh-qa-admin__alert dsh-qa-admin__alert--${alert.level}`, children: alert.code === "unreviewed-negatives"
|
|
16
|
+
? `${formatCount(alert.count)} негативных оценок без разбора`
|
|
17
|
+
: alert.code === "subrole-satisfaction"
|
|
18
|
+
? `Роль «${alert.subject}»: положительных ${formatRate(alert.rate ?? null)} против общей доли`
|
|
19
|
+
: `Причина «${FEEDBACK_REASON_LABELS[alert.subject] ?? alert.subject}» повторяется ${formatCount(alert.count)} раз` }, `${alert.code}:${alert.subject ?? index}`))) }))] }), _jsxs("section", { className: "dsh-qa-admin__panel", children: [_jsxs("div", { className: "dsh-qa-admin__panel-head", children: [_jsx("h2", { children: "\u041E\u0447\u0435\u0440\u0435\u0434\u044C \u0440\u0430\u0437\u0431\u043E\u0440\u0430" }), _jsx("button", { type: "button", onClick: props.onOpenQueue, children: "\u0412\u0441\u044F \u043E\u0447\u0435\u0440\u0435\u0434\u044C" })] }), _jsx(QueuePreview, { rows: data.queue, onOpenConversation: props.onOpenConversation })] }), _jsxs("section", { className: "dsh-qa-admin__panel", children: [_jsx("h2", { children: "\u041F\u043E\u0441\u043B\u0435\u0434\u043D\u0438\u0435 \u043E\u0446\u0435\u043D\u043A\u0438" }), data.recentFeedback.length === 0 ? (_jsx("p", { className: "dsh-qa-admin__empty", children: "\u041E\u0446\u0435\u043D\u043E\u043A \u043F\u043E\u043A\u0430 \u043D\u0435\u0442." })) : (_jsx("ul", { className: "dsh-qa-admin__recent", children: data.recentFeedback.map((row) => (_jsxs("li", { children: [_jsx("span", { "aria-hidden": "true", children: row.rating === "positive" ? "👍" : "👎" }), _jsx("button", { type: "button", onClick: () => props.onOpenConversation(row.conversationId, row.messageId), children: row.conversationTitle ?? row.conversationId }), _jsx("span", { children: row.displayName }), _jsx("time", { title: row.createdAt, children: formatRelative(row.createdAt) })] }, row.id))) }))] })] }))] }));
|
|
20
|
+
}
|
|
21
|
+
export function QueuePreview(props) {
|
|
22
|
+
return props.rows.length === 0 ? (_jsx("p", { className: "dsh-qa-admin__empty", children: "\u041E\u0447\u0435\u0440\u0435\u0434\u044C \u043F\u0443\u0441\u0442\u0430." })) : (_jsx("ul", { className: "dsh-qa-admin__queue", children: props.rows.map((row, index) => (_jsxs("li", { className: `dsh-qa-admin__queue-item dsh-qa-admin__queue-item--${row.priority}`, children: [_jsxs("div", { className: "dsh-qa-admin__queue-head", children: [_jsx("span", { className: "dsh-qa-admin__queue-priority", children: REVIEW_PRIORITY_LABELS[row.priority] }), _jsx("span", { children: REVIEW_REASON_LABELS[row.reason] }), _jsx("time", { title: row.raisedAt, children: formatRelative(row.raisedAt) })] }), _jsx("button", { type: "button", onClick: () => props.onOpenConversation(row.conversationId, row.messageId), children: row.title ?? row.conversationId }), _jsx("span", { className: "dsh-qa-admin__queue-owner", children: row.displayName })] }, `${row.conversationId}:${row.messageId ?? ""}:${index}`))) }));
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=Overview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Overview.js","sourceRoot":"","sources":["../../../../src/client/admin/pages/Overview.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useState } from "react";
|
|
3
|
+
import { FEEDBACK_REASON_LABELS, REVIEW_STATUS_LABELS, formatCount, formatRate, formatStamp, } from "../format.js";
|
|
4
|
+
import { Badge, FilterField, Pager, adminErrorMessage, useAdminResource, } from "../shared.js";
|
|
5
|
+
const PAGE_SIZE = 25;
|
|
6
|
+
/** The feedback table: every rating against the exact answer it judged. */
|
|
7
|
+
export function AdminFeedback(props) {
|
|
8
|
+
const [rating, setRating] = useState("");
|
|
9
|
+
const [reason, setReason] = useState("");
|
|
10
|
+
const [reviewStatus, setReviewStatus] = useState("");
|
|
11
|
+
const [rows, setRows] = useState([]);
|
|
12
|
+
const [cursor, setCursor] = useState(null);
|
|
13
|
+
const [total, setTotal] = useState(0);
|
|
14
|
+
const [loading, setLoading] = useState(true);
|
|
15
|
+
const load = useCallback(async (next, append) => {
|
|
16
|
+
setLoading(true);
|
|
17
|
+
const query = {
|
|
18
|
+
rating: rating === "" ? null : rating,
|
|
19
|
+
reason: reason === "" ? null : reason,
|
|
20
|
+
reviewStatus: reviewStatus === ""
|
|
21
|
+
? null
|
|
22
|
+
: reviewStatus,
|
|
23
|
+
};
|
|
24
|
+
const result = await props.api.feedback(props.token, query, next, PAGE_SIZE);
|
|
25
|
+
setLoading(false);
|
|
26
|
+
if (!result.ok)
|
|
27
|
+
return;
|
|
28
|
+
setTotal(result.value.total);
|
|
29
|
+
setCursor(result.value.nextCursor);
|
|
30
|
+
setRows((current) => append ? [...current, ...result.value.items] : result.value.items);
|
|
31
|
+
}, [props.api, props.token, rating, reason, reviewStatus]);
|
|
32
|
+
useEffect(() => {
|
|
33
|
+
void load(null, false);
|
|
34
|
+
}, [load]);
|
|
35
|
+
return (_jsxs("section", { className: "dsh-qa-admin__page", "aria-label": "\u041E\u0431\u0440\u0430\u0442\u043D\u0430\u044F \u0441\u0432\u044F\u0437\u044C", children: [_jsx("div", { className: "dsh-qa-admin__title-row", children: _jsxs("div", { children: [_jsx("h1", { children: "\u041E\u0431\u0440\u0430\u0442\u043D\u0430\u044F \u0441\u0432\u044F\u0437\u044C" }), _jsx("p", { children: "\u041E\u0446\u0435\u043D\u043A\u0430 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F \u2014 \u044D\u0442\u043E \u0441\u0438\u0433\u043D\u0430\u043B \u0443\u0434\u043E\u0432\u043B\u0435\u0442\u0432\u043E\u0440\u0451\u043D\u043D\u043E\u0441\u0442\u0438, \u0430 \u043D\u0435 \u0438\u0437\u043C\u0435\u0440\u0435\u043D\u0438\u0435 \u0442\u043E\u0447\u043D\u043E\u0441\u0442\u0438 \u043E\u0442\u0432\u0435\u0442\u0430." })] }) }), _jsxs("div", { className: "dsh-qa-admin__filters", children: [_jsx(FilterField, { label: "\u041E\u0446\u0435\u043D\u043A\u0430", children: _jsxs("select", { value: rating, onChange: (event) => setRating(event.currentTarget.value), children: [_jsx("option", { value: "", children: "\u041B\u044E\u0431\u0430\u044F" }), _jsx("option", { value: "positive", children: "\uD83D\uDC4D" }), _jsx("option", { value: "negative", children: "\uD83D\uDC4E" })] }) }), _jsx(FilterField, { label: "\u041F\u0440\u0438\u0447\u0438\u043D\u0430", children: _jsxs("select", { value: reason, onChange: (event) => setReason(event.currentTarget.value), children: [_jsx("option", { value: "", children: "\u041B\u044E\u0431\u0430\u044F" }), Object.keys(FEEDBACK_REASON_LABELS).map((value) => (_jsx("option", { value: value, children: FEEDBACK_REASON_LABELS[value] }, value)))] }) }), _jsx(FilterField, { label: "\u0420\u0430\u0437\u0431\u043E\u0440", children: _jsxs("select", { value: reviewStatus, onChange: (event) => setReviewStatus(event.currentTarget.value), children: [_jsx("option", { value: "", children: "\u041B\u044E\u0431\u043E\u0439" }), _jsx("option", { value: "unreviewed", children: "\u041D\u0435 \u0440\u0430\u0437\u043E\u0431\u0440\u0430\u043D\u043E" }), _jsx("option", { value: "reviewed", children: "\u0420\u0430\u0437\u043E\u0431\u0440\u0430\u043D\u043E" }), _jsx("option", { value: "needs_followup", children: "\u041D\u0443\u0436\u043D\u043E \u0432\u0435\u0440\u043D\u0443\u0442\u044C\u0441\u044F" })] }) })] }), rows.length === 0 ? (_jsx("p", { className: "dsh-qa-admin__empty", children: loading ? "Загружаю…" : "Оценок пока нет." })) : (_jsxs("table", { className: "dsh-qa-admin__table", children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { children: "\u041E\u0446\u0435\u043D\u043A\u0430" }), _jsx("th", { children: "\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C" }), _jsx("th", { children: "\u041F\u0440\u043E\u0444\u0438\u043B\u044C" }), _jsx("th", { children: "\u0420\u0430\u0437\u0433\u043E\u0432\u043E\u0440" }), _jsx("th", { children: "\u041F\u0440\u0438\u0447\u0438\u043D\u0430" }), _jsx("th", { children: "\u0414\u0430\u0442\u0430" }), _jsx("th", { children: "\u0420\u0430\u0437\u0431\u043E\u0440" }), _jsx("th", {})] }) }), _jsx("tbody", { children: rows.map((row) => (_jsxs("tr", { children: [_jsx("td", { children: row.rating === "positive" ? "👍" : "👎" }), _jsx("td", { children: row.displayName }), _jsx("td", { children: row.subroleId === "" ? "—" : row.subroleId }), _jsx("td", { children: row.conversationTitle ?? row.conversationId }), _jsxs("td", { children: [(row.reasons ?? [])
|
|
36
|
+
.map((value) => FEEDBACK_REASON_LABELS[value])
|
|
37
|
+
.join(", ") || "—", row.comment === undefined ? null : (_jsx("small", { children: row.comment }))] }), _jsx("td", { children: formatStamp(row.createdAt) }), _jsx("td", { children: _jsx(Badge, { tone: row.reviewStatus === "reviewed" ? "positive" : "neutral", children: REVIEW_STATUS_LABELS[row.reviewStatus] }) }), _jsx("td", { children: _jsx("button", { type: "button", onClick: () => props.onOpenConversation(row.conversationId, row.messageId), children: "\u041A \u043E\u0442\u0432\u0435\u0442\u0443" }) })] }, row.id))) })] })), _jsx(Pager, { total: total, shown: rows.length, hasMore: cursor !== null, loading: loading, onMore: () => void load(cursor, true), onReset: () => void load(null, false) })] }));
|
|
38
|
+
}
|
|
39
|
+
/** Issue distribution, per-subrole satisfaction and the trend over time. */
|
|
40
|
+
export function AdminQuality(props) {
|
|
41
|
+
const resource = useAdminResource(() => props.api.metrics(props.token), [props.api, props.token]);
|
|
42
|
+
const metrics = resource.data;
|
|
43
|
+
return (_jsxs("section", { className: "dsh-qa-admin__page", "aria-label": "\u0410\u043D\u0430\u043B\u0438\u0442\u0438\u043A\u0430 \u043A\u0430\u0447\u0435\u0441\u0442\u0432\u0430", children: [_jsxs("div", { className: "dsh-qa-admin__title-row", children: [_jsxs("div", { children: [_jsx("h1", { children: "\u0410\u043D\u0430\u043B\u0438\u0442\u0438\u043A\u0430" }), _jsx("p", { children: "\u0414\u043E\u043B\u0438 \u0441\u0447\u0438\u0442\u0430\u044E\u0442\u0441\u044F \u043F\u043E \u043E\u0446\u0435\u043D\u0451\u043D\u043D\u044B\u043C \u043E\u0442\u0432\u0435\u0442\u0430\u043C. \u042D\u0442\u043E \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0439 \u0441\u0438\u0433\u043D\u0430\u043B, \u0430 \u043D\u0435 \u0438\u0437\u043C\u0435\u0440\u0435\u043D\u043D\u0430\u044F \u0442\u043E\u0447\u043D\u043E\u0441\u0442\u044C." })] }), _jsx("button", { type: "button", onClick: () => void resource.reload(), children: "\u041E\u0431\u043D\u043E\u0432\u0438\u0442\u044C" })] }), resource.error === undefined ? null : (_jsx("p", { className: "dsh-qa-admin__error", role: "alert", children: adminErrorMessage(resource.error) })), metrics === undefined ? (_jsx("p", { className: "dsh-qa-admin__empty", children: "\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u044E\u2026" })) : (_jsxs(_Fragment, { children: [_jsxs("dl", { className: "dsh-qa-admin__facts dsh-qa-admin__facts--wide", children: [_jsx("dt", { children: "\u0420\u0430\u0437\u0433\u043E\u0432\u043E\u0440\u044B" }), _jsx("dd", { children: formatCount(metrics.conversations) }), _jsx("dt", { children: "\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0438 \u0441 \u0440\u0430\u0437\u0433\u043E\u0432\u043E\u0440\u0430\u043C\u0438" }), _jsx("dd", { children: formatCount(metrics.activeUsers) }), _jsx("dt", { children: "\u041E\u0442\u0432\u0435\u0442\u044B \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043D\u0442\u0430" }), _jsx("dd", { children: formatCount(metrics.assistantMessages) }), _jsx("dt", { children: "\u041E\u0446\u0435\u043D\u0451\u043D\u043D\u044B\u0435 \u043E\u0442\u0432\u0435\u0442\u044B" }), _jsx("dd", { children: formatCount(metrics.ratedMessages) }), _jsx("dt", { children: "\u0414\u043E\u043B\u044F \u043E\u0446\u0435\u043D\u0451\u043D\u043D\u044B\u0445" }), _jsx("dd", { children: formatRate(metrics.ratingRate) }), _jsx("dt", { children: "\u041F\u043E\u043B\u043E\u0436\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0445" }), _jsx("dd", { children: formatCount(metrics.positiveRatings) }), _jsx("dt", { children: "\u041D\u0435\u0433\u0430\u0442\u0438\u0432\u043D\u044B\u0445" }), _jsx("dd", { children: formatCount(metrics.negativeRatings) }), _jsx("dt", { children: "\u041F\u043E\u043B\u043E\u0436\u0438\u0442\u0435\u043B\u044C\u043D\u0430\u044F \u0434\u043E\u043B\u044F" }), _jsx("dd", { children: formatRate(metrics.positiveRate) }), _jsx("dt", { children: "\u041D\u0435\u0440\u0430\u0437\u043E\u0431\u0440\u0430\u043D\u043D\u044B\u0445 \u043D\u0435\u0433\u0430\u0442\u0438\u0432\u043D\u044B\u0445" }), _jsx("dd", { children: formatCount(metrics.unreviewedNegatives) }), _jsx("dt", { children: "\u0420\u0430\u0437\u043E\u0431\u0440\u0430\u043D\u043E" }), _jsx("dd", { children: formatCount(metrics.reviewedItems) })] }), _jsxs("section", { className: "dsh-qa-admin__panel", children: [_jsx("h2", { children: "\u041F\u043E\u043B\u043E\u0436\u0438\u0442\u0435\u043B\u044C\u043D\u0430\u044F \u0434\u043E\u043B\u044F \u043F\u043E \u043F\u0440\u043E\u0444\u0438\u043B\u044F\u043C" }), metrics.bySubrole.length === 0 ? (_jsx("p", { className: "dsh-qa-admin__empty", children: "\u041E\u0446\u0435\u043D\u043E\u043A \u043F\u043E \u043F\u0440\u043E\u0444\u0438\u043B\u044F\u043C \u043D\u0435\u0442." })) : (_jsxs("table", { className: "dsh-qa-admin__table", children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { children: "\u041F\u0440\u043E\u0444\u0438\u043B\u044C" }), _jsx("th", { children: "\u041E\u0446\u0435\u043D\u0435\u043D\u043E" }), _jsx("th", { children: "\uD83D\uDC4D" }), _jsx("th", { children: "\uD83D\uDC4E" }), _jsx("th", { children: "\u0414\u043E\u043B\u044F" })] }) }), _jsx("tbody", { children: metrics.bySubrole.map((row) => (_jsxs("tr", { children: [_jsx("td", { children: row.label }), _jsx("td", { children: formatCount(row.rated) }), _jsx("td", { children: formatCount(row.positive) }), _jsx("td", { children: formatCount(row.negative) }), _jsx("td", { children: formatRate(row.positiveRate) })] }, row.key))) })] }))] }), _jsxs("section", { className: "dsh-qa-admin__panel", children: [_jsx("h2", { children: "\u041F\u0440\u043E\u0431\u043B\u0435\u043C\u044B \u043F\u043E \u0432\u0435\u0440\u0434\u0438\u043A\u0442\u0430\u043C \u0440\u0435\u0432\u044C\u044E\u0435\u0440\u043E\u0432" }), metrics.issues.length === 0 ? (_jsx("p", { className: "dsh-qa-admin__empty", children: "\u0420\u0430\u0437\u0431\u043E\u0440\u043E\u0432 \u043F\u043E\u043A\u0430 \u043D\u0435\u0442." })) : (_jsx("ul", { className: "dsh-qa-admin__issues-list", children: metrics.issues.map((row) => (_jsxs("li", { children: [_jsx("span", { children: row.issue }), _jsx("strong", { children: formatCount(row.count) })] }, row.issue))) }))] }), _jsxs("section", { className: "dsh-qa-admin__panel", children: [_jsx("h2", { children: "\u041E\u0446\u0435\u043D\u043A\u0438 \u043F\u043E \u0434\u043D\u044F\u043C" }), metrics.trend.length === 0 ? (_jsx("p", { className: "dsh-qa-admin__empty", children: "\u041E\u0446\u0435\u043D\u043E\u043A \u043F\u043E\u043A\u0430 \u043D\u0435\u0442." })) : (_jsx("ul", { className: "dsh-qa-admin__trend", children: metrics.trend.map((point) => (_jsxs("li", { children: [_jsx("span", { children: point.date }), _jsxs("span", { children: ["\uD83D\uDC4D ", formatCount(point.positive)] }), _jsxs("span", { children: ["\uD83D\uDC4E ", formatCount(point.negative)] })] }, point.date))) }))] })] }))] }));
|
|
44
|
+
}
|
|
45
|
+
/** Every administrative action, newest first, from both writers. */
|
|
46
|
+
export function AdminAudit(props) {
|
|
47
|
+
const [rows, setRows] = useState([]);
|
|
48
|
+
const [action, setAction] = useState("");
|
|
49
|
+
const [cursor, setCursor] = useState(null);
|
|
50
|
+
const [total, setTotal] = useState(0);
|
|
51
|
+
const [loading, setLoading] = useState(true);
|
|
52
|
+
const load = useCallback(async (next, append) => {
|
|
53
|
+
setLoading(true);
|
|
54
|
+
const query = {
|
|
55
|
+
action: action === "" ? null : action,
|
|
56
|
+
};
|
|
57
|
+
const result = await props.api.audit(props.token, query, next, PAGE_SIZE);
|
|
58
|
+
setLoading(false);
|
|
59
|
+
if (!result.ok)
|
|
60
|
+
return;
|
|
61
|
+
setTotal(result.value.total);
|
|
62
|
+
setCursor(result.value.nextCursor);
|
|
63
|
+
setRows((current) => append ? [...current, ...result.value.items] : result.value.items);
|
|
64
|
+
}, [props.api, props.token, action]);
|
|
65
|
+
useEffect(() => {
|
|
66
|
+
void load(null, false);
|
|
67
|
+
}, [load]);
|
|
68
|
+
return (_jsxs("section", { className: "dsh-qa-admin__page", "aria-label": "\u0410\u0443\u0434\u0438\u0442", children: [_jsx("div", { className: "dsh-qa-admin__title-row", children: _jsxs("div", { children: [_jsx("h1", { children: "\u0410\u0443\u0434\u0438\u0442" }), _jsx("p", { children: "\u0418\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u0434\u043E\u0441\u0442\u0443\u043F\u0430, \u043D\u0430\u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0439 \u0438 \u0440\u0430\u0437\u0431\u043E\u0440\u043E\u0432. \u0417\u0430\u043F\u0438\u0441\u044C \u0445\u0440\u0430\u043D\u0438\u0442 \u0441\u043D\u0438\u043C\u043E\u043A \u00AB\u0434\u043E\u00BB \u0438 \u00AB\u043F\u043E\u0441\u043B\u0435\u00BB." })] }) }), _jsx("div", { className: "dsh-qa-admin__filters", children: _jsx(FilterField, { label: "\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435", children: _jsxs("select", { value: action, onChange: (event) => setAction(event.currentTarget.value), children: [_jsx("option", { value: "", children: "\u041B\u044E\u0431\u043E\u0435" }), _jsx("option", { value: "authorization.changed", children: "\u0420\u043E\u043B\u044C \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0430" }), _jsx("option", { value: "user.disabled", children: "\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C \u043E\u0442\u043A\u043B\u044E\u0447\u0451\u043D" }), _jsx("option", { value: "user.enabled", children: "\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C \u0432\u043A\u043B\u044E\u0447\u0451\u043D" }), _jsx("option", { value: "subrole.assignment.changed", children: "\u041D\u0430\u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u043E" }), _jsx("option", { value: "subrole.created", children: "\u0421\u0430\u0431\u0440\u043E\u043B\u044C \u0441\u043E\u0437\u0434\u0430\u043D\u0430" }), _jsx("option", { value: "subrole.updated", children: "\u0421\u0430\u0431\u0440\u043E\u043B\u044C \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0430" }), _jsx("option", { value: "subrole.deleted", children: "\u0421\u0430\u0431\u0440\u043E\u043B\u044C \u0443\u0434\u0430\u043B\u0435\u043D\u0430" }), _jsx("option", { value: "common_capabilities.updated", children: "\u041E\u0431\u0449\u0438\u0435 \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E\u0441\u0442\u0438 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u044B" }), _jsx("option", { value: "conversation.reviewed", children: "\u0420\u0430\u0437\u0433\u043E\u0432\u043E\u0440 \u0440\u0430\u0437\u043E\u0431\u0440\u0430\u043D" }), _jsx("option", { value: "review.updated", children: "\u0420\u0430\u0437\u0431\u043E\u0440 \u043E\u0431\u043D\u043E\u0432\u043B\u0451\u043D" }), _jsx("option", { value: "review.queued", children: "\u041E\u0442\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043E \u043D\u0430 \u0440\u0430\u0437\u0431\u043E\u0440" })] }) }) }), rows.length === 0 ? (_jsx("p", { className: "dsh-qa-admin__empty", children: loading ? "Загружаю…" : "Изменений пока нет." })) : (_jsx("ol", { className: "dsh-qa-audit", children: rows.map((event) => (_jsxs("li", { children: [_jsx("time", { title: event.timestamp, children: formatStamp(event.timestamp) }), _jsx("strong", { children: event.action }), _jsx("span", { children: event.targetId ?? event.targetType ?? "—" }), _jsx("code", { children: event.actorId }), event.before === undefined &&
|
|
69
|
+
event.after === undefined ? null : (_jsxs("details", { children: [_jsx("summary", { children: "\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0435" }), _jsxs("pre", { children: [event.before ?? "—", "\n→\n", event.after ?? "—"] })] }))] }, event.id))) })), _jsx(Pager, { total: total, shown: rows.length, hasMore: cursor !== null, loading: loading, onMore: () => void load(cursor, true), onReset: () => void load(null, false) })] }));
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=Quality.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Quality.js","sourceRoot":"","sources":["../../../../src/client/admin/pages/Quality.tsx"],"names":[],"mappings":"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"}
|