@yadsh/dsh-qa-surface 0.1.1 → 0.3.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 (192) hide show
  1. package/CHANGELOG.md +151 -0
  2. package/README.md +239 -16
  3. package/SPEC-dsh-qa-surface.md +600 -96
  4. package/capability-policy.json +5 -0
  5. package/compatibility.json +18 -4
  6. package/cordis.patch.yml +11 -0
  7. package/docs/ARCHITECTURE.md +50 -8
  8. package/docs/COMPATIBILITY.md +5 -4
  9. package/docs/CONFIGURATION.md +184 -3
  10. package/docs/SOURCES-MIGRATION.md +28 -0
  11. package/docs/SOURCES-PROVENANCE-AUDIT.md +88 -0
  12. package/docs/SPEC-dsh-qa-surface-accounts.md +219 -0
  13. package/docs/SPEC-dsh-qa-surface-sources-provenance.md +1692 -0
  14. package/lib/accounts/index.js +2 -0
  15. package/lib/accounts/index.js.map +1 -0
  16. package/lib/accounts/store.js +478 -0
  17. package/lib/accounts/store.js.map +1 -0
  18. package/lib/attestation.js +10 -0
  19. package/lib/attestation.js.map +1 -0
  20. package/lib/cli.js +143 -0
  21. package/lib/cli.js.map +1 -0
  22. package/lib/client/QaAccountsController.js +329 -0
  23. package/lib/client/QaAccountsController.js.map +1 -0
  24. package/lib/client/QaConfigController.js +111 -4
  25. package/lib/client/QaConfigController.js.map +1 -1
  26. package/lib/client/QaSessionController.js +621 -163
  27. package/lib/client/QaSessionController.js.map +1 -1
  28. package/lib/client/QaSurface.js +303 -24
  29. package/lib/client/QaSurface.js.map +1 -1
  30. package/lib/client/QaTranscriptAdapter.js +324 -49
  31. package/lib/client/QaTranscriptAdapter.js.map +1 -1
  32. package/lib/client/attestation.js +66 -0
  33. package/lib/client/attestation.js.map +1 -0
  34. package/lib/client/chat-index.js +86 -0
  35. package/lib/client/chat-index.js.map +1 -0
  36. package/lib/client/components/Markdown.js +124 -13
  37. package/lib/client/components/Markdown.js.map +1 -1
  38. package/lib/client/components/QaAgentsDrawer.js +40 -0
  39. package/lib/client/components/QaAgentsDrawer.js.map +1 -0
  40. package/lib/client/components/QaAuthGate.js +40 -0
  41. package/lib/client/components/QaAuthGate.js.map +1 -0
  42. package/lib/client/components/QaChangelog.js +112 -0
  43. package/lib/client/components/QaChangelog.js.map +1 -0
  44. package/lib/client/components/QaComposer.js +132 -15
  45. package/lib/client/components/QaComposer.js.map +1 -1
  46. package/lib/client/components/QaMessage.js +214 -10
  47. package/lib/client/components/QaMessage.js.map +1 -1
  48. package/lib/client/components/QaSidebar.js +167 -0
  49. package/lib/client/components/QaSidebar.js.map +1 -0
  50. package/lib/client/components/QaSourcesDrawer.js +127 -0
  51. package/lib/client/components/QaSourcesDrawer.js.map +1 -0
  52. package/lib/client/components/QaTurnRail.js +281 -0
  53. package/lib/client/components/QaTurnRail.js.map +1 -0
  54. package/lib/client/components/QaWelcomeNotice.js +125 -0
  55. package/lib/client/components/QaWelcomeNotice.js.map +1 -0
  56. package/lib/client/components/QaWidthHandle.js +142 -0
  57. package/lib/client/components/QaWidthHandle.js.map +1 -0
  58. package/lib/client/components/QaWorkGroup.js +135 -0
  59. package/lib/client/components/QaWorkGroup.js.map +1 -0
  60. package/lib/client/components/VariantSwitcher.js +29 -0
  61. package/lib/client/components/VariantSwitcher.js.map +1 -0
  62. package/lib/client/components/format.js +48 -0
  63. package/lib/client/components/format.js.map +1 -0
  64. package/lib/client/components/source-refs.js +78 -0
  65. package/lib/client/components/source-refs.js.map +1 -0
  66. package/lib/client/create-session.js +51 -0
  67. package/lib/client/create-session.js.map +1 -0
  68. package/lib/client/index.js +166 -35
  69. package/lib/client/index.js.map +1 -1
  70. package/lib/client/project-session-state.js +78 -0
  71. package/lib/client/project-session-state.js.map +1 -0
  72. package/lib/client/session-admission.js +38 -0
  73. package/lib/client/session-admission.js.map +1 -0
  74. package/lib/client/session-assets.js +52 -0
  75. package/lib/client/session-assets.js.map +1 -0
  76. package/lib/client/session-sources.js +61 -0
  77. package/lib/client/session-sources.js.map +1 -0
  78. package/lib/client/settlement.js +24 -0
  79. package/lib/client/settlement.js.map +1 -0
  80. package/lib/client/styles.js +450 -43
  81. package/lib/client/styles.js.map +1 -1
  82. package/lib/client/tool-presentation.js +102 -0
  83. package/lib/client/tool-presentation.js.map +1 -0
  84. package/lib/client/turn-sources.js +98 -0
  85. package/lib/client/turn-sources.js.map +1 -0
  86. package/lib/client/types.js +15 -0
  87. package/lib/client/types.js.map +1 -0
  88. package/lib/client/use-session-ui-state.js +68 -0
  89. package/lib/client/use-session-ui-state.js.map +1 -0
  90. package/lib/client/use-transcript-view.js +44 -0
  91. package/lib/client/use-transcript-view.js.map +1 -0
  92. package/lib/client/wait-for.js +49 -0
  93. package/lib/client/wait-for.js.map +1 -0
  94. package/lib/client.js +12551 -918
  95. package/lib/client.js.map +1 -1
  96. package/lib/config.js +226 -58
  97. package/lib/config.js.map +1 -1
  98. package/lib/entry-redirect.js +44 -0
  99. package/lib/entry-redirect.js.map +1 -0
  100. package/lib/host-route.js +25 -1
  101. package/lib/host-route.js.map +1 -1
  102. package/lib/index.js +354 -72
  103. package/lib/index.js.map +1 -1
  104. package/lib/launch-token.js +42 -0
  105. package/lib/launch-token.js.map +1 -0
  106. package/lib/lockdown-policy.js +20 -0
  107. package/lib/lockdown-policy.js.map +1 -0
  108. package/lib/provenance/collector.js +40 -0
  109. package/lib/provenance/collector.js.map +1 -0
  110. package/lib/provenance/connectors.js +147 -0
  111. package/lib/provenance/connectors.js.map +1 -0
  112. package/lib/provenance/dedupe.js +89 -0
  113. package/lib/provenance/dedupe.js.map +1 -0
  114. package/lib/provenance/extractors.js +340 -0
  115. package/lib/provenance/extractors.js.map +1 -0
  116. package/lib/provenance/file-preview.js +39 -0
  117. package/lib/provenance/file-preview.js.map +1 -0
  118. package/lib/provenance/host-store.js +387 -0
  119. package/lib/provenance/host-store.js.map +1 -0
  120. package/lib/provenance/index.js +9 -0
  121. package/lib/provenance/index.js.map +1 -0
  122. package/lib/provenance/normalize.js +128 -0
  123. package/lib/provenance/normalize.js.map +1 -0
  124. package/lib/provenance/reported.js +53 -0
  125. package/lib/provenance/reported.js.map +1 -0
  126. package/lib/provenance/types.js +2 -0
  127. package/lib/provenance/types.js.map +1 -0
  128. package/lib/resolve-config.js +283 -10
  129. package/lib/resolve-config.js.map +1 -1
  130. package/lib/secure-session.js +212 -0
  131. package/lib/secure-session.js.map +1 -0
  132. package/lib/typert.host.d.ts +3 -0
  133. package/lib/typert.host.js +784 -0
  134. package/lib/typert.remote-client.d.ts +40 -0
  135. package/lib/typert.remote-client.js +597 -0
  136. package/lib/types/accounts/index.d.ts +2 -0
  137. package/lib/types/accounts/store.d.ts +121 -0
  138. package/lib/types/attestation.d.ts +17 -0
  139. package/lib/types/cli.d.ts +9 -0
  140. package/lib/types/client/QaAccountsController.d.ts +95 -0
  141. package/lib/types/client/QaConfigController.d.ts +35 -3
  142. package/lib/types/client/QaSessionController.d.ts +146 -20
  143. package/lib/types/client/QaSurface.d.ts +11 -5
  144. package/lib/types/client/QaTranscriptAdapter.d.ts +13 -3
  145. package/lib/types/client/attestation.d.ts +25 -0
  146. package/lib/types/client/chat-index.d.ts +28 -0
  147. package/lib/types/client/components/Markdown.d.ts +17 -3
  148. package/lib/types/client/components/QaAgentsDrawer.d.ts +25 -0
  149. package/lib/types/client/components/QaAuthGate.d.ts +15 -0
  150. package/lib/types/client/components/QaChangelog.d.ts +21 -0
  151. package/lib/types/client/components/QaComposer.d.ts +12 -2
  152. package/lib/types/client/components/QaMessage.d.ts +22 -2
  153. package/lib/types/client/components/QaSidebar.d.ts +69 -0
  154. package/lib/types/client/components/QaSourcesDrawer.d.ts +20 -0
  155. package/lib/types/client/components/QaTurnRail.d.ts +59 -0
  156. package/lib/types/client/components/QaWelcomeNotice.d.ts +27 -0
  157. package/lib/types/client/components/QaWidthHandle.d.ts +36 -0
  158. package/lib/types/client/components/QaWorkGroup.d.ts +19 -0
  159. package/lib/types/client/components/VariantSwitcher.d.ts +19 -0
  160. package/lib/types/client/components/format.d.ts +9 -0
  161. package/lib/types/client/components/source-refs.d.ts +16 -0
  162. package/lib/types/client/create-session.d.ts +16 -0
  163. package/lib/types/client/index.d.ts +2 -5
  164. package/lib/types/client/project-session-state.d.ts +30 -0
  165. package/lib/types/client/session-admission.d.ts +23 -0
  166. package/lib/types/client/session-assets.d.ts +20 -0
  167. package/lib/types/client/session-sources.d.ts +28 -0
  168. package/lib/types/client/settlement.d.ts +6 -0
  169. package/lib/types/client/tool-presentation.d.ts +6 -0
  170. package/lib/types/client/turn-sources.d.ts +14 -0
  171. package/lib/types/client/types.d.ts +93 -0
  172. package/lib/types/client/use-session-ui-state.d.ts +35 -0
  173. package/lib/types/client/use-transcript-view.d.ts +20 -0
  174. package/lib/types/client/wait-for.d.ts +11 -0
  175. package/lib/types/entry-redirect.d.ts +20 -0
  176. package/lib/types/host-route.d.ts +14 -1
  177. package/lib/types/index.d.ts +67 -7
  178. package/lib/types/launch-token.d.ts +21 -0
  179. package/lib/types/lockdown-policy.d.ts +18 -0
  180. package/lib/types/provenance/collector.d.ts +26 -0
  181. package/lib/types/provenance/connectors.d.ts +11 -0
  182. package/lib/types/provenance/dedupe.d.ts +6 -0
  183. package/lib/types/provenance/extractors.d.ts +14 -0
  184. package/lib/types/provenance/file-preview.d.ts +10 -0
  185. package/lib/types/provenance/host-store.d.ts +54 -0
  186. package/lib/types/provenance/index.d.ts +10 -0
  187. package/lib/types/provenance/normalize.d.ts +13 -0
  188. package/lib/types/provenance/reported.d.ts +5 -0
  189. package/lib/types/provenance/types.d.ts +78 -0
  190. package/lib/types/secure-session.d.ts +31 -0
  191. package/lib/types/types.d.ts +304 -1
  192. package/package.json +70 -27
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QaTurnRail.js","sourceRoot":"","sources":["../../../src/client/components/QaTurnRail.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,125 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useRef, useState, } from "react";
3
+ import { createPortal } from "react-dom";
4
+ /** Bump when the notice changes materially and must be acknowledged again. */
5
+ export const QA_WELCOME_NOTICE_VERSION = "2026-09-12.1";
6
+ export const QA_WELCOME_NOTICE_COPY = Object.freeze({
7
+ title: "Перед началом тестирования",
8
+ paragraphs: Object.freeze([
9
+ "Этот помощник разработан не с нуля: он основан на DeepSeek Harness. Платформа находится в preview, поэтому возможны ошибки, нестабильная работа и изменения поведения.",
10
+ "На этапе тестирования заданные вопросы и полученные ответы будут анализироваться для повышения качества помощника. Пожалуйста, задавайте преимущественно вопросы, связанные с работой.",
11
+ "Помощник использует локальные модели. Данные обрабатываются внутри контура и никуда за его пределы не передаются.",
12
+ ]),
13
+ continueLabel: "Понятно, продолжить",
14
+ });
15
+ const QA_WELCOME_ACKNOWLEDGED_EVENT = "dsh-qa-welcome-acknowledged";
16
+ function acknowledged(storage, key) {
17
+ try {
18
+ return storage.getItem(key) === QA_WELCOME_NOTICE_VERSION;
19
+ }
20
+ catch {
21
+ return false;
22
+ }
23
+ }
24
+ function focusable(root) {
25
+ return [
26
+ ...root.querySelectorAll("button:not([disabled]), a[href], input:not([disabled]), [tabindex]:not([tabindex='-1'])"),
27
+ ].filter((element) => !element.hidden);
28
+ }
29
+ /** Route-scoped replacement for DSH's stock `welcome-notice` onboarding step. */
30
+ export function QaWelcomeNotice(props) {
31
+ const [isAcknowledged, setAcknowledged] = useState(() => acknowledged(props.storage, props.storageKey));
32
+ const completed = useRef(false);
33
+ const dialog = useRef(null);
34
+ const continueButton = useRef(null);
35
+ const complete = useCallback(() => {
36
+ if (completed.current)
37
+ return;
38
+ completed.current = true;
39
+ props.complete?.();
40
+ }, [props.complete]);
41
+ useEffect(() => {
42
+ if (isAcknowledged)
43
+ complete();
44
+ }, [complete, isAcknowledged]);
45
+ useEffect(() => {
46
+ if (isAcknowledged)
47
+ return;
48
+ const appRoot = document.getElementById("root");
49
+ const wasInert = appRoot?.inert;
50
+ if (appRoot !== null)
51
+ appRoot.inert = true;
52
+ continueButton.current?.focus();
53
+ return () => {
54
+ if (appRoot !== null)
55
+ appRoot.inert = wasInert ?? false;
56
+ };
57
+ }, [isAcknowledged]);
58
+ const confirm = useCallback(() => {
59
+ try {
60
+ props.storage.setItem(props.storageKey, QA_WELCOME_NOTICE_VERSION);
61
+ }
62
+ catch {
63
+ // A denied localStorage write only costs persistence across reloads.
64
+ }
65
+ setAcknowledged(true);
66
+ window.dispatchEvent(new CustomEvent(QA_WELCOME_ACKNOWLEDGED_EVENT, {
67
+ detail: props.storageKey,
68
+ }));
69
+ complete();
70
+ }, [complete, props.storage, props.storageKey]);
71
+ const trapKeys = useCallback((event) => {
72
+ if (event.key === "Escape") {
73
+ event.preventDefault();
74
+ event.stopPropagation();
75
+ return;
76
+ }
77
+ if (event.key !== "Tab" || dialog.current === null)
78
+ return;
79
+ const items = focusable(dialog.current);
80
+ if (items.length === 0) {
81
+ event.preventDefault();
82
+ dialog.current.focus();
83
+ return;
84
+ }
85
+ const first = items[0];
86
+ const last = items.at(-1);
87
+ if (event.shiftKey && document.activeElement === first) {
88
+ event.preventDefault();
89
+ last?.focus();
90
+ }
91
+ else if (!event.shiftKey && document.activeElement === last) {
92
+ event.preventDefault();
93
+ first?.focus();
94
+ }
95
+ }, []);
96
+ if (isAcknowledged)
97
+ return null;
98
+ return createPortal(_jsx("div", { className: "dsh-qa-onboarding", onKeyDown: trapKeys, children: _jsxs("div", { ref: dialog, className: "dsh-qa-onboarding__panel", role: "dialog", "aria-modal": "true", "aria-labelledby": "dsh-qa-onboarding-title", "aria-describedby": "dsh-qa-onboarding-description", tabIndex: -1, children: [_jsx("div", { className: "dsh-qa-onboarding__mark", "aria-hidden": "true", children: _jsxs("svg", { viewBox: "0 0 24 24", children: [_jsx("path", { d: "M12 3.5 20 8v8l-8 4.5L4 16V8l8-4.5Z" }), _jsx("path", { d: "m8.75 12 2 2 4.5-4.5" })] }) }), _jsxs("div", { className: "dsh-qa-onboarding__content", children: [_jsx("h1", { id: "dsh-qa-onboarding-title", className: "dsh-qa-onboarding__title", children: QA_WELCOME_NOTICE_COPY.title }), _jsx("div", { id: "dsh-qa-onboarding-description", className: "dsh-qa-onboarding__description", children: QA_WELCOME_NOTICE_COPY.paragraphs.map((paragraph) => (_jsx("p", { children: paragraph }, paragraph))) }), _jsx("div", { className: "dsh-qa-onboarding__actions", children: _jsx("button", { ref: continueButton, type: "button", className: "dsh-qa-onboarding__continue", onClick: confirm, children: QA_WELCOME_NOTICE_COPY.continueLabel }) })] })] }) }), document.body);
99
+ }
100
+ /**
101
+ * Invisible shadow for DSH's stock welcome step. The host coordinator removes
102
+ * onboarding content as soon as a chat stops being blank, so the visible QA
103
+ * notice is owned by the route overlay above instead of this lifecycle.
104
+ */
105
+ export function QaWelcomeNoticeStep(props) {
106
+ const [isAcknowledged, setAcknowledged] = useState(() => acknowledged(props.storage, props.storageKey));
107
+ const completed = useRef(false);
108
+ useEffect(() => {
109
+ const handleAcknowledged = (event) => {
110
+ if (event instanceof CustomEvent && event.detail === props.storageKey) {
111
+ setAcknowledged(true);
112
+ }
113
+ };
114
+ window.addEventListener(QA_WELCOME_ACKNOWLEDGED_EVENT, handleAcknowledged);
115
+ return () => window.removeEventListener(QA_WELCOME_ACKNOWLEDGED_EVENT, handleAcknowledged);
116
+ }, [props.storageKey]);
117
+ useEffect(() => {
118
+ if (!isAcknowledged || completed.current)
119
+ return;
120
+ completed.current = true;
121
+ props.complete();
122
+ }, [isAcknowledged, props.complete]);
123
+ return null;
124
+ }
125
+ //# sourceMappingURL=QaWelcomeNotice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QaWelcomeNotice.js","sourceRoot":"","sources":["../../../src/client/components/QaWelcomeNotice.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,142 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useLayoutEffect, useRef, useState, } from "react";
3
+ /** DSH's dragged content-width floor; a lower operator cap still wins. */
4
+ export const QA_CONTENT_MIN_WIDTH = 640;
5
+ /**
6
+ * Space kept outside the content: 88px per side leaves room for the handle,
7
+ * its inset, and a safe zone that remains draggable in both directions.
8
+ */
9
+ export const QA_CONTENT_EDGE_BUDGET = 176;
10
+ const QA_ADAPTIVE_MIN_WIDTH = 680;
11
+ const QA_ADAPTIVE_MAX_WIDTH = 920;
12
+ export function readQaContentWidth(storage, key) {
13
+ try {
14
+ const raw = storage.getItem(key);
15
+ if (raw === null)
16
+ return null;
17
+ const value = Number(raw);
18
+ return Number.isFinite(value) && value > 0 ? value : null;
19
+ }
20
+ catch {
21
+ return null;
22
+ }
23
+ }
24
+ export function writeQaContentWidth(storage, key, width) {
25
+ try {
26
+ storage.setItem(key, `${width}`);
27
+ }
28
+ catch {
29
+ // Denied durable storage only costs persistence across reloads.
30
+ }
31
+ }
32
+ /** Resolve the centered content width for the currently available column. */
33
+ export function resolveQaContentWidth(columnWidth, preference, maxContentWidth) {
34
+ const available = Math.max(0, columnWidth - QA_CONTENT_EDGE_BUDGET);
35
+ const maximum = Math.min(maxContentWidth, available);
36
+ const minimum = Math.min(QA_CONTENT_MIN_WIDTH, maximum);
37
+ const adaptive = Math.min(maxContentWidth, Math.max(QA_ADAPTIVE_MIN_WIDTH, Math.min(columnWidth * 0.64, QA_ADAPTIVE_MAX_WIDTH)));
38
+ const requested = preference ?? adaptive;
39
+ return Math.min(Math.max(requested, minimum), maximum);
40
+ }
41
+ /** Pointer-captured, rAF-throttled symmetric content-width handle. */
42
+ export function QaWidthHandle(props) {
43
+ const [dragging, setDragging] = useState(false);
44
+ const base = useRef(0);
45
+ const origin = useRef(0);
46
+ const latest = useRef(0);
47
+ const frame = useRef(null);
48
+ const callbacks = useRef(props);
49
+ callbacks.current = props;
50
+ const outwardWidth = () => {
51
+ const delta = latest.current - origin.current;
52
+ const outward = callbacks.current.side === "right" ? delta : -delta;
53
+ return base.current + outward * 2;
54
+ };
55
+ const cancelFrame = useCallback(() => {
56
+ if (frame.current === null)
57
+ return;
58
+ cancelAnimationFrame(frame.current);
59
+ frame.current = null;
60
+ }, []);
61
+ useEffect(() => cancelFrame, [cancelFrame]);
62
+ const onPointerDown = useCallback((event) => {
63
+ event.preventDefault();
64
+ event.currentTarget.setPointerCapture(event.pointerId);
65
+ origin.current = event.clientX;
66
+ latest.current = event.clientX;
67
+ base.current = callbacks.current.onStart();
68
+ setDragging(true);
69
+ }, []);
70
+ const onPointerMove = useCallback((event) => {
71
+ const box = event.currentTarget.getBoundingClientRect();
72
+ event.currentTarget.style.setProperty("--dsh-qa-width-handle-pointer-y", `${event.clientY - box.top}px`);
73
+ if (!event.currentTarget.hasPointerCapture(event.pointerId))
74
+ return;
75
+ latest.current = event.clientX;
76
+ frame.current ??= requestAnimationFrame(() => {
77
+ frame.current = null;
78
+ callbacks.current.onDrag(outwardWidth());
79
+ });
80
+ }, []);
81
+ const onPointerUp = useCallback((event) => {
82
+ if (!event.currentTarget.hasPointerCapture(event.pointerId))
83
+ return;
84
+ event.currentTarget.releasePointerCapture(event.pointerId);
85
+ cancelFrame();
86
+ latest.current = event.clientX;
87
+ if (latest.current !== origin.current) {
88
+ callbacks.current.onCommit(outwardWidth());
89
+ }
90
+ setDragging(false);
91
+ callbacks.current.onEnd();
92
+ }, [cancelFrame]);
93
+ const onPointerCancel = useCallback(() => {
94
+ cancelFrame();
95
+ setDragging(false);
96
+ callbacks.current.onEnd();
97
+ }, [cancelFrame]);
98
+ return (_jsx("div", { className: "dsh-qa-width-handle", "data-side": props.side, "data-width-handle": props.side, "data-dragging": dragging || undefined, onPointerDown: onPointerDown, onPointerMove: onPointerMove, onPointerUp: onPointerUp, onPointerCancel: onPointerCancel, onLostPointerCapture: onPointerCancel }));
99
+ }
100
+ export function useQaContentWidth({ active, root, storage, storageKey, maxContentWidth, }) {
101
+ const publish = useCallback(() => {
102
+ const element = root.current;
103
+ if (element === null)
104
+ return;
105
+ const preference = readQaContentWidth(storage, storageKey);
106
+ const width = resolveQaContentWidth(element.offsetWidth, preference, maxContentWidth);
107
+ element.style.setProperty("--dsh-qa-content-width", `${width}px`);
108
+ }, [maxContentWidth, root, storage, storageKey]);
109
+ useLayoutEffect(() => {
110
+ if (!active)
111
+ return;
112
+ const element = root.current;
113
+ if (element === null)
114
+ return;
115
+ publish();
116
+ const observer = new ResizeObserver(publish);
117
+ observer.observe(element);
118
+ return () => observer.disconnect();
119
+ }, [active, publish, root]);
120
+ const onStart = useCallback(() => {
121
+ const element = root.current;
122
+ if (element === null)
123
+ return maxContentWidth;
124
+ return resolveQaContentWidth(element.offsetWidth, readQaContentWidth(storage, storageKey), maxContentWidth);
125
+ }, [maxContentWidth, root, storage, storageKey]);
126
+ const onDrag = useCallback((requestedWidth) => {
127
+ const element = root.current;
128
+ if (element === null)
129
+ return;
130
+ const width = resolveQaContentWidth(element.offsetWidth, requestedWidth, maxContentWidth);
131
+ element.style.setProperty("--dsh-qa-content-width", `${width}px`);
132
+ }, [maxContentWidth, root]);
133
+ const onCommit = useCallback((requestedWidth) => {
134
+ const element = root.current;
135
+ if (element === null)
136
+ return;
137
+ const width = resolveQaContentWidth(element.offsetWidth, requestedWidth, maxContentWidth);
138
+ writeQaContentWidth(storage, storageKey, width);
139
+ }, [maxContentWidth, root, storage, storageKey]);
140
+ return { onStart, onDrag, onCommit, onEnd: publish };
141
+ }
142
+ //# sourceMappingURL=QaWidthHandle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QaWidthHandle.js","sourceRoot":"","sources":["../../../src/client/components/QaWidthHandle.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,135 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { memo, useEffect, useRef, useState } from "react";
3
+ import { formatWorkDuration } from "./format.js";
4
+ import { Markdown } from "./Markdown.js";
5
+ export const THINKING_PHRASES = Object.freeze([
6
+ "Скребу по сусекам…",
7
+ "Кумекаю…",
8
+ "Навожу резкость…",
9
+ "Собираю мысли в кучку…",
10
+ "Раскладываю по полочкам…",
11
+ "Сверяю приметы…",
12
+ ]);
13
+ function Chevron({ open }) {
14
+ return (_jsx("svg", { className: "dsh-qa-work__chevron", "data-open": open || undefined, viewBox: "0 0 14 14", "aria-hidden": "true", children: _jsx("path", { d: "m5.25 3.5 3.5 3.5-3.5 3.5" }) }));
15
+ }
16
+ function ThinkIcon() {
17
+ return (_jsxs("svg", { viewBox: "0 0 16 16", "aria-hidden": "true", children: [_jsx("path", { d: "M8 2.25a4.25 4.25 0 0 0-2.45 7.72c.48.34.7.72.7 1.15v.13h3.5v-.13c0-.43.22-.81.7-1.15A4.25 4.25 0 0 0 8 2.25Z" }), _jsx("path", { d: "M6.35 13h3.3M6.9 14.5h2.2" })] }));
18
+ }
19
+ function ToolIcon() {
20
+ return (_jsx("svg", { viewBox: "0 0 16 16", "aria-hidden": "true", children: _jsx("path", { d: "M9.8 2.4a3.2 3.2 0 0 0-3.73 4.12l-3.4 3.4a1.55 1.55 0 1 0 2.2 2.2l3.4-3.4A3.2 3.2 0 0 0 12.4 5l-1.85 1.1-1.5-1.5L9.8 2.4Z" }) }));
21
+ }
22
+ function RobotIcon() {
23
+ return (_jsxs("svg", { viewBox: "0 0 16 16", "aria-hidden": "true", children: [_jsx("rect", { x: "3", y: "5", width: "10", height: "7.5", rx: "1.75" }), _jsx("path", { d: "M8 2.5V5m0-.25a.9.9 0 1 0-.01-1.8.9.9 0 0 0 .01 1.8ZM5.4 8.4h1.7M8.9 8.4h1.7M6 10.4h4" })] }));
24
+ }
25
+ function isDelegationTool(name) {
26
+ return name === "subagent" || name === "subagent_fork";
27
+ }
28
+ /**
29
+ * Whether two work items render identically. The transcript projection
30
+ * rebuilds every item object on each published frame, so memoized work rows
31
+ * compare by rendered content instead of by reference.
32
+ */
33
+ export function sameWorkItem(a, b) {
34
+ if (a === b)
35
+ return true;
36
+ if (a.id !== b.id || a.kind !== b.kind)
37
+ return false;
38
+ if (a.kind === "tool" && b.kind === "tool") {
39
+ return (a.name === b.name &&
40
+ a.label === b.label &&
41
+ a.summary === b.summary &&
42
+ a.input === b.input &&
43
+ a.output === b.output &&
44
+ a.status === b.status &&
45
+ a.subagentId === b.subagentId &&
46
+ a.startedAt === b.startedAt &&
47
+ a.endedAt === b.endedAt);
48
+ }
49
+ if (a.kind !== "tool" && b.kind !== "tool") {
50
+ return a.text === b.text && a.status === b.status;
51
+ }
52
+ return false;
53
+ }
54
+ /** Whether two work item lists render identically, item for item. */
55
+ export function sameWorkItems(a, b) {
56
+ if (a === b)
57
+ return true;
58
+ if (a.length !== b.length)
59
+ return false;
60
+ return a.every((item, index) => sameWorkItem(item, b[index]));
61
+ }
62
+ function WorkItemIcon({ item }) {
63
+ if (item.kind !== "tool")
64
+ return _jsx(ThinkIcon, {});
65
+ if (isDelegationTool(item.name))
66
+ return _jsx(RobotIcon, {});
67
+ if (item.status === "running") {
68
+ return _jsx("span", { className: "dsh-qa-work-item__spinner", "aria-hidden": "true" });
69
+ }
70
+ if (item.status === "ok") {
71
+ return (_jsx("svg", { viewBox: "0 0 16 16", "aria-hidden": "true", children: _jsx("path", { d: "m3.5 8.25 2.7 2.7 6.3-6.3" }) }));
72
+ }
73
+ return _jsx(ToolIcon, {});
74
+ }
75
+ function toolStatusLabel(status) {
76
+ switch (status) {
77
+ case "running":
78
+ return "Выполняется";
79
+ case "ok":
80
+ return "Готово";
81
+ case "error":
82
+ return "Ошибка";
83
+ case "stopped":
84
+ return "Остановлено";
85
+ }
86
+ }
87
+ const QaToolWorkItem = memo(function QaToolWorkItem({ item, }) {
88
+ const expandable = item.input !== null || item.output !== null;
89
+ const delegation = isDelegationTool(item.name);
90
+ const header = (_jsxs(_Fragment, { children: [_jsx("span", { className: "dsh-qa-work-item__icon", "data-state": item.status, children: _jsx(WorkItemIcon, { item: item }) }), _jsx("span", { className: "dsh-qa-work-item__label", children: item.label }), _jsx("span", { className: "dsh-qa-work-item__summary", children: item.summary }), item.subagentId === undefined ? null : (_jsx("span", { className: "dsh-qa-work-item__agent-id", title: item.subagentId, children: item.subagentId.slice(0, 8) })), _jsx("span", { className: "dsh-qa-sr-only", children: toolStatusLabel(item.status) }), expandable ? _jsx(Chevron, { open: false }) : null] }));
91
+ if (!expandable) {
92
+ return (_jsx("div", { className: "dsh-qa-work-item dsh-qa-work-item--tool", "data-tool": delegation ? "subagent" : undefined, children: header }));
93
+ }
94
+ return (_jsxs("details", { className: "dsh-qa-work-tool", "data-tool": delegation ? "subagent" : undefined, children: [_jsx("summary", { className: "dsh-qa-work-item dsh-qa-work-item--tool", children: header }), _jsxs("div", { className: "dsh-qa-work-tool__body", children: [item.input === null ? null : (_jsxs("section", { "aria-label": `Входные данные: ${item.label}`, children: [_jsx("span", { children: "\u0412\u0445\u043E\u0434\u043D\u044B\u0435 \u0434\u0430\u043D\u043D\u044B\u0435" }), _jsx("pre", { children: item.input })] })), item.output === null ? null : (_jsxs("section", { "aria-label": `Результат: ${item.label}`, children: [_jsx("span", { children: "\u0420\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442" }), _jsx("pre", { children: item.output })] }))] })] }));
95
+ }, (prev, next) => sameWorkItem(prev.item, next.item));
96
+ const QaTextWorkItem = memo(function QaTextWorkItem({ item, renderMarkdown, }) {
97
+ return (_jsxs("section", { className: "dsh-qa-work-item dsh-qa-work-item--text", "data-state": item.status, "aria-label": item.kind === "reasoning" ? "Рассуждение" : "Ход работы", children: [_jsxs("div", { className: "dsh-qa-work-item__text-head", children: [_jsx("span", { className: "dsh-qa-work-item__icon", children: _jsx(ThinkIcon, {}) }), _jsx("span", { className: "dsh-qa-work-item__label", children: item.kind === "reasoning" ? "Размышление" : "Ход работы" })] }), _jsx("div", { className: "dsh-qa-work-item__text", children: renderMarkdown ? _jsx(Markdown, { text: item.text }) : item.text })] }));
98
+ }, (prev, next) => prev.renderMarkdown === next.renderMarkdown &&
99
+ sameWorkItem(prev.item, next.item));
100
+ export const QaWorkGroup = memo(function QaWorkGroup({ status, startedAt, endedAt, items, renderMarkdown, }) {
101
+ const [open, setOpen] = useState(status === "running");
102
+ const [now, setNow] = useState(() => Date.now());
103
+ const previousStatus = useRef(status);
104
+ useEffect(() => {
105
+ if (previousStatus.current === "running" && status === "complete") {
106
+ setOpen(false);
107
+ }
108
+ else if (previousStatus.current === "complete" &&
109
+ status === "running") {
110
+ setOpen(true);
111
+ }
112
+ previousStatus.current = status;
113
+ }, [status]);
114
+ useEffect(() => {
115
+ if (status !== "running" || startedAt === undefined)
116
+ return;
117
+ setNow(Date.now());
118
+ const timer = setInterval(() => setNow(Date.now()), 1_000);
119
+ return () => clearInterval(timer);
120
+ }, [startedAt, status]);
121
+ const duration = startedAt === undefined
122
+ ? null
123
+ : formatWorkDuration((endedAt ?? now) - startedAt);
124
+ const label = status === "running"
125
+ ? `${THINKING_PHRASES[Math.floor(Math.max(0, (endedAt ?? now) - (startedAt ?? now)) / 4_000) % THINKING_PHRASES.length]}${duration === null ? "" : ` (${duration})`}`
126
+ : duration === null
127
+ ? "Ход работы"
128
+ : `Готово за ${duration}`;
129
+ return (_jsxs("section", { className: "dsh-qa-work", "data-state": status, children: [_jsxs("button", { type: "button", className: "dsh-qa-work__toggle", "aria-expanded": open, onClick: () => setOpen((value) => !value), children: [status === "running" ? (_jsx("span", { className: "dsh-qa-work__spinner", "aria-hidden": "true" })) : null, _jsx("span", { children: label }), _jsx(Chevron, { open: open })] }), open ? (_jsx("div", { className: "dsh-qa-work__body", children: items.map((item) => item.kind === "tool" ? (_jsx(QaToolWorkItem, { item: item }, item.id)) : (_jsx(QaTextWorkItem, { item: item, renderMarkdown: renderMarkdown }, item.id))) })) : null] }));
130
+ }, (prev, next) => prev.status === next.status &&
131
+ prev.startedAt === next.startedAt &&
132
+ prev.endedAt === next.endedAt &&
133
+ prev.renderMarkdown === next.renderMarkdown &&
134
+ sameWorkItems(prev.items, next.items));
135
+ //# sourceMappingURL=QaWorkGroup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QaWorkGroup.js","sourceRoot":"","sources":["../../../src/client/components/QaWorkGroup.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * Group answer turns under the user message that triggered them. The session
4
+ * has no truncation seam, so a regenerated answer is a real follow-up turn;
5
+ * consecutive turns after one user message read as its variants.
6
+ */
7
+ export function collectVariantGroups(messages) {
8
+ const groups = [];
9
+ let current;
10
+ for (const message of messages) {
11
+ if (message.role === "user") {
12
+ current = { groupId: message.id, turns: [] };
13
+ groups.push(current);
14
+ continue;
15
+ }
16
+ if (current === undefined ||
17
+ (message.role !== "assistant" && message.role !== "work")) {
18
+ continue;
19
+ }
20
+ if (message.turn !== undefined && !current.turns.includes(message.turn)) {
21
+ current.turns.push(message.turn);
22
+ }
23
+ }
24
+ return groups;
25
+ }
26
+ export function VariantSwitcher({ count, offset, onStep, }) {
27
+ return (_jsxs("div", { className: "dsh-qa-variants", "aria-label": "\u0412\u0430\u0440\u0438\u0430\u043D\u0442\u044B \u043E\u0442\u0432\u0435\u0442\u0430", children: [_jsx("button", { type: "button", "aria-label": "\u041F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043D\u0442", disabled: offset >= count - 1, onClick: () => onStep(offset + 1), children: _jsx("svg", { viewBox: "0 0 14 14", "aria-hidden": "true", children: _jsx("path", { d: "m8.75 3.5-3.5 3.5 3.5 3.5" }) }) }), _jsxs("span", { children: [count - offset, "/", count] }), _jsx("button", { type: "button", "aria-label": "\u0421\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043D\u0442", disabled: offset <= 0, onClick: () => onStep(offset - 1), children: _jsx("svg", { viewBox: "0 0 14 14", "aria-hidden": "true", children: _jsx("path", { d: "m5.25 3.5 3.5 3.5-3.5 3.5" }) }) })] }));
28
+ }
29
+ //# sourceMappingURL=VariantSwitcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VariantSwitcher.js","sourceRoot":"","sources":["../../../src/client/components/VariantSwitcher.tsx"],"names":[],"mappings":";AASA;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,QAA8B;IAE9B,MAAM,MAAM,GAA2C,EAAE,CAAC;IAC1D,IAAI,OAAyD,CAAC;IAC9D,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC5B,OAAO,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;YAC7C,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrB,SAAS;QACX,CAAC;QACD,IACE,OAAO,KAAK,SAAS;YACrB,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,EACzD,CAAC;YACD,SAAS;QACX,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACxE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,EAC9B,KAAK,EACL,MAAM,EACN,MAAM,GAKP;IACC,OAAO,CACL,eAAK,SAAS,EAAC,iBAAiB,gBAAY,uFAAiB,aAC3D,iBACE,IAAI,EAAC,QAAQ,gBACF,yGAAoB,EAC/B,QAAQ,EAAE,MAAM,IAAI,KAAK,GAAG,CAAC,EAC7B,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,YAEjC,cAAK,OAAO,EAAC,WAAW,iBAAa,MAAM,YACzC,eAAM,CAAC,EAAC,2BAA2B,GAAG,GAClC,GACC,EACT,2BACG,KAAK,GAAG,MAAM,OAAG,KAAK,IAClB,EACP,iBACE,IAAI,EAAC,QAAQ,gBACF,mGAAmB,EAC9B,QAAQ,EAAE,MAAM,IAAI,CAAC,EACrB,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,YAEjC,cAAK,OAAO,EAAC,WAAW,iBAAa,MAAM,YACzC,eAAM,CAAC,EAAC,2BAA2B,GAAG,GAClC,GACC,IACL,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,48 @@
1
+ /** Shared time formatting for the QA surface UI. */
2
+ /** `только что`, `5 мин`, `3 ч`, `2 дн` or a ru-RU date past the week. */
3
+ export function relativeTime(timestamp, now) {
4
+ const seconds = Math.max(1, Math.round((now - timestamp) / 1000));
5
+ if (seconds < 60)
6
+ return "только что";
7
+ const minutes = Math.round(seconds / 60);
8
+ if (minutes < 60)
9
+ return `${minutes} мин`;
10
+ const hours = Math.round(minutes / 60);
11
+ if (hours < 24)
12
+ return `${hours} ч`;
13
+ const days = Math.round(hours / 24);
14
+ if (days < 7)
15
+ return `${days} дн`;
16
+ return new Date(timestamp).toLocaleDateString("ru-RU");
17
+ }
18
+ /** `9 сент 15:44` - compact ru-RU day/month plus time. */
19
+ export function formatDayTime(timestamp) {
20
+ const date = new Date(timestamp);
21
+ const month = date
22
+ .toLocaleDateString("ru-RU", { month: "short" })
23
+ .replace(".", "");
24
+ const time = date.toLocaleTimeString("ru-RU", {
25
+ hour: "2-digit",
26
+ minute: "2-digit",
27
+ });
28
+ return `${date.getDate()} ${month} ${time}`;
29
+ }
30
+ /** `1,1 с` below ten seconds, `8 с` above. */
31
+ export function formatSeconds(ms) {
32
+ const seconds = ms / 1_000;
33
+ const value = seconds < 10
34
+ ? (Math.round(seconds * 10) / 10).toString()
35
+ : String(Math.round(seconds));
36
+ return `${value.replace(".", ",")} с`;
37
+ }
38
+ export function formatWorkDuration(durationMs) {
39
+ const seconds = Math.max(0, Math.round(durationMs / 1_000));
40
+ if (seconds < 1)
41
+ return "< 1 с";
42
+ if (seconds < 60)
43
+ return `${seconds} с`;
44
+ const minutes = Math.floor(seconds / 60);
45
+ const remainder = seconds % 60;
46
+ return remainder === 0 ? `${minutes} мин` : `${minutes} мин ${remainder} с`;
47
+ }
48
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/client/components/format.ts"],"names":[],"mappings":"AAAA,oDAAoD;AAEpD,0EAA0E;AAC1E,MAAM,UAAU,YAAY,CAAC,SAAiB,EAAE,GAAW;IACzD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAClE,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,YAAY,CAAC;IACtC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACzC,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,MAAM,CAAC;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACvC,IAAI,KAAK,GAAG,EAAE;QAAE,OAAO,GAAG,KAAK,IAAI,CAAC;IACpC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;IACpC,IAAI,IAAI,GAAG,CAAC;QAAE,OAAO,GAAG,IAAI,KAAK,CAAC;IAClC,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;AACzD,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,aAAa,CAAC,SAAiB;IAC7C,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,IAAI;SACf,kBAAkB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;SAC/C,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACpB,MAAM,IAAI,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE;QAC5C,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,SAAS;KAClB,CAAC,CAAC;IACH,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;AAC9C,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,aAAa,CAAC,EAAU;IACtC,MAAM,OAAO,GAAG,EAAE,GAAG,KAAK,CAAC;IAC3B,MAAM,KAAK,GACT,OAAO,GAAG,EAAE;QACV,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE;QAC5C,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAClC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,UAAkB;IACnD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC;IAC5D,IAAI,OAAO,GAAG,CAAC;QAAE,OAAO,OAAO,CAAC;IAChC,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,IAAI,CAAC;IACxC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,OAAO,GAAG,EAAE,CAAC;IAC/B,OAAO,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,QAAQ,SAAS,IAAI,CAAC;AAC9E,CAAC"}