@yadsh/dsh-qa-surface 0.14.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.
@@ -163,6 +163,9 @@ export const QA_SURFACE_STYLES = String.raw `
163
163
  .dsh-qa-sidebar__account-exit:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}
164
164
  .dsh-qa-sidebar__account-exit:focus-visible{outline:var(--dsw-focus-ring-width, 2px) solid var(--dsw-focus-ring-color, var(--dsh-qa-accent));outline-offset:-2px}
165
165
  .dsh-qa-sidebar__account-exit svg{width:13px;height:13px;fill:none;stroke:currentColor;stroke-width:1.4;stroke-linecap:round;stroke-linejoin:round}
166
+ /* The phone drawer's dismiss layer: painted by the narrow layout alone, and only
167
+ while the drawer is open (QaSurface mounts nothing else). */
168
+ .dsh-qa-sidebar__scrim{display:none}
166
169
  .dsh-qa-auth{align-items:center;justify-content:center;padding:24px}
167
170
  .dsh-qa-auth__card{display:flex;flex-direction:column;gap:14px;width:min(360px,100%);padding:28px;border:1px solid var(--dsw-alias-border-l2);border-radius:14px;background:var(--dsw-alias-bg-layer-2);box-shadow:0 18px 48px var(--dsh-qa-overlay)}
168
171
  .dsh-qa-auth__brand{display:flex;flex-direction:column;align-items:center;gap:10px;text-align:center}
@@ -391,6 +394,15 @@ export const QA_SURFACE_STYLES = String.raw `
391
394
  .dsh-qa-header__settings:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}
392
395
  .dsh-qa-header__settings svg{width:15px;height:15px;fill:none;stroke:currentColor;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round}
393
396
  .dsh-qa-header__settings:focus-visible{outline:var(--dsw-focus-ring-width, 2px) solid var(--dsw-focus-ring-color, var(--dsh-qa-accent));outline-offset:2px}
397
+ /* The opener of the chat history at the phone widths, where the sheet switches
398
+ the sidebar off: it stands in the header because a control inside a switched-off
399
+ subtree is no control, and it is sized for a thumb rather than a cursor. The
400
+ wide layout hides it — there the sidebar is already on screen. */
401
+ .dsh-qa-header__history{display:none;align-items:center;justify-content:center;flex:none;width:44px;height:44px;padding:0;border:0;border-radius:10px;background:0 0;color:var(--dsw-alias-label-secondary);cursor:pointer}
402
+ .dsh-qa-header__history:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}
403
+ .dsh-qa-header__history[aria-expanded="true"]{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}
404
+ .dsh-qa-header__history:focus-visible{outline:var(--dsw-focus-ring-width, 2px) solid var(--dsw-focus-ring-color, var(--dsh-qa-accent));outline-offset:2px}
405
+ .dsh-qa-header__history svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:1.25;stroke-linecap:round;stroke-linejoin:round}
394
406
  .dsh-qa-role-selector select,.dsh-qa-header__admin{height:30px;padding:4px 10px;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-secondary);font:inherit;font-size:12px;line-height:20px;cursor:pointer}
395
407
  .dsh-qa-role-selector select:hover,.dsh-qa-header__admin:hover{border-color:var(--dsw-alias-label-dimmed);color:var(--dsw-alias-label-primary)}
396
408
  .dsh-qa-role-selector select:focus-visible,.dsh-qa-header__admin:focus-visible{outline:var(--dsw-focus-ring-width, 2px) solid var(--dsw-focus-ring-color, var(--dsh-qa-accent));outline-offset:1px}
