@yadsh/dsh-qa-surface 0.13.0 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +148 -22
- package/compatibility.json +7 -3
- package/lib/access/capability-catalog.js +22 -6
- package/lib/access/capability-catalog.js.map +1 -1
- package/lib/access/model.js +36 -2
- package/lib/access/model.js.map +1 -1
- package/lib/access/service.js +19 -4
- package/lib/access/service.js.map +1 -1
- package/lib/account-remotes.js +4 -0
- package/lib/account-remotes.js.map +1 -1
- package/lib/accounts/database.js +49 -9
- package/lib/accounts/database.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 +53 -8
- package/lib/accounts/store.js.map +1 -1
- package/lib/admin/permissions.js +6 -0
- package/lib/admin/permissions.js.map +1 -1
- package/lib/admin/quality-store.js +95 -19
- package/lib/admin/quality-store.js.map +1 -1
- package/lib/admin/service.js +178 -0
- package/lib/admin/service.js.map +1 -1
- package/lib/cli.js +24 -4
- package/lib/cli.js.map +1 -1
- package/lib/client/QaAccountsController.js +52 -5
- package/lib/client/QaAccountsController.js.map +1 -1
- package/lib/client/QaConfigController.js.map +1 -1
- package/lib/client/QaSessionController.js +626 -63
- package/lib/client/QaSessionController.js.map +1 -1
- package/lib/client/QaSurface.js +293 -43
- package/lib/client/QaSurface.js.map +1 -1
- package/lib/client/QaSurfaceGuard.js +2 -2
- package/lib/client/QaSurfaceGuard.js.map +1 -1
- package/lib/client/QaTranscriptAdapter.js +4 -2
- package/lib/client/QaTranscriptAdapter.js.map +1 -1
- package/lib/client/admin/QaAdmin.js +59 -34
- package/lib/client/admin/QaAdmin.js.map +1 -1
- package/lib/client/admin/pages/Conversations.js +12 -12
- package/lib/client/admin/pages/Conversations.js.map +1 -1
- package/lib/client/admin/pages/ExpertMemory.js +210 -0
- package/lib/client/admin/pages/ExpertMemory.js.map +1 -0
- package/lib/client/admin/pages/Overview.js +4 -4
- package/lib/client/admin/pages/Overview.js.map +1 -1
- package/lib/client/admin/pages/Quality.js +5 -5
- package/lib/client/admin/pages/Quality.js.map +1 -1
- package/lib/client/admin/pages/Review.js +5 -5
- package/lib/client/admin/pages/Review.js.map +1 -1
- package/lib/client/admin/pages/SkillFiles.js +3 -3
- package/lib/client/admin/pages/SkillFiles.js.map +1 -1
- package/lib/client/admin/pages/Users.js +12 -12
- package/lib/client/admin/pages/Users.js.map +1 -1
- package/lib/client/admin/routes.js +4 -0
- package/lib/client/admin/routes.js.map +1 -1
- package/lib/client/admin/shared.js +15 -6
- package/lib/client/admin/shared.js.map +1 -1
- package/lib/client/admin/styles.js +3 -0
- package/lib/client/admin/styles.js.map +1 -1
- package/lib/client/attestation.js +11 -2
- package/lib/client/attestation.js.map +1 -1
- package/lib/client/audit/QaAuditDialog.js +2 -2
- package/lib/client/audit/QaAuditDialog.js.map +1 -1
- package/lib/client/audit/QaAuditRowBadge.js +1 -1
- package/lib/client/audit/QaAuditRowBadge.js.map +1 -1
- package/lib/client/components/Markdown.js +7 -2
- package/lib/client/components/Markdown.js.map +1 -1
- package/lib/client/components/QaAgentsDrawer.js +7 -5
- package/lib/client/components/QaAgentsDrawer.js.map +1 -1
- package/lib/client/components/QaApproval.js +2 -2
- package/lib/client/components/QaApproval.js.map +1 -1
- package/lib/client/components/QaAuthGate.js +6 -6
- package/lib/client/components/QaAuthGate.js.map +1 -1
- package/lib/client/components/QaChangelog.js +77 -0
- package/lib/client/components/QaChangelog.js.map +1 -1
- package/lib/client/components/QaComposer.js +9 -6
- package/lib/client/components/QaComposer.js.map +1 -1
- package/lib/client/components/QaFileAttachment.js +1 -1
- package/lib/client/components/QaFileAttachment.js.map +1 -1
- package/lib/client/components/QaFilesPanel.js +7 -7
- package/lib/client/components/QaFilesPanel.js.map +1 -1
- package/lib/client/components/QaHeader.js +4 -4
- package/lib/client/components/QaHeader.js.map +1 -1
- package/lib/client/components/QaMessage.js +12 -12
- package/lib/client/components/QaMessage.js.map +1 -1
- package/lib/client/components/QaModal.js +11 -2
- package/lib/client/components/QaModal.js.map +1 -1
- package/lib/client/components/QaQuestions.js +4 -4
- package/lib/client/components/QaQuestions.js.map +1 -1
- package/lib/client/components/QaQueueDock.js +137 -0
- package/lib/client/components/QaQueueDock.js.map +1 -0
- package/lib/client/components/QaRequestQueue.js +22 -0
- package/lib/client/components/QaRequestQueue.js.map +1 -0
- package/lib/client/components/QaRightRail.js +2 -2
- package/lib/client/components/QaRightRail.js.map +1 -1
- package/lib/client/components/QaSidebar.js +98 -7
- package/lib/client/components/QaSidebar.js.map +1 -1
- package/lib/client/components/QaSourcesPanel.js +10 -8
- package/lib/client/components/QaSourcesPanel.js.map +1 -1
- package/lib/client/components/QaThemeSwitcher.js +19 -0
- package/lib/client/components/QaThemeSwitcher.js.map +1 -0
- package/lib/client/components/QaTurnNotice.js +40 -0
- package/lib/client/components/QaTurnNotice.js.map +1 -0
- package/lib/client/components/QaTurnRail.js +3 -3
- package/lib/client/components/QaTurnRail.js.map +1 -1
- package/lib/client/components/QaWelcomeNotice.js +2 -6
- package/lib/client/components/QaWelcomeNotice.js.map +1 -1
- package/lib/client/components/QaWidthHandle.js +2 -2
- package/lib/client/components/QaWidthHandle.js.map +1 -1
- package/lib/client/components/QaWorkGroup.js +5 -5
- package/lib/client/components/QaWorkGroup.js.map +1 -1
- package/lib/client/components/QaWorkspaceBrowser.js +10 -10
- package/lib/client/components/QaWorkspaceBrowser.js.map +1 -1
- package/lib/client/components/VariantSwitcher.js +1 -1
- package/lib/client/components/VariantSwitcher.js.map +1 -1
- package/lib/client/failure-copy.js +26 -8
- package/lib/client/failure-copy.js.map +1 -1
- package/lib/client/focus-ring.js +193 -0
- package/lib/client/focus-ring.js.map +1 -0
- package/lib/client/index.js +40 -20
- package/lib/client/index.js.map +1 -1
- package/lib/client/lineage.js +3 -16
- package/lib/client/lineage.js.map +1 -1
- package/lib/client/markdown/CodeBlock.js +2 -2
- package/lib/client/markdown/CodeBlock.js.map +1 -1
- package/lib/client/markdown/blocks.js +118 -31
- package/lib/client/markdown/blocks.js.map +1 -1
- package/lib/client/markdown/math.js +1 -1
- package/lib/client/markdown/math.js.map +1 -1
- package/lib/client/markdown/render.js +32 -16
- package/lib/client/markdown/render.js.map +1 -1
- package/lib/client/markdown/source-chip.js +3 -3
- package/lib/client/markdown/source-chip.js.map +1 -1
- package/lib/client/notifications/notification-dispatcher.js +90 -0
- package/lib/client/notifications/notification-dispatcher.js.map +1 -0
- package/lib/client/notifications/preferences.js +61 -0
- package/lib/client/notifications/preferences.js.map +1 -0
- package/lib/client/notifications/turn-completion-source.js +82 -0
- package/lib/client/notifications/turn-completion-source.js.map +1 -0
- package/lib/client/notifications/use-turn-notifications.js +108 -0
- package/lib/client/notifications/use-turn-notifications.js.map +1 -0
- package/lib/client/panels/PanelHost.js +5 -5
- package/lib/client/panels/PanelHost.js.map +1 -1
- package/lib/client/panels/PanelLauncher.js +2 -2
- package/lib/client/panels/PanelLauncher.js.map +1 -1
- package/lib/client/project-session-state.js +156 -4
- package/lib/client/project-session-state.js.map +1 -1
- package/lib/client/role/RoleSelector.js +9 -4
- package/lib/client/role/RoleSelector.js.map +1 -1
- package/lib/client/settings/card.js +58 -17
- package/lib/client/settings/card.js.map +1 -1
- package/lib/client/settings/fields.js +11 -10
- package/lib/client/settings/fields.js.map +1 -1
- package/lib/client/settings/format.js +0 -9
- package/lib/client/settings/format.js.map +1 -1
- package/lib/client/settings/sections/access.js +5 -5
- package/lib/client/settings/sections/access.js.map +1 -1
- package/lib/client/settings/sections/accounts.js +10 -10
- package/lib/client/settings/sections/accounts.js.map +1 -1
- package/lib/client/settings/sections/attachments.js +6 -6
- package/lib/client/settings/sections/attachments.js.map +1 -1
- package/lib/client/settings/sections/branding.js +7 -7
- package/lib/client/settings/sections/branding.js.map +1 -1
- package/lib/client/settings/sections/common.js +4 -2
- package/lib/client/settings/sections/common.js.map +1 -1
- package/lib/client/settings/sections/docs.js +4 -3
- package/lib/client/settings/sections/docs.js.map +1 -1
- package/lib/client/settings/sections/embedding.js +2 -2
- package/lib/client/settings/sections/embedding.js.map +1 -1
- package/lib/client/settings/sections/interface.js +12 -12
- package/lib/client/settings/sections/interface.js.map +1 -1
- package/lib/client/settings/sections/lockdown.js +9 -9
- package/lib/client/settings/sections/lockdown.js.map +1 -1
- package/lib/client/settings/sections/notes.js +12 -12
- package/lib/client/settings/sections/notes.js.map +1 -1
- package/lib/client/settings/sections/session.js +15 -12
- package/lib/client/settings/sections/session.js.map +1 -1
- package/lib/client/settings/sections/slash.js +9 -9
- package/lib/client/settings/sections/slash.js.map +1 -1
- package/lib/client/settings/sections/sources.js +26 -26
- package/lib/client/settings/sections/sources.js.map +1 -1
- package/lib/client/settings/sections/status.js +2 -2
- package/lib/client/settings/sections/status.js.map +1 -1
- package/lib/client/settings/styles.js +15 -9
- package/lib/client/settings/styles.js.map +1 -1
- package/lib/client/slash/SlashPalette.js +4 -4
- package/lib/client/slash/SlashPalette.js.map +1 -1
- package/lib/client/styles.js +145 -83
- package/lib/client/styles.js.map +1 -1
- package/lib/client/theme-preference.js +162 -0
- package/lib/client/theme-preference.js.map +1 -0
- package/lib/client/types.js +8 -0
- package/lib/client/types.js.map +1 -1
- package/lib/client/use-session-ui-state.js +7 -5
- package/lib/client/use-session-ui-state.js.map +1 -1
- package/lib/client/user-settings/GeneralSettingsPage.js +6 -6
- package/lib/client/user-settings/GeneralSettingsPage.js.map +1 -1
- package/lib/client/user-settings/IntegrationTokensPage.js +6 -6
- package/lib/client/user-settings/IntegrationTokensPage.js.map +1 -1
- package/lib/client/user-settings/NotificationSettingsPage.js +107 -0
- package/lib/client/user-settings/NotificationSettingsPage.js.map +1 -0
- package/lib/client/user-settings/PasswordSettingsPage.js +1 -1
- package/lib/client/user-settings/PasswordSettingsPage.js.map +1 -1
- package/lib/client/user-settings/ProfileSettingsPage.js +2 -2
- package/lib/client/user-settings/ProfileSettingsPage.js.map +1 -1
- package/lib/client/user-settings/SkillCatalog.js +3 -3
- package/lib/client/user-settings/SkillCatalog.js.map +1 -1
- package/lib/client/user-settings/SkillEditor.js +26 -8
- package/lib/client/user-settings/SkillEditor.js.map +1 -1
- package/lib/client/user-settings/SkillToolPicker.js +3 -3
- package/lib/client/user-settings/SkillToolPicker.js.map +1 -1
- package/lib/client/user-settings/SkillsSettingsPage.js +1 -1
- package/lib/client/user-settings/SkillsSettingsPage.js.map +1 -1
- package/lib/client/user-settings/StartersSettingsPage.js +6 -6
- package/lib/client/user-settings/StartersSettingsPage.js.map +1 -1
- package/lib/client/user-settings/UserSettingsDialog.js +7 -2
- package/lib/client/user-settings/UserSettingsDialog.js.map +1 -1
- package/lib/client/user-settings/copy.js +2 -0
- package/lib/client/user-settings/copy.js.map +1 -1
- package/lib/client/user-settings/draft.js +4 -1
- package/lib/client/user-settings/draft.js.map +1 -1
- package/lib/client/user-settings/fields.js +5 -5
- package/lib/client/user-settings/fields.js.map +1 -1
- package/lib/client.js +7307 -4010
- package/lib/client.js.map +1 -1
- package/lib/config-resolvers/defaults.js +7 -0
- package/lib/config-resolvers/defaults.js.map +1 -1
- package/lib/config-resolvers/lockdown.js +7 -0
- package/lib/config-resolvers/lockdown.js.map +1 -1
- package/lib/config-resolvers/notifications.js +15 -0
- package/lib/config-resolvers/notifications.js.map +1 -0
- package/lib/config-resolvers/session.js +11 -1
- package/lib/config-resolvers/session.js.map +1 -1
- package/lib/config.js +67 -18
- package/lib/config.js.map +1 -1
- package/lib/enforcement/tool-grants.js +6 -6
- package/lib/enforcement/tool-grants.js.map +1 -1
- package/lib/index.js +145 -30
- package/lib/index.js.map +1 -1
- package/lib/integration/answer.js +74 -8
- package/lib/integration/answer.js.map +1 -1
- package/lib/integration/expert-memory.js +39 -0
- package/lib/integration/expert-memory.js.map +1 -0
- package/lib/integration/host-runner.js +26 -14
- package/lib/integration/host-runner.js.map +1 -1
- package/lib/notifications.js +66 -0
- package/lib/notifications.js.map +1 -0
- package/lib/personal-skills/errors.js.map +1 -1
- package/lib/personal-skills/service.js +81 -7
- package/lib/personal-skills/service.js.map +1 -1
- package/lib/prompt-notes.js +2 -10
- package/lib/prompt-notes.js.map +1 -1
- package/lib/provenance/host-store.js +8 -5
- package/lib/provenance/host-store.js.map +1 -1
- package/lib/qa-tools/docs-tools.js +1 -1
- package/lib/qa-tools/docs-tools.js.map +1 -1
- package/lib/qa-tools/lifecycle.js +6 -3
- package/lib/qa-tools/lifecycle.js.map +1 -1
- package/lib/request-queue.js +32 -0
- package/lib/request-queue.js.map +1 -0
- package/lib/resolve-config.js +2 -0
- package/lib/resolve-config.js.map +1 -1
- package/lib/secure-session.js +7 -2
- package/lib/secure-session.js.map +1 -1
- package/lib/shared/settings.js +19 -2
- package/lib/shared/settings.js.map +1 -1
- package/lib/turn-failure-log.js +67 -0
- package/lib/turn-failure-log.js.map +1 -0
- package/lib/typert.host.js +1398 -651
- package/lib/typert.remote-client.d.ts +15 -1
- package/lib/typert.remote-client.js +1315 -645
- package/lib/types/access/capability-catalog.d.ts +20 -4
- package/lib/types/access/model.d.ts +23 -0
- package/lib/types/access/service.d.ts +2 -3
- package/lib/types/account-remotes.d.ts +8 -1
- package/lib/types/accounts/database.d.ts +13 -3
- package/lib/types/accounts/errors.d.ts +9 -1
- package/lib/types/accounts/file.d.ts +12 -0
- package/lib/types/accounts/store.d.ts +30 -2
- package/lib/types/admin/quality-store.d.ts +33 -0
- package/lib/types/admin/service.d.ts +60 -1
- package/lib/types/client/QaAccountsController.d.ts +25 -2
- package/lib/types/client/QaConfigController.d.ts +2 -2
- package/lib/types/client/QaSessionController.d.ts +199 -6
- package/lib/types/client/QaSurface.d.ts +6 -1
- package/lib/types/client/admin/pages/ExpertMemory.d.ts +19 -0
- package/lib/types/client/admin/routes.d.ts +3 -1
- package/lib/types/client/admin/shared.d.ts +4 -0
- package/lib/types/client/components/Markdown.d.ts +8 -1
- package/lib/types/client/components/QaHeader.d.ts +18 -4
- package/lib/types/client/components/QaModal.d.ts +7 -0
- package/lib/types/client/components/QaQueueDock.d.ts +27 -0
- package/lib/types/client/components/QaRequestQueue.d.ts +20 -0
- package/lib/types/client/components/QaSidebar.d.ts +14 -0
- package/lib/types/client/components/QaThemeSwitcher.d.ts +14 -0
- package/lib/types/client/components/QaTurnNotice.d.ts +55 -0
- package/lib/types/client/focus-ring.d.ts +65 -0
- package/lib/types/client/lineage.d.ts +3 -13
- package/lib/types/client/markdown/blocks.d.ts +30 -2
- package/lib/types/client/markdown/render.d.ts +4 -1
- package/lib/types/client/notifications/notification-dispatcher.d.ts +68 -0
- package/lib/types/client/notifications/preferences.d.ts +44 -0
- package/lib/types/client/notifications/turn-completion-source.d.ts +114 -0
- package/lib/types/client/notifications/use-turn-notifications.d.ts +51 -0
- package/lib/types/client/project-session-state.d.ts +35 -1
- package/lib/types/client/role/RoleSelector.d.ts +7 -1
- package/lib/types/client/settings/card.d.ts +36 -5
- package/lib/types/client/settings/fields.d.ts +24 -0
- package/lib/types/client/settings/format.d.ts +0 -5
- package/lib/types/client/settings/sections/common.d.ts +3 -1
- package/lib/types/client/settings/sections/session.d.ts +2 -1
- package/lib/types/client/settings/styles.d.ts +9 -4
- package/lib/types/client/settings-extensions/user-session.d.ts +1 -1
- package/lib/types/client/theme-preference.d.ts +69 -0
- package/lib/types/client/types.d.ts +25 -1
- package/lib/types/client/use-session-ui-state.d.ts +6 -4
- package/lib/types/client/user-settings/GeneralSettingsPage.d.ts +5 -5
- package/lib/types/client/user-settings/NotificationSettingsPage.d.ts +40 -0
- package/lib/types/client/user-settings/UserSettingsDialog.d.ts +12 -2
- package/lib/types/client/user-settings/draft.d.ts +4 -1
- package/lib/types/client/user-settings/fields.d.ts +7 -0
- package/lib/types/config-resolvers/notifications.d.ts +10 -0
- package/lib/types/config-resolvers/session.d.ts +6 -0
- package/lib/types/config.d.ts +20 -1
- package/lib/types/index.d.ts +53 -5
- package/lib/types/integration/answer.d.ts +27 -0
- package/lib/types/integration/expert-memory.d.ts +49 -0
- package/lib/types/notifications.d.ts +32 -0
- package/lib/types/personal-skills/errors.d.ts +1 -1
- package/lib/types/personal-skills/service.d.ts +6 -0
- package/lib/types/prompt-notes.d.ts +17 -4
- package/lib/types/request-queue.d.ts +32 -0
- package/lib/types/shared/settings.d.ts +19 -2
- package/lib/types/turn-failure-log.d.ts +18 -0
- package/lib/types/types.d.ts +180 -4
- package/package.json +64 -63
- package/scripts/attach-workspace-sessions.mjs +24 -5
- package/scripts/repair-session-events.mjs +25 -5
- package/lib/client/markdown/MermaidBlock.js +0 -80
- package/lib/client/markdown/MermaidBlock.js.map +0 -1
- package/lib/types/client/markdown/MermaidBlock.d.ts +0 -6
|
@@ -2,6 +2,80 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { QaModal } from "./QaModal.js";
|
|
3
3
|
export const QA_VERSION = __DSH_QA_VERSION__;
|
|
4
4
|
export const QA_CHANGELOG = [
|
|
5
|
+
{
|
|
6
|
+
version: "0.15.0",
|
|
7
|
+
date: "2026-10-05",
|
|
8
|
+
sections: [
|
|
9
|
+
{
|
|
10
|
+
title: "Исправления",
|
|
11
|
+
items: [
|
|
12
|
+
"Ответ снова рассказывает, откуда в нём факты. Источник, который сдал сам отвечающий агент — а не тот, кому он делегировал кусок работы, — раньше молча отклонялся: канал спрашивал не «есть ли у записи адрес», а «кто вообще имеет право отчитываться», и на стенде, где читает и отвечает один агент разговора, не записывался ни один источник. Теперь такой источник попадает ровно в тот ход, который его сдал, а правило «источник обязан назвать файл или ссылку» по-прежнему проверяется по каждой записи отдельно — то есть пустая ссылка не пройдёт и теперь.",
|
|
13
|
+
"На телефоне история чатов снова достижима. Узкая раскладка прятала боковую панель вместе с обеими кнопками, которые могли её показать: список чатов, поиск и «Новый чат» исчезали, а шапка ничего вместо них не предлагала. Теперь в шапке есть своя кнопка — размером под палец, а не под курсор, — и история выезжает поверх затемняющего слоя: закрыть её можно Escape, тапом вне панели или выбором чата. Состояние свёрнутой панели на широком экране этот ящик не трогает, поэтому, вернувшись на десктоп, читатель застанет ровно то, что оставил.",
|
|
14
|
+
],
|
|
15
|
+
},
|
|
16
|
+
],
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
version: "0.14.0",
|
|
20
|
+
date: "2026-09-25",
|
|
21
|
+
sections: [
|
|
22
|
+
{
|
|
23
|
+
title: "Новое",
|
|
24
|
+
items: [
|
|
25
|
+
"Вопрос, заданный во время ответа, больше не остаётся невидимкой. Пока ассистент отвечает, поле ввода по-прежнему активно, и новый вопрос можно задать сразу: он встаёт в очередь сообщений прямо над полем ввода и будет взят следующим ходом. В очереди видно, что именно там лежит, и с каждой строкой можно сделать три вещи: отредактировать её (Enter сохраняет, Shift+Enter переносит строку, Escape отменяет), отправить сразу — то есть вставить в текущий ответ, не дожидаясь его конца, — или убрать, если передумали. Пока вопрос ещё не дошёл до сервера, строка помечена как отправляемая и сама исчезает в тот момент, когда сервер его принял, так что один и тот же вопрос не показывается дважды. Сообщение с вложениями можно убрать или отправить сразу, но нельзя переписать: сервер не отдаёт его как простой текст, и кнопка правки об этом говорит. Если очередь к тому времени уже отдала сообщение ходу, операция не проходит, и стенд честно пишет, что сообщение, возможно, уже отправлено.",
|
|
26
|
+
"Тему оформления можно выбрать прямо в чате. Светлая, тёмная и «как в системе» раньше задавались только самим приложением: переключатель живёт в его настройках, а стенд как раз их и прячет — получалось, что на /qa тема достается такая, какой открылся стенд, и поменять её было негде. Теперь в шапке чата, рядом с ролью, три кнопки: солнце, луна и авто. Выбор принадлежит этому браузеру и больше никому: он не уезжает в настройки стенда (стенд общий, а зрение у каждого своё), сохраняется между перезагрузками страницы и действует, пока открыт чат: ушёл с /qa — страница надевает обратно ту тему, с которой открылась, потому что вне своего маршрута переключателя на экране нет и вернуть её было бы негде. «Авто» отвечает на запрос системы и продолжает отвечать, если вечер наступил посреди разговора. Тема меняет не только окно чата, но и карточки, и панели, и диалоги — всё, что нарисовано общими цветами приложения, а не набором дефолтов, под который что-то подгоняли вручную. Стенд, где в переключатель никто не тыкал, выглядит ровно как выглядел: пока выбора нет, ничего не запоминается и показывается та тема, с которой открылось приложение.",
|
|
27
|
+
"Чат, ход в котором завершился, напоминает о себе сам — и только тому, кто его ждёт. Пока ответ доходит в другой вкладке или в другом окне, страница держит строку «Ход завершён» с названием чата: клик по ней открывает этот чат, крестик убирает строку. Напоминание появляется для чатов из собственной истории браузера, поэтому чужой ход не становится чужим уведомлением — даже тот, что администратору видно в общем списке. Ждать — значит видеть ход целиком: и его начало, и его конец. Страница, открывшаяся на середине хода, про тот ход молчит; так же молчит она и про любой ход, внутрь которого попал обрыв связи, — даже про тот, начало которого успела увидеть: пока связи не было, в этом чате мог пройти другой ход, а вернувшийся список не называет, какой именно перед вами. И пока строка чата после обрыва не сдвинулась, страница не считает его увиденным заново: список чатов перечитывается отдельно от связи и обычно уже после того, как связь вернулась. Новый отсчёт начинается только с самого хода — молчит первый ход, закончившийся после возвращения связи, даже тот, что начался и кончился уже при живой связи; ход, который закончился, пока связи не было, теряется сверх этого. Отсюда цена: там, где связь отрывается внутри каждого долгого хода и экран успевает это заметить, напоминание не приходит ни разу — каждый такой ход платит за свой обрыв, и это ровно то, что честно не обещать начала, которого страница не видела. Молчание держится на том, что обрыв замечен экраном — совсем короткую потерю связи страница не успевает отразить, и ход, начавшийся в неё, получает напоминание, хотя его начала никто не видел; со следующего хода, начало которого видно целиком, напоминание возвращается. Свёрнутая или спрятанная за другим окном вкладка может отдать ту же строку системе: запрос на такие уведомления задаётся один раз, ответ запоминается, а при отказе уведомление остаётся внутри страницы и больше не спрашивает. Стенд закрывает каналы конфигурацией — notifications.enabled выключает оба, notifications.allowOs оставляет только строку на странице. Ход, который завершился в чате у вас на экране при активном окне, не получает ничего: ответ и так видно в переписке.",
|
|
28
|
+
"Где напоминанию позволено вас догнать, теперь решает сам читатель — и выбор едет вместе с его учётной записью. В диалоге «Настройки» появился раздел «Уведомления» с теми двумя каналами, что у стенда есть: строка внутри страницы и уведомление системы, которое свернутая или закрытая другим окном вкладка может отдать операционной системе. Ответ хранится на учётной записи рядом с профилем и быстрыми сообщениями, поэтому вход с другого ноутбука приносит его с собой; там, где учётных записей нет, решение про системные уведомления остаётся в браузере, где его и приняли, — больше записывать его некуда. Что стенд закрыл через notifications.enabled или notifications.allowOs, остаётся закрытым, и раздел прямо называет, из-за чего канал недоступен, вместо переключателя, который ни на что не влияет. Разрешения браузер спрашивает по нажатию — с кнопки на уведомлении или из нового раздела, — никогда при загрузке страницы и не по каждому завершённому ходу.",
|
|
29
|
+
"В консоли администратора появился раздел «Память экспертов»: там видно, что каждый домен записал себе сам. Память домена подмешивается в каждый следующий ответ этой области, поэтому неверную строку можно поправить или убрать — по одной, сразу несколько галочками или всю память домена целиком. Поиск ищет по тексту, ключу и тегам. Ревьюер память видит, но не правит: для правки нужна роль администратора. Каждая правка и каждое удаление записываются в журнал аудита вместе с тем, как строка выглядела до.",
|
|
30
|
+
"Эксперты перестали запоминать мусор. Запись вида «ок», «не нашёл информации», заглушка или повтор команды отклоняются в момент записи, и помощник получает объяснение, почему его не приняли. Уже записанное по-прежнему можно исправить руками — на ручные правки фильтра нет.",
|
|
31
|
+
"Стенд теперь может ограничить, сколько вопросов он отвечает одновременно. Это нужно там, где модель работает на сервере без ускорителя или на слабой видеокарте: третий вопрос не добавляет мощности — он лишь замедляет те два, что уже отвечаются, и в итоге никто не получает ответа вовремя. В настройках, в разделе «Сессия», для этого есть поле «Максимум одновременных вопросов»; 0 означает «без ограничения», и по умолчанию стоит именно он, никак не меняя привычную работу стенда. Когда все места заняты, новый вопрос не отправляется: разговор не создаётся, в переписку ничего не попадает, а набранный текст остаётся в поле ввода — вместо ответа показывается «Подождите в очереди» с числом запросов, которые стенд уже отвечает. Закрыли окно — тот же текст снова перед вами, и остаётся нажать отправку ещё раз. Считаются именно вопросы, а не любое нажатие отправки: сообщение, которое встаёт в очередь уже отвечающего чата, второго места не стоит и проходит всегда, как и команда из палитры, — иначе на загруженном стенде нельзя было бы посмотреть его состояние, а что именно стоит за командой, решает сам сервер. Сколько вопросов отвечается сейчас, считает сервер, а не браузер: только там видно, что отвечает другой посетитель и что вопрос пришёл из внешней программы, а не из чата. Поэтому ограничение работает и когда вопросов много сразу, и когда их принёс один чужой разговор. Потолок этот — потолок, а не замок: два вопроса, отправленные в одну секунду, всё же могут разойтись на один лишний. А если сервер не может сказать, насколько он занят, вопрос уходит как обычно: незнание не повод молчать.",
|
|
32
|
+
],
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
title: "Исправления",
|
|
36
|
+
items: [
|
|
37
|
+
"Вопрос, заданный во время ответа, больше не остаётся на экране после того, как ход его забрал. Раньше такая строка жила дважды: пока сообщение ждало своего хода, это была строка очереди с кнопками, а когда ход её освобождал, на том же месте оставалась строка «отправляется…» — уже без единой кнопки. Ответ тем временем уже был в переписке, поэтому экран говорил прямо обратное: вопрос не отправлен. Перезагрузка страницы убирала строку, а в ленте по-прежнему оставалась ровно одна доставка — значит, призрачное состояние жило в браузере. Теперь стенд держит подтверждение сервера: как только сервер назвал сообщение — в очереди или уже в переписке, — его строка перестаёт быть «отправляемой», и кадр с опустевшей очередью не оставляет ничего. Это подтверждение стенд снимает с самого сообщения сервера, а не с перерисованного кадра: во время ответа поток не показывает часть кадров, и то, дошёл ли кадр до интерфейса, не должен решать, засчитано ли сообщение отправленным. Ничего правка не отнимает: стенд убирает строку только там, где снятие уже решено. Как только сервер назвал сообщение, библиотека зафиксировала, что её эхо уходит, — ждёт только кадра. Разница между этим экраном и её контрактом в часах, а не в результате, и неотправленный вопрос по-прежнему остаётся неотправленным: строка, которую сервер не назвал, никуда не денется. Подтверждение живёт, пока открыт этот чат, и забывается при перепривязке — при уходе из чата, открытии сабагента, восстановлении политики и входе в черновик. Вернуться строка может ровно на один кадр: новое открытие чата либо находит чистую сессию — когда последняя ссылка на старую отпущена, менеджер забирает её вместе со всеми её эхо, — либо снова читает имя сообщения из кадров сервера — и подтверждение появляется заново. Эхо и его снятие живут в браузере, а не на сервере: снять эхо в момент, когда очередь приняла сообщение, обязана клиентская библиотека сессий (`@deepseek-ai/dsh-api-session-controller`, контракт `beginSubmission`), и фоллоу-ап принадлежит ей, а не этому плагину — здесь строка перестаёт врать посетителю, пока тот контракт не выполняется. Снятие отложено на следующий кадр анимации, а поверхность, которой кадров не досталось — свёрнутая панель, фоновая вкладка, — этот кадр не получает; сообщения же продолжают приходить по микрозадачам, поэтому лента обновляется, а строка остаётся. Честное «отправляется…» остаётся за вопросом, который сервер ещё не принял, а принятый и ждущий своего хода по-прежнему виден в очереди с кнопками «Изменить», «Отправить сразу» и «Убрать».",
|
|
38
|
+
"Сбой, у которого есть код, теперь называет его. Одна и та же строка «Помощнику не удалось завершить ответ.» закрывала собой всё, для чего у хоста нет отдельной фразы: и оборванный поток, и лимит запросов, и отказ реестра провайдеров. Стенд, потерявший адаптеры провайдеров после перезапуска, отвечал так на каждый вопрос, а настоящий отказ — код и имя провайдера — лежал только в журнале сессии, который надо расшифровать. Теперь код сбоя стоит в самой строке при любом исходе, а не только когда у сбоя нет своей фразы; служебный `UNKNOWN`, за которым ничего не стоит, не пишется больше нигде — ни в строке сбоя, ни в строке повтора. Незарегистрированному адаптеру дана своя фраза — с прямым «повтор не поможет», потому что переспрашиванием этот сбой не лечится. Оператор тем временем читает отказ в журнале плагина: ход, закрытый ошибкой, записывается там как `session.turn-failed` — с идентификатором чата, номером хода, кодом и провайдером, на который хост направлял запрос. Записью ведает сам чат: ход мог умереть внутри его собственного субагента, и по id субагента оператор не нашёл бы эту строку ни в одном разговоре; сам этот id прикладывается к записи отдельным полем, чтобы два субагента одного чата, погибшие на третьем ходу, не дали две одинаковые строки. Имя провайдера для отказа реестра берётся из той фразы отказа, которую хост составляет сам, — она про этот ход, тогда как заголовок запроса описывает разговор в целом и мог сохраниться от более раннего провайдера; во всех прочих случаях имя берётся из заголовка. Наружу из фразы отказа берётся только само имя — и только когда отказ звучит ровно как эта фраза хоста, без хвоста, — поскольку её текст может оказаться ключом, и целого текста ошибки в журнале нет по-прежнему. Запись попадает и в stdout контейнера, потому что предупреждения и выше зеркалятся туда.",
|
|
39
|
+
"Список изменений 0.13.0 теперь называет три её возможности, которые в неё попали, но остались незаписанными: отмену разбора одним запросом, автоматическое подключение общего управляемого профиля и загрузку файлов рядом с картинками. Сама версия не меняется — меняется то, что о ней рассказано.",
|
|
40
|
+
"Повторная оценка своего ответа больше не стирает чужую. У списка сохранённых отзывов есть предел, и он считался по положению записей, а не по их количеству: когда список заполнен, повторная оценка уже сохранённого ответа передвигала свою запись в конец, а освободившееся место означало, что самый старый отзыв уходит из базы — хотя ничего нового не добавилось и вытеснять было нечего. На стенде с полной историей несколько повторных оценок стоили нескольким уже сохранённым отзывам: они исчезали из списка оценок, из очереди разбора и из метрик качества, причём не сразу, а при следующем открытии файла. То же касалось разговора, удалённого из харнесса: дырка в порядке записей стоила ещё одного отзыва. Теперь за предел отвечает только новая запись — она вытесняет ровно самую старую, а повторная оценка своего не стоит ничего.",
|
|
41
|
+
"Управление учётными записями снова отвечает, когда его запускают установленной командой. Менеджер пакетов ставит команду ссылкой на файл, а Node при запуске раскрывает эту ссылку и показывает модулю уже другой путь — и проверка «запущен ли я как команда» сравнивала эти два пути как строки. Под ссылкой она не срабатывала, и команда молча завершалась успешно: «qa-accounts list» на стенде, где записи есть, не печатал ничего, а «qa-accounts add» не создавал учётную запись — и то и другое с кодом «успешно», поэтому выглядело как потерянная база, а не как сломанный запуск. Теперь ссылка ведёт себя так же, как файл, на который она указывает; так же исправлены qa-repair-sessions и qa-attach-sessions. Молчать не станет и сборка: проверка пакета запускает каждую команду через ссылку, похожую на установленную, требует настоящего ответа — текста справки и списка записей по пустой базе — и следит, чтобы у файла осталась строка, по которой система отдаёт его Node. Команда, которая запускается впустую, теперь валит выпуск, а не стенд.",
|
|
42
|
+
"Вход больше не теряется сразу после входа. Страница пересобирает свою учётную часть, когда переподключается обвязка стенда; запрос «кто я», отправленный старой копией, мог ответить уже после этого и сообщить, что сохранённый вход недействителен. Так он стирал тот самый токен, который новая копия только что записала, и браузер показывал карточку входа вместо уже начатой сессии — просил пароль заново, хотя ничего не потерялось. Запоздалый ответ отброшенной копии теперь ничего не стирает.",
|
|
43
|
+
"Отозванный доступ становится виден всем запросам сразу. Когда оператор отключает учётную запись, меняет пароль или отзывает токены, стенд закрывал вход по прежнему токену не везде: страницы, которые перечитывают список учётных записей перед проверкой, отказывали, а запросы, которые проверяют только сам токен — например, работа с личными навыками, — принимали его дальше, пока список не перечитает кто-то другой. На стенде, где человек заходит только в свои навыки, таким «кто-то другой» мог не оказаться никто. Проверка токена теперь сама перечитывает состояние учётных записей: отказ получает тот же запрос, который принёс недействительный токен, а не следующий случайный.",
|
|
44
|
+
"Перечитывание списка учётных записей стало согласованным. Отметка, по которой стенд понимает, что список устарел и его надо перечитать, снималась после чтения строк, а не вокруг него. Поэтому изменение, пришедшее из другой программы ровно во время чтения, оставалось невидимым: строки прочитаны до него, отметка снята после него, — и устаревший список считался актуальным, так что сделанный в этот момент отзыв не действовал до следующей чужой записи. Теперь отметка снимается с обеих сторон чтения, и если между ними появилась чужая запись, чтение повторяется. Если чужие записи идут чаще, чем стенд успевает читать, он отдаст снимок с заведомо несовпадающей отметкой, и следующий запрос перечитает список заново.",
|
|
45
|
+
"Ответ с формулами и таблицами больше не показывает сырую разметку, пока пишется. Исследовательский вопрос на стенде стоит минуты, и всё это время текст ответа появляется на экране по мере работы: пока модель не закрыла формулу, под ней было видно служебные `$$` и незакрытую команду вида `\\frac{`; таблица до того, как дописан ряд разделителей, показывала сами вертикальные черточки, а строка, которую ещё печатают, была видна обрезанной. Теперь незакрытый блок не рендерится как готовый: до своей закрывающей черты формула показывается моноширинно — ровно тем, что уже написано, и без служебных `$$`, таблица с недописанным рядом разделителей показывается готовой шапкой, а строка входит в неё целой, как только её дописали. Завершённый ответ от этого не меняется: закрытая формула остаётся формулой KaTeX, а строки таблицы — на своих местах.",
|
|
46
|
+
"Диаграммы в блоках mermaid снова показываются исходным кодом, и страница QA перестала получать движок диаграмм вместе с первым кадром. В 0.13.0 диаграммы пришли не одни: клиентский модуль — единственный файл, который стенд отдаёт браузеру, — вобрал в себя всё дерево mermaid, cytoscape, d3, dagre и парсер языков диаграмм, и вместо 66 745 строк (2,8 МБ) страница получала 239 027 строк (9,3 МБ) до того, как на ней что-нибудь появилось. Отдать эту часть наружу было некуда: DSH загружает ровно один самодостаточный файл плагина и не подтягивает за ним отложенных чанков, а обвязка стенда диаграммы не рисует, поэтому сохранить их значило сохранить и вес. Читатель видит тот же исходник, что и до 0.13.0: незакрытый блок показывается написанным к этому моменту, закрытый — целиком, и кнопка копирования на нём работает, как на любом коде. Формулы остаются: математика по-прежнему рендерится KaTeX, а стоит она бандлу не 172 тысячи строк, а 17. Возвращение диаграмм — вопрос не к этому плагину: нужен либо общий рендерер у стенда, либо возможность загрузить отложенный модуль, чего клиентский файл плагина сейчас не умеет.",
|
|
47
|
+
"Большой файл навыка больше не выдаётся за прочитанный целиком. `SKILL.md` читается с потолком, чтобы один огромный файл не подвесил стенд, — но раньше редактор показывал прочитанное начало как весь навык, говорил, что с ним всё в порядке, и позволял сохранить: непрочитанный хвост исчезал молча. Теперь редактор прямо пишет, сколько весит файл и что видима только его часть, а сохранение поверх неполного файла просит подтверждение — вторая кнопка нажимается как «Стереть непрочитанное и сохранить». Версией навыка считается хэш всего файла, а не прочитанного начала, поэтому правка в невидимом хвосте, сделанная вне редактора, больше не проходит незамеченной: сохранение откажет и предложит перезагрузить текущую версию.",
|
|
48
|
+
"Строгий навык больше не отвергается из-за инструмента, который роль выдаёт и так. Навык с `requireAll` отказывался включаться, если требовал инструмент из уже доступного базового набора: требование сверялось со списком того, что выдача может добавить, а базовые инструменты из него исключены. Такое требование теперь считается выполненным, и проверяются только недостающие инструменты.",
|
|
49
|
+
"Вопрос, заданный по API, получает ответ на свой вопрос. У каждого обращения через /qa/api/ask есть своя идентичность, но ответ стенд выбирал по «последнему вопросу этого чата»: когда в один разговор одновременно приходилось два обращения, журнал уже содержал вопрос второго, и первый вызов считался от него — под первым вопросом публиковался ответ на второй, вместе с источниками и доказательствами чужого хода. Теперь вызов ищет в журнале строку, которую записал он сам (харнесс сохраняет в ней идентичность запроса), и читает ход, открытый этой строкой: собственный ответ либо ничего, если его ход оборвался, не успев написать текст. Ссылки на источники берутся из того же хода, а не из самого свежего в чате.",
|
|
50
|
+
"Вопрос с файлом не уходит в чат, который вы уже покинули. Загрузка вложения — отдельный запрос к стенду, и пока он идёт, можно переключиться на другой разговор или закрыть интерфейс. Проверка, что чат на месте, стояла после отправки, поэтому черновик доезжал до оставленного разговора, а чат на экране наследовал занятое поле ввода: показывал отправку, которой не совершал, и ждал, пока она «завершится». Теперь чат проверяется сразу после загрузки файла и до отправки — и в вопросе помощнику, и в слэш-команде с вложением; черновик, чей разговор ушёл, отбрасывается, а текущий остаётся в обычном состоянии.",
|
|
51
|
+
"Первое сообщение в новом чате больше не исчезает. «Новый чат» сам по себе разговор не создаёт: чат появляется только вместе с первым сообщением — и именно в этот момент сообщение и терялось. Поле ввода жило состоянием того чата, который был открыт, поэтому создание чата пересоздавало поле пустым: вопрос пропадал из браузера до того, как стенд успел что-нибудь принять, чат оставался пустым, и ни ошибки на экране, ни отказа в сети при этом не было. Теперь поле хранит вопрос, пока сессия его не приняла, и отдаёт его обратно при отказе; вложения этого же сообщения переживают создание чата так же.",
|
|
52
|
+
"Сообщение, которое не удалось отправить, говорит о себе, а не пропадает молча. Если чат ещё создаётся или уже закрыт, поле ввода остаётся с набранным вопросом и рядом появляется причина — «чат ещё создаётся, отправьте сообщение ещё раз»; раньше такой отправленный вопрос просто переставал быть виден.",
|
|
53
|
+
"Черта чата принадлежит ему одному, сколько бы раз страница ни пересобирала свой интерфейс. У каждого чата есть своя метка, по которой поле ввода, открытые панели и черновик понимают, кому они принадлежат; раньше метку выдавали заново каждому новому экземпляру интерфейса, и чат, начатый после смены роли, настройки или адреса, мог получить метку чата, который только что закрылся, — вместе с его неотправленным вопросом, приложенными файлами и раскрытыми панелями. Теперь метка не переиспользуется и достаётся только тому чату, который действительно открылся: повторная отправка после неудачной попытки — чат не создался, не открылся или его отвергла проверка настроек — остаётся в своём чате, а не уезжает в новый, и поле ввода не пересобирается под вопросом, который ещё никто не принял. Попытка открыть чат, которая завершилась уже после того, как вы перешли в другой (стенд слишком поздно показал этот разговор или отверг его), не трогает экран: чат на экране остаётся со своей чертой и подпиской, и следующий вопрос уходит в него, а не слышит «чат не открыт». Чат, пришедший на смену другому — отказавшему сохранённому разговору или тому, которого стенд больше не показывает, — начинается пустым и молчаливым, без чужого вопроса и без «идёт отправка». У этой точности есть цена, о которой лучше знать заранее: страница пересобирает свой интерфейс при смене роли, настроек или адреса, и пересобранный интерфейс начинает чат под новой чертой — поэтому неотправленный вопрос, приложенные к нему файлы и раскрытые панели сбрасываются, даже когда стенд возвращает ровно тот же самый разговор. Раньше черта переиспользовалась и черновик переживал пересборку — ценой того, что доставался чату, который его никогда не видел.",
|
|
54
|
+
"Уход в новый черновик больше не обещает чат, которого нет. «Выйти из просмотра» и смена роли начинают новый черновик — и нажатые в тот момент, когда первый вопрос ещё создаёт чат, они уводили экран из-под этого вопроса, а несостоявшаяся попытка считалась завершившейся: черновик объявлялся открытым, чата у него не было, и каждый следующий вопрос в нём отвечал «чат не открыт» — до тех пор, пока пользователь сам не нажимал «Новый чат». Кнопка выхода из просмотра теперь неактивна, пока чат создаётся, — как шапочный «Новый чат» и селектор роли; а если черновик всё-таки сменяется уходом, которого кнопка не ждёт (так делает, например, удаление открытого чата), оставленная позади попытка не объявляет открытым ничего: следующий вопрос создаёт свой чат и доходит в него.",
|
|
55
|
+
"Отпущенная попытка не оставляет за собой чата, в который никто не заходил. Первый вопрос ждёт, пока стенд покажет его разговор и подтвердит его настройки, — и за это время экран может занять другой чат. Так делает, например, «Повторить» под «не удалось начать чат», нажатая, пока первый вопрос ещё в пути: попытка создания чата уходит, а её подписка на тот, уже не нужный разговор остаётся. Каждый кадр этого разговора перечёркивал причину отказа, которую стенд только что показал: сообщение об ошибке появлялось и тут же исчезал, и над полем ввода снова наступала тишина — а сам разговор оставался занят страницей, которая его бросила. Теперь несостоявшаяся попытка забирает обратно всё, что успела взять — подписку, ссылку на сессию и транскрипт, — и причина отказа остаётся там, где её показали. Чата, который реально на экране, это не касается: своей подписки, своей черты и своей проверки настроек он не теряет ни при каком опоздавшем исходе.",
|
|
56
|
+
"«Новый чат», нажатый во время ответа, больше не отменяет чат, открытый в тот же момент. Чтобы начать черновик, стенд сначала останавливает текущий ответ — это отдельный запрос, и, пока он в пути, успеваешь открыть другой разговор из списка. Черновик возвращался после этого запроса и забирал экран себе: только что открытый разговор оставался без чата, его переписка исчезала, а следующий вопрос не уходил никуда. Теперь экраном владеет последняя нажатая кнопка: если за время остановки чат открыли, черновик уступает ему экран и даже не начинается — достаточно нажать «Новый чат» ещё раз, когда ответ долистается.",
|
|
57
|
+
"Кнопка удаления в списке чатов называет чат, из-за которого она стоит: «Удалить чат «Как перевыставить счёт»». Раньше у всех строк было одно имя — «Удалить чат», — и то же имя носило само окно подтверждения: по подписи было невозможно понять, какой чат уйдёт и какое окно открылось, — ни с экрана, ни в тесте. Окно теперь называется своим именем: «Подтвердите удаление чата».",
|
|
58
|
+
"Скрытая до наведения кнопка больше не отвечает на клик, которого не видно. Прозрачность от клика не защищала: кнопка стояла на правом краю строки и принимала нажатие, даже когда строка не наведена, — именно так автоматический обход списка удалял строки, которых никто не касался. Теперь кнопка принимает указатель ровно тогда, когда её показывают, и клик, пришедший без наведения, попадает в сам чат. С клавиатуры ничего не изменилось: фокус сам показывает кнопку.",
|
|
59
|
+
"Закрытое окно подтверждения возвращает клавиатуру туда, откуда приходило. Отмена наводит фокус на кнопку той же строки, а подтверждённое удаление оставляет его в списке чатов, а не на начале страницы: следующая строка находится переходом Tab, а не долгим путём через весь экран. Это заметно на серии удалений, когда строки после каждой ушедшей сдвигаются вверх.",
|
|
60
|
+
"Одинаковые названия чатов различаются и в подписи кнопки. «Новый чат» — имя каждого чата, в который ещё не ответили, — и два таких чата подписывались одинаково, поэтому повторяющееся название теперь нумеруется по месту в списке: «Удалить чат «Новый чат» (2 из 2)». Окно подтверждения спрашивает про тот же чат и называет его тем же номером. Подпись всегда описывает тот список, что перед глазами: ушёл один из двух — у оставшегося номер снимается.",
|
|
61
|
+
"Личный навык снова видно и в палитре, и по «/имя». Навык, который лежит в личных навыках учётной записи (Настройки → Навыки) и разрешён к вызову человеком, стенд замечал — но ни палитра по «/», ни набранный «/имя» его не показывали: список навыков, доступных человеку, собирался только из роли и общего списка, которые ведёт администратор. Роль у многих одна, и вписать в неё навык одного человека нельзя — поэтому собственный навык теперь всегда доступен владельцу: палитра, набор «/имя» и проверка прав читают один и тот же список и не могут разойтись. Помощнику при этом личный навык не отдаётся — модель видит только то, что разрешила роль. Границы прав сохраняются: инструменты, которые роль не может выдать, с личным навыком не выдаются. Если администратор отозвал навык по имени, отзыв сильнее личного слоя и догоняет чат, который уже идёт: отозванный личный навык перестаёт вызываться сразу, а не с следующего чата, — а роль в этом чате остаётся такой, какой была на момент его начала.",
|
|
62
|
+
"Отправленный вопрос больше не исчезает на долю секунды в начале хода. Стенд показывает отправленное сообщение сам, а когда доходит запись сервера, заменяет его той самой строкой переписки. Момент этой передачи раньше определялся признаком «чат занят»: стоило чату показаться занятым, а потом снова свободным, как показанная стендом копия вопроса убиралась с экрана. Тот же признак приходит и через список чатов, и его устаревшее значение в самом начале хода успевало убрать текст раньше, чем переписка получила настоящую запись: вопрос пропадал примерно на треть секунды и возвращался, а в этот промежуток поле ввода разблокировалось и на миг мелькал пустой экран чата. Первый вопрос после этого выглядел потерянным, хотя стенд его уже принял. Копия, которую стенд держит сам, теперь уходит только вместе с приходом настоящей строки — или когда ход закрылся, а строка так и не появилась; одно лишь мигание признака «идёт ответ» больше не убирает сообщение.",
|
|
63
|
+
"Браузер больше не продолжает чужой разговор, даже если на стенде выключен lockdown. Запоминается не учётная запись, а адрес стенда: выйдя из одной учётной записи и войдя в другую на том же браузере, стенд возвращался к разговору, который начал первый. Со списком чатов, источниками, подтверждениями и вопросами так не было — там стенд всегда спрашивал, кто владелец; не хватало именно момента открытия чата. Теперь этот вопрос задаётся всегда, пока в учётных записях включены: если стенд отвечает, что чат принадлежит другому, сохранённый идентификатор забывается и открывается ваш новый разговор, а не чужой. На стенде без учётных записей ничего не меняется — там и так один говорящий.",
|
|
64
|
+
"Уведомление о завершённом ходе открывается с клавиатуры. Строка «ход завершён» показывается поверх страницы, вне того блока, где переход Tab держит клавиатуру внутри стенда, и достать её можно было только мышью: Tab из поля ввода возвращался к началу чата, не доходя до уведомления. Теперь обход ведёт по строке, по её кнопке скрытия и по кнопке «Включить системные уведомления», а на границе кольца возвращает в интерфейс; Shift+Tab от самого первого элемента, который остаётся на этой ширине, попадает в стек уведомлений. Боковой список чатов при ширине ≤600px и рельс ходов при ≤900px выключены стилями, и в разметке об этом нет слова; раньше обход считал их границей, и на узкой панели первый переход назад уходил из стенда к элементам браузера, потому что граница стояла на кнопке, которой на экране нет. Если уведомление уходит, пока на нём стоит фокус — убрали одну из трёх строк, пришло четвёртое уведомление при полном стеке или исчезла кнопка согласия после ответа на запрос разрешений, — клавиатура не остаётся висеть в пустоте, а переходит на строку, вставшую на это место; место запоминается именно для стека уведомлений, а уходящую строку списка чатов или исчезнувшую кнопку в переписке стенд по-прежнему отпускает как раньше. Пока открыто какое-нибудь окно — приглашение, настроек или истории версий, — кольцо уступает клавиатуру ему: уведомление не перехватывает переход, а граница обхода возвращается внутрь интерфейса, поэтому из окна не выбрасывает на затемнённый экран. Escape из стека при этом уходит наружу, как и раньше: окно, которое слушает его на уровне страницы — настроек или истории версий, — закрывается им; приглашение принимает Escape только у себя, поэтому из стека оно его не получает. Если уведомление открывает чат, клавиатура остаётся на стеке — на строке, вставшей рядом с ушедшей, — и не уходит вслед за переключением: у открываемого чата поле ввода ещё не активно, поэтому фокус оно принять не может.",
|
|
65
|
+
"Строка «Ход завершён» больше не следит за чужими чатами. Общий список чатов (accounts.showOtherUsersChats) — это право читать: он добавляет в боковой список чаты других учётных записей, чтобы администратор мог их открыть. Уведомления о завершённых ходах брали ровно тот же список, поэтому включённый общий список решал заодно, чью активность этому браузеру сообщать: администратор получал строку «Ход завершён» по каждому чату, который перестал отвечать, — а при включённом системном канале ещё и уведомление операционной системы, чей заголовок она оставляет в своём журнале. Теперь уведомление ограничено чатами, которыми владеет эта учётная запись: страница не запоминает ход, идущий в чужом чате, и ничего о нём не сообщает. Сам список не сузился — группировка по владельцу, подписи авторов в чужих чатах и значки аудита остались на месте, общий список по-прежнему общий. У посетителя с выключенным общим списком ничего не меняется: там оба списка совпадают. Слежения за чужими завершениями при этом не появилось: для него нужны отдельный выбор самого администратора и отдельное разрешение стенда, а не случайно включённый режим чтения.",
|
|
66
|
+
],
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
title: "Служебное",
|
|
70
|
+
items: [
|
|
71
|
+
"Плагин собирается против хоста 0.1.7-rc.2. Для оператора это меняет две вещи. Карточка настроек помощника больше не прячется в общий список карточек конфигурации и не живёт отдельной вкладкой в настройках: она открывается из строки самого плагина на странице «Плагины» панели управления плагинами — там, где плагин включают и настраивают. Пространство настроек при этом не меняется, поэтому значения, сохранённые до переноса, остаются на месте; правки по-прежнему сразу уходят на работающий хост — маршрут, политика и остальные поля перечитываются на каждое действие, а перерегистрация маршрута следует за изменением. И если развёртывание выбрало пресет разрешений `auto` для локдауна, плагин теперь отказывается стартовать и говорит почему: `auto` отвечает хосту «спрашивать подтверждение», тогда как локдаун закрепляет «никогда не спрашивать», и раньше об этом можно было узнать только из отказа на конкретной сессии.",
|
|
72
|
+
"Карточка настроек помощника на странице «Плагины» больше не рисует свою рамку и свой заголовок: строку ряда оформляет интерфейс хоста — рамку, заголовок и кнопку раскрытия рисует он, — а плагин приносит только сами настройки. Раньше под хостовым заголовком стояла вторая карточка, со своим заголовком и вторым переключателем «показать/скрыть»; адрес страницы и признак выключенного состояния, которые та карточка показывала в своей шапке, по-прежнему видны в разделе «Состояние». Кольцо обводки фокуса берётся из токенов хоста — как у первосторонних элементов, — и это касается не только настроек: на самой странице помощника фокус больше не остаётся там, где хост гасит его при работе мышью. Если хост не отдаёт этому браузеру пространство настроек (так видит браузер, открытый не с машины стенда), раздел больше не остаётся пустым: карточка одной фразой говорит, почему редактировать нечего, и не опрашивает хост впустую. На сохранённые значения переезд не влияет — тот же ряд и то же пространство настроек.",
|
|
73
|
+
"В работе стенда ничего не изменилось. Выпуск поправляет проверку, которая следит за тем, чтобы оценка ответа доходила до стенда под своим номером в журнале. Она ждала появления кнопки одну секунду и на загруженной машине не успевала: чат ещё открывался, а проверка уже докладывала, что кнопки нет. Теперь она ждёт не секунду, а того, чтобы чат успел открыться, и потому не зависит от скорости машины. Поведение оценок прежнее.",
|
|
74
|
+
"Внутренняя уборка в тестах стенда: двести восемь проверочных файлов и двадцать служебных модулей, которые лежали в одном каталоге, разложены по каталогам по области стенда — происхождение ответов, доступы, учётные записи, настройки, журнал разговоров, консоль администратора и остальные. Сами проверки не переписаны: изменены только пути к файлам и относительные импорты. Интерфейс QA, поведение стенда и его настройки эта версия не меняет.",
|
|
75
|
+
],
|
|
76
|
+
},
|
|
77
|
+
],
|
|
78
|
+
},
|
|
5
79
|
{
|
|
6
80
|
version: "0.13.0",
|
|
7
81
|
date: "2026-09-24",
|
|
@@ -11,6 +85,9 @@ export const QA_CHANGELOG = [
|
|
|
11
85
|
items: [
|
|
12
86
|
"Диаграммы в блоках Mermaid теперь открываются прямо в ответе: их можно увеличить, подогнать по ширине, развернуть на весь экран и переключить на исходный код. Если синтаксис диаграммы неверен, чат не ломается и показывает код с понятным предупреждением.",
|
|
13
87
|
"Стенд добирает оценки, которые нажимали до исправления. Пока отзыв не умел передаваться на стенд, 👍 и 👎 оставались только в браузере того, кто их нажал: в списке оценок, в очереди на разбор и в метриках качества не было ни одной. Теперь при первом входе в свою учётную запись браузер один раз передаёт стенду те из своих оценок, которые относятся к чатам этой учётной записи и которые можно сопоставить с ответом в журнале. Уже записанный отзыв стенд не перезаписывает: оценка с причиной и комментарием остаётся такой, какой её сдали в момент нажатия, — а разовость сбора помечается у себя, чтобы при следующем входе то же самое не предлагать. Учётная запись на другом браузере добирает свои оценки сама. Оценки самых первых версий, где список отзывов был один на весь стенд и не был привязан к чату, остаются в браузере: по ним нельзя понять, к какому разговору их нажимали, а угадывать стенд не стал.",
|
|
88
|
+
"Разбор ответа можно отменить на один запрос: команда /no-review перед вопросом говорит стенду, что этот ответ разбирать не нужно. Отмена привязана ровно к одному запросу и на следующие не распространяется. Обычные слова — «разбор не нужен», «без проверки» — ничего не отменяют: стенд слушает только команду, иначе молчание в тексте принималось бы за отказ. Развёртывания с закрытым режимом разбора по умолчанию команду не слышат, пока оператор сам её не разрешит. В журнале остаётся отметка об отмене, но ни текст вопроса, ни текст ответа в него не переносится.",
|
|
89
|
+
"Новый пользователь попадает на общий управляемый профиль, если развёртывание держит ровно один такой профиль и помечает его как профиль по умолчанию: карточка интеграции открыта, токен вводить не нужно. Личный выбор сильнее автоматики — после «отключить» стенд больше не подключает общий профиль сам, даже после перезахода, а тот, кто уже вписал свой токен, свой токен и сохраняет. Если профилей несколько, стенд не угадывает: это выбор, для которого в настройках есть форма.",
|
|
90
|
+
"Стенд умеет забирать не только картинки. Ответ по авторизованному доступу сохраняется как вложение разговора — документ, таблица, презентация, архив, лог, страница или другой разрешённый отклик. Правила те же, что у картинок: адрес из списка разрешённых, проверка DNS без переподключения, ограничение на редиректы, время и размер ответа. Логин и токен инструмент у модели не спрашивает — доступ выбирает развёртывание.",
|
|
14
91
|
],
|
|
15
92
|
},
|
|
16
93
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QaChangelog.js","sourceRoot":"","sources":["../../../src/client/components/QaChangelog.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAWvC,MAAM,CAAC,MAAM,UAAU,GAAG,kBAAkB,CAAC;AAW7C,MAAM,CAAC,MAAM,YAAY,GAAgC;IACvD;QACE,OAAO,EAAE,QAAQ;QACjB,IAAI,EAAE,YAAY;QAClB,QAAQ,EAAE;YACR;gBACE,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE;oBACL,+PAA+P;oBAC/P,04BAA04B;
|
|
1
|
+
{"version":3,"file":"QaChangelog.js","sourceRoot":"","sources":["../../../src/client/components/QaChangelog.tsx"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,9 @@ const SLASH_LIST_ID = "dsh-qa-slash";
|
|
|
9
9
|
function AttachIcon() {
|
|
10
10
|
return (_jsx("svg", { viewBox: "0 0 18 18", "aria-hidden": "true", children: _jsx("path", { d: "M16.08 8.29 9.19 15.18a4.5 4.5 0 0 1-6.37-6.37l6.89-6.89a3 3 0 0 1 4.25 4.25l-6.9 6.89a1.5 1.5 0 0 1-2.12-2.12l6.37-6.36" }) }));
|
|
11
11
|
}
|
|
12
|
+
function SendIcon() {
|
|
13
|
+
return (_jsx("svg", { viewBox: "0 0 18 18", "aria-hidden": "true", children: _jsx("path", { d: "M9 13.5v-9m0 0L5.5 8M9 4.5 12.5 8" }) }));
|
|
14
|
+
}
|
|
12
15
|
/**
|
|
13
16
|
* Memoized with the default shallow compare: every prop is a scalar, a
|
|
14
17
|
* stable array or a stable callback, so a stream of transcript frames never
|
|
@@ -116,18 +119,18 @@ export const QaComposer = memo(function QaComposer(props) {
|
|
|
116
119
|
: (props.status ?? "Enter: отправить, Shift+Enter: новая строка");
|
|
117
120
|
return (_jsxs("div", { className: dragOver
|
|
118
121
|
? "dsh-qa-composer-wrap dsh-qa-composer-wrap--drag"
|
|
119
|
-
: "dsh-qa-composer-wrap", onDragOver: (event) => {
|
|
122
|
+
: "dsh-qa-composer-wrap", "data-testid": "qa-composer-drop-zone", onDragOver: (event) => {
|
|
120
123
|
event.preventDefault();
|
|
121
124
|
setDragOver(true);
|
|
122
125
|
}, onDragLeave: () => setDragOver(false), onDrop: (event) => {
|
|
123
126
|
event.preventDefault();
|
|
124
127
|
setDragOver(false);
|
|
125
128
|
void addFiles([...event.dataTransfer.files]);
|
|
126
|
-
}, children: [(props.quickQuestions?.length ?? 0) > 0 ? (_jsx("div", { className: "dsh-qa-quick-questions", "aria-label": "\u0411\u044B\u0441\u0442\u0440\u044B\u0435 \u0432\u043E\u043F\u0440\u043E\u0441\u044B", children: props.quickQuestions?.map((question, index) => (_jsx("button", { type: "button", disabled: !props.canSend || submitting, onClick: () => void send(question.prompt), children: question.label }, index))) })) : null, navigation.open ? (_jsx(QaSlashPalette, { idPrefix: SLASH_LIST_ID, rows: navigation.rows, activeId: navigation.activeId, state: props.slash.state, error: props.slash.error, commandSurface: props.slash.commandSurface, showDescriptions: props.slashPolicy.showDescriptions, showKindBadge: props.slashPolicy.showKindBadge, onHover: navigation.hover, onPick: navigation.pick })) : null, _jsxs("div", { className: "dsh-qa-composer", children: [files.length === 0 ? null : (_jsx("div", { className: "dsh-qa-composer__files", "aria-label": "\u041F\u0440\u0438\u043A\u0440\u0435\u043F\u043B\u0451\u043D\u043D\u044B\u0435 \u0444\u0430\u0439\u043B\u044B", children: files.map((file) => (_jsx(QaFileAttachment, { name: file.name, bytes: file.bytes, tone: "draft", onRemove: () => {
|
|
129
|
+
}, children: [(props.quickQuestions?.length ?? 0) > 0 ? (_jsx("div", { className: "dsh-qa-quick-questions", "data-testid": "qa-composer-quick-questions", "aria-label": "\u0411\u044B\u0441\u0442\u0440\u044B\u0435 \u0432\u043E\u043F\u0440\u043E\u0441\u044B", children: props.quickQuestions?.map((question, index) => (_jsx("button", { type: "button", "data-testid": "qa-composer-quick-question", disabled: !props.canSend || submitting, onClick: () => void send(question.prompt), children: question.label }, index))) })) : null, navigation.open ? (_jsx(QaSlashPalette, { idPrefix: SLASH_LIST_ID, rows: navigation.rows, activeId: navigation.activeId, state: props.slash.state, error: props.slash.error, commandSurface: props.slash.commandSurface, showDescriptions: props.slashPolicy.showDescriptions, showKindBadge: props.slashPolicy.showKindBadge, onHover: navigation.hover, onPick: navigation.pick })) : null, _jsxs("div", { className: "dsh-qa-composer", "data-testid": "qa-composer", children: [files.length === 0 ? null : (_jsx("div", { className: "dsh-qa-composer__files", "data-testid": "qa-composer-files", "aria-label": "\u041F\u0440\u0438\u043A\u0440\u0435\u043F\u043B\u0451\u043D\u043D\u044B\u0435 \u0444\u0430\u0439\u043B\u044B", children: files.map((file) => (_jsx(QaFileAttachment, { name: file.name, bytes: file.bytes, tone: "draft", onRemove: () => {
|
|
127
130
|
remove(file.id);
|
|
128
|
-
} }, file.id))) })), images.length === 0 ? null : (_jsx("div", { className: "dsh-qa-composer__images", "aria-label": "\u041F\u0440\u0438\u043A\u0440\u0435\u043F\u043B\u0451\u043D\u043D\u044B\u0435 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F", children: images.map((image) => (_jsxs("span", { className: "dsh-qa-composer__image", children: [_jsx("img", { src: image.previewUrl, alt: image.name }), _jsx("button", { type: "button", "aria-label": `Убрать ${image.name}`, title: "\u0423\u0431\u0440\u0430\u0442\u044C", onClick: () => {
|
|
131
|
+
} }, file.id))) })), images.length === 0 ? null : (_jsx("div", { className: "dsh-qa-composer__images", "data-testid": "qa-composer-images", "aria-label": "\u041F\u0440\u0438\u043A\u0440\u0435\u043F\u043B\u0451\u043D\u043D\u044B\u0435 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F", children: images.map((image) => (_jsxs("span", { className: "dsh-qa-composer__image", "data-testid": "qa-composer-image", children: [_jsx("img", { src: image.previewUrl, alt: image.name }), _jsx("button", { type: "button", "data-testid": "qa-composer-image-remove", "aria-label": `Убрать ${image.name}`, title: "\u0423\u0431\u0440\u0430\u0442\u044C", onClick: () => {
|
|
129
132
|
remove(image.id);
|
|
130
|
-
}, children: _jsx("svg", { viewBox: "0 0 16 16", "aria-hidden": "true", children: _jsx("path", { d: "m4 4 8 8m0-8-8 8" }) }) })] }, image.id))) })), attachmentError === null ? null : (_jsx("p", { className: "dsh-qa-composer__attachment-error", role: "alert", children: attachmentError })), _jsx("label", { className: "dsh-qa-sr-only", htmlFor: "dsh-qa-prompt", children: "\u0417\u0430\u0434\u0430\u0442\u044C \u0432\u043E\u043F\u0440\u043E\u0441" }), _jsx("textarea", { ref: textarea, id: "dsh-qa-prompt", rows: 1, value: draft, placeholder: props.placeholder, disabled: !props.canSend && !props.running, onChange: (event) => setDraft(event.currentTarget.value), onPaste: (event) => {
|
|
133
|
+
}, children: _jsx("svg", { viewBox: "0 0 16 16", "aria-hidden": "true", children: _jsx("path", { d: "m4 4 8 8m0-8-8 8" }) }) })] }, image.id))) })), attachmentError === null ? null : (_jsx("p", { className: "dsh-qa-composer__attachment-error", "data-testid": "qa-composer-attachment-error", role: "alert", children: attachmentError })), _jsx("label", { className: "dsh-qa-sr-only", htmlFor: "dsh-qa-prompt", children: "\u0417\u0430\u0434\u0430\u0442\u044C \u0432\u043E\u043F\u0440\u043E\u0441" }), _jsx("textarea", { ref: textarea, id: "dsh-qa-prompt", "data-testid": "qa-composer-input", rows: 1, value: draft, placeholder: props.placeholder, disabled: !props.canSend && !props.running, onChange: (event) => setDraft(event.currentTarget.value), onPaste: (event) => {
|
|
131
134
|
const pasted = [...(event.clipboardData?.files ?? [])];
|
|
132
135
|
if (pasted.length > 0) {
|
|
133
136
|
event.preventDefault();
|
|
@@ -184,9 +187,9 @@ export const QaComposer = memo(function QaComposer(props) {
|
|
|
184
187
|
event.preventDefault();
|
|
185
188
|
void send();
|
|
186
189
|
}
|
|
187
|
-
} }), _jsxs("div", { className: "dsh-qa-composer__toolbar", children: [_jsx("input", { ref: fileInput, type: "file", accept: attachmentAccept(limits), multiple: true, className: "dsh-qa-sr-only", tabIndex: -1, "aria-hidden": "true", onChange: (event) => {
|
|
190
|
+
} }), _jsxs("div", { className: "dsh-qa-composer__toolbar", children: [_jsx("input", { ref: fileInput, type: "file", "data-testid": "qa-composer-file-input", accept: attachmentAccept(limits), multiple: true, className: "dsh-qa-sr-only", tabIndex: -1, "aria-hidden": "true", onChange: (event) => {
|
|
188
191
|
void addFiles([...(event.target.files ?? [])]);
|
|
189
192
|
event.target.value = "";
|
|
190
|
-
} }), _jsx("button", { type: "button", className: "dsh-qa-composer__attach", "aria-label": "\u041F\u0440\u0438\u043A\u0440\u0435\u043F\u0438\u0442\u044C \u0444\u0430\u0439\u043B", title: "\u041F\u0440\u0438\u043A\u0440\u0435\u043F\u0438\u0442\u044C \u0444\u0430\u0439\u043B \u0438\u043B\u0438 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435", disabled: !props.canSend || attachments.length >= limits.maxPending, onClick: () => fileInput.current?.click(), children: _jsx(AttachIcon, {}) }), _jsx("span", { className: "dsh-qa-composer__hint", "aria-live": "polite", children: hint }), props.running && props.showStop ? (_jsx("button", { type: "button", className: "dsh-qa-composer__action dsh-qa-composer__action--stop", "aria-label": "\u041E\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C", title: "\u041E\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C", disabled: !props.canStop, onClick: () => void props.onStop(), children: _jsx("svg", { viewBox: "0 0 18 18", "aria-hidden": "true", children: _jsx("rect", { x: "5.25", y: "5.25", width: "7.5", height: "7.5", rx: "1.5" }) }) })) : (_jsx("button", { type: "button", className: "dsh-qa-composer__action dsh-qa-composer__action--send", "aria-label": "\u041E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C", title: "\u041E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C", disabled:
|
|
193
|
+
} }), _jsx("button", { type: "button", className: "dsh-qa-composer__attach", "data-testid": "qa-composer-attach", "aria-label": "\u041F\u0440\u0438\u043A\u0440\u0435\u043F\u0438\u0442\u044C \u0444\u0430\u0439\u043B", title: "\u041F\u0440\u0438\u043A\u0440\u0435\u043F\u0438\u0442\u044C \u0444\u0430\u0439\u043B \u0438\u043B\u0438 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435", disabled: !props.canSend || attachments.length >= limits.maxPending, onClick: () => fileInput.current?.click(), children: _jsx(AttachIcon, {}) }), _jsx("span", { className: "dsh-qa-composer__hint", "data-testid": "qa-composer-hint", "aria-live": "polite", children: hint }), props.running && props.showStop ? (_jsx("button", { type: "button", className: "dsh-qa-composer__action dsh-qa-composer__action--stop", "data-testid": "qa-composer-stop", "aria-label": "\u041E\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C", title: "\u041E\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C", disabled: !props.canStop, onClick: () => void props.onStop(), children: _jsx("svg", { viewBox: "0 0 18 18", "aria-hidden": "true", children: _jsx("rect", { x: "5.25", y: "5.25", width: "7.5", height: "7.5", rx: "1.5" }) }) })) : null, props.running && props.showStop && props.canSend ? (_jsx("button", { type: "button", className: "dsh-qa-composer__action dsh-qa-composer__action--send", "data-testid": "qa-composer-send", "aria-label": "\u041E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C \u0432 \u043E\u0447\u0435\u0440\u0435\u0434\u044C", title: "\u041E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C \u0432 \u043E\u0447\u0435\u0440\u0435\u0434\u044C", disabled: submitting || !hasContent, onClick: () => void send(), children: _jsx(SendIcon, {}) })) : null, props.running && props.showStop ? null : (_jsx("button", { type: "button", className: "dsh-qa-composer__action dsh-qa-composer__action--send", "data-testid": "qa-composer-send", "aria-label": props.running ? "Отправить в очередь" : "Отправить", title: props.running ? "Отправить в очередь" : "Отправить", disabled: !props.canSend || submitting || !hasContent, onClick: () => void send(), children: _jsx(SendIcon, {}) }))] })] })] }));
|
|
191
194
|
});
|
|
192
195
|
//# sourceMappingURL=QaComposer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QaComposer.js","sourceRoot":"","sources":["../../../src/client/components/QaComposer.tsx"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"QaComposer.js","sourceRoot":"","sources":["../../../src/client/components/QaComposer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,6 @@ function badgeText(name) {
|
|
|
14
14
|
* both the composer card and the sent row show the same handle.
|
|
15
15
|
*/
|
|
16
16
|
export function QaFileAttachment({ name, bytes, tone, onRemove, }) {
|
|
17
|
-
return (_jsxs("span", { className: "dsh-qa-file", "data-tone": tone, title: name, children: [_jsx("span", { className: "dsh-qa-file__badge", "aria-hidden": "true", children: badgeText(name) }), _jsxs("span", { className: "dsh-qa-file__text", children: [_jsx("span", { className: "dsh-qa-file__name", children: name }), _jsx("span", { className: "dsh-qa-file__meta", children: formatFileSize(bytes) })] }), onRemove === undefined ? null : (_jsx("button", { type: "button", "aria-label": `Убрать ${name}`, title: "\u0423\u0431\u0440\u0430\u0442\u044C", onClick: onRemove, children: _jsx("svg", { viewBox: "0 0 16 16", "aria-hidden": "true", children: _jsx("path", { d: "m4 4 8 8m0-8-8 8" }) }) }))] }));
|
|
17
|
+
return (_jsxs("span", { className: "dsh-qa-file", "data-testid": "qa-file", "data-tone": tone, title: name, children: [_jsx("span", { className: "dsh-qa-file__badge", "data-testid": "qa-file-badge", "aria-hidden": "true", children: badgeText(name) }), _jsxs("span", { className: "dsh-qa-file__text", children: [_jsx("span", { className: "dsh-qa-file__name", "data-testid": "qa-file-name", children: name }), _jsx("span", { className: "dsh-qa-file__meta", "data-testid": "qa-file-size", children: formatFileSize(bytes) })] }), onRemove === undefined ? null : (_jsx("button", { type: "button", "data-testid": "qa-file-remove", "aria-label": `Убрать ${name}`, title: "\u0423\u0431\u0440\u0430\u0442\u044C", onClick: onRemove, children: _jsx("svg", { viewBox: "0 0 16 16", "aria-hidden": "true", children: _jsx("path", { d: "m4 4 8 8m0-8-8 8" }) }) }))] }));
|
|
18
18
|
}
|
|
19
19
|
//# sourceMappingURL=QaFileAttachment.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QaFileAttachment.js","sourceRoot":"","sources":["../../../src/client/components/QaFileAttachment.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,iFAAiF;AACjF,SAAS,SAAS,CAAC,IAAY;IAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,SAAS,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IACtD,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC,MAAM,IAAI,CAAC;QAClD,CAAC,CAAC,SAAS,CAAC,WAAW,EAAE;QACzB,CAAC,CAAC,MAAM,CAAC;AACb,CAAC;AAUD;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,EAC/B,IAAI,EACJ,KAAK,EACL,IAAI,EACJ,QAAQ,GACc;IACtB,OAAO,CACL,
|
|
1
|
+
{"version":3,"file":"QaFileAttachment.js","sourceRoot":"","sources":["../../../src/client/components/QaFileAttachment.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,iFAAiF;AACjF,SAAS,SAAS,CAAC,IAAY;IAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,SAAS,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IACtD,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC,MAAM,IAAI,CAAC;QAClD,CAAC,CAAC,SAAS,CAAC,WAAW,EAAE;QACzB,CAAC,CAAC,MAAM,CAAC;AACb,CAAC;AAUD;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,EAC/B,IAAI,EACJ,KAAK,EACL,IAAI,EACJ,QAAQ,GACc;IACtB,OAAO,CACL,gBACE,SAAS,EAAC,aAAa,iBACX,SAAS,eACV,IAAI,EACf,KAAK,EAAE,IAAI,aAEX,eACE,SAAS,EAAC,oBAAoB,iBAClB,eAAe,iBACf,MAAM,YAEjB,SAAS,CAAC,IAAI,CAAC,GACX,EACP,gBAAM,SAAS,EAAC,mBAAmB,aACjC,eAAM,SAAS,EAAC,mBAAmB,iBAAa,cAAc,YAC3D,IAAI,GACA,EACP,eAAM,SAAS,EAAC,mBAAmB,iBAAa,cAAc,YAC3D,cAAc,CAAC,KAAK,CAAC,GACjB,IACF,EACN,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAC/B,iBACE,IAAI,EAAC,QAAQ,iBACD,gBAAgB,gBAChB,UAAU,IAAI,EAAE,EAC5B,KAAK,EAAC,sCAAQ,EACd,OAAO,EAAE,QAAQ,YAEjB,cAAK,OAAO,EAAC,WAAW,iBAAa,MAAM,YACzC,eAAM,CAAC,EAAC,kBAAkB,GAAG,GACzB,GACC,CACV,IACI,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -20,12 +20,12 @@ function QaFileImage({ image, resolve, }) {
|
|
|
20
20
|
};
|
|
21
21
|
}, [image.attachmentId, resolve]);
|
|
22
22
|
if (url === null) {
|
|
23
|
-
return _jsx("span", { className: "dsh-qa-files__thumb", "data-state": "loading" });
|
|
23
|
+
return (_jsx("span", { className: "dsh-qa-files__thumb", "data-state": "loading", "data-testid": "qa-files-thumb-loading" }));
|
|
24
24
|
}
|
|
25
25
|
if (url === "") {
|
|
26
|
-
return _jsx("span", { className: "dsh-qa-files__thumb", "data-state": "broken" });
|
|
26
|
+
return (_jsx("span", { className: "dsh-qa-files__thumb", "data-state": "broken", "data-testid": "qa-files-thumb-broken" }));
|
|
27
27
|
}
|
|
28
|
-
return (_jsx("a", { href: url, target: "_blank", rel: "noreferrer", children: _jsx("img", { className: "dsh-qa-files__thumb", src: url, alt: "\u041F\u0440\u0438\u043A\u0440\u0435\u043F\u043B\u0451\u043D\u043D\u043E\u0435 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435" }) }));
|
|
28
|
+
return (_jsx("a", { href: url, "data-testid": "qa-files-thumb-link", target: "_blank", rel: "noreferrer", children: _jsx("img", { className: "dsh-qa-files__thumb", "data-testid": "qa-files-thumb", src: url, alt: "\u041F\u0440\u0438\u043A\u0440\u0435\u043F\u043B\u0451\u043D\u043D\u043E\u0435 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435" }) }));
|
|
29
29
|
}
|
|
30
30
|
/**
|
|
31
31
|
* The chat's attachment roster plus, when the Host is reachable, the chat's
|
|
@@ -37,15 +37,15 @@ function QaFileImage({ image, resolve, }) {
|
|
|
37
37
|
* workspace section reads through the Host's fenced listing and file reads.
|
|
38
38
|
*/
|
|
39
39
|
export function QaFilesPanel({ groups, resolveImage, onJumpToMessage, sessionId, api, }) {
|
|
40
|
-
const workspace = sessionId === undefined || api === undefined ? null : (_jsxs("section", { className: "dsh-qa-files__workspace", children: [_jsx("h3", { children: _jsx("span", { children: "\u0420\u0430\u0431\u043E\u0447\u0438\u0439 \u043A\u0430\u0442\u0430\u043B\u043E\u0433" }) }), _jsx(QaWorkspaceBrowser, { sessionId: sessionId, api: api })] }));
|
|
40
|
+
const workspace = sessionId === undefined || api === undefined ? null : (_jsxs("section", { className: "dsh-qa-files__workspace", "data-testid": "qa-files-workspace", children: [_jsx("h3", { children: _jsx("span", { children: "\u0420\u0430\u0431\u043E\u0447\u0438\u0439 \u043A\u0430\u0442\u0430\u043B\u043E\u0433" }) }), _jsx(QaWorkspaceBrowser, { sessionId: sessionId, api: api })] }));
|
|
41
41
|
if (groups.length === 0) {
|
|
42
|
-
return (_jsxs("div", { className: "dsh-qa-files", children: [workspace, _jsx("p", { className: "dsh-qa-files__empty", children: "\u0412 \u044D\u0442\u043E\u043C \u0447\u0430\u0442\u0435 \u043D\u0435\u0442 \u0432\u043B\u043E\u0436\u0435\u043D\u0438\u0439." })] }));
|
|
42
|
+
return (_jsxs("div", { className: "dsh-qa-files", "data-testid": "qa-files-panel", children: [workspace, _jsx("p", { className: "dsh-qa-files__empty", "data-testid": "qa-files-empty", children: "\u0412 \u044D\u0442\u043E\u043C \u0447\u0430\u0442\u0435 \u043D\u0435\u0442 \u0432\u043B\u043E\u0436\u0435\u043D\u0438\u0439." })] }));
|
|
43
43
|
}
|
|
44
|
-
return (_jsxs("div", { className: "dsh-qa-files", children: [workspace, groups.map((group) => {
|
|
44
|
+
return (_jsxs("div", { className: "dsh-qa-files", "data-testid": "qa-files-panel", children: [workspace, groups.map((group) => {
|
|
45
45
|
const time = group.timestamp === undefined
|
|
46
46
|
? "Вложенные файлы"
|
|
47
47
|
: formatDayTime(group.timestamp);
|
|
48
|
-
return (_jsxs("section", { className: "dsh-qa-files__group", children: [_jsxs("h3", { children: [_jsx("span", { children: time }), _jsx("button", { type: "button", className: "dsh-qa-files__jump", "aria-label": `Перейти к сообщению от ${time}`, title: "\u041A \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044E", onClick: () => onJumpToMessage(group.messageId), children: _jsx("svg", { viewBox: "0 0 14 14", "aria-hidden": "true", children: _jsx("path", { d: "M3.5 7h7m-3-3.5L11 7l-3.5 3.5" }) }) })] }), _jsxs("div", { className: "dsh-qa-files__items", children: [group.files.map((file) => (_jsx(QaFileAttachment, { name: file.name, bytes: file.bytes, tone: "sent" }, file.attachmentId))), group.images.map((image) => resolveImage === undefined ? null : (_jsx(QaFileImage, { image: image, resolve: resolveImage }, image.attachmentId)))] })] }, group.messageId));
|
|
48
|
+
return (_jsxs("section", { className: "dsh-qa-files__group", "data-testid": "qa-files-group", children: [_jsxs("h3", { children: [_jsx("span", { "data-testid": "qa-files-group-time", children: time }), _jsx("button", { type: "button", className: "dsh-qa-files__jump", "data-testid": "qa-files-jump", "aria-label": `Перейти к сообщению от ${time}`, title: "\u041A \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044E", onClick: () => onJumpToMessage(group.messageId), children: _jsx("svg", { viewBox: "0 0 14 14", "aria-hidden": "true", children: _jsx("path", { d: "M3.5 7h7m-3-3.5L11 7l-3.5 3.5" }) }) })] }), _jsxs("div", { className: "dsh-qa-files__items", "data-testid": "qa-files-group-items", children: [group.files.map((file) => (_jsx(QaFileAttachment, { name: file.name, bytes: file.bytes, tone: "sent" }, file.attachmentId))), group.images.map((image) => resolveImage === undefined ? null : (_jsx(QaFileImage, { image: image, resolve: resolveImage }, image.attachmentId)))] })] }, group.messageId));
|
|
49
49
|
})] }));
|
|
50
50
|
}
|
|
51
51
|
//# sourceMappingURL=QaFilesPanel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QaFilesPanel.js","sourceRoot":"","sources":["../../../src/client/components/QaFilesPanel.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAI5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,+EAA+E;AAC/E,SAAS,WAAW,CAAC,EACnB,KAAK,EACL,OAAO,GAIR;IACC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IACpD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,KAAK,GAAG,IAAI,CAAC;QACjB,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,IAAI,CAC9B,CAAC,QAAQ,EAAE,EAAE;YACX,IAAI,KAAK;gBAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC,EACD,GAAG,EAAE;YACH,IAAI,KAAK;gBAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QACxB,CAAC,CACF,CAAC;QACF,OAAO,GAAG,EAAE;YACV,KAAK,GAAG,KAAK,CAAC;QAChB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;IAClC,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACjB,OAAO,
|
|
1
|
+
{"version":3,"file":"QaFilesPanel.js","sourceRoot":"","sources":["../../../src/client/components/QaFilesPanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -8,11 +8,11 @@ function RobotBadge() {
|
|
|
8
8
|
* the same indication lives in the title row instead.
|
|
9
9
|
*/
|
|
10
10
|
export function QaSubagentBanner({ onClose, }) {
|
|
11
|
-
return (_jsxs("div", { className: "dsh-qa-agentview", role: "status", children: [_jsx(RobotBadge, {}), _jsx("span", { children: "\u041F\u0440\u043E\u0441\u043C\u043E\u0442\u0440 \u0441\u0443\u0431\u0430\u0433\u0435\u043D\u0442\u0430" }), _jsx("button", { type: "button", onClick: onClose, children: "\u2190 \u0412 \u0447\u0430\u0442" })] }));
|
|
11
|
+
return (_jsxs("div", { className: "dsh-qa-agentview", "data-testid": "qa-surface-subagent-banner", role: "status", children: [_jsx(RobotBadge, {}), _jsx("span", { children: "\u041F\u0440\u043E\u0441\u043C\u043E\u0442\u0440 \u0441\u0443\u0431\u0430\u0433\u0435\u043D\u0442\u0430" }), _jsx("button", { type: "button", "data-testid": "qa-surface-subagent-banner-back", onClick: onClose, children: "\u2190 \u0412 \u0447\u0430\u0442" })] }));
|
|
12
12
|
}
|
|
13
|
-
export function QaHeader({ logoUrl, title, viewingSubagent, onCloseSubagent, roleSelector, administration, agentCount, agentsOpen, onToggleAgents, sourcesVisible, sourcesCount, sourcesComplete, sourcesOpen, onOpenSources, fileCount, filesEnabled, filesOpen, onOpenFiles, settings, panelLauncher, showReset, resetDisabled, onReset, }) {
|
|
14
|
-
return (_jsx("header", { className: "dsh-qa-header", children: _jsxs("div", { className: "dsh-qa-header__inner", children: [_jsxs("div", { className: "dsh-qa-header__title-row", children: [logoUrl === null ? null : (_jsx("img", { className: "dsh-qa-header__logo", src: logoUrl, alt: "" })), title === null ? null : _jsx("h1", { title: title, children: title }), viewingSubagent ? (_jsxs("span", { className: "dsh-qa-header__viewing", children: [_jsx(RobotBadge, {}), "\u041F\u0440\u043E\u0441\u043C\u043E\u0442\u0440 \u0441\u0443\u0431\u0430\u0433\u0435\u043D\u0442\u0430", _jsx("button", { type: "button", className: "dsh-qa-header__back", onClick: onCloseSubagent, children: "\u2190 \u0412 \u0447\u0430\u0442" })] })) : null, roleSelector, _jsxs("button", { type: "button", className: "dsh-qa-header__agents", disabled: agentCount === 0, "aria-expanded": agentsOpen, onClick: onToggleAgents, children: [_jsxs("svg", { viewBox: "0 0 16 16", "aria-hidden": "true", children: [_jsx("rect", { x: "3", y: "5.5", width: "10", height: "7", rx: "1.75" }), _jsx("path", { d: "M8 3v2.5M6.2 9h.01M9.8 9h.01M6.2 11h3.6" })] }), "\u0410\u0433\u0435\u043D\u0442\u044B", agentCount === 0 ? null : ` (${agentCount})`] }), sourcesVisible ? (_jsxs("button", { type: "button", className: "dsh-qa-header__sources", disabled: sourcesCount === 0 && sourcesComplete, "aria-expanded": sourcesOpen, onClick: onOpenSources, children: [_jsxs("svg", { viewBox: "0 0 16 16", "aria-hidden": "true", children: [_jsx("circle", { cx: "8", cy: "8", r: "5.75" }), _jsx("path", { d: "M2.25 8h11.5M8 2.25c1.6 1.55 2.4 3.5 2.4 5.75S9.6 12.2 8 13.75C6.4 12.2 5.6 10.25 5.6 8S6.4 3.8 8 2.25Z" })] }), "\u0418\u0441\u0442\u043E\u0447\u043D\u0438\u043A\u0438", sourcesCount === 0 && sourcesComplete
|
|
13
|
+
export function QaHeader({ logoUrl, title, viewingSubagent, onCloseSubagent, roleSelector, themeSwitcher, administration, agentCount, agentsOpen, onToggleAgents, sourcesVisible, sourcesCount, sourcesComplete, sourcesOpen, onOpenSources, fileCount, filesEnabled, filesOpen, onOpenFiles, settings, history, panelLauncher, showReset, resetDisabled, onReset, }) {
|
|
14
|
+
return (_jsx("header", { className: "dsh-qa-header", "data-testid": "qa-surface-header", children: _jsxs("div", { className: "dsh-qa-header__inner", "data-testid": "qa-surface-header-inner", children: [_jsxs("div", { className: "dsh-qa-header__title-row", "data-testid": "qa-surface-header-title-row", children: [history === undefined ? null : (_jsx("button", { type: "button", className: "dsh-qa-header__history", "data-testid": "qa-surface-header-history", "aria-label": "\u0418\u0441\u0442\u043E\u0440\u0438\u044F \u0447\u0430\u0442\u043E\u0432", title: "\u0418\u0441\u0442\u043E\u0440\u0438\u044F \u0447\u0430\u0442\u043E\u0432", "aria-expanded": history.open, onClick: history.onToggle, children: _jsx("svg", { viewBox: "0 0 16 16", "aria-hidden": "true", children: _jsx("path", { d: "M5.75 4h8M5.75 8h8M5.75 12h8M2.75 4h.01M2.75 8h.01M2.75 12h.01" }) }) })), logoUrl === null ? null : (_jsx("img", { className: "dsh-qa-header__logo", "data-testid": "qa-surface-header-logo", src: logoUrl, alt: "" })), title === null ? null : (_jsx("h1", { title: title, "data-testid": "qa-surface-header-title", children: title })), viewingSubagent ? (_jsxs("span", { className: "dsh-qa-header__viewing", "data-testid": "qa-surface-header-viewing", children: [_jsx(RobotBadge, {}), "\u041F\u0440\u043E\u0441\u043C\u043E\u0442\u0440 \u0441\u0443\u0431\u0430\u0433\u0435\u043D\u0442\u0430", _jsx("button", { type: "button", className: "dsh-qa-header__back", "data-testid": "qa-surface-header-back", onClick: onCloseSubagent, children: "\u2190 \u0412 \u0447\u0430\u0442" })] })) : null, roleSelector, themeSwitcher, _jsxs("button", { type: "button", className: "dsh-qa-header__agents", "data-testid": "qa-surface-header-agents", disabled: agentCount === 0, "aria-expanded": agentsOpen, onClick: onToggleAgents, children: [_jsxs("svg", { viewBox: "0 0 16 16", "aria-hidden": "true", children: [_jsx("rect", { x: "3", y: "5.5", width: "10", height: "7", rx: "1.75" }), _jsx("path", { d: "M8 3v2.5M6.2 9h.01M9.8 9h.01M6.2 11h3.6" })] }), "\u0410\u0433\u0435\u043D\u0442\u044B", agentCount === 0 ? null : ` (${agentCount})`] }), sourcesVisible ? (_jsxs("button", { type: "button", className: "dsh-qa-header__sources", "data-testid": "qa-surface-header-sources", disabled: sourcesCount === 0 && sourcesComplete, "aria-expanded": sourcesOpen, onClick: onOpenSources, children: [_jsxs("svg", { viewBox: "0 0 16 16", "aria-hidden": "true", children: [_jsx("circle", { cx: "8", cy: "8", r: "5.75" }), _jsx("path", { d: "M2.25 8h11.5M8 2.25c1.6 1.55 2.4 3.5 2.4 5.75S9.6 12.2 8 13.75C6.4 12.2 5.6 10.25 5.6 8S6.4 3.8 8 2.25Z" })] }), "\u0418\u0441\u0442\u043E\u0447\u043D\u0438\u043A\u0438", sourcesCount === 0 && sourcesComplete
|
|
15
15
|
? null
|
|
16
|
-
: ` (${sourcesCount})`] })) : null, _jsxs("button", { type: "button", className: "dsh-qa-header__files", disabled: !filesEnabled, "aria-expanded": filesOpen, onClick: onOpenFiles, children: [_jsxs("svg", { viewBox: "0 0 16 16", "aria-hidden": "true", children: [_jsx("path", { d: "M9.25 2.5H4.75A1.25 1.25 0 0 0 3.5 3.75v8.5a1.25 1.25 0 0 0 1.25 1.25h6.5a1.25 1.25 0 0 0 1.25-1.25V5.75L9.25 2.5Z" }), _jsx("path", { d: "M9.25 2.5v3.25h3.25M6 8.5h4M6 11h2.5" })] }), "\u0424\u0430\u0439\u043B\u044B", fileCount === 0 ? null : ` (${fileCount})`] }), _jsxs("div", { className: "dsh-qa-header__actions", children: [showReset ? (_jsx("button", { type: "button", className: "dsh-qa-header__reset", disabled: resetDisabled, onClick: onReset, children: "\u041D\u043E\u0432\u044B\u0439 \u0447\u0430\u0442" })) : null, administration === undefined ? null : (_jsx("button", { type: "button", className: "dsh-qa-header__admin", onClick: administration.onOpen, children: "\u0410\u0434\u043C\u0438\u043D\u0438\u0441\u0442\u0440\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435" })), panelLauncher, settings === undefined ? null : (_jsxs("button", { type: "button", className: "dsh-qa-header__settings", title: settings.label, onClick: settings.onOpen, children: [_jsxs("svg", { viewBox: "0 0 16 16", "aria-hidden": "true", children: [_jsx("circle", { cx: "8", cy: "8", r: "2.2" }), _jsx("path", { d: "M8 1.8v2M8 12.2v2M1.8 8h2M12.2 8h2M3.6 3.6l1.4 1.4M11 11l1.4 1.4M3.6 12.4 5 11M11 5l1.4-1.4" })] }), "\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438"] }))] })] }), _jsx("div", { className: "dsh-qa-header__tabs", children: _jsx("span", { "aria-current": "page", children: "\u0427\u0430\u0442" }) })] }) }));
|
|
16
|
+
: ` (${sourcesCount})`] })) : null, _jsxs("button", { type: "button", className: "dsh-qa-header__files", "data-testid": "qa-surface-header-files", disabled: !filesEnabled, "aria-expanded": filesOpen, onClick: onOpenFiles, children: [_jsxs("svg", { viewBox: "0 0 16 16", "aria-hidden": "true", children: [_jsx("path", { d: "M9.25 2.5H4.75A1.25 1.25 0 0 0 3.5 3.75v8.5a1.25 1.25 0 0 0 1.25 1.25h6.5a1.25 1.25 0 0 0 1.25-1.25V5.75L9.25 2.5Z" }), _jsx("path", { d: "M9.25 2.5v3.25h3.25M6 8.5h4M6 11h2.5" })] }), "\u0424\u0430\u0439\u043B\u044B", fileCount === 0 ? null : ` (${fileCount})`] }), _jsxs("div", { className: "dsh-qa-header__actions", "data-testid": "qa-surface-header-actions", children: [showReset ? (_jsx("button", { type: "button", className: "dsh-qa-header__reset", "data-testid": "qa-surface-header-reset", disabled: resetDisabled, onClick: onReset, children: "\u041D\u043E\u0432\u044B\u0439 \u0447\u0430\u0442" })) : null, administration === undefined ? null : (_jsx("button", { type: "button", className: "dsh-qa-header__admin", "data-testid": "qa-surface-header-admin", onClick: administration.onOpen, children: "\u0410\u0434\u043C\u0438\u043D\u0438\u0441\u0442\u0440\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435" })), panelLauncher, settings === undefined ? null : (_jsxs("button", { type: "button", className: "dsh-qa-header__settings", "data-testid": "qa-surface-header-settings", title: settings.label, onClick: settings.onOpen, children: [_jsxs("svg", { viewBox: "0 0 16 16", "aria-hidden": "true", children: [_jsx("circle", { cx: "8", cy: "8", r: "2.2" }), _jsx("path", { d: "M8 1.8v2M8 12.2v2M1.8 8h2M12.2 8h2M3.6 3.6l1.4 1.4M11 11l1.4 1.4M3.6 12.4 5 11M11 5l1.4-1.4" })] }), "\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438"] }))] })] }), _jsx("div", { className: "dsh-qa-header__tabs", "data-testid": "qa-surface-header-tabs", children: _jsx("span", { "aria-current": "page", children: "\u0427\u0430\u0442" }) })] }) }));
|
|
17
17
|
}
|
|
18
18
|
//# sourceMappingURL=QaHeader.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QaHeader.js","sourceRoot":"","sources":["../../../src/client/components/QaHeader.tsx"],"names":[],"mappings":";AAQA,SAAS,UAAU;IACjB,OAAO,CACL,eACE,SAAS,EAAC,wBAAwB,EAClC,OAAO,EAAC,WAAW,iBACP,MAAM,aAElB,eAAM,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,KAAK,EAAC,EAAE,EAAC,MAAM,GAAG,EACtD,eAAM,CAAC,EAAC,uFAAuF,GAAG,IAC9F,CACP,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,EAC/B,OAAO,GAGR;IACC,OAAO,CACL,
|
|
1
|
+
{"version":3,"file":"QaHeader.js","sourceRoot":"","sources":["../../../src/client/components/QaHeader.tsx"],"names":[],"mappings":"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"}
|