@yadsh/dsh-qa-surface 0.8.0 → 0.9.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 (157) hide show
  1. package/README.md +113 -3
  2. package/compatibility.json +5 -0
  3. package/lib/access/capability-catalog.js +32 -3
  4. package/lib/access/capability-catalog.js.map +1 -1
  5. package/lib/access/service.js +45 -17
  6. package/lib/access/service.js.map +1 -1
  7. package/lib/accounts/errors.js.map +1 -1
  8. package/lib/accounts/store.js +14 -0
  9. package/lib/accounts/store.js.map +1 -1
  10. package/lib/admin/permissions.js +4 -0
  11. package/lib/admin/permissions.js.map +1 -1
  12. package/lib/admin/quality-store.js +71 -0
  13. package/lib/admin/quality-store.js.map +1 -1
  14. package/lib/admin/service.js +106 -1
  15. package/lib/admin/service.js.map +1 -1
  16. package/lib/admin/session-log.js +66 -5
  17. package/lib/admin/session-log.js.map +1 -1
  18. package/lib/client/QaSessionController.js +359 -37
  19. package/lib/client/QaSessionController.js.map +1 -1
  20. package/lib/client/QaSurface.js +26 -4
  21. package/lib/client/QaSurface.js.map +1 -1
  22. package/lib/client/QaTranscriptAdapter.js +36 -0
  23. package/lib/client/QaTranscriptAdapter.js.map +1 -1
  24. package/lib/client/admin/QaAdmin.js +9 -1
  25. package/lib/client/admin/QaAdmin.js.map +1 -1
  26. package/lib/client/admin/pages/Conversations.js +33 -7
  27. package/lib/client/admin/pages/Conversations.js.map +1 -1
  28. package/lib/client/admin/shared.js +9 -0
  29. package/lib/client/admin/shared.js.map +1 -1
  30. package/lib/client/admin/styles.js +2 -0
  31. package/lib/client/admin/styles.js.map +1 -1
  32. package/lib/client/audit/QaAuditDialog.js +74 -0
  33. package/lib/client/audit/QaAuditDialog.js.map +1 -0
  34. package/lib/client/audit/QaAuditRowBadge.js +17 -0
  35. package/lib/client/audit/QaAuditRowBadge.js.map +1 -0
  36. package/lib/client/audit/controller.js +39 -0
  37. package/lib/client/audit/controller.js.map +1 -0
  38. package/lib/client/audit/types.js +36 -0
  39. package/lib/client/audit/types.js.map +1 -0
  40. package/lib/client/audit/use-chat-audits.js +139 -0
  41. package/lib/client/audit/use-chat-audits.js.map +1 -0
  42. package/lib/client/components/QaChangelog.js +43 -0
  43. package/lib/client/components/QaChangelog.js.map +1 -1
  44. package/lib/client/components/QaComposer.js +63 -3
  45. package/lib/client/components/QaComposer.js.map +1 -1
  46. package/lib/client/components/QaMessage.js +16 -0
  47. package/lib/client/components/QaMessage.js.map +1 -1
  48. package/lib/client/components/QaQuestions.js +1 -1
  49. package/lib/client/components/QaQuestions.js.map +1 -1
  50. package/lib/client/components/QaSidebar.js +12 -1
  51. package/lib/client/components/QaSidebar.js.map +1 -1
  52. package/lib/client/index.js +22 -2
  53. package/lib/client/index.js.map +1 -1
  54. package/lib/client/project-session-state.js +15 -2
  55. package/lib/client/project-session-state.js.map +1 -1
  56. package/lib/client/prompt-content.js +26 -0
  57. package/lib/client/prompt-content.js.map +1 -1
  58. package/lib/client/settings/card.js +2 -2
  59. package/lib/client/settings/card.js.map +1 -1
  60. package/lib/client/settings/sections/lockdown.js +1 -6
  61. package/lib/client/settings/sections/lockdown.js.map +1 -1
  62. package/lib/client/settings/sections/slash.js +57 -0
  63. package/lib/client/settings/sections/slash.js.map +1 -0
  64. package/lib/client/settings/sections/status.js +9 -1
  65. package/lib/client/settings/sections/status.js.map +1 -1
  66. package/lib/client/settings/sections.js +1 -0
  67. package/lib/client/settings/sections.js.map +1 -1
  68. package/lib/client/slash/SlashPalette.js +48 -0
  69. package/lib/client/slash/SlashPalette.js.map +1 -0
  70. package/lib/client/slash/copy.js +54 -0
  71. package/lib/client/slash/copy.js.map +1 -0
  72. package/lib/client/slash/slash-router.js +49 -0
  73. package/lib/client/slash/slash-router.js.map +1 -0
  74. package/lib/client/slash/useSlashNavigation.js +95 -0
  75. package/lib/client/slash/useSlashNavigation.js.map +1 -0
  76. package/lib/client/styles.js +51 -1
  77. package/lib/client/styles.js.map +1 -1
  78. package/lib/client/types.js +11 -0
  79. package/lib/client/types.js.map +1 -1
  80. package/lib/client.js +4231 -551
  81. package/lib/client.js.map +1 -1
  82. package/lib/config-resolvers/basics.js +11 -2
  83. package/lib/config-resolvers/basics.js.map +1 -1
  84. package/lib/config-resolvers/defaults.js +22 -0
  85. package/lib/config-resolvers/defaults.js.map +1 -1
  86. package/lib/config-resolvers/lockdown.js +8 -2
  87. package/lib/config-resolvers/lockdown.js.map +1 -1
  88. package/lib/config-resolvers/slash-commands.js +60 -0
  89. package/lib/config-resolvers/slash-commands.js.map +1 -0
  90. package/lib/config.js +61 -2
  91. package/lib/config.js.map +1 -1
  92. package/lib/index.js +158 -1
  93. package/lib/index.js.map +1 -1
  94. package/lib/personal-skills/service.js +16 -3
  95. package/lib/personal-skills/service.js.map +1 -1
  96. package/lib/provenance/host-store.js +18 -1
  97. package/lib/provenance/host-store.js.map +1 -1
  98. package/lib/questions.js +90 -43
  99. package/lib/questions.js.map +1 -1
  100. package/lib/resolve-config.js +5 -0
  101. package/lib/resolve-config.js.map +1 -1
  102. package/lib/secure-session.js +24 -0
  103. package/lib/secure-session.js.map +1 -1
  104. package/lib/slash/catalog.js +77 -0
  105. package/lib/slash/catalog.js.map +1 -0
  106. package/lib/slash/matcher.js +100 -0
  107. package/lib/slash/matcher.js.map +1 -0
  108. package/lib/slash/parser.js +79 -0
  109. package/lib/slash/parser.js.map +1 -0
  110. package/lib/slash/policy.js +72 -0
  111. package/lib/slash/policy.js.map +1 -0
  112. package/lib/slash/remotes.js +272 -0
  113. package/lib/slash/remotes.js.map +1 -0
  114. package/lib/typert.host.js +318 -53
  115. package/lib/typert.remote-client.d.ts +7 -1
  116. package/lib/typert.remote-client.js +247 -51
  117. package/lib/types/access/capability-catalog.d.ts +28 -1
  118. package/lib/types/access/service.d.ts +33 -4
  119. package/lib/types/accounts/errors.d.ts +7 -1
  120. package/lib/types/accounts/store.d.ts +12 -0
  121. package/lib/types/admin/quality-store.d.ts +18 -0
  122. package/lib/types/admin/service.d.ts +34 -2
  123. package/lib/types/admin/session-log.d.ts +65 -1
  124. package/lib/types/client/QaSessionController.d.ts +84 -2
  125. package/lib/types/client/QaSurface.d.ts +14 -1
  126. package/lib/types/client/admin/pages/Conversations.d.ts +4 -0
  127. package/lib/types/client/audit/QaAuditDialog.d.ts +21 -0
  128. package/lib/types/client/audit/QaAuditRowBadge.d.ts +18 -0
  129. package/lib/types/client/audit/controller.d.ts +27 -0
  130. package/lib/types/client/audit/types.d.ts +72 -0
  131. package/lib/types/client/audit/use-chat-audits.d.ts +20 -0
  132. package/lib/types/client/components/QaComposer.d.ts +12 -2
  133. package/lib/types/client/components/QaQuestions.d.ts +7 -0
  134. package/lib/types/client/components/QaSidebar.d.ts +8 -0
  135. package/lib/types/client/project-session-state.d.ts +3 -1
  136. package/lib/types/client/prompt-content.d.ts +9 -1
  137. package/lib/types/client/settings/sections/slash.d.ts +16 -0
  138. package/lib/types/client/settings/sections.d.ts +1 -0
  139. package/lib/types/client/slash/SlashPalette.d.ts +24 -0
  140. package/lib/types/client/slash/copy.d.ts +30 -0
  141. package/lib/types/client/slash/slash-router.d.ts +67 -0
  142. package/lib/types/client/slash/useSlashNavigation.d.ts +47 -0
  143. package/lib/types/client/styles.d.ts +9 -0
  144. package/lib/types/client/types.d.ts +16 -1
  145. package/lib/types/config-resolvers/slash-commands.d.ts +20 -0
  146. package/lib/types/index.d.ts +78 -1
  147. package/lib/types/personal-skills/service.d.ts +5 -0
  148. package/lib/types/provenance/host-store.d.ts +13 -0
  149. package/lib/types/questions.d.ts +8 -0
  150. package/lib/types/slash/catalog.d.ts +56 -0
  151. package/lib/types/slash/matcher.d.ts +51 -0
  152. package/lib/types/slash/parser.d.ts +46 -0
  153. package/lib/types/slash/policy.d.ts +40 -0
  154. package/lib/types/slash/remotes.d.ts +35 -0
  155. package/lib/types/types.d.ts +200 -5
  156. package/package.json +7 -3
  157. package/scripts/attach-workspace-sessions.mjs +472 -0
