@yadsh/dsh-qa-surface 0.7.3 → 0.8.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.
Files changed (146) hide show
  1. package/README.md +56 -9
  2. package/lib/access/model.js +24 -4
  3. package/lib/access/model.js.map +1 -1
  4. package/lib/access/role-repository.js +199 -91
  5. package/lib/access/role-repository.js.map +1 -1
  6. package/lib/access/service.js +194 -6
  7. package/lib/access/service.js.map +1 -1
  8. package/lib/account-remotes.js +2 -4
  9. package/lib/account-remotes.js.map +1 -1
  10. package/lib/accounts/database.js +447 -0
  11. package/lib/accounts/database.js.map +1 -0
  12. package/lib/accounts/file.js +27 -90
  13. package/lib/accounts/file.js.map +1 -1
  14. package/lib/accounts/store.js +210 -59
  15. package/lib/accounts/store.js.map +1 -1
  16. package/lib/admin/quality-store.js +199 -54
  17. package/lib/admin/quality-store.js.map +1 -1
  18. package/lib/admin/service.js +39 -6
  19. package/lib/admin/service.js.map +1 -1
  20. package/lib/cli.js +2 -1
  21. package/lib/cli.js.map +1 -1
  22. package/lib/client/QaSessionController.js +20 -2
  23. package/lib/client/QaSessionController.js.map +1 -1
  24. package/lib/client/QaSurface.js +69 -31
  25. package/lib/client/QaSurface.js.map +1 -1
  26. package/lib/client/QaTranscriptAdapter.js +4 -0
  27. package/lib/client/QaTranscriptAdapter.js.map +1 -1
  28. package/lib/client/admin/QaAdmin.js +17 -7
  29. package/lib/client/admin/QaAdmin.js.map +1 -1
  30. package/lib/client/admin/{format.js → copy.js} +1 -1
  31. package/lib/client/admin/copy.js.map +1 -0
  32. package/lib/client/admin/pages/Conversations.js +1 -1
  33. package/lib/client/admin/pages/Conversations.js.map +1 -1
  34. package/lib/client/admin/pages/Overview.js +1 -1
  35. package/lib/client/admin/pages/Overview.js.map +1 -1
  36. package/lib/client/admin/pages/Quality.js +1 -1
  37. package/lib/client/admin/pages/Quality.js.map +1 -1
  38. package/lib/client/admin/pages/Review.js +1 -1
  39. package/lib/client/admin/pages/Review.js.map +1 -1
  40. package/lib/client/admin/pages/Users.js +6 -2
  41. package/lib/client/admin/pages/Users.js.map +1 -1
  42. package/lib/client/admin/shared.js +1 -1
  43. package/lib/client/admin/shared.js.map +1 -1
  44. package/lib/client/components/Markdown.js +14 -206
  45. package/lib/client/components/Markdown.js.map +1 -1
  46. package/lib/client/components/QaChangelog.js +60 -0
  47. package/lib/client/components/QaChangelog.js.map +1 -1
  48. package/lib/client/components/QaHeader.js +1 -3
  49. package/lib/client/components/QaHeader.js.map +1 -1
  50. package/lib/client/components/QaMessage.js +9 -4
  51. package/lib/client/components/QaMessage.js.map +1 -1
  52. package/lib/client/components/QaSidebar.js +5 -2
  53. package/lib/client/components/QaSidebar.js.map +1 -1
  54. package/lib/client/components/QaSourcesPanel.js +3 -18
  55. package/lib/client/components/QaSourcesPanel.js.map +1 -1
  56. package/lib/client/components/QaWorkGroup.js +4 -8
  57. package/lib/client/components/QaWorkGroup.js.map +1 -1
  58. package/lib/client/components/source-icon.js +26 -0
  59. package/lib/client/components/source-icon.js.map +1 -0
  60. package/lib/client/components/thinking-phrases.js +2 -11
  61. package/lib/client/components/thinking-phrases.js.map +1 -1
  62. package/lib/client/components/use-now.js +21 -0
  63. package/lib/client/components/use-now.js.map +1 -0
  64. package/lib/client/index.js +11 -3
  65. package/lib/client/index.js.map +1 -1
  66. package/lib/client/lineage.js +18 -0
  67. package/lib/client/lineage.js.map +1 -0
  68. package/lib/client/markdown/CodeBlock.js +28 -0
  69. package/lib/client/markdown/CodeBlock.js.map +1 -0
  70. package/lib/client/markdown/blocks.js +342 -0
  71. package/lib/client/markdown/blocks.js.map +1 -0
  72. package/lib/client/markdown/highlight.js +1089 -0
  73. package/lib/client/markdown/highlight.js.map +1 -0
  74. package/lib/client/markdown/inline.js +377 -0
  75. package/lib/client/markdown/inline.js.map +1 -0
  76. package/lib/client/markdown/render.js +147 -0
  77. package/lib/client/markdown/render.js.map +1 -0
  78. package/lib/client/markdown/source-chip.js +55 -0
  79. package/lib/client/markdown/source-chip.js.map +1 -0
  80. package/lib/client/markdown/use-transient-flag.js +27 -0
  81. package/lib/client/markdown/use-transient-flag.js.map +1 -0
  82. package/lib/client/role/RoleSelector.js +11 -2
  83. package/lib/client/role/RoleSelector.js.map +1 -1
  84. package/lib/client/role/preview.js +123 -0
  85. package/lib/client/role/preview.js.map +1 -0
  86. package/lib/client/styles.js +73 -19
  87. package/lib/client/styles.js.map +1 -1
  88. package/lib/client.js +3137 -761
  89. package/lib/client.js.map +1 -1
  90. package/lib/config-resolvers/accounts.js +15 -0
  91. package/lib/config-resolvers/accounts.js.map +1 -1
  92. package/lib/config-resolvers/defaults.js +8 -0
  93. package/lib/config-resolvers/defaults.js.map +1 -1
  94. package/lib/config-resolvers/sources.js +16 -0
  95. package/lib/config-resolvers/sources.js.map +1 -1
  96. package/lib/config.js +57 -0
  97. package/lib/config.js.map +1 -1
  98. package/lib/index.js +25 -10
  99. package/lib/index.js.map +1 -1
  100. package/lib/lockdown-policy.js +19 -0
  101. package/lib/lockdown-policy.js.map +1 -1
  102. package/lib/provenance/host-store.js +7 -3
  103. package/lib/provenance/host-store.js.map +1 -1
  104. package/lib/provenance/retention.js +25 -0
  105. package/lib/provenance/retention.js.map +1 -0
  106. package/lib/provenance/snapshot-store.js +290 -35
  107. package/lib/provenance/snapshot-store.js.map +1 -1
  108. package/lib/questions.js +16 -3
  109. package/lib/questions.js.map +1 -1
  110. package/lib/secure-session.js +136 -23
  111. package/lib/secure-session.js.map +1 -1
  112. package/lib/typert.host.js +79 -52
  113. package/lib/typert.remote-client.js +75 -48
  114. package/lib/types/access/role-repository.d.ts +38 -7
  115. package/lib/types/access/service.d.ts +77 -3
  116. package/lib/types/account-remotes.d.ts +8 -4
  117. package/lib/types/accounts/database.d.ts +84 -0
  118. package/lib/types/accounts/file.d.ts +17 -39
  119. package/lib/types/accounts/store.d.ts +98 -19
  120. package/lib/types/admin/quality-store.d.ts +20 -2
  121. package/lib/types/client/admin/{format.d.ts → copy.d.ts} +1 -1
  122. package/lib/types/client/components/Markdown.d.ts +7 -8
  123. package/lib/types/client/components/QaSidebar.d.ts +3 -1
  124. package/lib/types/client/components/QaSourcesPanel.d.ts +1 -3
  125. package/lib/types/client/components/source-icon.d.ts +12 -0
  126. package/lib/types/client/components/use-now.d.ts +8 -0
  127. package/lib/types/client/lineage.d.ts +15 -0
  128. package/lib/types/client/markdown/CodeBlock.d.ts +14 -0
  129. package/lib/types/client/markdown/blocks.d.ts +74 -0
  130. package/lib/types/client/markdown/highlight.d.ts +29 -0
  131. package/lib/types/client/markdown/inline.d.ts +40 -0
  132. package/lib/types/client/markdown/render.d.ts +13 -0
  133. package/lib/types/client/markdown/source-chip.d.ts +32 -0
  134. package/lib/types/client/markdown/use-transient-flag.d.ts +12 -0
  135. package/lib/types/client/role/RoleSelector.d.ts +11 -1
  136. package/lib/types/client/role/preview.d.ts +109 -0
  137. package/lib/types/index.d.ts +5 -1
  138. package/lib/types/lockdown-policy.d.ts +16 -0
  139. package/lib/types/provenance/host-store.d.ts +7 -3
  140. package/lib/types/provenance/retention.d.ts +46 -0
  141. package/lib/types/provenance/snapshot-store.d.ts +63 -7
  142. package/lib/types/questions.d.ts +5 -0
  143. package/lib/types/secure-session.d.ts +27 -1
  144. package/lib/types/types.d.ts +54 -0
  145. package/package.json +3 -3
  146. package/lib/client/admin/format.js.map +0 -1