@@ -964,7 +976,7 @@ a.dsh-qa-srcref:hover,button.dsh-qa-srcref:hover{border-color:var(--dsw-alias-la
964
976
  row — title, role, palette, action cluster — is wider than the viewport with
965
977
  every child refusing to shrink, so it wraps instead of pushing «Настройки»
966
978
  past the clipped edge. */
967
- @media (max-width:600px){.dsh-qa-sidebar{display:none}.dsh-qa-panel,.dsh-qa-agents{position:absolute;inset:0;z-index:6;width:100%;border-left:0}.dsh-qa-header__inner{padding-left:16px;padding-right:16px}.dsh-qa-header h1{max-width:48vw}.dsh-qa-header__title-row{flex-wrap:wrap;row-gap:6px}.dsh-qa-width-handle{display:none}.dsh-qa-transcript__inner{--dsh-qa-bleed:0px;max-width:100%;padding:16px 16px 28px}.dsh-qa-footer__inner{max-width:100%}.dsh-qa-message{margin-bottom:16px}.dsh-qa-message--user .dsh-qa-message__content{max-width:88%;font-size:15px}.dsh-qa-message__content{font-size:14px}.dsh-qa-footer{padding-left:10px;padding-right:10px;padding-bottom:max(8px,env(safe-area-inset-bottom))}.dsh-qa-composer{min-height:84px;padding-top:12px}.dsh-qa-composer__hint{font-size:0}.dsh-qa-composer__hint::after{content:"Enter: отправить";font-size:11px}}
979
+ @media (max-width:600px){.dsh-qa-sidebar{display:none}.dsh-qa-sidebar[data-qa-drawer="open"]{display:flex;position:fixed;inset:0 auto 0 0;z-index:24;width:min(320px,86vw);max-width:100%;border-right:1px solid var(--dsw-alias-border-l2);box-shadow:0 18px 44px rgba(0,0,0,.28);padding-bottom:env(safe-area-inset-bottom)}.dsh-qa-sidebar__scrim{display:block;position:fixed;inset:0;z-index:22;background:var(--dsh-qa-overlay)}.dsh-qa-sidebar__resize{display:none}.dsh-qa-sidebar__collapse,.dsh-qa-sidebar__expand{width:44px;height:44px}.dsh-qa-sidebar__new,.dsh-qa-sidebar__item-main{min-height:44px}.dsh-qa-header__history{display:inline-flex}.dsh-qa-panel,.dsh-qa-agents{position:absolute;inset:0;z-index:6;width:100%;border-left:0}.dsh-qa-header__inner{padding-left:16px;padding-right:16px}.dsh-qa-header h1{max-width:48vw}.dsh-qa-header__title-row{flex-wrap:wrap;row-gap:6px}.dsh-qa-width-handle{display:none}.dsh-qa-transcript__inner{--dsh-qa-bleed:0px;max-width:100%;padding:16px 16px 28px}.dsh-qa-footer__inner{max-width:100%}.dsh-qa-message{margin-bottom:16px}.dsh-qa-message--user .dsh-qa-message__content{max-width:88%;font-size:15px}.dsh-qa-message__content{font-size:14px}.dsh-qa-footer{padding-left:10px;padding-right:10px;padding-bottom:max(8px,env(safe-area-inset-bottom))}.dsh-qa-composer{min-height:84px;padding-top:12px}.dsh-qa-composer__hint{font-size:0}.dsh-qa-composer__hint::after{content:"Enter: отправить";font-size:11px}}
968
980
  @media (max-height:480px) and (orientation:landscape){.dsh-qa-header__inner{padding-top:6px}.dsh-qa-header__tabs{display:none}.dsh-qa-transcript__inner{padding-top:12px}.dsh-qa-footer{padding-top:12px}.dsh-qa-composer{min-height:72px;gap:4px;padding-top:8px}}
969
981
  @media (prefers-reduced-motion:reduce){.dsh-qa-message__cursor,.dsh-qa-message__pending-spinner,.dsh-qa-work__spinner,.dsh-qa-work-item__spinner,.dsh-qa-command__spinner{animation:none}.dsh-qa-work__chevron{transition:none}.dsh-qa-rail__frame,.dsh-qa-rail__pos,.dsh-qa-rail__mark::before,.dsh-qa-rail__mark--busy::before,.dsh-qa-rail__preview{transition:none;animation:none}}
970
982
  ${QA_ADMIN_CONSOLE_STYLES}
@@ -1 +1 @@
1
- {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../src/client/styles.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../src/client/styles.ts"],"names":[],"mappings":"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"}
package/lib/client.js CHANGED
@@ -20242,7 +20242,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
20242
20242
  ]
20243
20243
  });
