@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.
Files changed (287) hide show
  1. package/README.md +163 -7
  2. package/capability-policy.json +1 -1
  3. package/lib/access/capability-catalog.js +144 -0
  4. package/lib/access/capability-catalog.js.map +1 -0
  5. package/lib/access/model.js +379 -0
  6. package/lib/access/model.js.map +1 -0
  7. package/lib/access/role-repository.js +195 -0
  8. package/lib/access/role-repository.js.map +1 -0
  9. package/lib/access/service.js +380 -0
  10. package/lib/access/service.js.map +1 -0
  11. package/lib/access/skill-metadata.js +234 -0
  12. package/lib/access/skill-metadata.js.map +1 -0
  13. package/lib/account-remotes.js +20 -10
  14. package/lib/account-remotes.js.map +1 -1
  15. package/lib/accounts/errors.js.map +1 -1
  16. package/lib/accounts/file.js.map +1 -1
  17. package/lib/accounts/store.js +202 -3
  18. package/lib/accounts/store.js.map +1 -1
  19. package/lib/admin/conversation-log.js +256 -0
  20. package/lib/admin/conversation-log.js.map +1 -0
  21. package/lib/admin/index.js +17 -0
  22. package/lib/admin/index.js.map +1 -0
  23. package/lib/admin/metrics.js +103 -0
  24. package/lib/admin/metrics.js.map +1 -0
  25. package/lib/admin/paging.js +23 -0
  26. package/lib/admin/paging.js.map +1 -0
  27. package/lib/admin/permissions.js +50 -0
  28. package/lib/admin/permissions.js.map +1 -0
  29. package/lib/admin/quality-store.js +485 -0
  30. package/lib/admin/quality-store.js.map +1 -0
  31. package/lib/admin/queue.js +107 -0
  32. package/lib/admin/queue.js.map +1 -0
  33. package/lib/admin/redaction.js +45 -0
  34. package/lib/admin/redaction.js.map +1 -0
  35. package/lib/admin/service.js +897 -0
  36. package/lib/admin/service.js.map +1 -0
  37. package/lib/admin/session-log.js +142 -0
  38. package/lib/admin/session-log.js.map +1 -0
  39. package/lib/cli.js +9 -6
  40. package/lib/cli.js.map +1 -1
  41. package/lib/client/QaSessionController.js +28 -2
  42. package/lib/client/QaSessionController.js.map +1 -1
  43. package/lib/client/QaSurface.js +143 -5
  44. package/lib/client/QaSurface.js.map +1 -1
  45. package/lib/client/QaTranscriptAdapter.js +1 -0
  46. package/lib/client/QaTranscriptAdapter.js.map +1 -1
  47. package/lib/client/admin/QaAdmin.js +458 -0
  48. package/lib/client/admin/QaAdmin.js.map +1 -0
  49. package/lib/client/admin/format.js +177 -0
  50. package/lib/client/admin/format.js.map +1 -0
  51. package/lib/client/admin/pages/Conversations.js +114 -0
  52. package/lib/client/admin/pages/Conversations.js.map +1 -0
  53. package/lib/client/admin/pages/Overview.js +24 -0
  54. package/lib/client/admin/pages/Overview.js.map +1 -0
  55. package/lib/client/admin/pages/Quality.js +71 -0
  56. package/lib/client/admin/pages/Quality.js.map +1 -0
  57. package/lib/client/admin/pages/Review.js +93 -0
  58. package/lib/client/admin/pages/Review.js.map +1 -0
  59. package/lib/client/admin/pages/Users.js +95 -0
  60. package/lib/client/admin/pages/Users.js.map +1 -0
  61. package/lib/client/admin/routes.js +143 -0
  62. package/lib/client/admin/routes.js.map +1 -0
  63. package/lib/client/admin/shared.js +91 -0
  64. package/lib/client/admin/shared.js.map +1 -0
  65. package/lib/client/admin/styles.js +111 -0
  66. package/lib/client/admin/styles.js.map +1 -0
  67. package/lib/client/components/QaChangelog.js +53 -0
  68. package/lib/client/components/QaChangelog.js.map +1 -1
  69. package/lib/client/components/QaHeader.js +3 -3
  70. package/lib/client/components/QaHeader.js.map +1 -1
  71. package/lib/client/components/QaMessage.js +61 -2
  72. package/lib/client/components/QaMessage.js.map +1 -1
  73. package/lib/client/create-session.js +1 -1
  74. package/lib/client/create-session.js.map +1 -1
  75. package/lib/client/index.js +48 -1
  76. package/lib/client/index.js.map +1 -1
  77. package/lib/client/role/RoleSelector.js +31 -0
  78. package/lib/client/role/RoleSelector.js.map +1 -0
  79. package/lib/client/session-sources.js +37 -1
  80. package/lib/client/session-sources.js.map +1 -1
  81. package/lib/client/settings/card.js +2 -2
  82. package/lib/client/settings/card.js.map +1 -1
  83. package/lib/client/settings/sections.js +0 -1
  84. package/lib/client/settings/sections.js.map +1 -1
  85. package/lib/client/settings-extensions/index.js +1 -0
  86. package/lib/client/settings-extensions/index.js.map +1 -1
  87. package/lib/client/settings-extensions/user-session.js +62 -0
  88. package/lib/client/settings-extensions/user-session.js.map +1 -0
  89. package/lib/client/styles.js +31 -0
  90. package/lib/client/styles.js.map +1 -1
  91. package/lib/client/types.js.map +1 -1
  92. package/lib/client.js +9993 -4848
  93. package/lib/client.js.map +1 -1
  94. package/lib/config-resolvers/defaults.js +0 -2
  95. package/lib/config-resolvers/defaults.js.map +1 -1
  96. package/lib/config.js +0 -249
  97. package/lib/config.js.map +1 -1
  98. package/lib/enforcement/skill-policy.js +172 -0
  99. package/lib/enforcement/skill-policy.js.map +1 -0
  100. package/lib/enforcement/tool-grants.js +151 -0
  101. package/lib/enforcement/tool-grants.js.map +1 -0
  102. package/lib/index.js +224 -42
  103. package/lib/index.js.map +1 -1
  104. package/lib/personal-skills/service.js +10 -3
  105. package/lib/personal-skills/service.js.map +1 -1
  106. package/lib/qa-tools/index.js +4 -0
  107. package/lib/qa-tools/index.js.map +1 -1
  108. package/lib/resolve-config.js +0 -2
  109. package/lib/resolve-config.js.map +1 -1
  110. package/lib/secure-session.js +71 -17
  111. package/lib/secure-session.js.map +1 -1
  112. package/lib/typert.host.js +2237 -202
  113. package/lib/typert.remote-client.d.ts +49 -3
  114. package/lib/typert.remote-client.js +1863 -183
  115. package/lib/types/access/capability-catalog.d.ts +37 -0
  116. package/lib/types/access/model.d.ts +60 -0
  117. package/lib/types/access/role-repository.d.ts +32 -0
  118. package/lib/types/access/service.d.ts +57 -0
  119. package/lib/types/access/skill-metadata.d.ts +53 -0
  120. package/lib/types/account-remotes.d.ts +6 -0
  121. package/lib/types/accounts/errors.d.ts +1 -1
  122. package/lib/types/accounts/file.d.ts +16 -5
  123. package/lib/types/accounts/store.d.ts +83 -3
  124. package/lib/types/admin/conversation-log.d.ts +39 -0
  125. package/lib/types/admin/index.d.ts +24 -0
  126. package/lib/types/admin/metrics.d.ts +29 -0
  127. package/lib/types/admin/paging.d.ts +33 -0
  128. package/lib/types/admin/permissions.d.ts +10 -0
  129. package/lib/types/admin/quality-store.d.ts +82 -0
  130. package/lib/types/admin/queue.d.ts +21 -0
  131. package/lib/types/admin/redaction.d.ts +29 -0
  132. package/lib/types/admin/service.d.ts +105 -0
  133. package/lib/types/admin/session-log.d.ts +53 -0
  134. package/lib/types/client/QaSessionController.d.ts +12 -1
  135. package/lib/types/client/QaSurface.d.ts +7 -1
  136. package/lib/types/client/admin/QaAdmin.d.ts +17 -0
  137. package/lib/types/client/admin/format.d.ts +43 -0
  138. package/lib/types/client/admin/pages/Conversations.d.ts +21 -0
  139. package/lib/types/client/admin/pages/Overview.d.ts +13 -0
  140. package/lib/types/client/admin/pages/Quality.d.ts +18 -0
  141. package/lib/types/client/admin/pages/Review.d.ts +15 -0
  142. package/lib/types/client/admin/pages/Users.d.ts +22 -0
  143. package/lib/types/client/admin/routes.d.ts +60 -0
  144. package/lib/types/client/admin/shared.d.ts +53 -0
  145. package/lib/types/client/admin/styles.d.ts +11 -0
  146. package/lib/types/client/components/QaHeader.d.ts +5 -1
  147. package/lib/types/client/components/QaMessage.d.ts +14 -1
  148. package/lib/types/client/create-session.d.ts +2 -0
  149. package/lib/types/client/role/RoleSelector.d.ts +14 -0
  150. package/lib/types/client/session-sources.d.ts +9 -0
  151. package/lib/types/client/settings/sections.d.ts +0 -1
  152. package/lib/types/client/settings-extensions/index.d.ts +2 -0
  153. package/lib/types/client/settings-extensions/user-session.d.ts +59 -0
  154. package/lib/types/client/types.d.ts +39 -2
  155. package/lib/types/enforcement/skill-policy.d.ts +29 -0
  156. package/lib/types/enforcement/tool-grants.d.ts +84 -0
  157. package/lib/types/index.d.ts +62 -14
  158. package/lib/types/qa-tools/index.d.ts +2 -0
  159. package/lib/types/secure-session.d.ts +10 -1
  160. package/lib/types/types.d.ts +568 -5
  161. package/package.json +2 -2
  162. package/lib/client/settings/sections/documents.js +0 -88
  163. package/lib/client/settings/sections/documents.js.map +0 -1
  164. package/lib/documents/artifacts/ids.js +0 -43
  165. package/lib/documents/artifacts/ids.js.map +0 -1
  166. package/lib/documents/artifacts/manifest.js +0 -66
  167. package/lib/documents/artifacts/manifest.js.map +0 -1
  168. package/lib/documents/artifacts/store.js +0 -169
  169. package/lib/documents/artifacts/store.js.map +0 -1
  170. package/lib/documents/capabilities.js +0 -93
  171. package/lib/documents/capabilities.js.map +0 -1
  172. package/lib/documents/config.js +0 -302
  173. package/lib/documents/config.js.map +0 -1
  174. package/lib/documents/defaults.js +0 -78
  175. package/lib/documents/defaults.js.map +0 -1
  176. package/lib/documents/errors.js +0 -101
  177. package/lib/documents/errors.js.map +0 -1
  178. package/lib/documents/index.js +0 -80
  179. package/lib/documents/index.js.map +0 -1
  180. package/lib/documents/inspect/facts.js +0 -161
  181. package/lib/documents/inspect/facts.js.map +0 -1
  182. package/lib/documents/inspect/zip.js +0 -108
  183. package/lib/documents/inspect/zip.js.map +0 -1
  184. package/lib/documents/markdown/directives.js +0 -135
  185. package/lib/documents/markdown/directives.js.map +0 -1
  186. package/lib/documents/markdown/frontmatter.js +0 -35
  187. package/lib/documents/markdown/frontmatter.js.map +0 -1
  188. package/lib/documents/markdown/normalize.js +0 -113
  189. package/lib/documents/markdown/normalize.js.map +0 -1
  190. package/lib/documents/orchestrator/assets.js +0 -243
  191. package/lib/documents/orchestrator/assets.js.map +0 -1
  192. package/lib/documents/orchestrator/convert-document.js +0 -186
  193. package/lib/documents/orchestrator/convert-document.js.map +0 -1
  194. package/lib/documents/orchestrator/create-document.js +0 -292
  195. package/lib/documents/orchestrator/create-document.js.map +0 -1
  196. package/lib/documents/orchestrator/extract-document.js +0 -162
  197. package/lib/documents/orchestrator/extract-document.js.map +0 -1
  198. package/lib/documents/orchestrator/inspect-document.js +0 -89
  199. package/lib/documents/orchestrator/inspect-document.js.map +0 -1
  200. package/lib/documents/orchestrator/runtime-deps.js +0 -59
  201. package/lib/documents/orchestrator/runtime-deps.js.map +0 -1
  202. package/lib/documents/orchestrator/scope.js +0 -132
  203. package/lib/documents/orchestrator/scope.js.map +0 -1
  204. package/lib/documents/providers/docling.js +0 -247
  205. package/lib/documents/providers/docling.js.map +0 -1
  206. package/lib/documents/providers/libreoffice.js +0 -130
  207. package/lib/documents/providers/libreoffice.js.map +0 -1
  208. package/lib/documents/providers/markitdown.js +0 -89
  209. package/lib/documents/providers/markitdown.js.map +0 -1
  210. package/lib/documents/providers/pandoc.js +0 -161
  211. package/lib/documents/providers/pandoc.js.map +0 -1
  212. package/lib/documents/providers/process.js +0 -164
  213. package/lib/documents/providers/process.js.map +0 -1
  214. package/lib/documents/providers/registry.js +0 -152
  215. package/lib/documents/providers/registry.js.map +0 -1
  216. package/lib/documents/providers/shared.js +0 -75
  217. package/lib/documents/providers/shared.js.map +0 -1
  218. package/lib/documents/runtime.js +0 -114
  219. package/lib/documents/runtime.js.map +0 -1
  220. package/lib/documents/security/file-types.js +0 -188
  221. package/lib/documents/security/file-types.js.map +0 -1
  222. package/lib/documents/security/limits.js +0 -78
  223. package/lib/documents/security/limits.js.map +0 -1
  224. package/lib/documents/security/mime.js +0 -43
  225. package/lib/documents/security/mime.js.map +0 -1
  226. package/lib/documents/security/paths.js +0 -133
  227. package/lib/documents/security/paths.js.map +0 -1
  228. package/lib/documents/templates/registry.js +0 -147
  229. package/lib/documents/templates/registry.js.map +0 -1
  230. package/lib/documents/templates/resolver.js +0 -59
  231. package/lib/documents/templates/resolver.js.map +0 -1
  232. package/lib/documents/tools/convert.js +0 -125
  233. package/lib/documents/tools/convert.js.map +0 -1
  234. package/lib/documents/tools/create.js +0 -187
  235. package/lib/documents/tools/create.js.map +0 -1
  236. package/lib/documents/tools/index.js +0 -41
  237. package/lib/documents/tools/index.js.map +0 -1
  238. package/lib/documents/tools/inspect.js +0 -135
  239. package/lib/documents/tools/inspect.js.map +0 -1
  240. package/lib/documents/tools/shared.js +0 -88
  241. package/lib/documents/tools/shared.js.map +0 -1
  242. package/lib/documents/tools/to-markdown.js +0 -125
  243. package/lib/documents/tools/to-markdown.js.map +0 -1
  244. package/lib/documents/types.js +0 -12
  245. package/lib/documents/types.js.map +0 -1
  246. package/lib/types/client/settings/sections/documents.d.ts +0 -13
  247. package/lib/types/documents/artifacts/ids.d.ts +0 -14
  248. package/lib/types/documents/artifacts/manifest.d.ts +0 -32
  249. package/lib/types/documents/artifacts/store.d.ts +0 -67
  250. package/lib/types/documents/capabilities.d.ts +0 -32
  251. package/lib/types/documents/config.d.ts +0 -27
  252. package/lib/types/documents/defaults.d.ts +0 -161
  253. package/lib/types/documents/errors.d.ts +0 -42
  254. package/lib/types/documents/index.d.ts +0 -63
  255. package/lib/types/documents/inspect/facts.d.ts +0 -43
  256. package/lib/types/documents/inspect/zip.d.ts +0 -28
  257. package/lib/types/documents/markdown/directives.d.ts +0 -39
  258. package/lib/types/documents/markdown/frontmatter.d.ts +0 -15
  259. package/lib/types/documents/markdown/normalize.d.ts +0 -30
  260. package/lib/types/documents/orchestrator/assets.d.ts +0 -55
  261. package/lib/types/documents/orchestrator/convert-document.d.ts +0 -25
  262. package/lib/types/documents/orchestrator/create-document.d.ts +0 -18
  263. package/lib/types/documents/orchestrator/extract-document.d.ts +0 -24
  264. package/lib/types/documents/orchestrator/inspect-document.d.ts +0 -12
  265. package/lib/types/documents/orchestrator/runtime-deps.d.ts +0 -43
  266. package/lib/types/documents/orchestrator/scope.d.ts +0 -52
  267. package/lib/types/documents/providers/docling.d.ts +0 -54
  268. package/lib/types/documents/providers/libreoffice.d.ts +0 -40
  269. package/lib/types/documents/providers/markitdown.d.ts +0 -28
  270. package/lib/types/documents/providers/pandoc.d.ts +0 -42
  271. package/lib/types/documents/providers/process.d.ts +0 -54
  272. package/lib/types/documents/providers/registry.d.ts +0 -68
  273. package/lib/types/documents/providers/shared.d.ts +0 -27
  274. package/lib/types/documents/runtime.d.ts +0 -59
  275. package/lib/types/documents/security/file-types.d.ts +0 -39
  276. package/lib/types/documents/security/limits.d.ts +0 -24
  277. package/lib/types/documents/security/mime.d.ts +0 -13
  278. package/lib/types/documents/security/paths.d.ts +0 -38
  279. package/lib/types/documents/templates/registry.d.ts +0 -50
  280. package/lib/types/documents/templates/resolver.d.ts +0 -30
  281. package/lib/types/documents/tools/convert.d.ts +0 -9
  282. package/lib/types/documents/tools/create.d.ts +0 -14
  283. package/lib/types/documents/tools/index.d.ts +0 -33
  284. package/lib/types/documents/tools/inspect.d.ts +0 -9
  285. package/lib/types/documents/tools/shared.d.ts +0 -77
  286. package/lib/types/documents/tools/to-markdown.d.ts +0 -12
  287. 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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"}