@@ -0,0 +1,55 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useId } from "react";
3
+ import { SourceIcon } from "../components/source-icon.js";
4
+ import { sourceFileName, } from "../components/source-refs.js";
5
+ /**
6
+ * One inline source footnote: a pill over the matched link or path with a
7
+ * hover/focus preview card (title, target, snippet). A URL-backed source is
8
+ * an anchor that opens right away; a path-backed one is a button whose click
9
+ * the owner routes to the sources drawer. The hover card stays out of the
10
+ * chip's accessible name and rides along as its description instead.
11
+ */
12
+ export function SourceChip({ source, label, href, onOpen, }) {
13
+ const cardId = useId();
14
+ const target = source.path ?? source.uri ?? source.title;
15
+ const face = (_jsxs(_Fragment, { children: [_jsx("span", { className: "dsh-qa-srcref__icon", "data-kind": source.kind, children: _jsx(SourceIcon, { kind: source.kind }) }), _jsx("span", { className: "dsh-qa-srcref__label", children: label }), _jsxs("span", { className: "dsh-qa-srcref__card", id: cardId, role: "tooltip", "aria-hidden": "true", children: [_jsxs("span", { className: "dsh-qa-srcref__card-title", children: [_jsx("span", { className: "dsh-qa-srcref__icon", "data-kind": source.kind, children: _jsx(SourceIcon, { kind: source.kind }) }), source.title || label] }), _jsx("span", { className: "dsh-qa-srcref__card-target", children: target }), source.snippet === undefined ? null : (_jsx("span", { className: "dsh-qa-srcref__card-snippet", children: source.snippet }))] })] }));
16
+ if (href !== undefined) {
17
+ return (_jsx("a", { className: "dsh-qa-srcref", "data-kind": source.kind, href: href, target: "_blank", rel: "noopener noreferrer", "aria-describedby": cardId, children: face }));
18
+ }
19
+ return (_jsx("button", { type: "button", className: "dsh-qa-srcref", "data-kind": source.kind, "aria-describedby": cardId, onClick: onOpen === undefined ? undefined : () => onOpen(source), children: face }));
20
+ }
21
+ /**
22
+ * The chip a path-backed inline-code token earns, or undefined when the token
23
+ * names no known source. A URL-backed token is a chip that opens right away.
24
+ */
25
+ export function codeChip(value, context) {
26
+ const source = context.refs?.resolvePath(value);
27
+ if (source === undefined)
28
+ return undefined;
29
+ if (source.path === undefined) {
30
+ return (_jsx(SourceChip, { source: source, label: source.title || value, href: safeHref(source.uri ?? "") }));
31
+ }
32
+ if (context.onSourceOpen === undefined)
33
+ return undefined;
34
+ return (_jsx(SourceChip, { source: source, label: sourceFileName(source), onOpen: context.onSourceOpen }));
35
+ }
36
+ /** The chip a matched markdown link earns, or undefined when it matches none. */
37
+ export function linkChip(href, label, context) {
38
+ const source = context.refs?.resolveUrl(href);
39
+ if (source === undefined)
40
+ return undefined;
41
+ return (_jsx(SourceChip, { source: source, label: label || source.title, href: href }));
42
+ }
43
+ /** http(s)/mailto destinations only; images are narrowed further to http(s). */
44
+ export function safeHref(value) {
45
+ try {
46
+ const url = new URL(value);
47
+ return ["http:", "https:", "mailto:"].includes(url.protocol)
48
+ ? value
49
+ : undefined;
50
+ }
51
+ catch {
52
+ return undefined;
53
+ }
54
+ }
55
+ //# sourceMappingURL=source-chip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-chip.js","sourceRoot":"","sources":["../../../src/client/markdown/source-chip.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { useCallback, useEffect, useRef, useState } from "react";
2
+ /**
3
+ * A boolean that turns on for a fixed window and drops back off — the
4
+ * "Скопировано" flash and its siblings. The pending timer lives in a ref and
5
+ * is cleared by the unmount cleanup, so a pulse fired right before the block
6
+ * leaves the DOM never schedules a state update on it, and re-pulsing restarts
7
+ * the window instead of stacking timers.
8
+ */
9
+ export function useTransientFlag(windowMs) {
10
+ const [on, setOn] = useState(false);
11
+ const timer = useRef(undefined);
12
+ useEffect(() => () => {
13
+ if (timer.current !== undefined)
14
+ clearTimeout(timer.current);
15
+ }, []);
16
+ const pulse = useCallback(() => {
17
+ setOn(true);
18
+ if (timer.current !== undefined)
19
+ clearTimeout(timer.current);
20
+ timer.current = setTimeout(() => {
21
+ timer.current = undefined;
22
+ setOn(false);
23
+ }, windowMs);
24
+ }, [windowMs]);
25
+ return { on, pulse };
26
+ }
27
+ //# sourceMappingURL=use-transient-flag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-transient-flag.js","sourceRoot":"","sources":["../../../src/client/markdown/use-transient-flag.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjE;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAI/C,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,KAAK,GAAG,MAAM,CAA4C,SAAS,CAAC,CAAC;IAC3E,SAAS,CACP,GAAG,EAAE,CAAC,GAAG,EAAE;QACT,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS;YAAE,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/D,CAAC,EACD,EAAE,CACH,CAAC;IACF,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,KAAK,CAAC,IAAI,CAAC,CAAC;QACZ,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS;YAAE,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7D,KAAK,CAAC,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC;YAC1B,KAAK,CAAC,KAAK,CAAC,CAAC;QACf,CAAC,EAAE,QAAQ,CAAC,CAAC;IACf,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IACf,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;AACvB,CAAC"}
@@ -25,7 +25,16 @@ export function QaRoleSelector(props) {
25
25
  setPending(undefined);
26
26
  }, children: ["\u041D\u0430\u0447\u0430\u0442\u044C \u043D\u043E\u0432\u044B\u0439 \u0447\u0430\u0442 \u043A\u0430\u043A ", pending?.name ?? ""] })] }), children: _jsx("p", { className: "dsh-qa-role-selector__notice", children: "\u0421\u043C\u0435\u043D\u0430 \u0440\u043E\u043B\u0438 \u043D\u0430\u0447\u0438\u043D\u0430\u0435\u0442 \u043D\u043E\u0432\u044B\u0439 \u0440\u0430\u0437\u0433\u043E\u0432\u043E\u0440: \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0435 \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043D\u0442\u0443 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u044B \u0438 \u043D\u0430\u0432\u044B\u043A\u0438 \u0438\u0437\u043C\u0435\u043D\u044F\u0442\u0441\u044F. \u0422\u0435\u043A\u0443\u0449\u0438\u0439 \u0447\u0430\u0442 \u043E\u0441\u0442\u0430\u043D\u0435\u0442\u0441\u044F \u0432 \u0438\u0441\u0442\u043E\u0440\u0438\u0438 \u0431\u0435\u0437 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0439." }) })] }));