@@ -0,0 +1,48 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { memo } from "react";
3
+ const KIND_LABEL = Object.freeze({ skill: "Навык", command: "Команда" });
4
+ const KIND_GROUP = Object.freeze({ skill: "Навыки", command: "Команды" });
5
+ function groupRows(rows) {
6
+ const groups = [];
7
+ rows.forEach((entry, index) => {
8
+ const tail = groups.at(-1);
9
+ if (tail !== undefined && tail.kind === entry.kind) {
10
+ tail.rows.push({ entry, index });
11
+ return;
12
+ }
13
+ groups.push({ kind: entry.kind, rows: [{ entry, index }] });
14
+ });
15
+ return groups;
16
+ }
17
+ /**
18
+ * The palette itself: a listbox over rows the composer has already filtered
19
+ * and ranked. It owns no state — an empty list means "nothing matches", and
20
+ * the surface line says why when the catalog could not be read at all.
21
+ *
22
+ * Options are picked on `click` and never take focus (`onMouseDown` prevents
23
+ * the default) so the caret stays in the textarea: the keyboard keeps working
24
+ * straight after a click, and Escape still closes what the mouse opened.
25
+ */
26
+ export const QaSlashPalette = memo(function QaSlashPalette(props) {
27
+ const message = props.state === "error"
28
+ ? (props.error ?? "Не удалось загрузить команды")
29
+ : props.state === "loading"
30
+ ? "Загрузка действий…"
31
+ : props.rows.length === 0
32
+ ? "Ничего не найдено"
33
+ : null;
34
+ const groups = groupRows(props.rows);
35
+ return (_jsxs("div", { className: "dsh-qa-slash", role: "listbox", id: `${props.idPrefix}-list`, "aria-label": "\u041D\u0430\u0432\u044B\u043A\u0438 \u0438 \u043A\u043E\u043C\u0430\u043D\u0434\u044B", children: [message === null ? null : (_jsx("p", { className: "dsh-qa-slash__empty", role: "presentation", children: message })), groups.map((group) => (_jsxs("div", { role: "group", "aria-label": KIND_GROUP[group.kind], className: "dsh-qa-slash__group", children: [_jsx("p", { className: "dsh-qa-slash__group-title", role: "presentation", children: KIND_GROUP[group.kind] }), group.rows.map(({ entry, index }) => {
36
+ const selected = entry.id === props.activeId;
37
+ return (_jsxs("div", { id: `${props.idPrefix}-option-${String(index)}`, role: "option", "aria-selected": selected, className: selected
38
+ ? "dsh-qa-slash__row dsh-qa-slash__row--active"
39
+ : "dsh-qa-slash__row", onMouseEnter: () => {
40
+ props.onHover(index);
41
+ }, onMouseDown: (event) => {
42
+ event.preventDefault();
43
+ }, onClick: () => {
44
+ props.onPick(entry);
45
+ }, children: [_jsxs("span", { className: "dsh-qa-slash__head", children: [_jsx("span", { className: "dsh-qa-slash__name", children: `/${entry.name}` }), props.showKindBadge ? (_jsx("span", { className: `dsh-qa-slash__kind dsh-qa-slash__kind--${entry.kind}`, children: KIND_LABEL[entry.kind] })) : null] }), props.showDescriptions && entry.description !== "" ? (_jsx("span", { className: "dsh-qa-slash__description", children: entry.description })) : null] }, entry.id));
46
+ })] }, group.kind))), props.commandSurface === "inactive" && props.rows.length > 0 ? (_jsx("p", { className: "dsh-qa-slash__hint", role: "presentation", children: "\u041A\u043E\u043C\u0430\u043D\u0434\u044B \u043F\u043E\u044F\u0432\u044F\u0442\u0441\u044F, \u043A\u043E\u0433\u0434\u0430 \u0443 \u0447\u0430\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u0430\u043A\u0442\u0438\u0432\u043D\u0430\u044F \u0441\u0435\u0441\u0441\u0438\u044F." })) : null] }));
47
+ });
48
+ //# sourceMappingURL=SlashPalette.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SlashPalette.js","sourceRoot":"","sources":["../../../src/client/slash/SlashPalette.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * The user-facing copy of every slash decision. One module because these
3
+ * strings are the whole interface between a refusal and the person reading it:
4
+ * a refusal that does not say what to do next is indistinguishable from a bug.
5
+ */
6
+ /** The refusal that predates the feature; unchanged, so nothing regresses. */
7
+ export const SLASH_DISABLED_COPY = "Команды со слешем недоступны в режиме помощника.";
8
+ export function slashRefusalCopy(route) {
9
+ switch (route.kind) {
10
+ case "unknown":
11
+ return `Неизвестное действие: /${route.name}. Выберите действие из списка.`;
12
+ case "ambiguous":
13
+ return `Найдены навык и команда с именем /${route.name}. Выберите нужное действие.`;
14
+ case "unavailable":
15
+ return "Список действий сейчас недоступен. Обычные сообщения работают.";
16
+ }
17
+ }
18
+ /**
19
+ * A gesture inside an ordinary prompt that this deployment withholds. Stated
20
+ * as a fact about the deployment, not as a fault of the message, because the
21
+ * message itself is fine — it is one word of it that will not take effect.
22
+ */
23
+ export function slashWithheldCopy(names) {
24
+ const list = names.map((name) => `/${name}`).join(", ");
25
+ return `${list} недоступно в этом чате. Уберите упоминание или включите навык в настройках.`;
26
+ }
27
+ export function slashExecuteFailureCopy(entry) {
28
+ return `Не удалось выполнить /${entry.name}.`;
29
+ }
30
+ /** Copy for a refusal the Host decided, keyed by its reason. */
31
+ export function slashHostRefusalCopy(refusal) {
32
+ const reason = refusal.reason;
33
+ switch (reason) {
34
+ case "slash-disabled":
35
+ return SLASH_DISABLED_COPY;
36
+ case "unknown-command":
37
+ return "Команда больше недоступна.";
38
+ case "not-allowed":
39
+ return "Эта команда запрещена на этом стенде.";
40
+ case "attachments-unsupported":
41
+ return "Эта команда не принимает вложения.";
42
+ case "inactive-session":
43
+ return "Команда доступна только в активном чате.";
44
+ }
45
+ }
46
+ /**
47
+ * Attachments the chosen command refuses. Checked before dispatch so the
48
+ * composer keeps the draft and the files; the Host checks it again and stays
49
+ * the authority.
50
+ */
51
+ export function slashAttachmentsCopy(entry) {
52
+ return `/${entry.name} не принимает вложения.`;
53
+ }
54
+ //# sourceMappingURL=copy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy.js","sourceRoot":"","sources":["../../../src/client/slash/copy.ts"],"names":[],"mappings":"AAOA;;;;GAIG;AAEH,8EAA8E;AAC9E,MAAM,CAAC,MAAM,mBAAmB,GAC9B,kDAAkD,CAAC;AAErD,MAAM,UAAU,gBAAgB,CAC9B,KAGC;IAED,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,SAAS;YACZ,OAAO,0BAA0B,KAAK,CAAC,IAAI,gCAAgC,CAAC;QAC9E,KAAK,WAAW;YACd,OAAO,qCAAqC,KAAK,CAAC,IAAI,6BAA6B,CAAC;QACtF,KAAK,aAAa;YAChB,OAAO,gEAAgE,CAAC;IAC5E,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAwB;IACxD,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxD,OAAO,GAAG,IAAI,8EAA8E,CAAC;AAC/F,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAA0B;IAChE,OAAO,yBAAyB,KAAK,CAAC,IAAI,GAAG,CAAC;AAChD,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,oBAAoB,CAClC,OAAuD;IAEvD,MAAM,MAAM,GAAmB,OAAO,CAAC,MAAM,CAAC;IAC9C,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,gBAAgB;YACnB,OAAO,mBAAmB,CAAC;QAC7B,KAAK,iBAAiB;YACpB,OAAO,4BAA4B,CAAC;QACtC,KAAK,aAAa;YAChB,OAAO,uCAAuC,CAAC;QACjD,KAAK,yBAAyB;YAC5B,OAAO,oCAAoC,CAAC;QAC9C,KAAK,kBAAkB;YACrB,OAAO,0CAA0C,CAAC;IACtD,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAA0B;IAC7D,OAAO,IAAI,KAAK,CAAC,IAAI,yBAAyB,CAAC;AACjD,CAAC"}
@@ -0,0 +1,49 @@
1
+ import { parseSlashLine, skillGestures } from "../../slash/parser.js";
2
+ function entryById(entries, id) {
3
+ if (id === null || id === undefined)
4
+ return undefined;
5
+ return entries.find((entry) => entry.id === id);
6
+ }
7
+ /** Whether a withheld name appears in the text as a native skill gesture. */
8
+ const NO_WITHHELD = Object.freeze([]);
9
+ function withheldInText(text, deniedSkills) {
10
+ if (deniedSkills.length === 0)
11
+ return NO_WITHHELD;
12
+ const denied = new Set(deniedSkills);
13
+ return Object.freeze(skillGestures(text).filter((name) => denied.has(name)));
14
+ }
15
+ export function resolveSlashRoute(input) {
16
+ const line = parseSlashLine(input.text);
17
+ if (line === undefined) {
18
+ // Not a command line. It may still carry a `/name` gesture inside a
19
+ // sentence, which the native skill consumer will act on — say so when the
20
+ // deployment withholds that name.
21
+ const withheld = input.enabled
22
+ ? withheldInText(input.text, input.deniedSkills)
23
+ : Object.freeze([]);
24
+ return withheld.length === 0
25
+ ? { kind: "prompt" }
26
+ : { kind: "prompt", withheld };
27
+ }
28
+ if (!input.enabled)
29
+ return { kind: "disabled" };
30
+ const picked = entryById(input.entries, input.picked);
31
+ if (picked !== undefined && picked.name === line.name) {
32
+ return picked.kind === "skill"
33
+ ? { kind: "skill", entry: picked }
34
+ : { kind: "command", entry: picked };
35
+ }
36
+ if (!input.catalogReady)
37
+ return { kind: "unavailable", name: line.name };
38
+ const candidates = input.entries.filter((entry) => entry.name === line.name);
39
+ const only = candidates[0];
40
+ if (only === undefined)
41
+ return { kind: "unknown", name: line.name };
42
+ if (candidates.length > 1) {
43
+ return { kind: "ambiguous", name: line.name, entries: candidates };
44
+ }
45
+ return only.kind === "skill"
46
+ ? { kind: "skill", entry: only }
47
+ : { kind: "command", entry: only };
48
+ }
49
+ //# sourceMappingURL=slash-router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slash-router.js","sourceRoot":"","sources":["../../../src/client/slash/slash-router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
2
+ import { rankSlashEntries } from "../../slash/matcher.js";
3
+ import { slashPaletteQuery } from "../../slash/parser.js";
4
+ /**
5
+ * Palette state for one composer draft.
6
+ *
7
+ * The palette is a pure function of the draft: it is open while the draft is
8
+ * `/` plus a name still being typed, and closes the moment the user types a
9
+ * space and starts writing arguments. Nothing has to be kept in sync — which
10
+ * is also why switching chats (the composer is keyed by chat and remounts)
11
+ * cannot leave a palette behind.
12
+ *
13
+ * Selection is one index over the filtered rows; the arrow keys, the mouse and
14
+ * the touch screen all move the same number.
15
+ */
16
+ export function useSlashNavigation(options) {
17
+ const { draft, slash, setDraft } = options;
18
+ const [dismissed, setDismissed] = useState(false);
19
+ const [pickedId, setPickedId] = useState(null);
20
+ const [active, setActive] = useState(0);
21
+ const lastReopen = useRef(options.reopen);
22
+ const query = slashPaletteQuery(draft);
23
+ const canOpen = slash.enabled && query !== undefined && !dismissed;
24
+ const open = canOpen;
25
+ useEffect(() => {
26
+ if (lastReopen.current === options.reopen)
27
+ return;
28
+ lastReopen.current = options.reopen;
29
+ setDismissed(false);
30
+ }, [options.reopen]);
31
+ const rows = useMemo(() => {
32
+ if (query === undefined)
33
+ return [];
34
+ return rankSlashEntries(slash.entries, query, {
35
+ fuzzy: options.fuzzySearch,
36
+ }).slice(0, options.maxVisible);
37
+ }, [slash.entries, query, options.fuzzySearch, options.maxVisible]);
38
+ // A new query re-ranks the rows, so the old index may point at a row that is
39
+ // no longer the best match; the first row is always the right anchor.
40
+ useEffect(() => {
41
+ setActive(0);
42
+ }, [query]);
43
+ const bounded = rows.length === 0 ? -1 : Math.min(active, rows.length - 1);
44
+ const activeId = bounded === -1 ? null : (rows[bounded]?.id ?? null);
45
+ const picked = useMemo(() => {
46
+ if (pickedId === null)
47
+ return undefined;
48
+ const entry = slash.entries.find((candidate) => candidate.id === pickedId);
49
+ // The pick survives only while the draft still reads as that invocation;
50
+ // editing the name away retires it and lets the router decide afresh.
51
+ if (entry === undefined)
52
+ return undefined;
53
+ return draft === `/${entry.name}` || draft.startsWith(`/${entry.name} `)
54
+ ? entry
55
+ : undefined;
56
+ }, [pickedId, slash.entries, draft]);
57
+ const insert = useCallback((entry) => {
58
+ setPickedId(entry.id);
59
+ setDismissed(true);
60
+ setDraft(`/${entry.name} `);
61
+ }, [setDraft]);
62
+ return {
63
+ open,
64
+ query: query ?? "",
65
+ rows,
66
+ active: bounded,
67
+ activeId,
68
+ move: (delta) => {
69
+ if (rows.length === 0)
70
+ return;
71
+ setActive((current) => {
72
+ const next = current + delta;
73
+ if (next < 0)
74
+ return rows.length - 1;
75
+ if (next >= rows.length)
76
+ return 0;
77
+ return next;
78
+ });
79
+ },
80
+ hover: (index) => {
81
+ setActive(index);
82
+ },
83
+ pickActive: () => {
84
+ const entry = rows[bounded];
85
+ if (entry !== undefined)
86
+ insert(entry);
87
+ },
88
+ pick: insert,
89
+ dismiss: () => {
90
+ setDismissed(true);
91
+ },
92
+ picked,
93
+ };
94
+ }
95
+ //# sourceMappingURL=useSlashNavigation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSlashNavigation.js","sourceRoot":"","sources":["../../../src/client/slash/useSlashNavigation.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { QA_BLEED_MAX_WIDTH } from "./components/QaWidthHandle.js";
2
2
  import { QA_ADMIN_CONSOLE_STYLES } from "./admin/styles.js";