20244
20244
  }
20245
- function QaHeader({ logoUrl, title, viewingSubagent, onCloseSubagent, roleSelector, themeSwitcher, administration, agentCount, agentsOpen, onToggleAgents, sourcesVisible, sourcesCount, sourcesComplete, sourcesOpen, onOpenSources, fileCount, filesEnabled, filesOpen, onOpenFiles, settings, panelLauncher, showReset, resetDisabled, onReset }) {
20245
+ 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 }) {
20246
20246
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("header", {
20247
20247
  className: "dsh-qa-header",
20248
20248
  "data-testid": "qa-surface-header",
@@ -20253,6 +20253,20 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
20253
20253
  className: "dsh-qa-header__title-row",
20254
20254
  "data-testid": "qa-surface-header-title-row",
20255
20255
  children: [
20256
+ history === void 0 ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
20257
+ type: "button",
20258
+ className: "dsh-qa-header__history",
20259
+ "data-testid": "qa-surface-header-history",
20260
+ "aria-label": "История чатов",
20261
+ title: "История чатов",
20262
+ "aria-expanded": history.open,
20263
+ onClick: history.onToggle,
20264
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("svg", {
20265
+ viewBox: "0 0 16 16",
20266
+ "aria-hidden": "true",
20267
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M5.75 4h8M5.75 8h8M5.75 12h8M2.75 4h.01M2.75 8h.01M2.75 12h.01" })
20268
+ })
20269
+ }),
20256
20270
  logoUrl === null ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("img", {
20257
20271
  className: "dsh-qa-header__logo",
20258
20272
  "data-testid": "qa-surface-header-logo",
@@ -52610,8 +52624,16 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
52610
52624
  }
52611
52625
  //#endregion
52612
52626
  //#region src/client/components/QaChangelog.tsx
52613
- const QA_VERSION = "0.14.0";
52627
+ const QA_VERSION = "0.15.0";
52614
52628
  const QA_CHANGELOG = [
52629
+ {
52630
+ version: "0.15.0",
52631
+ date: "2026-10-05",
52632
+ sections: [{
52633
+ title: "Исправления",
52634
+ items: ["Ответ снова рассказывает, откуда в нём факты. Источник, который сдал сам отвечающий агент — а не тот, кому он делегировал кусок работы, — раньше молча отклонялся: канал спрашивал не «есть ли у записи адрес», а «кто вообще имеет право отчитываться», и на стенде, где читает и отвечает один агент разговора, не записывался ни один источник. Теперь такой источник попадает ровно в тот ход, который его сдал, а правило «источник обязан назвать файл или ссылку» по-прежнему проверяется по каждой записи отдельно — то есть пустая ссылка не пройдёт и теперь.", "На телефоне история чатов снова достижима. Узкая раскладка прятала боковую панель вместе с обеими кнопками, которые могли её показать: список чатов, поиск и «Новый чат» исчезали, а шапка ничего вместо них не предлагала. Теперь в шапке есть своя кнопка — размером под палец, а не под курсор, — и история выезжает поверх затемняющего слоя: закрыть её можно Escape, тапом вне панели или выбором чата. Состояние свёрнутой панели на широком экране этот ящик не трогает, поэтому, вернувшись на десктоп, читатель застанет ровно то, что оставил."]
52635
+ }]
52636
+ },
52615
52637
  {
52616
52638
  version: "0.14.0",
52617
52639
  date: "2026-09-25",
@@ -53120,7 +53142,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
53120
53142
  className: "dsh-qa-changelog__date",
53121
53143
  children: entry.date
53122
53144
  }),
53123
- entry.version === "0.14.0" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
53145
+ entry.version === "0.15.0" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
53124
53146
  className: "dsh-qa-changelog__current",
53125
53147
  children: "текущая"
53126
53148
  }) : null
@@ -53576,7 +53598,11 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
53576
53598
  setCollapsed(next);
53577
53599
  writeCollapsed(props.stateKey, next);
53578
53600
  };