27
27
  }
28
- export function QaAdminPreviewBanner({ role }) {
29
- return (_jsxs("div", { className: "dsh-qa-admin-preview", role: "status", children: ["\u041F\u0420\u041E\u0421\u041C\u041E\u0422\u0420 \u0410\u0414\u041C\u0418\u041D\u0418\u0421\u0422\u0420\u0410\u0422\u041E\u0420\u0410 \u00B7 ", role] }));
28
+ /**
29
+ * The banner that keeps a preview from being mistaken for an ordinary chat.
30
+ *
31
+ * It carries the way out as well: while previewing, the header's role selector
32
+ * is hidden — the previewed profile need not be one the account holds — so
33
+ * without a control here the only exit was the browser's Back button, and a new
34
+ * chat meanwhile ran as the previewed profile instead of the account's default.
35
+ * @param props - the previewed role's name, and how to leave the preview.
36
+ */
37
+ export function QaAdminPreviewBanner(props) {
38
+ return (_jsxs("div", { className: "dsh-qa-admin-preview", role: "status", children: [_jsxs("span", { children: ["\u041F\u0420\u041E\u0421\u041C\u041E\u0422\u0420 \u0410\u0414\u041C\u0418\u041D\u0418\u0421\u0422\u0420\u0410\u0422\u041E\u0420\u0410: ", props.role] }), props.onExit === undefined ? null : (_jsx("button", { type: "button", className: "dsh-qa-admin-preview__exit", onClick: props.onExit, title: "\u0412\u0435\u0440\u043D\u0443\u0442\u044C\u0441\u044F \u043A \u0441\u0432\u043E\u0435\u043C\u0443 \u043F\u0440\u043E\u0444\u0438\u043B\u044E \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E: \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440 \u0437\u0430\u043A\u043E\u043D\u0447\u0438\u0442\u0441\u044F, \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0439 \u0447\u0430\u0442 \u043D\u0430\u0447\u043D\u0451\u0442\u0441\u044F \u0437\u0430\u043D\u043E\u0432\u043E", children: "\u0412\u044B\u0439\u0442\u0438 \u0438\u0437 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430" }))] }));
30
39
  }
31
40
  //# sourceMappingURL=RoleSelector.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RoleSelector.js","sourceRoot":"","sources":["../../../src/client/role/RoleSelector.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjC,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAUnD,0EAA0E;AAC1E,MAAM,UAAU,cAAc,CAAC,KAA0B;IACvD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,EAAa,CAAC;IACpD,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACzC,MAAM,MAAM,GAAG,CAAC,EAAU,EAAE,EAAE;QAC5B,IAAI,EAAE,KAAK,KAAK,CAAC,QAAQ;YAAE,OAAO;QAClC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAClE,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO;QAC/B,IAAI,KAAK,CAAC,mBAAmB,EAAE,CAAC;YAC9B,UAAU,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC;IACF,OAAO,CACL,8BACE,iBAAO,SAAS,EAAC,sBAAsB,aACrC,eAAM,SAAS,EAAC,gBAAgB,sGAAuB,EACvD,iBACE,KAAK,EAAE,KAAK,CAAC,QAAQ,EACrB,QAAQ,EAAE,KAAK,CAAC,QAAQ,gBACb,uFAAiB,EAC5B,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,YAErD,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACzB,iBAAsB,KAAK,EAAE,IAAI,CAAC,EAAE,YACjC,IAAI,CAAC,IAAI,IADC,IAAI,CAAC,EAAE,CAEX,CACV,CAAC,GACK,IACH,EACR,KAAC,OAAO,IACN,IAAI,EAAE,OAAO,KAAK,SAAS,EAC3B,KAAK,EAAC,yFAAmB,EACzB,UAAU,EAAC,0GAAqB,EAChC,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EACpC,MAAM,EACJ,8BACE,iBAAQ,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,qDAEjD,EACT,kBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,uBAAuB,EACjC,OAAO,EAAE,GAAG,EAAE;gCACZ,IAAI,OAAO,KAAK,SAAS;oCAAE,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gCACtD,UAAU,CAAC,SAAS,CAAC,CAAC;4BACxB,CAAC,2HAEqB,OAAO,EAAE,IAAI,IAAI,EAAE,IAClC,IACR,YAGL,YAAG,SAAS,EAAC,8BAA8B,utBAGvC,GACI,IACT,CACJ,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,EAAE,IAAI,EAA6B;IACtE,OAAO,CACL,eAAK,SAAS,EAAC,sBAAsB,EAAC,IAAI,EAAC,QAAQ,8JACtB,IAAI,IAC3B,CACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"RoleSelector.js","sourceRoot":"","sources":["../../../src/client/role/RoleSelector.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjC,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAUnD,0EAA0E;AAC1E,MAAM,UAAU,cAAc,CAAC,KAA0B;IACvD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,EAAa,CAAC;IACpD,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACzC,MAAM,MAAM,GAAG,CAAC,EAAU,EAAE,EAAE;QAC5B,IAAI,EAAE,KAAK,KAAK,CAAC,QAAQ;YAAE,OAAO;QAClC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAClE,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO;QAC/B,IAAI,KAAK,CAAC,mBAAmB,EAAE,CAAC;YAC9B,UAAU,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC;IACF,OAAO,CACL,8BACE,iBAAO,SAAS,EAAC,sBAAsB,aACrC,eAAM,SAAS,EAAC,gBAAgB,sGAAuB,EACvD,iBACE,KAAK,EAAE,KAAK,CAAC,QAAQ,EACrB,QAAQ,EAAE,KAAK,CAAC,QAAQ,gBACb,uFAAiB,EAC5B,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,YAErD,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACzB,iBAAsB,KAAK,EAAE,IAAI,CAAC,EAAE,YACjC,IAAI,CAAC,IAAI,IADC,IAAI,CAAC,EAAE,CAEX,CACV,CAAC,GACK,IACH,EACR,KAAC,OAAO,IACN,IAAI,EAAE,OAAO,KAAK,SAAS,EAC3B,KAAK,EAAC,yFAAmB,EACzB,UAAU,EAAC,0GAAqB,EAChC,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EACpC,MAAM,EACJ,8BACE,iBAAQ,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,qDAEjD,EACT,kBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,uBAAuB,EACjC,OAAO,EAAE,GAAG,EAAE;gCACZ,IAAI,OAAO,KAAK,SAAS;oCAAE,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gCACtD,UAAU,CAAC,SAAS,CAAC,CAAC;4BACxB,CAAC,2HAEqB,OAAO,EAAE,IAAI,IAAI,EAAE,IAClC,IACR,YAGL,YAAG,SAAS,EAAC,8BAA8B,utBAGvC,GACI,IACT,CACJ,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAGpC;IACC,OAAO,CACL,eAAK,SAAS,EAAC,sBAAsB,EAAC,IAAI,EAAC,QAAQ,aACjD,sKAAgC,KAAK,CAAC,IAAI,IAAQ,EACjD,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CACnC,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,4BAA4B,EACtC,OAAO,EAAE,KAAK,CAAC,MAAM,EACrB,KAAK,EAAC,meAA6F,mHAG5F,CACV,IACG,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,123 @@
1
+ import { useCallback, useEffect, useRef, useState } from "react";
2
+ function isRecord(value) {
3
+ return typeof value === "object" && value !== null;
4
+ }
5
+ function text(value) {
6
+ if (typeof value !== "string")
7
+ return undefined;
8
+ const trimmed = value.trim();
9
+ return trimmed === "" ? undefined : trimmed;
10
+ }
11
+ /** The history state a "Preview as role" navigation carries. */
12
+ export function previewEntryState(role) {
13
+ return { qaPreview: role.id, qaPreviewName: role.name };
14
+ }
15
+ /**
16
+ * The preview one history entry asks for, or undefined for an ordinary entry.
17
+ *
18
+ * Home of an older Host or of a cleared entry carries no marker at all, and a
19
+ * marker whose role id cannot be read is ignored rather than guessed: the name
20
+ * is cosmetic, so an entry written before names travelled with the marker
21
+ * still previews, under its role id.
22
+ */
23
+ export function readPreviewEntry(state) {
24
+ if (!isRecord(state))
25
+ return undefined;
26
+ const roleId = text(state.qaPreview);
27
+ if (roleId === undefined)
28
+ return undefined;
29
+ return { roleId, name: text(state.qaPreviewName) ?? roleId };
30
+ }
31
+ /**
32
+ * What the surface should do with the preview mode for one history entry.
33
+ *
34
+ * Only an administrator can preview, so an entry that asks for one while an
35
+ * ordinary account is signed in leaves the mode instead of entering it — the
36
+ * marker survives in the browser's history across a sign-out, and latching it
37
+ * again would hand the next account a chat under a profile it was never
38
+ * assigned.
39
+ * @param input - the entry's state, the preview in force, and who is signed in.
40
+ * @returns enter, leave, or keep, so the caller only writes state it must.
41
+ */
42
+ export function planPreviewTransition(input) {
43
+ if (!input.isAdmin)
44
+ return input.preview === null ? { kind: "keep" } : { kind: "leave" };
45
+ const entry = readPreviewEntry(input.state);
46
+ if (entry === undefined) {
47
+ return input.preview === null ? { kind: "keep" } : { kind: "leave" };
48
+ }
49
+ if (entry.roleId === input.preview?.roleId)
50
+ return { kind: "keep" };
51
+ return { kind: "enter", preview: entry };
52
+ }
53
+ /** The live browser, read at call time so a test's own history is honoured. */
54
+ const BROWSER = {
55
+ get state() {
56
+ return window.history.state;
57
+ },
58
+ pushState: (data, unused, url) => window.history.pushState(data, unused, url),
59
+ replaceState: (data, unused, url) => window.history.replaceState(data, unused, url),
60
+ onPopState: (listener) => {
61
+ window.addEventListener("popstate", listener);
62
+ return () => window.removeEventListener("popstate", listener);
63
+ },
64
+ };
65
+ /**
66
+ * The administrator preview mode of one browser tab.
67
+ *
68
+ * The mode is a property of the history entry, so entering and leaving it
69
+ * follows the browser: the console pushes an entry that carries the preview,
70
+ * every navigation back to an entry without one ends the mode, and only an
71
+ * administrator can hold it. The alternative — reading the marker once and
72
+ * latching it in component state — kept the mode alive for the whole tab, and
73
+ * since the role selector is hidden while previewing, later new chats silently
74
+ * ran as the previewed profile instead of the account's default one.
75
+ * @param options - who is signed in, the account default, and the history.
76
+ * @returns the preview in force plus the two explicit transitions.
77
+ */
78
+ export function useQaAdminPreview(options) {
79
+ const target = options.target ?? BROWSER;
80
+ const [preview, setPreview] = useState(null);
81
+ // The listener is registered once per navigation source and cannot read the
82
+ // render it came from, so the current value travels in a ref as well.
83
+ const current = useRef(null);
84
+ const { onSelect, fallbackSubrole, isAdmin, previewUrl, routeKey } = options;
85
+ const apply = useCallback((next) => {
86
+ current.current = next;
87
+ setPreview(next);
88
+ }, []);
89
+ useEffect(() => {
90
+ const sync = () => {
91
+ const transition = planPreviewTransition({
92
+ state: target.state,
93
+ preview: current.current,
94
+ isAdmin,
95
+ });
96
+ if (transition.kind === "enter") {
97
+ apply(transition.preview);
98
+ onSelect(transition.preview.roleId);
99
+ return;
100
+ }
101
+ if (transition.kind === "leave") {
102
+ apply(null);
103
+ onSelect(fallbackSubrole);
104
+ }
105
+ };
106
+ const unsubscribe = target.onPopState(sync);
107
+ sync();
108
+ return unsubscribe;
109
+ }, [apply, fallbackSubrole, isAdmin, onSelect, routeKey, target]);
110
+ const enter = useCallback((role) => {
111
+ apply({ roleId: role.id, name: role.name });
112
+ onSelect(role.id);
113
+ target.pushState(previewEntryState(role), "", previewUrl);
114
+ }, [apply, onSelect, previewUrl, target]);
115
+ const leave = useCallback(() => {
116
+ apply(null);
117
+ onSelect(fallbackSubrole);
118
+ target.replaceState(null, "", null);
119
+ }, [apply, fallbackSubrole, onSelect, target]);
120
+ const clear = useCallback(() => apply(null), [apply]);
121
+ return { preview, enter, clear, leave };
122
+ }
123
+ //# sourceMappingURL=preview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview.js","sourceRoot":"","sources":["../../../src/client/role/preview.ts"],"names":[],"mappings":"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"}
@@ -285,11 +285,12 @@ body[data-dsh-qa-surface="active"] div:has(>[data-shell-overlay])>:not([data-she
285
285
  .dsh-qa-header::after{content:"";position:absolute;right:0;bottom:1px;left:0;height:1px;background:var(--dsw-alias-border-l2);pointer-events:none}
286
286
  .dsh-qa-header__inner{width:100%;padding:11px 28px 0 30px}
287
287
  .dsh-qa-header__title-row{display:flex;align-items:center;min-height:32px;gap:10px}
288
+ .dsh-qa-header__actions{display:flex;align-items:center;flex:none;gap:10px;margin-left:auto}
288
289
  .dsh-qa-header__logo{width:24px;height:24px;object-fit:contain;border-radius:6px;flex:none}
289
290
  .dsh-qa-header h1{max-width:min(42vw,420px);min-width:0;overflow:hidden;margin:0;color:var(--dsw-alias-label-primary);font-size:14px;font-weight:500;line-height:20px;text-overflow:ellipsis;white-space:nowrap}
290
291
  .dsh-qa-header__mode{display:inline-flex;align-items:center;gap:5px;flex:none;color:var(--dsw-alias-label-tertiary);font-size:13px;line-height:20px;white-space:nowrap}
291
292
  .dsh-qa-header__mode svg{width:15px;height:15px;fill:none;stroke:currentColor;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round}
292
- .dsh-qa-header__reset{margin-left:auto;padding:5px 10px;border:0;border-radius:8px;background:transparent;color:var(--dsw-alias-label-secondary);font:inherit;font-size:13px;cursor:pointer}
293
+ .dsh-qa-header__reset{padding:5px 10px;border:0;border-radius:8px;background:transparent;color:var(--dsw-alias-label-secondary);font:inherit;font-size:13px;cursor:pointer}
293
294
  .dsh-qa-header__agents{display:inline-flex;align-items:center;gap:6px;flex:none;padding:5px 10px;border:0;border-radius:8px;background:transparent;color:var(--dsw-alias-label-secondary);font:inherit;font-size:13px;line-height:20px;cursor:pointer}
294
295
  .dsh-qa-header__agents:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}
295
296
  .dsh-qa-header__agents:disabled{opacity:.45;cursor:default}
@@ -331,7 +332,6 @@ body[data-dsh-qa-surface="active"] div:has(>[data-shell-overlay])>:not([data-she
331
332
  .dsh-qa-header__sources svg{width:15px;height:15px;fill:none;stroke:currentColor;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round}
332
333
  .dsh-qa-header__sources:focus-visible{outline:2px solid var(--dsh-qa-accent);outline-offset:2px}
333
334
  .dsh-qa-header__files{display:inline-flex;align-items:center;gap:6px;flex:none;padding:5px 10px;border:0;border-radius:8px;background:transparent;color:var(--dsw-alias-label-secondary);font:inherit;font-size:13px;line-height:20px;cursor:pointer}
334
- .dsh-qa-header__files--end{margin-left:auto}
335
335
  .dsh-qa-header__files:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}
336
336
  .dsh-qa-header__files:disabled{opacity:.45;cursor:default}
337
337
  .dsh-qa-header__files[aria-expanded="true"]{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}
@@ -344,8 +344,11 @@ body[data-dsh-qa-surface="active"] div:has(>[data-shell-overlay])>:not([data-she
344
344
  .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}
345
345
  .dsh-qa-role-selector select:hover,.dsh-qa-header__admin:hover{border-color:var(--dsw-alias-label-dimmed);color:var(--dsw-alias-label-primary)}
346
346
  .dsh-qa-role-selector select:focus-visible,.dsh-qa-header__admin:focus-visible{outline:2px solid var(--dsh-qa-accent);outline-offset:1px}
347
- .dsh-qa-header__admin{margin-left:auto;white-space:nowrap}
348
- .dsh-qa-admin-preview{position:absolute;z-index:8;right:20px;bottom:14px;padding:5px 10px;border:1px solid var(--dsh-qa-warning);border-radius:999px;background:var(--dsh-qa-warning10);color:var(--dsw-alias-label-primary);font-size:11px;font-weight:700;letter-spacing:.04em;pointer-events:none}
347
+ .dsh-qa-header__admin{white-space:nowrap}
348
+ .dsh-qa-admin-preview{position:absolute;z-index:8;right:20px;bottom:14px;display:flex;align-items:center;gap:8px;padding:5px 6px 5px 12px;border:1px solid var(--dsh-qa-warning);border-radius:999px;background:var(--dsh-qa-warning10);color:var(--dsw-alias-label-primary);font-size:11px;font-weight:700;letter-spacing:.04em}
349
+ .dsh-qa-admin-preview__exit{appearance:none;border:1px solid var(--dsh-qa-warning);border-radius:999px;background:var(--dsw-alias-bg-layer-3);color:var(--dsw-alias-label-primary);font:inherit;font-size:11px;font-weight:600;letter-spacing:.02em;padding:2px 9px;cursor:pointer}
350
+ .dsh-qa-admin-preview__exit:hover{border-color:var(--dsw-alias-label-dimmed)}
351
+ .dsh-qa-admin-preview__exit:focus-visible{outline:2px solid var(--dsh-qa-accent);outline-offset:1px}
349
352
  .dsh-qa-role-selector__notice{margin:0;color:var(--dsw-alias-label-secondary);font-size:14px;line-height:1.6}
350
353
  .dsh-qa-admin{${QA_BRAND_TOKENS};position:fixed;inset:0;z-index:2147483000;display:flex;flex-direction:column;min-width:0;min-height:0;overflow:hidden;background:var(--dsw-alias-bg-base);color:var(--dsw-alias-label-primary);font-family:inherit}
351
354
  .dsh-qa-admin *{box-sizing:border-box}
@@ -487,7 +490,11 @@ a.dsh-qa-sources__title:hover{text-decoration:underline}
487
490
  .dsh-qa-preview__range{display:flex;align-items:center;gap:8px;margin:0 0 9px!important;color:var(--dsw-alias-label-secondary);font-size:11px}
488
491
  .dsh-qa-preview__range button{appearance:none;padding:1px 6px;border:0;background:transparent;color:var(--dsh-qa-accent);font:inherit;font-size:11px;cursor:pointer}
489
492
  .dsh-qa-preview__markdown{white-space:normal;color:var(--dsw-alias-label-primary);font-size:13px;line-height:1.6}
490
- .dsh-qa-preview__markdown p,.dsh-qa-preview__markdown ul,.dsh-qa-preview__markdown ol,.dsh-qa-preview__markdown blockquote,.dsh-qa-preview__markdown pre,.dsh-qa-preview__markdown table{margin:0 0 10px}
493
+ /* The preview pane is a dense read-only pane: it keeps its own scale instead
494
+ of the transcript's ladder, one step tighter in every block. */
495
+ .dsh-qa-preview__markdown .dsh-qa-md{font-size:13px;line-height:1.6}
496
+ .dsh-qa-preview__markdown .dsh-qa-md :where(p,ul,ol,blockquote,.dsh-qa-md-code,.dsh-qa-md-table){margin:0 0 10px}
497
+ .dsh-qa-preview__markdown .dsh-qa-md :where(h1,h2,h3,h4,h5,h6){margin:14px 0 8px;font-size:15px;line-height:1.4}
491
498
  .dsh-qa-preview__raw{max-width:100%;margin:0;overflow:auto;white-space:pre;background:var(--dsw-alias-bg-layer-3);font:11px/18px ui-monospace,SFMono-Regular,Consolas,monospace}
492
499
  .dsh-qa-preview__raw code{display:block;min-width:max-content}
493
500
  .dsh-qa-preview__line{display:flex;min-height:18px}
@@ -565,24 +572,67 @@ a.dsh-qa-srcref:hover,button.dsh-qa-srcref:hover{border-color:var(--dsw-alias-la
565
572
  .dsh-qa-srcref__card-target{display:block;overflow:hidden;margin-top:2px;color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px;text-overflow:ellipsis;white-space:nowrap}
566
573
  .dsh-qa-srcref__card-snippet{display:-webkit-box;overflow:hidden;margin-top:6px;color:var(--dsw-alias-label-secondary);-webkit-box-orient:vertical;-webkit-line-clamp:3}
567
574
 
568
- .dsh-qa-message__content p,.dsh-qa-message__content ul,.dsh-qa-message__content blockquote,.dsh-qa-message__content pre{margin:0 0 14px}
569
- .dsh-qa-message__content :last-child{margin-bottom:0}
570
- .dsh-qa-message__content h2,.dsh-qa-message__content h3,.dsh-qa-message__content h4{margin:18px 0 8px;line-height:1.35}
571
- .dsh-qa-message__content h2{font-size:19px}.dsh-qa-message__content h3{font-size:17px}.dsh-qa-message__content h4{font-size:15px}
572
- .dsh-qa-message__content ul{padding-left:22px}.dsh-qa-message__content a{color:var(--dsh-qa-accent)}
573
- .dsh-qa-message__content code{border-radius:5px;padding:1px 4px;background:var(--dsw-alias-bg-layer-2);font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:.9em}
574
- .dsh-qa-message__content pre{overflow-x:auto;border:1px solid var(--dsw-alias-border-l2);border-radius:10px;padding:13px;background:var(--dsw-alias-bg-layer-2)}
575
- .dsh-qa-message__content pre code{padding:0;background:transparent}
576
- .dsh-qa-message__content ol{margin:0 0 14px;padding-left:22px}
577
- .dsh-qa-message__content ol li,.dsh-qa-message__content ul li{margin:0 0 4px}
578
- .dsh-qa-message__content hr{border:0;border-top:1px solid var(--dsw-alias-border-l2);margin:16px 0}
575
+ /* Markdown typography follows the host transcript's own ladder: the sizes,
576
+ weights, and margins below are the ones DSH gives assistant prose, read
577
+ from the theme's --dsw-font-markdown-* / --dsw-alias-markdown-* custom
578
+ properties, so a font-size preference or a light/dark switch moves both
579
+ surfaces together. A container that needs a denser scale (the source
580
+ preview, the work-item text) overrides the ladder for its own subtree. */
581
+ .dsh-qa-md{min-width:0;white-space:normal;overflow-wrap:anywhere;color:var(--dsw-alias-label-primary);font-family:var(--dsw-font-markdown-base-font-family,inherit);font-size:var(--dsw-font-markdown-base-font-size,14px);font-weight:400;line-height:var(--dsw-font-markdown-base-line-height,24px)}
582
+ .dsh-qa-md>:first-child{margin-top:0}
583
+ .dsh-qa-md>:last-child{margin-bottom:0}
584
+ .dsh-qa-md p{margin:16px 0}
585
+ .dsh-qa-md strong{font-weight:600}
586
+ .dsh-qa-md h1{margin:32px 0 16px;font-size:var(--dsw-font-markdown-h1-font-size,21px);font-weight:700;line-height:var(--dsw-font-markdown-h1-line-height,30px)}
587
+ .dsh-qa-md h2{margin:32px 0 16px;font-size:var(--dsw-font-markdown-h2-font-size,19px);font-weight:700;line-height:var(--dsw-font-markdown-h2-line-height,28px)}
588
+ .dsh-qa-md h3{margin:32px 0 16px;font-size:var(--dsw-font-markdown-h3-font-size,18px);font-weight:700;line-height:var(--dsw-font-markdown-h3-line-height,26px)}
589
+ .dsh-qa-md h4,.dsh-qa-md h5,.dsh-qa-md h6{margin:16px 0;font-size:var(--dsw-font-markdown-base-font-size,14px);font-weight:600;line-height:var(--dsw-font-markdown-base-line-height,24px)}
590
+ .dsh-qa-md h1 strong,.dsh-qa-md h2 strong,.dsh-qa-md h3 strong,.dsh-qa-md h4 strong,.dsh-qa-md h5 strong,.dsh-qa-md h6 strong{font-weight:inherit}
591
+ .dsh-qa-md h4+ol,.dsh-qa-md h4+ul,.dsh-qa-md h5+ol,.dsh-qa-md h5+ul,.dsh-qa-md h6+ol,.dsh-qa-md h6+ul{margin-top:8px}
592
+ .dsh-qa-md a{position:relative;color:var(--dsh-qa-accent);font-weight:500;text-decoration:none}
593
+ .dsh-qa-md a:hover,.dsh-qa-md a:focus-visible{text-decoration:underline dotted var(--dsh-qa-accent);text-underline-offset:3px;outline:none}
594
+ .dsh-qa-md-link-icon{width:1.05em;height:1.05em;flex:none;margin-right:5px;vertical-align:-.18em;fill:none;stroke:currentColor;stroke-width:1.15;stroke-linecap:round;stroke-linejoin:round}
595
+ .dsh-qa-md ol,.dsh-qa-md ul{margin:16px 0;padding-left:22px}
596
+ .dsh-qa-md li{margin-top:6px}
597
+ .dsh-qa-md li>:first-child{margin-top:0}
598
+ .dsh-qa-md li>:last-child{margin-bottom:0}
599
+ .dsh-qa-md li::marker{color:var(--dsw-alias-label-secondary)}
600
+ .dsh-qa-md li>ol,.dsh-qa-md li>ul{margin-top:4px}
601
+ .dsh-qa-md :where(ol,ul) ol{list-style-position:inside;padding-left:0}
602
+ .dsh-qa-md .dsh-qa-md-task{list-style:none}
603
+ .dsh-qa-md .dsh-qa-md-task input{margin:0 8px 0 0;accent-color:var(--dsw-alias-label-secondary)}
604
+ .dsh-qa-md hr{height:.5px;margin:32px 0;border:0;background:var(--dsw-alias-border-l2)}
605
+ .dsh-qa-md blockquote{margin:16px 0;padding-left:14px;border-left:2px solid var(--dsw-alias-label-caption,var(--dsw-alias-label-tertiary));color:var(--dsw-alias-label-secondary)}
606
+ .dsh-qa-md :not(pre)>code{display:inline-flex;align-items:center;box-sizing:border-box;padding:0 5px;border:.5px solid var(--dsw-alias-border-l1);border-radius:6px;background:var(--dsw-alias-markdown-inline-code,var(--dsw-alias-bg-layer-2));font-family:var(--ds-font-family-code,ui-monospace,SFMono-Regular,Consolas,monospace);font-size:.875em;line-height:19px}
607
+ .dsh-qa-md h1 code,.dsh-qa-md h2 code,.dsh-qa-md h3 code,.dsh-qa-md h4 code,.dsh-qa-md h5 code,.dsh-qa-md h6 code{font-family:var(--ds-font-family-code,ui-monospace,SFMono-Regular,Consolas,monospace);font-size:inherit}
608
+ .dsh-qa-md-image{display:block;max-width:100%;height:auto;margin:0;border-radius:8px}
609
+ .dsh-qa-md-image-alt{color:var(--dsw-alias-label-tertiary);font-style:italic}
610
+ .dsh-qa-md-code{margin:16px 0;border-radius:12px;background:var(--dsw-alias-markdown-code-block,var(--dsw-alias-bg-layer-2));color:var(--dsw-alias-label-primary)}
611
+ .dsh-qa-md-code__banner{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:9px 14px;border-radius:12px 12px 0 0;background:var(--dsw-alias-markdown-code-block-banner,var(--dsw-alias-bg-layer-3))}
612
+ .dsh-qa-md-code__lang{min-width:0;overflow:hidden;color:var(--dsw-alias-label-primary);font-family:var(--ds-font-family-code,ui-monospace,SFMono-Regular,Consolas,monospace);font-size:11px;line-height:18px;text-overflow:ellipsis;white-space:nowrap}
613
+ .dsh-qa-md-code__copy{appearance:none;flex:none;padding:0;border:0;background:transparent;color:var(--dsw-alias-label-secondary);font:inherit;font-size:11px;line-height:18px;cursor:pointer}
614
+ .dsh-qa-md-code__copy:hover{color:var(--dsw-alias-label-primary)}
615
+ .dsh-qa-md-code__copy:focus-visible{outline:2px solid var(--dsh-qa-accent);outline-offset:2px}
616
+ .dsh-qa-md-code pre{overflow-x:auto;margin:0;padding:16px;border:0;border-radius:0 0 12px 12px;background:transparent;font-family:var(--ds-font-family-code,ui-monospace,SFMono-Regular,Consolas,monospace);font-size:var(--dsw-font-markdown-code-block-font-size,11px);line-height:var(--dsw-font-markdown-code-block-line-height,19px);white-space:pre-wrap;word-break:break-word}
617
+ .dsh-qa-md-code pre code{display:block;padding:0;border:0;background:transparent;font:inherit}
618
+ .dsh-qa-md-tok[data-tok="comment"]{color:var(--shiki-token-comment)}
619
+ .dsh-qa-md-tok[data-tok="string"]{color:var(--shiki-token-string)}
620
+ .dsh-qa-md-tok[data-tok="keyword"]{color:var(--shiki-token-keyword)}
621
+ .dsh-qa-md-tok[data-tok="number"]{color:var(--shiki-token-constant)}
622
+ .dsh-qa-md-tok[data-tok="constant"]{color:var(--shiki-token-constant)}
623
+ .dsh-qa-md-tok[data-tok="meta"]{color:var(--shiki-token-parameter)}
624
+ .dsh-qa-md-tok[data-tok="tag"]{color:var(--shiki-token-keyword)}
625
+ .dsh-qa-md-tok[data-tok="attr"]{color:var(--shiki-token-parameter)}
626
+ .dsh-qa-md-tok[data-tok="key"]{color:var(--shiki-token-function)}
627
+ .dsh-qa-md-tok[data-tok="insert"]{color:var(--dsh-qa-success)}
628
+ .dsh-qa-md-tok[data-tok="delete"]{color:var(--dsh-qa-error)}
629
+ .dsh-qa-md-tok[data-tok="hunk"]{color:var(--shiki-token-function)}
579
630
  .dsh-qa-md-table{max-width:100%;overflow-x:auto;overscroll-behavior-x:contain;margin:0 0 14px}
580
- .dsh-qa-md-table table{border-collapse:collapse;width:max-content;font-size:14px}
631
+ .dsh-qa-md-table table{border-collapse:collapse;width:max-content;font-size:var(--dsw-font-markdown-table-font-size,14px)}
581
632
  .dsh-qa-md-table th,.dsh-qa-md-table td{max-width:max(160px,calc(var(--dsh-qa-content-width,920px)*0.35));border:1px solid var(--dsw-alias-border-l2);padding:6px 10px;vertical-align:top;overflow-wrap:anywhere}
582
633
  .dsh-qa-md-table thead th{background:var(--dsw-alias-bg-layer-2);font-weight:600}
583
634
  .dsh-qa-md-table tbody tr:nth-child(even){background:var(--dsw-alias-bg-layer-2)}
584
- .dsh-qa-message--assistant .dsh-qa-message__content pre{width:calc(100% + var(--dsh-qa-bleed)*2);margin-right:calc(var(--dsh-qa-bleed)*-1);margin-left:calc(var(--dsh-qa-bleed)*-1)}
585
- .dsh-qa-message__content blockquote{border-left:3px solid var(--dsw-alias-border-l2);padding-left:12px;color:var(--dsw-alias-label-secondary)}
635
+ .dsh-qa-message--assistant .dsh-qa-message__content .dsh-qa-md-code{width:calc(100% + var(--dsh-qa-bleed)*2);margin-right:calc(var(--dsh-qa-bleed)*-1);margin-left:calc(var(--dsh-qa-bleed)*-1)}
586
636
  .dsh-qa-message__cursor{display:inline-block;width:7px;height:1em;margin-left:3px;vertical-align:-2px;background:var(--dsw-alias-label-secondary);animation:dsh-qa-blink 1s steps(2,start) infinite}
587
637
  @keyframes dsh-qa-blink{50%{opacity:0}}
588
638
  .dsh-qa-notice{width:100%;min-width:0;margin:-4px 0 14px;border:1px solid var(--dsw-alias-border-l2);border-radius:10px;background:var(--dsw-alias-bg-layer-2)}
@@ -596,6 +646,7 @@ a.dsh-qa-srcref:hover,button.dsh-qa-srcref:hover{border-color:var(--dsw-alias-la
596
646
  .dsh-qa-notice[open] .dsh-qa-notice__chevron{transform:rotate(90deg)}
597
647
  .dsh-qa-notice__body{padding:2px 12px 10px 32px;color:var(--dsw-alias-label-secondary);font-size:13px;line-height:20px;white-space:pre-wrap;overflow-wrap:anywhere}
598
648
  .dsh-qa-notice__body p{margin:0}
649
+ .dsh-qa-notice__body .dsh-qa-md{font-size:13px;line-height:20px;white-space:pre-wrap}
599
650
  .dsh-qa-notice__meta{margin:0 0 6px;color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:17px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
600
651
  .dsh-qa-work{width:100%;color:var(--dsw-alias-label-secondary);font-size:14px;line-height:22px}
601
652
  .dsh-qa-work__toggle{display:flex;align-items:center;gap:7px;min-height:30px;margin:0;padding:3px 5px 3px 0;border:0;border-radius:7px;background:transparent;color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer}
@@ -625,6 +676,9 @@ a.dsh-qa-srcref:hover,button.dsh-qa-srcref:hover{border-color:var(--dsw-alias-la
625
676
  .dsh-qa-work-item__text{padding:3px 0 0 23px;color:var(--dsw-alias-label-tertiary);font-size:14px;line-height:23px;white-space:pre-wrap;overflow-wrap:anywhere}
626
677
  .dsh-qa-work-item__text p,.dsh-qa-work-item__text ul,.dsh-qa-work-item__text pre{margin:0 0 9px}
627
678
  .dsh-qa-work-item__text :last-child{margin-bottom:0}
679
+ /* Reasoning keeps its authored line breaks: the process log reads as the
680
+ model wrote it, not as reflowed prose. */
681
+ .dsh-qa-work-item__text .dsh-qa-md{font-size:14px;line-height:23px;white-space:pre-wrap}
628
682
  .dsh-qa-work-tool__body{margin:0 6px 7px 29px;overflow:hidden;border:1px solid var(--dsw-alias-border-l2);border-radius:9px;background:var(--dsw-alias-bg-layer-2)}
629
683
  .dsh-qa-work-tool__body section+section{border-top:1px solid var(--dsw-alias-border-l2)}
630
684
  .dsh-qa-work-tool__body section>span{display:block;padding:7px 10px 0;color:var(--dsw-alias-label-tertiary);font-size:11px;font-weight:600;line-height:18px;text-transform:uppercase;letter-spacing:.04em}
@@ -1 +1 @@
1
- {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../src/client/styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAE5D;;;;;;;GAOG;AACH,MAAM,gBAAgB,GAAG;IACvB,KAAK,EAAE,SAAS;IAChB,yDAAyD;IACzD,MAAM,EAAE,SAAS;IACjB,UAAU,EAAE,SAAS;IACrB,UAAU,EAAE,SAAS;IACrB,WAAW,EAAE,SAAS;IACtB,uBAAuB;IACvB,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,SAAS;IACjB,MAAM,EAAE,SAAS;IACjB,kBAAkB;IAClB,OAAO,EAAE,SAAS;IAClB,SAAS,EAAE,SAAS;IACpB,SAAS,EAAE,SAAS;IACpB,gBAAgB;IAChB,KAAK,EAAE,SAAS;IAChB,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAClB,UAAU,EAAE,SAAS;IACrB,yBAAyB;IACzB,OAAO,EAAE,SAAS;IAClB,SAAS,EAAE,SAAS;IACpB,SAAS,EAAE,SAAS;IACpB,YAAY,EAAE,SAAS;IACvB,mDAAmD;IACnD,cAAc,EAAE,SAAS;IACzB,qDAAqD;IACrD,OAAO,EAAE,wBAAwB;CACzB,CAAC;AAEX,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AAC1E,CAAC;AAED,iEAAiE;AACjE,MAAM,CAAC,MAAM,oBAAoB,GAC/B,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAE/C,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC;KACrD,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,YAAY,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC;KAChE,IAAI,CAAC,GAAG,CAAC,CAAC;AAEb,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;kBAQzB,eAAe;qBACZ,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBAyGpB,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBA2Lf,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mJAgDoH,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6UnK,uBAAuB;CACxB,CAAC"}
1
+ {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../src/client/styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAE5D;;;;;;;GAOG;AACH,MAAM,gBAAgB,GAAG;IACvB,KAAK,EAAE,SAAS;IAChB,yDAAyD;IACzD,MAAM,EAAE,SAAS;IACjB,UAAU,EAAE,SAAS;IACrB,UAAU,EAAE,SAAS;IACrB,WAAW,EAAE,SAAS;IACtB,uBAAuB;IACvB,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,SAAS;IACjB,MAAM,EAAE,SAAS;IACjB,kBAAkB;IAClB,OAAO,EAAE,SAAS;IAClB,SAAS,EAAE,SAAS;IACpB,SAAS,EAAE,SAAS;IACpB,gBAAgB;IAChB,KAAK,EAAE,SAAS;IAChB,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAClB,UAAU,EAAE,SAAS;IACrB,yBAAyB;IACzB,OAAO,EAAE,SAAS;IAClB,SAAS,EAAE,SAAS;IACpB,SAAS,EAAE,SAAS;IACpB,YAAY,EAAE,SAAS;IACvB,mDAAmD;IACnD,cAAc,EAAE,SAAS;IACzB,qDAAqD;IACrD,OAAO,EAAE,wBAAwB;CACzB,CAAC;AAEX,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AAC1E,CAAC;AAED,iEAAiE;AACjE,MAAM,CAAC,MAAM,oBAAoB,GAC/B,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAE/C,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC;KACrD,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,YAAY,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC;KAChE,IAAI,CAAC,GAAG,CAAC,CAAC;AAEb,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;kBAQzB,eAAe;qBACZ,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBAyGpB,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBA8Lf,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mJAgDoH,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgYnK,uBAAuB;CACxB,CAAC"}