3
+ import { AUDIT_UI_STYLES } from "@yadsh/dsh-audit-ui";
3
4
  /**
4
5
  * Company interaction palette ("Цвета взаимодействия" guideline) — the single
5
6
  * source of every hard-coded color in this file. The object is emitted once as
@@ -113,6 +114,15 @@ body[data-dsh-qa-surface="active"] div:has(>[data-shell-overlay])>:not([data-she
113
114
  .dsh-qa-sidebar__item-delete{appearance:none;position:absolute;top:50%;right:4px;display:flex;align-items:center;justify-content:center;width:26px;height:26px;border:0;background:var(--dsw-alias-bg-layer-2);cursor:pointer;color:var(--dsw-alias-label-tertiary);padding:5px;border-radius:6px;opacity:0;transform:translateY(-50%);transition:opacity .12s}
114
115
  .dsh-qa-sidebar__item:hover .dsh-qa-sidebar__item-delete,.dsh-qa-sidebar__item-delete:focus-visible,.dsh-qa-sidebar__item-delete--confirm{opacity:1}
115
116
  .dsh-qa-sidebar__item-delete:hover{color:var(--dsw-alias-label-primary)}
117
+ .dsh-qa-sidebar__item-audit{appearance:none;flex:none;display:inline-flex;align-items:center;gap:4px;height:22px;margin-right:4px;padding:0 8px;border:1px solid var(--dsw-alias-border-l2);border-radius:999px;background:var(--dsw-alias-bg-layer-3);color:var(--dsw-alias-label-secondary);font:inherit;font-size:11px;line-height:16px;cursor:pointer;transition:border-color .12s,color .12s}
118
+ .dsh-qa-sidebar__item-audit--with-delete{margin-right:28px}
119
+ .dsh-qa-sidebar__item-audit:hover{border-color:var(--dsw-alias-label-dimmed);color:var(--dsw-alias-label-primary)}
120
+ .dsh-qa-sidebar__item-audit:focus-visible{outline:2px solid var(--dsh-qa-accent);outline-offset:-2px}
121
+ .dsh-qa-sidebar__item-audit-check{width:11px;height:11px;flex:none;color:var(--dsw-alias-state-success-primary)}
122
+ .dsh-qa-sidebar__item-audit-verdict{font-weight:600}
123
+ .dsh-qa-sidebar__item-audit-verdict--good{color:var(--dsw-alias-state-success-primary)}
124
+ .dsh-qa-sidebar__item-audit-verdict--warn{color:var(--dsw-alias-state-warn-primary)}
125
+ .dsh-qa-sidebar__item-audit-verdict--bad{color:var(--dsw-alias-state-error-primary)}
116
126
  .dsh-qa-sidebar__item-delete:focus-visible{outline:2px solid var(--dsh-qa-accent);outline-offset:-2px}
117
127
  .dsh-qa-sidebar__item-delete--confirm{color:var(--dsh-qa-error-hover)}
118
128
  .dsh-qa-sidebar__item-delete svg{width:14px;height:14px;display:block;fill:none;stroke:currentColor;stroke-width:1.3;stroke-linecap:round;stroke-linejoin:round}
@@ -170,6 +180,9 @@ body[data-dsh-qa-surface="active"] div:has(>[data-shell-overlay])>:not([data-she
170
180
  .dsh-qa-modal__close:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}
171
181
  .dsh-qa-modal__close:focus-visible{outline:2px solid var(--dsh-qa-accent);outline-offset:-2px}
172
182
  .dsh-qa-modal__close svg{width:14px;height:14px;fill:none;stroke:currentColor;stroke-width:1.3;stroke-linecap:round;stroke-linejoin:round}
183
+ .dsh-qa-audit-dialog{display:flex;flex-direction:column;min-height:0;height:100%}
184
+ .dsh-qa-audit-dialog__body{flex:1;min-height:0;overflow:auto;padding:16px 18px}
185
+ .dsh-qa-audit-dialog__body .dsh-audit-json{height:100%;min-height:320px}
173
186
  .dsh-qa-modal__body{flex:1;min-height:0;overflow-y:auto;overscroll-behavior:contain;padding:6px 18px 18px}
174
187
  .dsh-qa-modal__footer{display:flex;align-items:center;justify-content:flex-end;gap:8px;flex:none;padding:12px 18px;border-top:1px solid var(--dsw-alias-border-l2)}
175
188
  .dsh-qa-changelog__entry{padding-top:10px}
@@ -728,6 +741,11 @@ a.dsh-qa-srcref:hover,button.dsh-qa-srcref:hover{border-color:var(--dsw-alias-la
728
741
  .dsh-qa-question__button:focus-visible{outline:2px solid var(--dsh-qa-info);outline-offset:1px}
729
742
  .dsh-qa-question__button--primary{border-color:transparent;background:var(--dsh-qa-accent);color:var(--dsh-qa-accent-contrast)}
730
743
  .dsh-qa-question__button--primary:hover:not(:disabled){background:var(--dsh-qa-accent-hover)}
744
+ .dsh-qa-questions__bar{display:flex;align-items:center;justify-content:space-between;gap:8px}
745
+ .dsh-qa-questions__note{min-width:0;color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:17px}
746
+ .dsh-qa-question__button--stop{display:inline-flex;align-items:center;gap:6px;flex:none}
747
+ .dsh-qa-question__button--stop svg{width:13px;height:13px;flex:none;fill:currentColor}
748
+ .dsh-qa-composer-slot[hidden]{display:none}
731
749
  .dsh-qa-footer{position:relative;flex:none;padding:28px 16px max(12px,env(safe-area-inset-bottom));background:linear-gradient(180deg,color-mix(in srgb,var(--dsw-alias-bg-base) 0%,transparent) 0,var(--dsw-alias-bg-base) 28px)}
732
750
  .dsh-qa-footer__inner{width:100%;max-width:var(--dsh-qa-content-width);margin:0 auto}
733
751
  .dsh-qa-composer-wrap{display:flex;flex-direction:column;gap:10px;width:100%}
@@ -762,6 +780,28 @@ a.dsh-qa-srcref:hover,button.dsh-qa-srcref:hover{border-color:var(--dsw-alias-la
762
780
  .dsh-qa-composer__attach:disabled{opacity:.4;cursor:default}
763
781
  .dsh-qa-composer__attach:focus-visible{outline:2px solid var(--dsh-qa-accent);outline-offset:1px}
764
782
  .dsh-qa-composer__attach svg{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:1.3;stroke-linecap:round;stroke-linejoin:round}
783
+ .dsh-qa-slash{display:flex;flex-direction:column;gap:2px;width:100%;max-height:min(46vh,320px);overflow-y:auto;overscroll-behavior:contain;padding:6px;border:1px solid var(--dsw-alias-border-l2);border-radius:16px;background:var(--dsw-alias-bg-layer-2);box-shadow:var(--dsw-shadow-lv2)}
784
+ .dsh-qa-slash__empty,.dsh-qa-slash__hint{margin:0;padding:8px 10px;color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:18px}
785
+ .dsh-qa-slash__group{display:flex;flex-direction:column;gap:2px}
786
+ .dsh-qa-slash__group-title{margin:6px 0 2px;padding:0 10px;color:var(--dsw-alias-label-tertiary);font-size:10px;font-weight:600;letter-spacing:.04em;text-transform:uppercase}
787
+ .dsh-qa-slash__row{display:flex;flex-direction:column;gap:2px;min-width:0;padding:7px 10px;border-radius:10px;cursor:pointer}
788
+ .dsh-qa-slash__row--active{background:var(--dsw-alias-interactive-bg-hover)}
789
+ .dsh-qa-slash__head{display:flex;align-items:center;gap:8px;min-width:0}
790
+ .dsh-qa-slash__name{color:var(--dsw-alias-label-primary);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:13px;font-weight:600;line-height:18px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
791
+ .dsh-qa-slash__kind{flex:none;padding:1px 7px;border-radius:999px;background:var(--dsw-alias-bg-module-platform);color:var(--dsw-alias-label-secondary);font-size:10px;font-weight:500;line-height:15px}
792
+ .dsh-qa-slash__kind--command{background:color-mix(in srgb,var(--dsh-qa-accent) 16%,var(--dsw-alias-bg-module-platform))}
793
+ .dsh-qa-slash__description{color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:17px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
794
+ .dsh-qa-command{display:flex;flex-direction:column;gap:3px;margin:0 0 14px;padding:8px 12px;border-left:2px solid var(--dsw-alias-border-l2);border-radius:0 10px 10px 0;background:var(--dsw-alias-bg-layer-3)}
795
+ .dsh-qa-command[data-state="error"]{border-left-color:var(--dsh-qa-error)}
796
+ .dsh-qa-command__line{display:flex;align-items:baseline;gap:8px;min-width:0}
797
+ .dsh-qa-command__name{color:var(--dsw-alias-label-primary);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:13px;font-weight:600;line-height:18px}
798
+ .dsh-qa-command__args{color:var(--dsw-alias-label-secondary);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;line-height:18px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
799
+ .dsh-qa-command__state{display:flex;align-items:center;gap:6px;color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:17px;overflow-wrap:anywhere}
800
+ .dsh-qa-command__state svg{flex:none;width:12px;height:12px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}
801
+ .dsh-qa-command[data-state="success"] .dsh-qa-command__state svg{stroke:var(--dsh-qa-accent)}
802
+ .dsh-qa-command[data-state="error"] .dsh-qa-command__state{color:var(--dsh-qa-error)}
803
+ .dsh-qa-command__spinner{flex:none;width:11px;height:11px;border:1.5px solid var(--dsw-alias-label-dimmed);border-top-color:var(--dsh-qa-accent);border-radius:999px;animation:dsh-qa-command-spin .7s linear infinite}
804
+ @keyframes dsh-qa-command-spin{to{transform:rotate(360deg)}}
765
805
  .dsh-qa-composer{display:flex;flex-direction:column;gap:10px;width:100%;min-height:94px;padding:14px 10px 8px 16px;border:1px solid var(--dsw-alias-border-l2-darkmode-thin);border-radius:22px;background:var(--dsw-specific-input-major);box-shadow:var(--dsw-shadow-lv2);transition:border-color .12s,box-shadow .12s}
766
806
  .dsh-qa-composer:focus-within{border-color:var(--dsh-qa-accent)}
767
807
  .dsh-qa-composer textarea{display:block;width:100%;min-height:28px;max-height:168px;resize:none;overflow-y:auto;border:0;outline:0;background:transparent;color:var(--dsw-alias-label-primary);font:inherit;font-size:16px;line-height:24px;padding:0 6px 0 0;caret-color:var(--dsh-qa-accent)}
@@ -781,7 +821,17 @@ a.dsh-qa-srcref:hover,button.dsh-qa-srcref:hover{border-color:var(--dsw-alias-la
781
821
  @media (max-width:760px){.dsh-qa-admin__header{min-height:56px;padding:8px 14px}.dsh-qa-admin__layout{grid-template-columns:1fr;grid-template-rows:auto minmax(0,1fr)}.dsh-qa-admin__layout>nav{flex-direction:row;overflow-x:auto;padding:8px;border-right:0;border-bottom:1px solid var(--dsw-alias-border-l2)}.dsh-qa-admin__layout>nav strong{display:none}.dsh-qa-admin__layout>nav button{white-space:nowrap}.dsh-qa-admin__content,.dsh-qa-role-editor{padding:20px 14px 76px}.dsh-qa-admin__title-row{flex-direction:column}.dsh-qa-role-grid{grid-template-columns:1fr}.dsh-qa-role-editor__general{grid-template-columns:1fr}.dsh-qa-role-editor__wide{grid-column:auto}.dsh-qa-admin__savebar{bottom:-76px;margin:24px -14px -76px;padding:10px 14px}.dsh-qa-admin__savebar>span{display:none}.dsh-qa-audit li{grid-template-columns:1fr 1fr}.dsh-qa-capabilities__toolbar{align-items:stretch;flex-direction:column}.dsh-qa-capabilities__toolbar>input{width:100%}}
782
822
  @media (max-width:600px){.dsh-qa-sidebar{display:none}.dsh-qa-panel,.dsh-qa-agents{position:absolute;inset:0;z-index:6;width:100%;border-left:0}.dsh-qa-header__inner{padding-left:16px;padding-right:16px}.dsh-qa-header h1{max-width:48vw}.dsh-qa-header__mode{font-size:12px}.dsh-qa-width-handle{display:none}.dsh-qa-transcript__inner{--dsh-qa-bleed:0px;max-width:100%;padding:16px 16px 28px}.dsh-qa-footer__inner{max-width:100%}.dsh-qa-message{margin-bottom:16px}.dsh-qa-message--user .dsh-qa-message__content{max-width:88%;font-size:15px}.dsh-qa-message__content{font-size:14px}.dsh-qa-footer{padding-left:10px;padding-right:10px;padding-bottom:max(8px,env(safe-area-inset-bottom))}.dsh-qa-composer{min-height:84px;padding-top:12px}.dsh-qa-composer__hint{font-size:0}.dsh-qa-composer__hint::after{content:"Enter: отправить";font-size:11px}}
783
823
  @media (max-height:480px) and (orientation:landscape){.dsh-qa-header__inner{padding-top:6px}.dsh-qa-header__tabs{display:none}.dsh-qa-transcript__inner{padding-top:12px}.dsh-qa-footer{padding-top:12px}.dsh-qa-composer{min-height:72px;gap:4px;padding-top:8px}}
784
- @media (prefers-reduced-motion:reduce){.dsh-qa-message__cursor,.dsh-qa-message__pending-spinner,.dsh-qa-work__spinner,.dsh-qa-work-item__spinner{animation:none}.dsh-qa-work__chevron{transition:none}.dsh-qa-rail__frame,.dsh-qa-rail__pos,.dsh-qa-rail__mark::before,.dsh-qa-rail__mark--busy::before,.dsh-qa-rail__preview{transition:none;animation:none}}
824
+ @media (prefers-reduced-motion:reduce){.dsh-qa-message__cursor,.dsh-qa-message__pending-spinner,.dsh-qa-work__spinner,.dsh-qa-work-item__spinner,.dsh-qa-command__spinner{animation:none}.dsh-qa-work__chevron{transition:none}.dsh-qa-rail__frame,.dsh-qa-rail__pos,.dsh-qa-rail__mark::before,.dsh-qa-rail__mark--busy::before,.dsh-qa-rail__preview{transition:none;animation:none}}
785
825
  ${QA_ADMIN_CONSOLE_STYLES}
786
826
  `;
827
+ /**
828
+ * Everything the QA overlay paints, as one sheet for one `<style>` tag.
829
+ *
830
+ * The shared audit components keep their own stylesheet in
831
+ * `@yadsh/dsh-audit-ui`; it is folded in here so the overlay is self-contained
832
+ * — the audit dialog must look right whether or not the audit plugin's own
833
+ * client bundle happens to have injected the same rules into the document.
834
+ */
835
+ export const QA_OVERLAY_STYLES = `${QA_SURFACE_STYLES}
836
+ ${AUDIT_UI_STYLES}`;
787
837
  //# sourceMappingURL=styles.js.map