53579
- if (collapsed) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("nav", {
53601
+ const drawerOpen = props.drawerOpen === true;
53602
+ const closeDrawer = () => {
53603
+ if (drawerOpen) props.onDrawerClose?.();
53604
+ };
53605
+ if (collapsed && !drawerOpen) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("nav", {
53580
53606
  className: "dsh-qa-sidebar dsh-qa-sidebar--collapsed",
53581
53607
  "data-testid": "qa-surface-sidebar-collapsed",
53582
53608
  "aria-label": "История чатов",
@@ -53609,7 +53635,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
53609
53635
  className: "dsh-qa-sidebar__item-main",
53610
53636
  "data-testid": "qa-surface-sidebar-item-open",
53611
53637
  "aria-current": row.active ? "true" : void 0,
53612
- onClick: () => props.onSwitch(row.id),
53638
+ onClick: () => {
53639
+ props.onSwitch(row.id);
53640
+ closeDrawer();
53641
+ },
53613
53642
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
53614
53643
  className: "dsh-qa-sidebar__item-title",
53615
53644
  "data-testid": "qa-surface-sidebar-item-title",
@@ -53661,7 +53690,13 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
53661
53690
  ref: nav,
53662
53691
  className: "dsh-qa-sidebar",
53663
53692
  "data-testid": "qa-surface-sidebar",
53693
+ "data-qa-drawer": drawerOpen ? "open" : void 0,
53664
53694
  "aria-label": "История чатов",
53695
+ onKeyDown: (event) => {
53696
+ if (!drawerOpen || event.key !== "Escape") return;
53697
+ event.stopPropagation();
53698
+ closeDrawer();
53699
+ },
53665
53700
  children: [
53666
53701
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
53667
53702
  className: "dsh-qa-sidebar__head",
@@ -53683,9 +53718,15 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
53683
53718
  type: "button",
53684
53719
  className: "dsh-qa-sidebar__collapse",
53685
53720
  "data-testid": "qa-surface-sidebar-collapse",
53686
- "aria-label": "Свернуть историю чатов",
53687
- title: "Свернуть историю чатов",
53688
- onClick: toggleCollapsed,
53721
+ "aria-label": drawerOpen ? "Закрыть историю чатов" : "Свернуть историю чатов",
53722
+ title: drawerOpen ? "Закрыть историю чатов" : "Свернуть историю чатов",
53723
+ onClick: () => {
53724
+ if (drawerOpen) {
53725
+ closeDrawer();
53726
+ return;
53727
+ }
53728
+ toggleCollapsed();
53729
+ },
53689
53730
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ChevronIcon, {})
53690
53731
  })]
53691
53732
  }),
@@ -53697,7 +53738,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
53697
53738
  className: "dsh-qa-sidebar__new",
53698
53739
  "data-testid": "qa-surface-sidebar-new",
53699
53740
  disabled: props.busy,
53700
- onClick: props.onNewChat,
53741
+ onClick: () => {
53742
+ props.onNewChat();
53743
+ closeDrawer();
53744
+ },
53701
53745
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(PlusIcon, {}), "Новый чат"]
53702
53746
  })
53703
53747
  }) : null,
@@ -53839,7 +53883,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
53839
53883
  })
53840
53884
  ]
53841
53885
  });
53842
- }, (prev, next) => prev.title === next.title && prev.logoUrl === next.logoUrl && prev.stateKey === next.stateKey && prev.showNewChat === next.showNewChat && prev.busy === next.busy && prev.groupByOwner === next.groupByOwner && prev.onSwitch === next.onSwitch && prev.onNewChat === next.onNewChat && prev.onDelete === next.onDelete && prev.onAudit === next.onAudit && prev.audits === next.audits && prev.account?.email === next.account?.email && prev.account?.role === next.account?.role && prev.account?.onLogout === next.account?.onLogout && prev.account?.settings === next.account?.settings && sameChatRows(prev.rows, next.rows));
53886
+ }, (prev, next) => prev.title === next.title && prev.logoUrl === next.logoUrl && prev.stateKey === next.stateKey && prev.showNewChat === next.showNewChat && prev.busy === next.busy && prev.drawerOpen === next.drawerOpen && prev.onDrawerClose === next.onDrawerClose && prev.groupByOwner === next.groupByOwner && prev.onSwitch === next.onSwitch && prev.onNewChat === next.onNewChat && prev.onDelete === next.onDelete && prev.onAudit === next.onAudit && prev.audits === next.audits && prev.account?.email === next.account?.email && prev.account?.role === next.account?.role && prev.account?.onLogout === next.account?.onLogout && prev.account?.settings === next.account?.settings && sameChatRows(prev.rows, next.rows));
53843
53887
  //#endregion
