@yadsh/dsh-qa-surface 0.1.1 → 0.2.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 (89) hide show
  1. package/CHANGELOG.md +68 -0
  2. package/README.md +162 -14
  3. package/SPEC-dsh-qa-surface.md +600 -96
  4. package/capability-policy.json +5 -0
  5. package/compatibility.json +7 -1
  6. package/cordis.patch.yml +11 -0
  7. package/docs/ARCHITECTURE.md +49 -7
  8. package/docs/COMPATIBILITY.md +5 -4
  9. package/docs/CONFIGURATION.md +96 -2
  10. package/lib/attestation.js +10 -0
  11. package/lib/attestation.js.map +1 -0
  12. package/lib/client/QaConfigController.js +111 -4
  13. package/lib/client/QaConfigController.js.map +1 -1
  14. package/lib/client/QaSessionController.js +501 -119
  15. package/lib/client/QaSessionController.js.map +1 -1
  16. package/lib/client/QaSurface.js +137 -20
  17. package/lib/client/QaSurface.js.map +1 -1
  18. package/lib/client/QaTranscriptAdapter.js +534 -45
  19. package/lib/client/QaTranscriptAdapter.js.map +1 -1
  20. package/lib/client/attestation.js +60 -0
  21. package/lib/client/attestation.js.map +1 -0
  22. package/lib/client/chat-index.js +86 -0
  23. package/lib/client/chat-index.js.map +1 -0
  24. package/lib/client/components/Markdown.js +75 -5
  25. package/lib/client/components/Markdown.js.map +1 -1
  26. package/lib/client/components/QaAgentsDrawer.js +40 -0
  27. package/lib/client/components/QaAgentsDrawer.js.map +1 -0
  28. package/lib/client/components/QaComposer.js +132 -15
  29. package/lib/client/components/QaComposer.js.map +1 -1
  30. package/lib/client/components/QaMessage.js +184 -10
  31. package/lib/client/components/QaMessage.js.map +1 -1
  32. package/lib/client/components/QaSidebar.js +124 -0
  33. package/lib/client/components/QaSidebar.js.map +1 -0
  34. package/lib/client/components/QaSourcesDrawer.js +46 -0
  35. package/lib/client/components/QaSourcesDrawer.js.map +1 -0
  36. package/lib/client/components/QaWorkGroup.js +135 -0
  37. package/lib/client/components/QaWorkGroup.js.map +1 -0
  38. package/lib/client/components/VariantSwitcher.js +29 -0
  39. package/lib/client/components/VariantSwitcher.js.map +1 -0
  40. package/lib/client/components/format.js +48 -0
  41. package/lib/client/components/format.js.map +1 -0
  42. package/lib/client/index.js +77 -34
  43. package/lib/client/index.js.map +1 -1
  44. package/lib/client/styles.js +308 -43
  45. package/lib/client/styles.js.map +1 -1
  46. package/lib/client/types.js +13 -0
  47. package/lib/client/types.js.map +1 -0
  48. package/lib/client/wait-for.js +49 -0
  49. package/lib/client/wait-for.js.map +1 -0
  50. package/lib/client.js +8228 -383
  51. package/lib/client.js.map +1 -1
  52. package/lib/config.js +61 -9
  53. package/lib/config.js.map +1 -1
  54. package/lib/index.js +166 -70
  55. package/lib/index.js.map +1 -1
  56. package/lib/lockdown-policy.js +20 -0
  57. package/lib/lockdown-policy.js.map +1 -0
  58. package/lib/resolve-config.js +122 -10
  59. package/lib/resolve-config.js.map +1 -1
  60. package/lib/secure-session.js +170 -0
  61. package/lib/secure-session.js.map +1 -0
  62. package/lib/typert.host.d.ts +3 -0
  63. package/lib/typert.host.js +191 -0
  64. package/lib/typert.remote-client.d.ts +24 -0
  65. package/lib/typert.remote-client.js +129 -0
  66. package/lib/types/attestation.d.ts +17 -0
  67. package/lib/types/client/QaConfigController.d.ts +34 -2
  68. package/lib/types/client/QaSessionController.d.ts +106 -19
  69. package/lib/types/client/QaSurface.d.ts +5 -4
  70. package/lib/types/client/QaTranscriptAdapter.d.ts +17 -2
  71. package/lib/types/client/attestation.d.ts +25 -0
  72. package/lib/types/client/chat-index.d.ts +28 -0
  73. package/lib/types/client/components/Markdown.d.ts +7 -3
  74. package/lib/types/client/components/QaAgentsDrawer.d.ts +25 -0
  75. package/lib/types/client/components/QaComposer.d.ts +12 -2
  76. package/lib/types/client/components/QaMessage.d.ts +14 -1
  77. package/lib/types/client/components/QaSidebar.d.ts +41 -0
  78. package/lib/types/client/components/QaSourcesDrawer.d.ts +8 -0
  79. package/lib/types/client/components/QaWorkGroup.d.ts +19 -0
  80. package/lib/types/client/components/VariantSwitcher.d.ts +19 -0
  81. package/lib/types/client/components/format.d.ts +9 -0
  82. package/lib/types/client/index.d.ts +1 -5
  83. package/lib/types/client/types.d.ts +29 -0
  84. package/lib/types/client/wait-for.d.ts +11 -0
  85. package/lib/types/index.d.ts +22 -6
  86. package/lib/types/lockdown-policy.d.ts +18 -0
  87. package/lib/types/secure-session.d.ts +22 -0
  88. package/lib/types/types.d.ts +148 -1
  89. package/package.json +29 -3