@@ -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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBA8Lf,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mJAgDoH,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgYnK,uBAAuB;CACxB,CAAC"}
1
+ {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../src/client/styles.ts"],"names":[],"mappings":"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"}
@@ -15,5 +15,16 @@ export const QA_SESSION_IDLE_STATE = Object.freeze({
15
15
  viewingSubagent: null,
16
16
  approvals: Object.freeze([]),
17
17
  questions: Object.freeze([]),
18
+ // Idle means no chat, so there is nothing for a slash line to act on; the
19
+ // controller fills this in once a session binds.
20
+ slash: Object.freeze({
21
+ enabled: false,
22
+ state: "idle",
23
+ entries: Object.freeze([]),
24
+ commandSurface: "unavailable",
25
+ deniedSkills: Object.freeze([]),
26
+ error: null,
27
+ reopen: 0,
28
+ }),
18
29
  });
19
30
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"AAgbA,iFAAiF;AACjF,MAAM,CAAC,MAAM,qBAAqB,GAAmB,MAAM,CAAC,MAAM,CAAC;IACjE,KAAK,EAAE,MAAM;IACb,SAAS,EAAE,IAAI;IACf,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;IAC3B,cAAc,EAAE,IAAI;IACpB,KAAK,EAAE,IAAI;IACX,qBAAqB,EAAE,KAAK;IAC5B,OAAO,EAAE,KAAK;IACd,OAAO,EAAE,KAAK;IACd,aAAa,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;IAC1B,eAAe,EAAE,IAAI;IACrB,uBAAuB,EAAE,SAAS;IAClC,eAAe,EAAE,IAAI;IACrB,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;CAC7B,CAAC,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"AA+cA,iFAAiF;AACjF,MAAM,CAAC,MAAM,qBAAqB,GAAmB,MAAM,CAAC,MAAM,CAAC;IACjE,KAAK,EAAE,MAAM;IACb,SAAS,EAAE,IAAI;IACf,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;IAC3B,cAAc,EAAE,IAAI;IACpB,KAAK,EAAE,IAAI;IACX,qBAAqB,EAAE,KAAK;IAC5B,OAAO,EAAE,KAAK;IACd,OAAO,EAAE,KAAK;IACd,aAAa,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;IAC1B,eAAe,EAAE,IAAI;IACrB,uBAAuB,EAAE,SAAS;IAClC,eAAe,EAAE,IAAI;IACrB,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;IAC5B,0EAA0E;IAC1E,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;QACnB,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,MAAM;QACb,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,cAAc,EAAE,aAAa;QAC7B,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/B,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,CAAC;KACV,CAAC;CACH,CAAC,CAAC"}