53844
53888
  //#region src/client/components/QaAgentsDrawer.tsx
53845
53889
  /**
@@ -63738,6 +63782,9 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
63738
63782
  const handleNewChat = (0, react.useCallback)(() => {
63739
63783
  controller?.startDraft();
63740
63784
  }, [controller]);
63785
+ const [historyOpen, setHistoryOpen] = (0, react.useState)(false);
63786
+ const toggleHistory = (0, react.useCallback)(() => setHistoryOpen((open) => !open), []);
63787
+ const closeHistory = (0, react.useCallback)(() => setHistoryOpen(false), []);
63741
63788
  const [auditTarget, setAuditTarget] = (0, react.useState)(null);
63742
63789
  const openAudit = (0, react.useCallback)((sessionId) => {
63743
63790
  setAuditTarget(sessionId);
@@ -64094,6 +64141,12 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
64094
64141
  ...previewing ? { onExit: exitPreview } : {},
64095
64142
  disabled: state.phase === "creating"
64096
64143
  }) : null,
64144
+ showSidebar && historyOpen ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
64145
+ className: "dsh-qa-sidebar__scrim",
64146
+ "data-testid": "qa-surface-sidebar-scrim",
64147
+ "aria-hidden": "true",
64148
+ onClick: closeHistory
64149
+ }) : null,
64097
64150
  showSidebar ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(QaSidebar, {
64098
64151
  rows: chatRows,
64099
64152
  groupByOwner: ownerNames !== void 0,
@@ -64102,6 +64155,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
64102
64155
  stateKey,
64103
64156
  showNewChat: allowNewChat,
64104
64157
  busy: state.phase === "creating",
64158
+ drawerOpen: historyOpen,
64159
+ onDrawerClose: closeHistory,
64105
64160
  onSwitch: handleSwitch,
64106
64161
  onNewChat: handleNewChat,
64107
64162
  onDelete: handleDelete,
@@ -64164,6 +64219,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
64164
64219
  filesOpen: rail.railOpen && rail.railTab === "files",
64165
64220
  onOpenFiles: () => rail.openTab("files"),
64166
64221
  panelLauncher: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(QaPanelLauncher, { panels: props.panels }),
64222
+ history: showSidebar ? {
64223
+ open: historyOpen,
64224
+ onToggle: toggleHistory
64225
+ } : void 0,
64167
64226
  settings: showSidebar ? void 0 : settingsEntry,
64168
64227
  showReset: showResetButton,
64169
64228
  resetDisabled: controller === void 0 || state.phase === "creating",
@@ -64761,6 +64820,9 @@ body[data-dsh-qa-surface="active"] div:has(>[data-shell-overlay])>:not([data-she
64761
64820
  .dsh-qa-sidebar__account-exit:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}
64762
64821
  .dsh-qa-sidebar__account-exit:focus-visible{outline:var(--dsw-focus-ring-width, 2px) solid var(--dsw-focus-ring-color, var(--dsh-qa-accent));outline-offset:-2px}
64763
64822
  .dsh-qa-sidebar__account-exit svg{width:13px;height:13px;fill:none;stroke:currentColor;stroke-width:1.4;stroke-linecap:round;stroke-linejoin:round}
64823
+ /* The phone drawer's dismiss layer: painted by the narrow layout alone, and only
64824
+ while the drawer is open (QaSurface mounts nothing else). */
64825
+ .dsh-qa-sidebar__scrim{display:none}
64764
64826
  .dsh-qa-auth{align-items:center;justify-content:center;padding:24px}