@@ -0,0 +1,60 @@
1
+ /** The `(reason: <code>)` marker the Host folds into attestation wire failures. */
2
+ const ATTESTATION_REASON_MARKER = /\(reason: ([a-z-]+)\)/u;
3
+ /**
4
+ * Browser-side reading of Host policy attestation: one error type the session
5
+ * lifecycle branches on, plus pure diagnostics for the console. The specific
6
+ * mismatch facts stay in the Host logs; a refusal only reveals the coarse
7
+ * reason class and an operator hint.
8
+ */
9
+ export class QaPolicyAttestationError extends Error {
10
+ constructor() {
11
+ super("QA session policy could not be attested.");
12
+ this.name = "QaPolicyAttestationError";
13
+ }
14
+ }
15
+ /**
16
+ * Extract the coarse attestation reason code from a Host wire failure, if the
17
+ * failure carries the marker.
18
+ */
19
+ export function attestationReasonOf(failure) {
20
+ const match = ATTESTATION_REASON_MARKER.exec(failure?.message ?? "");
21
+ const reason = match?.[1];
22
+ return reason === undefined ? null : reason;
23
+ }
24
+ export function attestationHint(reason) {
25
+ if (reason === "unknown-tools") {
26
+ return "A lockdown.toolPolicy name is not mounted in this session's tool catalog — check the deployment agent preset and the tool's server availability.";
27
+ }
28
+ if (reason === "workspace-unavailable") {
29
+ return "The configured session.workspaceId does not match a registered workspace - create the workspace or fix the id (session.cwd is the no-registry alternative).";
30
+ }
31
+ if (reason === "composition-mismatch") {
32
+ return "The session's agent preset, workspace or model no longer matches the deployment QA config.";
33
+ }
34
+ if (reason === "permission-preset") {
35
+ return "The configured permission preset did not resolve to the pinned sandbox/approval policy.";
36
+ }
37
+ if (reason === "adoption-refused") {
38
+ return "This browser tried to adopt a session created outside the current QA policy.";
39
+ }
40
+ return "The specific mismatch facts are written to the Host logs.";
41
+ }
42
+ /**
43
+ * Whether a Host proof answers the deployment lockdown config this browser
44
+ * holds. Every field must match; the allow-list is compared as exact JSON so
45
+ * order differences refuse too, mirroring the Host's pinned list.
46
+ */
47
+ export function proofMatchesConfig(proof, lockdown, sessionId) {
48
+ return (proof.sessionId === sessionId &&
49
+ proof.enabled &&
50
+ proof.agentPresetMatches &&
51
+ proof.workspaceMatches &&
52
+ proof.modelMatches &&
53
+ proof.sandboxIsReadOnly &&
54
+ proof.approvalIsNever &&
55
+ proof.permissionPreset === lockdown.permissionPreset &&
56
+ proof.toolPolicyLoaded &&
57
+ JSON.stringify(proof.toolAllowList) ===
58
+ JSON.stringify(lockdown.toolPolicy.allow));
59
+ }
60
+ //# sourceMappingURL=attestation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attestation.js","sourceRoot":"","sources":["../../src/client/attestation.ts"],"names":[],"mappings":"AAEA,mFAAmF;AACnF,MAAM,yBAAyB,GAAG,wBAAwB,CAAC;AAE3D;;;;;GAKG;AACH,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IACjD;QACE,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAClD,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;IACzC,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAKQ;IAER,MAAM,KAAK,GAAG,yBAAyB,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;IACrE,MAAM,MAAM,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1B,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAqB;IACnD,IAAI,MAAM,KAAK,eAAe,EAAE,CAAC;QAC/B,OAAO,kJAAkJ,CAAC;IAC5J,CAAC;IACD,IAAI,MAAM,KAAK,uBAAuB,EAAE,CAAC;QACvC,OAAO,6JAA6J,CAAC;IACvK,CAAC;IACD,IAAI,MAAM,KAAK,sBAAsB,EAAE,CAAC;QACtC,OAAO,4FAA4F,CAAC;IACtG,CAAC;IACD,IAAI,MAAM,KAAK,mBAAmB,EAAE,CAAC;QACnC,OAAO,yFAAyF,CAAC;IACnG,CAAC;IACD,IAAI,MAAM,KAAK,kBAAkB,EAAE,CAAC;QAClC,OAAO,8EAA8E,CAAC;IACxF,CAAC;IACD,OAAO,2DAA2D,CAAC;AACrE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAAsB,EACtB,QAA6C,EAC7C,SAAiB;IAEjB,OAAO,CACL,KAAK,CAAC,SAAS,KAAK,SAAS;QAC7B,KAAK,CAAC,OAAO;QACb,KAAK,CAAC,kBAAkB;QACxB,KAAK,CAAC,gBAAgB;QACtB,KAAK,CAAC,YAAY;QAClB,KAAK,CAAC,iBAAiB;QACvB,KAAK,CAAC,eAAe;QACrB,KAAK,CAAC,gBAAgB,KAAK,QAAQ,CAAC,gBAAgB;QACpD,KAAK,CAAC,gBAAgB;QACtB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,aAAa,CAAC;YACjC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAC5C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,86 @@
1
+ /** Cap on the per-browser chat index so localStorage cannot grow unbounded. */
2
+ const MAX_INDEXED_CHATS = 50;
3
+ /**
4
+ * Browser-local chat bookkeeping: a most-recently-used index of chat ids for
5
+ * the sidebar plus the id of the chat this browser reopens on load. Both live
6
+ * under the deployment's storage key and route path, and every access
7
+ * tolerates a denied or broken store — persistence must never prevent a real
8
+ * DSH session.
9
+ */
10
+ export class QaChatIndex {
11
+ storage;
12
+ sessionKey;
13
+ chatKey;
14
+ constructor(storage, prefix) {
15
+ this.storage = storage;
16
+ this.sessionKey = `${prefix}:session`;
17
+ this.chatKey = `${prefix}:chats`;
18
+ }
19
+ /** This browser's indexed chat ids, most recently used first. */
20
+ chatIds() {
21
+ try {
22
+ const raw = this.storage?.getItem(this.chatKey) ?? "[]";
23
+ const parsed = JSON.parse(raw);
24
+ if (!Array.isArray(parsed))
25
+ return [];
26
+ return [
27
+ ...new Set(parsed.filter((id) => typeof id === "string")),
28
+ ].slice(0, MAX_INDEXED_CHATS);
29
+ }
30
+ catch {
31
+ return [];
32
+ }
33
+ }
34
+ /**
35
+ * Add one chat to the index without reordering anything. Display order is
36
+ * the host's `updatedAt`, so merely opening a chat must not move it — the
37
+ * index is membership only.
38
+ */
39
+ addChat(sessionId) {
40
+ try {
41
+ if (this.chatIds().includes(sessionId))
42
+ return;
43
+ const next = [sessionId, ...this.chatIds()].slice(0, MAX_INDEXED_CHATS);
44
+ this.storage?.setItem(this.chatKey, JSON.stringify(next));
45
+ }
46
+ catch {
47
+ // A denied localStorage write must not prevent the bound chat.
48
+ }
49
+ }
50
+ forgetChat(sessionId) {
51
+ try {
52
+ const next = this.chatIds().filter((id) => id !== sessionId);
53
+ this.storage?.setItem(this.chatKey, JSON.stringify(next));
54
+ }
55
+ catch {
56
+ // A denied localStorage removal is harmless; the id is revalidated later.
57
+ }
58
+ }
59
+ /** The persisted chat id this browser reopens on load, or null. */
60
+ activeId() {
61
+ try {
62
+ const value = this.storage?.getItem(this.sessionKey)?.trim() ?? "";
63
+ return value === "" ? null : value;
64
+ }
65
+ catch {
66
+ return null;
67
+ }
68
+ }
69
+ saveActive(sessionId) {
70
+ try {
71
+ this.storage?.setItem(this.sessionKey, sessionId);
72
+ }
73
+ catch {
74
+ // A denied localStorage write must not prevent a real DSH session.
75
+ }
76
+ }
77
+ clearActive() {
78
+ try {
79
+ this.storage?.removeItem(this.sessionKey);
80
+ }
81
+ catch {
82
+ // A denied localStorage removal is harmless; the id is revalidated later.
83
+ }
84
+ }
85
+ }
86
+ //# sourceMappingURL=chat-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-index.js","sourceRoot":"","sources":["../../src/client/chat-index.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,10 @@
1
1
  import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Fragment } from "react";