64765
64827
  .dsh-qa-auth__card{display:flex;flex-direction:column;gap:14px;width:min(360px,100%);padding:28px;border:1px solid var(--dsw-alias-border-l2);border-radius:14px;background:var(--dsw-alias-bg-layer-2);box-shadow:0 18px 48px var(--dsh-qa-overlay)}
64766
64828
  .dsh-qa-auth__brand{display:flex;flex-direction:column;align-items:center;gap:10px;text-align:center}
@@ -64989,6 +65051,15 @@ body[data-dsh-qa-surface="active"] div:has(>[data-shell-overlay])>:not([data-she
64989
65051
  .dsh-qa-header__settings:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}
64990
65052
  .dsh-qa-header__settings svg{width:15px;height:15px;fill:none;stroke:currentColor;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round}
64991
65053
  .dsh-qa-header__settings:focus-visible{outline:var(--dsw-focus-ring-width, 2px) solid var(--dsw-focus-ring-color, var(--dsh-qa-accent));outline-offset:2px}
65054
+ /* The opener of the chat history at the phone widths, where the sheet switches
65055
+ the sidebar off: it stands in the header because a control inside a switched-off
65056
+ subtree is no control, and it is sized for a thumb rather than a cursor. The
65057
+ wide layout hides it — there the sidebar is already on screen. */
65058
+ .dsh-qa-header__history{display:none;align-items:center;justify-content:center;flex:none;width:44px;height:44px;padding:0;border:0;border-radius:10px;background:0 0;color:var(--dsw-alias-label-secondary);cursor:pointer}
65059
+ .dsh-qa-header__history:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}
65060
+ .dsh-qa-header__history[aria-expanded="true"]{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}
65061
+ .dsh-qa-header__history:focus-visible{outline:var(--dsw-focus-ring-width, 2px) solid var(--dsw-focus-ring-color, var(--dsh-qa-accent));outline-offset:2px}
65062
+ .dsh-qa-header__history svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:1.25;stroke-linecap:round;stroke-linejoin:round}
64992
65063
  .dsh-qa-role-selector select,.dsh-qa-header__admin{height:30px;padding:4px 10px;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-secondary);font:inherit;font-size:12px;line-height:20px;cursor:pointer}
64993
65064
  .dsh-qa-role-selector select:hover,.dsh-qa-header__admin:hover{border-color:var(--dsw-alias-label-dimmed);color:var(--dsw-alias-label-primary)}
64994
65065
  .dsh-qa-role-selector select:focus-visible,.dsh-qa-header__admin:focus-visible{outline:var(--dsw-focus-ring-width, 2px) solid var(--dsw-focus-ring-color, var(--dsh-qa-accent));outline-offset:1px}
@@ -65562,7 +65633,7 @@ a.dsh-qa-srcref:hover,button.dsh-qa-srcref:hover{border-color:var(--dsw-alias-la
65562
65633
  row — title, role, palette, action cluster — is wider than the viewport with
65563
65634
  every child refusing to shrink, so it wraps instead of pushing «Настройки»
65564
65635
  past the clipped edge. */
65565
- @media (max-width:600px){.dsh-qa-sidebar{display:none}.dsh-qa-panel,.dsh-qa-agents{position:absolute;inset:0;z-index:6;width:100%;border-left:0}.dsh-qa-header__inner{padding-left:16px;padding-right:16px}.dsh-qa-header h1{max-width:48vw}.dsh-qa-header__title-row{flex-wrap:wrap;row-gap:6px}.dsh-qa-width-handle{display:none}.dsh-qa-transcript__inner{--dsh-qa-bleed:0px;max-width:100%;padding:16px 16px 28px}.dsh-qa-footer__inner{max-width:100%}.dsh-qa-message{margin-bottom:16px}.dsh-qa-message--user .dsh-qa-message__content{max-width:88%;font-size:15px}.dsh-qa-message__content{font-size:14px}.dsh-qa-footer{padding-left:10px;padding-right:10px;padding-bottom:max(8px,env(safe-area-inset-bottom))}.dsh-qa-composer{min-height:84px;padding-top:12px}.dsh-qa-composer__hint{font-size:0}.dsh-qa-composer__hint::after{content:"Enter: отправить";font-size:11px}}
65636
+ @media (max-width:600px){.dsh-qa-sidebar{display:none}.dsh-qa-sidebar[data-qa-drawer="open"]{display:flex;position:fixed;inset:0 auto 0 0;z-index:24;width:min(320px,86vw);max-width:100%;border-right:1px solid var(--dsw-alias-border-l2);box-shadow:0 18px 44px rgba(0,0,0,.28);padding-bottom:env(safe-area-inset-bottom)}.dsh-qa-sidebar__scrim{display:block;position:fixed;inset:0;z-index:22;background:var(--dsh-qa-overlay)}.dsh-qa-sidebar__resize{display:none}.dsh-qa-sidebar__collapse,.dsh-qa-sidebar__expand{width:44px;height:44px}.dsh-qa-sidebar__new,.dsh-qa-sidebar__item-main{min-height:44px}.dsh-qa-header__history{display:inline-flex}.dsh-qa-panel,.dsh-qa-agents{position:absolute;inset:0;z-index:6;width:100%;border-left:0}.dsh-qa-header__inner{padding-left:16px;padding-right:16px}.dsh-qa-header h1{max-width:48vw}.dsh-qa-header__title-row{flex-wrap:wrap;row-gap:6px}.dsh-qa-width-handle{display:none}.dsh-qa-transcript__inner{--dsh-qa-bleed:0px;max-width:100%;padding:16px 16px 28px}.dsh-qa-footer__inner{max-width:100%}.dsh-qa-message{margin-bottom:16px}.dsh-qa-message--user .dsh-qa-message__content{max-width:88%;font-size:15px}.dsh-qa-message__content{font-size:14px}.dsh-qa-footer{padding-left:10px;padding-right:10px;padding-bottom:max(8px,env(safe-area-inset-bottom))}.dsh-qa-composer{min-height:84px;padding-top:12px}.dsh-qa-composer__hint{font-size:0}.dsh-qa-composer__hint::after{content:"Enter: отправить";font-size:11px}}
65566
65637
  @media (max-height:480px) and (orientation:landscape){.dsh-qa-header__inner{padding-top:6px}.dsh-qa-header__tabs{display:none}.dsh-qa-transcript__inner{padding-top:12px}.dsh-qa-footer{padding-top:12px}.dsh-qa-composer{min-height:72px;gap:4px;padding-top:8px}}
65567
65638
  @media (prefers-reduced-motion:reduce){.dsh-qa-message__cursor,.dsh-qa-message__pending-spinner,.dsh-qa-work__spinner,.dsh-qa-work-item__spinner,.dsh-qa-command__spinner{animation:none}.dsh-qa-work__chevron{transition:none}.dsh-qa-rail__frame,.dsh-qa-rail__pos,.dsh-qa-rail__mark::before,.dsh-qa-rail__mark--busy::before,.dsh-qa-rail__preview{transition:none;animation:none}}
65568
65639
  ${QA_ADMIN_CONSOLE_STYLES}
@@ -67946,7 +68017,7 @@ ${QA_ROOT_STYLES}`;
67946
68017
  checked: sources?.subagents?.validateReportedSources ?? true,
67947
68018
  disabled: blocked,
67948
68019
  label: "Проверять источники из отчёта",
67949
- hint: "С проверкой принимается только источник с путём или адресом из делегированного прогона. Без неё записывается и «факт» без адреса, и отчёт самого помощника.",
68020
+ hint: "С проверкой записывается только источник с путём или адресом — и в делегированном прогоне, и в отчёте самого помощника. Без неё записывается и «факт» без адреса.",
67950
68021
  testId: "qa-settings-sources-subagents-validate-reported-sources",
67951
68022
  onChange: (value) => {
67952
68023
  props.write([