2
+ import { memo, Fragment } from "react";
3
3
  const INLINE = /(\[[^\]]+\]\([^\s)]+\)|`[^`]+`|\*\*[^*]+\*\*|\*[^*]+\*)/gu;
4
+ const TABLE_SEPARATOR = /^\s*\|?\s*:?-{2,}:?\s*(\|\s*:?-{2,}:?\s*)*\|?\s*$/u;
5
+ const ORDERED_LIST = /^\d{1,3}[.)]\s+/u;
6
+ const HORIZONTAL_RULE = /^\s*(?:-{3,}|\*{3,}|_{3,})\s*$/u;
7
+ const BLOCK_START = /^(#{1,3})\s+|```|^[-*]\s+|^\d{1,3}[.)]\s+|^>\s|(?:^\s*(?:-{3,}|\*{3,}|_{3,})\s*$)/u;
4
8
  function safeHref(value) {
5
9
  try {
6
10
  const url = new URL(value, window.location.origin);
@@ -41,8 +45,52 @@ function inline(text, keyPrefix) {
41
45
  nodes.push(text.slice(offset));
42
46
  return nodes;
43
47
  }
44
- /** Deliberately small, HTML-free Markdown renderer for assistant-visible text. */
45
- export function Markdown({ text }) {
48
+ /** Split one GFM table row into trimmed cells, honoring escaped pipes. */
49
+ function splitTableRow(line) {
50
+ let row = line.trim();
51
+ if (row.startsWith("|"))
52
+ row = row.slice(1);
53
+ if (row.endsWith("|") && !row.endsWith("\\|"))
54
+ row = row.slice(0, -1);
55
+ return row
56
+ .split(/(?<!\\)\|/u)
57
+ .map((cell) => cell.trim().replace(/\\\|/gu, "|"));
58
+ }
59
+ function isTableStart(lines, index) {
60
+ const header = lines[index] ?? "";
61
+ if (!header.includes("|"))
62
+ return false;
63
+ return TABLE_SEPARATOR.test(lines[index + 1] ?? "");
64
+ }
65
+ function renderTable(lines, index) {
66
+ const header = splitTableRow(lines[index] ?? "");
67
+ const aligns = splitTableRow(lines[index + 1] ?? "").map((cell) => {
68
+ const left = cell.startsWith(":");
69
+ const right = cell.endsWith(":");
70
+ if (left && right)
71
+ return "center";
72
+ return right ? "right" : "left";
73
+ });
74
+ let cursor = index + 2;
75
+ const rows = [];
76
+ while (cursor < lines.length &&
77
+ (lines[cursor] ?? "").trim() !== "" &&
78
+ (lines[cursor] ?? "").includes("|") &&
79
+ !/^(#{1,3})\s+|```|^[-*]\s+|^\d{1,3}[.)]\s+|^>\s/u.test(lines[cursor] ?? "")) {
80
+ rows.push(splitTableRow(lines[cursor] ?? ""));
81
+ cursor += 1;
82
+ }
83
+ return {
84
+ node: (_jsx("div", { className: "dsh-qa-md-table", children: _jsxs("table", { children: [_jsx("thead", { children: _jsx("tr", { children: header.map((cell, cellIndex) => (_jsx("th", { style: { textAlign: aligns[cellIndex] ?? "left" }, children: inline(cell, `th:${index}:${cellIndex}`) }, `h:${cellIndex}`))) }) }), _jsx("tbody", { children: rows.map((row, rowIndex) => (_jsx("tr", { children: header.map((_, cellIndex) => (_jsx("td", { style: { textAlign: aligns[cellIndex] ?? "left" }, children: inline(row[cellIndex] ?? "", `td:${rowIndex}:${cellIndex}`) }, `d:${rowIndex}:${cellIndex}`))) }, `r:${rowIndex}`))) })] }) }, `table:${index}`)),
85
+ next: cursor,
86
+ };
87
+ }
88
+ /**
89
+ * Deliberately small, HTML-free Markdown renderer for assistant-visible text.
90
+ * Memoized on the text value: stream updates re-render only the message whose
91
+ * text actually changed, so committed history is never re-parsed.
92
+ */
93
+ export const Markdown = memo(function Markdown({ text, }) {
46
94
  const lines = text.replace(/\r\n?/gu, "\n").split("\n");
47
95
  const blocks = [];
48
96
  for (let index = 0; index < lines.length;) {
@@ -60,6 +108,17 @@ export function Markdown({ text }) {
60
108
  blocks.push(_jsx("pre", { children: _jsx("code", { "data-language": language || undefined, children: code.join("\n") }) }, `code:${index}`));
61
109
  continue;
62
110
  }
111
+ if (isTableStart(lines, index)) {
112
+ const table = renderTable(lines, index);
113
+ blocks.push(table.node);
114
+ index = table.next;
115
+ continue;
116
+ }
117
+ if (HORIZONTAL_RULE.test(line)) {
118
+ blocks.push(_jsx("hr", {}, `hr:${index}`));
119
+ index += 1;
120
+ continue;
121
+ }
63
122
  const heading = /^(#{1,3})\s+(.+)$/u.exec(line);
64
123
  if (heading !== null) {
65
124
  const content = inline(heading[2] ?? "", `heading:${index}`);
@@ -78,6 +137,16 @@ export function Markdown({ text }) {
78
137
  blocks.push(_jsx("ul", { children: items }, `list:${index}`));
79
138
  continue;
80
139
  }
140
+ if (ORDERED_LIST.test(line)) {
141
+ const items = [];
142
+ while (index < lines.length && ORDERED_LIST.test(lines[index] ?? "")) {
143
+ const content = (lines[index] ?? "").replace(ORDERED_LIST, "");
144
+ items.push(_jsx("li", { children: inline(content, `oitem:${index}`) }, `oitem:${index}`));
145
+ index += 1;
146
+ }
147
+ blocks.push(_jsx("ol", { children: items }, `olist:${index}`));
148
+ continue;
149
+ }
81
150
  if (line.startsWith("> ")) {
82
151
  blocks.push(_jsx("blockquote", { children: inline(line.slice(2), `quote:${index}`) }, `quote:${index}`));
83
152
  index += 1;
@@ -91,12 +160,13 @@ export function Markdown({ text }) {
91
160
  index += 1;
92
161
  while (index < lines.length &&
93
162
  (lines[index] ?? "").trim() !== "" &&
94
- !/^(#{1,3})\s+|^```|^[-*]\s+|^>\s/u.test(lines[index] ?? "")) {
163
+ !BLOCK_START.test(lines[index] ?? "") &&
164
+ !isTableStart(lines, index)) {
95
165
  paragraph.push(lines[index] ?? "");
96
166
  index += 1;
97
167
  }
98
168
  blocks.push(_jsx("p", { children: paragraph.map((part, partIndex) => (_jsxs(Fragment, { children: [partIndex === 0 ? null : _jsx("br", {}), inline(part, `paragraph:${index}:${partIndex}`)] }, `line:${partIndex}`))) }, `paragraph:${index}`));
99
169
  }
100
170
  return _jsx(_Fragment, { children: blocks });
101
- }
171
+ });
102
172
  //# sourceMappingURL=Markdown.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Markdown.js","sourceRoot":"","sources":["../../../src/client/components/Markdown.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Markdown.js","sourceRoot":"","sources":["../../../src/client/components/Markdown.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { relativeTime } from "./format.js";
3
+ /**
4
+ * Direct subagent children of the open chat, running first. Reads the host
5
+ * session list's lineage (parentId + origin), so no extra subscription beyond
6
+ * the list the surface already follows.
7
+ */
8
+ export function collectSubagents(byId, rootId, now = Date.now()) {
9
+ if (rootId === null)
10
+ return [];
11
+ const rows = [];
12
+ for (const summary of Object.values(byId)) {
13
+ if (summary.parentId !== rootId || summary.origin !== "subagent")
14
+ continue;
15
+ rows.push({
16
+ id: summary.id,
17
+ title: summary.blank ? "Субагент" : summary.displayTitle,
18
+ running: summary.running,
19
+ completed: summary.completed === true,
20
+ meta: relativeTime(summary.updatedAt, now),
21
+ });
22
+ }
23
+ return rows.sort((left, right) => left.running === right.running ? 0 : left.running ? -1 : 1);
24
+ }
25
+ /** Right-hand panel listing the chat's subagents. */
26
+ export function QaAgentsDrawer({ agents, activeId, onView, onClose, }) {
27
+ return (_jsxs("aside", { className: "dsh-qa-agents", "aria-label": "\u0421\u0443\u0431\u0430\u0433\u0435\u043D\u0442\u044B \u0447\u0430\u0442\u0430", children: [_jsxs("div", { className: "dsh-qa-agents__head", children: [_jsxs("span", { children: ["\u0421\u0443\u0431\u0430\u0433\u0435\u043D\u0442\u044B (", agents.length, ")"] }), _jsx("button", { type: "button", "aria-label": "\u0417\u0430\u043A\u0440\u044B\u0442\u044C \u0441\u043F\u0438\u0441\u043E\u043A \u0441\u0443\u0431\u0430\u0433\u0435\u043D\u0442\u043E\u0432", title: "\u0417\u0430\u043A\u0440\u044B\u0442\u044C", onClick: onClose, children: _jsx("svg", { viewBox: "0 0 16 16", "aria-hidden": "true", children: _jsx("path", { d: "m4 4 8 8m0-8-8 8" }) }) })] }), _jsx("div", { className: "dsh-qa-agents__list", children: agents.map((agent) => {
28
+ const active = activeId === agent.id;
29
+ return (_jsxs("button", { type: "button", className: active
30
+ ? "dsh-qa-agents__item dsh-qa-agents__item--active"
31
+ : "dsh-qa-agents__item", onClick: () => onView(agent.id, agent.title), children: [_jsx("span", { className: agent.running
32
+ ? "dsh-qa-agents__dot dsh-qa-agents__dot--running"
33
+ : "dsh-qa-agents__dot", "aria-hidden": "true" }), _jsxs("span", { className: "dsh-qa-agents__text", children: [_jsx("span", { className: "dsh-qa-agents__title", children: agent.title }), _jsx("span", { className: "dsh-qa-agents__meta", children: agent.running
34
+ ? "выполняется"
35
+ : agent.completed
36
+ ? "завершён"
37
+ : agent.meta })] }), _jsx("span", { className: "dsh-qa-agents__open", children: active ? "открыт" : "смотреть" })] }, agent.id));
38
+ }) })] }));
39
+ }
40
+ //# sourceMappingURL=QaAgentsDrawer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QaAgentsDrawer.js","sourceRoot":"","sources":["../../../src/client/components/QaAgentsDrawer.tsx"],"names":[],"mappings":"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"}
@@ -1,33 +1,150 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useEffect, useRef, useState } from "react";
3
- export function QaComposer(props) {
2
+ import { memo, useEffect, useLayoutEffect, useRef, useState } from "react";
3
+ /** Raster formats the host attachment path accepts. */
4
+ const IMAGE_MEDIA_TYPES = [
5
+ "image/png",
6
+ "image/jpeg",
7
+ "image/webp",
8
+ "image/gif",
9
+ ];
10
+ /** Soft client-side caps; the Host stays authoritative at admission. */
11
+ const MAX_IMAGES = 8;
12
+ const MAX_FILE_BYTES = 15 * 1024 * 1024;
13
+ let imageDraftSequence = 0;
14
+ function bytesToBase64(bytes) {
15
+ let binary = "";
16
+ for (let index = 0; index < bytes.length; index += 0x8000) {
17
+ binary += String.fromCharCode(...bytes.subarray(index, index + 0x8000));
18
+ }
19
+ return btoa(binary);
20
+ }
21
+ /** FileReader covers runtimes without File.arrayBuffer (jsdom). */
22
+ function readAsArrayBuffer(file) {
23
+ if (typeof file.arrayBuffer === "function")
24
+ return file.arrayBuffer();
25
+ return new Promise((resolve, reject) => {
26
+ const reader = new FileReader();
27
+ reader.onload = () => resolve(reader.result);
28
+ reader.onerror = () => reject(reader.error ?? new Error("read failed"));
29
+ reader.readAsArrayBuffer(file);
30
+ });
31
+ }
32
+ async function fileToImageDraft(file) {
33
+ if (!IMAGE_MEDIA_TYPES.includes(file.type)) {
34
+ return "Поддерживаются изображения PNG, JPEG, WebP и GIF.";
35
+ }
36
+ if (file.size > MAX_FILE_BYTES) {
37
+ return "Изображение слишком большое (лимит 15 МБ).";
38
+ }
39
+ const data = bytesToBase64(new Uint8Array(await readAsArrayBuffer(file)));
40
+ imageDraftSequence += 1;
41
+ return {
42
+ id: `image-${imageDraftSequence}`,
43
+ mediaType: file.type,
44
+ name: file.name === "" ? "изображение" : file.name,
45
+ data,
46
+ previewUrl: URL.createObjectURL(file),
47
+ };
48
+ }
49
+ function ImagePickerIcon() {
50
+ return (_jsxs("svg", { viewBox: "0 0 18 18", "aria-hidden": "true", children: [_jsx("rect", { x: "2.5", y: "3.5", width: "13", height: "11", rx: "2" }), _jsx("circle", { cx: "6.4", cy: "7.4", r: "1.3" }), _jsx("path", { d: "m4 13 3.6-3.6 2 2L12.4 8l2.6 2.6" })] }));
51
+ }
52
+ /**
53
+ * Memoized with the default shallow compare: every prop is a scalar, a
54
+ * stable array or a stable callback, so a stream of transcript frames never
55
+ * re-renders the composer and typing stays responsive while an answer runs.
56
+ */
57
+ export const QaComposer = memo(function QaComposer(props) {
4
58
  const [draft, setDraft] = useState("");
5
59
  const [submitting, setSubmitting] = useState(false);
60
+ const [dragOver, setDragOver] = useState(false);
61
+ const [attachmentError, setAttachmentError] = useState(null);
6
62
  const textarea = useRef(null);
7
- const send = async () => {
8
- if (submitting || draft.trim() === "" || !props.canSend)
63
+ const fileInput = useRef(null);
64
+ const images = props.images;
65
+ const send = async (textOverride) => {
66
+ const text = textOverride ?? draft;
67
+ if (submitting || !props.canSend)
68
+ return;
69
+ if (text.trim() === "" && images.length === 0)
9
70
  return;
10
71
  setSubmitting(true);
11
72
  try {
12
- if (await props.onSend(draft))
13
- setDraft("");
73
+ if (await props.onSend(text, images)) {
74
+ if (textOverride === undefined)
75
+ setDraft("");
76
+ else
77
+ setDraft("");
78
+ props.onImagesChange([]);
79
+ }
14
80
  }
15
81
  finally {
16
82
  setSubmitting(false);
17
83
  textarea.current?.focus();
18
84
  }
19
85
  };
86
+ const addFiles = async (files) => {
87
+ const incoming = [...files];
88
+ if (incoming.length === 0)
89
+ return;
90
+ setAttachmentError(null);
91
+ const room = MAX_IMAGES - images.length;
92
+ if (room <= 0) {
93
+ setAttachmentError(`Не больше ${MAX_IMAGES} изображений на сообщение.`);
94
+ return;
95
+ }
96
+ const drafts = [];
97
+ let error = incoming.length > room
98
+ ? `Не больше ${MAX_IMAGES} изображений на сообщение.`
99
+ : null;
100
+ for (const file of incoming.slice(0, Math.max(0, room))) {
101
+ const draft = await fileToImageDraft(file);
102
+ if (typeof draft === "string")
103
+ error = draft;
104
+ else
105
+ drafts.push(draft);
106
+ }
107
+ if (drafts.length > 0)
108
+ props.onImagesChange([...images, ...drafts]);
109
+ setAttachmentError(error);
110
+ };
20
111
  useEffect(() => {
21
112
  if (!props.running)
22
113
  textarea.current?.focus();
23
114
  }, [props.running]);
24
- return (_jsxs("div", { className: "dsh-qa-composer", children: [_jsx("label", { className: "dsh-qa-sr-only", htmlFor: "dsh-qa-prompt", children: "Ask a question" }), _jsx("textarea", { ref: textarea, id: "dsh-qa-prompt", rows: 1, value: draft, placeholder: props.placeholder, disabled: !props.canSend && !props.running, onChange: (event) => setDraft(event.currentTarget.value), onKeyDown: (event) => {
25
- if (event.key === "Enter" &&
26
- !event.shiftKey &&
27
- !event.nativeEvent.isComposing) {
28
- event.preventDefault();
29
- void send();
30
- }
31
- } }), props.running && props.showStop ? (_jsx("button", { type: "button", className: "dsh-qa-button dsh-qa-button--stop", disabled: !props.canStop, onClick: () => void props.onStop(), children: "Stop" })) : (_jsx("button", { type: "button", className: "dsh-qa-button dsh-qa-button--send", disabled: !props.canSend || submitting || draft.trim() === "", onClick: () => void send(), children: "Send" }))] }));
32
- }
115
+ useLayoutEffect(() => {
116
+ const element = textarea.current;
117
+ if (element === null)
118
+ return;
119
+ element.style.height = "0px";
120
+ element.style.height = `${Math.min(element.scrollHeight, 168)}px`;
121
+ }, [draft]);
122
+ const hasContent = draft.trim() !== "" || images.length > 0;
123
+ return (_jsxs("div", { className: dragOver
124
+ ? "dsh-qa-composer-wrap dsh-qa-composer-wrap--drag"
125
+ : "dsh-qa-composer-wrap", onDragOver: (event) => {
126
+ event.preventDefault();
127
+ setDragOver(true);
128
+ }, onDragLeave: () => setDragOver(false), onDrop: (event) => {
129
+ event.preventDefault();
130
+ setDragOver(false);
131
+ void addFiles(event.dataTransfer.files);
132
+ }, children: [(props.quickQuestions?.length ?? 0) > 0 ? (_jsx("div", { className: "dsh-qa-quick-questions", "aria-label": "\u0411\u044B\u0441\u0442\u0440\u044B\u0435 \u0432\u043E\u043F\u0440\u043E\u0441\u044B", children: props.quickQuestions?.map((question) => (_jsx("button", { type: "button", disabled: !props.canSend || submitting, onClick: () => void send(question), children: question }, question))) })) : null, _jsxs("div", { className: "dsh-qa-composer", children: [images.length === 0 ? null : (_jsx("div", { className: "dsh-qa-composer__images", "aria-label": "\u041F\u0440\u0438\u043A\u0440\u0435\u043F\u043B\u0451\u043D\u043D\u044B\u0435 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F", children: images.map((image) => (_jsxs("span", { className: "dsh-qa-composer__image", children: [_jsx("img", { src: image.previewUrl, alt: image.name }), _jsx("button", { type: "button", "aria-label": `Убрать ${image.name}`, title: "\u0423\u0431\u0440\u0430\u0442\u044C", onClick: () => props.onImagesChange(images.filter((candidate) => candidate.id !== image.id)), children: _jsx("svg", { viewBox: "0 0 16 16", "aria-hidden": "true", children: _jsx("path", { d: "m4 4 8 8m0-8-8 8" }) }) })] }, image.id))) })), attachmentError === null ? null : (_jsx("p", { className: "dsh-qa-composer__attachment-error", role: "alert", children: attachmentError })), _jsx("label", { className: "dsh-qa-sr-only", htmlFor: "dsh-qa-prompt", children: "\u0417\u0430\u0434\u0430\u0442\u044C \u0432\u043E\u043F\u0440\u043E\u0441" }), _jsx("textarea", { ref: textarea, id: "dsh-qa-prompt", rows: 1, value: draft, placeholder: props.placeholder, disabled: !props.canSend && !props.running, onChange: (event) => setDraft(event.currentTarget.value), onPaste: (event) => {
133
+ const files = event.clipboardData?.files;
134
+ if (files !== undefined && files.length > 0) {
135
+ event.preventDefault();
136
+ void addFiles(files);
137
+ }
138
+ }, onKeyDown: (event) => {
139
+ if (event.key === "Enter" &&
140
+ !event.shiftKey &&
141
+ !event.nativeEvent.isComposing) {
142
+ event.preventDefault();
143
+ void send();
144
+ }
145
+ } }), _jsxs("div", { className: "dsh-qa-composer__toolbar", children: [_jsx("input", { ref: fileInput, type: "file", accept: IMAGE_MEDIA_TYPES.join(","), multiple: true, className: "dsh-qa-sr-only", tabIndex: -1, "aria-hidden": "true", onChange: (event) => {
146
+ void addFiles(event.target.files ?? []);
147
+ event.target.value = "";
148
+ } }), _jsx("button", { type: "button", className: "dsh-qa-composer__attach", "aria-label": "\u041F\u0440\u0438\u043A\u0440\u0435\u043F\u0438\u0442\u044C \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F", title: "\u041F\u0440\u0438\u043A\u0440\u0435\u043F\u0438\u0442\u044C \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F", disabled: !props.canSend || images.length >= MAX_IMAGES, onClick: () => fileInput.current?.click(), children: _jsx(ImagePickerIcon, {}) }), _jsx("span", { className: "dsh-qa-composer__hint", "aria-live": "polite", children: props.status ?? "Enter: отправить, Shift+Enter: новая строка" }), props.running && props.showStop ? (_jsx("button", { type: "button", className: "dsh-qa-composer__action dsh-qa-composer__action--stop", "aria-label": "\u041E\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C", title: "\u041E\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C", disabled: !props.canStop, onClick: () => void props.onStop(), children: _jsx("svg", { viewBox: "0 0 18 18", "aria-hidden": "true", children: _jsx("rect", { x: "5.25", y: "5.25", width: "7.5", height: "7.5", rx: "1.5" }) }) })) : (_jsx("button", { type: "button", className: "dsh-qa-composer__action dsh-qa-composer__action--send", "aria-label": "\u041E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C", title: "\u041E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C", disabled: !props.canSend || submitting || !hasContent, onClick: () => void send(), children: _jsx("svg", { viewBox: "0 0 18 18", "aria-hidden": "true", children: _jsx("path", { d: "M9 13.5v-9m0 0L5.5 8M9 4.5 12.5 8" }) }) }))] })] })] }));
149
+ });
33
150
  //# sourceMappingURL=QaComposer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"QaComposer.js","sourceRoot":"","sources":["../../../src/client/components/QaComposer.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAYpD,MAAM,UAAU,UAAU,CAAC,KAAsB;IAC/C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACvC,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,MAAM,CAAsB,IAAI,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;QACtB,IAAI,UAAU,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO;YAAE,OAAO;QAChE,aAAa,CAAC,IAAI,CAAC,CAAC;QACpB,IAAI,CAAC;YACH,IAAI,MAAM,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;gBAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC9C,CAAC;gBAAS,CAAC;YACT,aAAa,CAAC,KAAK,CAAC,CAAC;YACrB,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,KAAK,CAAC,OAAO;YAAE,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;IAChD,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAEpB,OAAO,CACL,eAAK,SAAS,EAAC,iBAAiB,aAC9B,gBAAO,SAAS,EAAC,gBAAgB,EAAC,OAAO,EAAC,eAAe,+BAEjD,EACR,mBACE,GAAG,EAAE,QAAQ,EACb,EAAE,EAAC,eAAe,EAClB,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,QAAQ,EAAE,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,EAC1C,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,EACxD,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;oBACnB,IACE,KAAK,CAAC,GAAG,KAAK,OAAO;wBACrB,CAAC,KAAK,CAAC,QAAQ;wBACf,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,EAC9B,CAAC;wBACD,KAAK,CAAC,cAAc,EAAE,CAAC;wBACvB,KAAK,IAAI,EAAE,CAAC;oBACd,CAAC;gBACH,CAAC,GACD,EACD,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CACjC,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,mCAAmC,EAC7C,QAAQ,EAAE,CAAC,KAAK,CAAC,OAAO,EACxB,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,KAAK,CAAC,MAAM,EAAE,qBAG3B,CACV,CAAC,CAAC,CAAC,CACF,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,mCAAmC,EAC7C,QAAQ,EAAE,CAAC,KAAK,CAAC,OAAO,IAAI,UAAU,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAC7D,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,IAAI,EAAE,qBAGnB,CACV,IACG,CACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"QaComposer.js","sourceRoot":"","sources":["../../../src/client/components/QaComposer.tsx"],"names":[],"mappings":"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"}