@yadsh/dsh-qa-surface 0.7.4 → 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.
- package/README.md +169 -12
- package/compatibility.json +5 -0
- package/lib/access/capability-catalog.js +32 -3
- package/lib/access/capability-catalog.js.map +1 -1
- package/lib/access/model.js +24 -4
- package/lib/access/model.js.map +1 -1
- package/lib/access/role-repository.js +199 -91
- package/lib/access/role-repository.js.map +1 -1
- package/lib/access/service.js +223 -7
- package/lib/access/service.js.map +1 -1
- package/lib/account-remotes.js +2 -4
- package/lib/account-remotes.js.map +1 -1
- package/lib/accounts/database.js +447 -0
- package/lib/accounts/database.js.map +1 -0
- package/lib/accounts/errors.js.map +1 -1
- package/lib/accounts/file.js +27 -90
- package/lib/accounts/file.js.map +1 -1
- package/lib/accounts/store.js +224 -59
- package/lib/accounts/store.js.map +1 -1
- package/lib/admin/permissions.js +4 -0
- package/lib/admin/permissions.js.map +1 -1
- package/lib/admin/quality-store.js +270 -54
- package/lib/admin/quality-store.js.map +1 -1
- package/lib/admin/service.js +145 -7
- package/lib/admin/service.js.map +1 -1
- package/lib/admin/session-log.js +66 -5
- package/lib/admin/session-log.js.map +1 -1
- package/lib/cli.js +2 -1
- package/lib/cli.js.map +1 -1
- package/lib/client/QaSessionController.js +379 -39
- package/lib/client/QaSessionController.js.map +1 -1
- package/lib/client/QaSurface.js +94 -34
- package/lib/client/QaSurface.js.map +1 -1
- package/lib/client/QaTranscriptAdapter.js +40 -0
- package/lib/client/QaTranscriptAdapter.js.map +1 -1
- package/lib/client/admin/QaAdmin.js +26 -8
- package/lib/client/admin/QaAdmin.js.map +1 -1
- package/lib/client/admin/{format.js → copy.js} +1 -1
- package/lib/client/admin/copy.js.map +1 -0
- package/lib/client/admin/pages/Conversations.js +34 -8
- package/lib/client/admin/pages/Conversations.js.map +1 -1
- package/lib/client/admin/pages/Overview.js +1 -1
- package/lib/client/admin/pages/Overview.js.map +1 -1
- package/lib/client/admin/pages/Quality.js +1 -1
- package/lib/client/admin/pages/Quality.js.map +1 -1
- package/lib/client/admin/pages/Review.js +1 -1
- package/lib/client/admin/pages/Review.js.map +1 -1
- package/lib/client/admin/pages/Users.js +6 -2
- package/lib/client/admin/pages/Users.js.map +1 -1
- package/lib/client/admin/shared.js +10 -1
- package/lib/client/admin/shared.js.map +1 -1
- package/lib/client/admin/styles.js +2 -0
- package/lib/client/admin/styles.js.map +1 -1
- package/lib/client/audit/QaAuditDialog.js +74 -0
- package/lib/client/audit/QaAuditDialog.js.map +1 -0
- package/lib/client/audit/QaAuditRowBadge.js +17 -0
- package/lib/client/audit/QaAuditRowBadge.js.map +1 -0
- package/lib/client/audit/controller.js +39 -0
- package/lib/client/audit/controller.js.map +1 -0
- package/lib/client/audit/types.js +36 -0
- package/lib/client/audit/types.js.map +1 -0
- package/lib/client/audit/use-chat-audits.js +139 -0
- package/lib/client/audit/use-chat-audits.js.map +1 -0
- package/lib/client/components/Markdown.js +14 -206
- package/lib/client/components/Markdown.js.map +1 -1
- package/lib/client/components/QaChangelog.js +91 -0
- package/lib/client/components/QaChangelog.js.map +1 -1
- package/lib/client/components/QaComposer.js +63 -3
- package/lib/client/components/QaComposer.js.map +1 -1
- package/lib/client/components/QaHeader.js +1 -3
- package/lib/client/components/QaHeader.js.map +1 -1
- package/lib/client/components/QaMessage.js +25 -4
- package/lib/client/components/QaMessage.js.map +1 -1
- package/lib/client/components/QaQuestions.js +1 -1
- package/lib/client/components/QaQuestions.js.map +1 -1
- package/lib/client/components/QaSidebar.js +17 -3
- package/lib/client/components/QaSidebar.js.map +1 -1
- package/lib/client/components/QaSourcesPanel.js +3 -18
- package/lib/client/components/QaSourcesPanel.js.map +1 -1
- package/lib/client/components/QaWorkGroup.js +4 -8
- package/lib/client/components/QaWorkGroup.js.map +1 -1
- package/lib/client/components/source-icon.js +26 -0
- package/lib/client/components/source-icon.js.map +1 -0
- package/lib/client/components/thinking-phrases.js +2 -11
- package/lib/client/components/thinking-phrases.js.map +1 -1
- package/lib/client/components/use-now.js +21 -0
- package/lib/client/components/use-now.js.map +1 -0
- package/lib/client/index.js +33 -5
- package/lib/client/index.js.map +1 -1
- package/lib/client/lineage.js +18 -0
- package/lib/client/lineage.js.map +1 -0
- package/lib/client/markdown/CodeBlock.js +28 -0
- package/lib/client/markdown/CodeBlock.js.map +1 -0
- package/lib/client/markdown/blocks.js +342 -0
- package/lib/client/markdown/blocks.js.map +1 -0
- package/lib/client/markdown/highlight.js +1089 -0
- package/lib/client/markdown/highlight.js.map +1 -0
- package/lib/client/markdown/inline.js +377 -0
- package/lib/client/markdown/inline.js.map +1 -0
- package/lib/client/markdown/render.js +147 -0
- package/lib/client/markdown/render.js.map +1 -0
- package/lib/client/markdown/source-chip.js +55 -0
- package/lib/client/markdown/source-chip.js.map +1 -0
- package/lib/client/markdown/use-transient-flag.js +27 -0
- package/lib/client/markdown/use-transient-flag.js.map +1 -0
- package/lib/client/project-session-state.js +15 -2
- package/lib/client/project-session-state.js.map +1 -1
- package/lib/client/prompt-content.js +26 -0
- package/lib/client/prompt-content.js.map +1 -1
- package/lib/client/role/RoleSelector.js +11 -2
- package/lib/client/role/RoleSelector.js.map +1 -1
- package/lib/client/role/preview.js +123 -0
- package/lib/client/role/preview.js.map +1 -0
- package/lib/client/settings/card.js +2 -2
- package/lib/client/settings/card.js.map +1 -1
- package/lib/client/settings/sections/lockdown.js +1 -6
- package/lib/client/settings/sections/lockdown.js.map +1 -1
- package/lib/client/settings/sections/slash.js +57 -0
- package/lib/client/settings/sections/slash.js.map +1 -0
- package/lib/client/settings/sections/status.js +9 -1
- package/lib/client/settings/sections/status.js.map +1 -1
- package/lib/client/settings/sections.js +1 -0
- package/lib/client/settings/sections.js.map +1 -1
- package/lib/client/slash/SlashPalette.js +48 -0
- package/lib/client/slash/SlashPalette.js.map +1 -0
- package/lib/client/slash/copy.js +54 -0
- package/lib/client/slash/copy.js.map +1 -0
- package/lib/client/slash/slash-router.js +49 -0
- package/lib/client/slash/slash-router.js.map +1 -0
- package/lib/client/slash/useSlashNavigation.js +95 -0
- package/lib/client/slash/useSlashNavigation.js.map +1 -0
- package/lib/client/styles.js +124 -20
- package/lib/client/styles.js.map +1 -1
- package/lib/client/types.js +11 -0
- package/lib/client/types.js.map +1 -1
- package/lib/client.js +7615 -1567
- package/lib/client.js.map +1 -1
- package/lib/config-resolvers/accounts.js +15 -0
- package/lib/config-resolvers/accounts.js.map +1 -1
- package/lib/config-resolvers/basics.js +11 -2
- package/lib/config-resolvers/basics.js.map +1 -1
- package/lib/config-resolvers/defaults.js +30 -0
- package/lib/config-resolvers/defaults.js.map +1 -1
- package/lib/config-resolvers/lockdown.js +8 -2
- package/lib/config-resolvers/lockdown.js.map +1 -1
- package/lib/config-resolvers/slash-commands.js +60 -0
- package/lib/config-resolvers/slash-commands.js.map +1 -0
- package/lib/config-resolvers/sources.js +16 -0
- package/lib/config-resolvers/sources.js.map +1 -1
- package/lib/config.js +118 -2
- package/lib/config.js.map +1 -1
- package/lib/index.js +183 -11
- package/lib/index.js.map +1 -1
- package/lib/lockdown-policy.js +19 -0
- package/lib/lockdown-policy.js.map +1 -1
- package/lib/personal-skills/service.js +16 -3
- package/lib/personal-skills/service.js.map +1 -1
- package/lib/provenance/host-store.js +25 -4
- package/lib/provenance/host-store.js.map +1 -1
- package/lib/provenance/retention.js +25 -0
- package/lib/provenance/retention.js.map +1 -0
- package/lib/provenance/snapshot-store.js +290 -35
- package/lib/provenance/snapshot-store.js.map +1 -1
- package/lib/questions.js +98 -38
- package/lib/questions.js.map +1 -1
- package/lib/resolve-config.js +5 -0
- package/lib/resolve-config.js.map +1 -1
- package/lib/secure-session.js +139 -21
- package/lib/secure-session.js.map +1 -1
- package/lib/slash/catalog.js +77 -0
- package/lib/slash/catalog.js.map +1 -0
- package/lib/slash/matcher.js +100 -0
- package/lib/slash/matcher.js.map +1 -0
- package/lib/slash/parser.js +79 -0
- package/lib/slash/parser.js.map +1 -0
- package/lib/slash/policy.js +72 -0
- package/lib/slash/policy.js.map +1 -0
- package/lib/slash/remotes.js +272 -0
- package/lib/slash/remotes.js.map +1 -0
- package/lib/typert.host.js +348 -56
- package/lib/typert.remote-client.d.ts +7 -1
- package/lib/typert.remote-client.js +274 -51
- package/lib/types/access/capability-catalog.d.ts +28 -1
- package/lib/types/access/role-repository.d.ts +38 -7
- package/lib/types/access/service.d.ts +106 -3
- package/lib/types/account-remotes.d.ts +8 -4
- package/lib/types/accounts/database.d.ts +84 -0
- package/lib/types/accounts/errors.d.ts +7 -1
- package/lib/types/accounts/file.d.ts +17 -39
- package/lib/types/accounts/store.d.ts +110 -19
- package/lib/types/admin/quality-store.d.ts +38 -2
- package/lib/types/admin/service.d.ts +34 -2
- package/lib/types/admin/session-log.d.ts +65 -1
- package/lib/types/client/QaSessionController.d.ts +84 -2
- package/lib/types/client/QaSurface.d.ts +14 -1
- package/lib/types/client/admin/{format.d.ts → copy.d.ts} +1 -1
- package/lib/types/client/admin/pages/Conversations.d.ts +4 -0
- package/lib/types/client/audit/QaAuditDialog.d.ts +21 -0
- package/lib/types/client/audit/QaAuditRowBadge.d.ts +18 -0
- package/lib/types/client/audit/controller.d.ts +27 -0
- package/lib/types/client/audit/types.d.ts +72 -0
- package/lib/types/client/audit/use-chat-audits.d.ts +20 -0
- package/lib/types/client/components/Markdown.d.ts +7 -8
- package/lib/types/client/components/QaComposer.d.ts +12 -2
- package/lib/types/client/components/QaQuestions.d.ts +7 -0
- package/lib/types/client/components/QaSidebar.d.ts +11 -1
- package/lib/types/client/components/QaSourcesPanel.d.ts +1 -3
- package/lib/types/client/components/source-icon.d.ts +12 -0
- package/lib/types/client/components/use-now.d.ts +8 -0
- package/lib/types/client/lineage.d.ts +15 -0
- package/lib/types/client/markdown/CodeBlock.d.ts +14 -0
- package/lib/types/client/markdown/blocks.d.ts +74 -0
- package/lib/types/client/markdown/highlight.d.ts +29 -0
- package/lib/types/client/markdown/inline.d.ts +40 -0
- package/lib/types/client/markdown/render.d.ts +13 -0
- package/lib/types/client/markdown/source-chip.d.ts +32 -0
- package/lib/types/client/markdown/use-transient-flag.d.ts +12 -0
- package/lib/types/client/project-session-state.d.ts +3 -1
- package/lib/types/client/prompt-content.d.ts +9 -1
- package/lib/types/client/role/RoleSelector.d.ts +11 -1
- package/lib/types/client/role/preview.d.ts +109 -0
- package/lib/types/client/settings/sections/slash.d.ts +16 -0
- package/lib/types/client/settings/sections.d.ts +1 -0
- package/lib/types/client/slash/SlashPalette.d.ts +24 -0
- package/lib/types/client/slash/copy.d.ts +30 -0
- package/lib/types/client/slash/slash-router.d.ts +67 -0
- package/lib/types/client/slash/useSlashNavigation.d.ts +47 -0
- package/lib/types/client/styles.d.ts +9 -0
- package/lib/types/client/types.d.ts +16 -1
- package/lib/types/config-resolvers/slash-commands.d.ts +20 -0
- package/lib/types/index.d.ts +83 -2
- package/lib/types/lockdown-policy.d.ts +16 -0
- package/lib/types/personal-skills/service.d.ts +5 -0
- package/lib/types/provenance/host-store.d.ts +20 -3
- package/lib/types/provenance/retention.d.ts +46 -0
- package/lib/types/provenance/snapshot-store.d.ts +63 -7
- package/lib/types/questions.d.ts +13 -0
- package/lib/types/secure-session.d.ts +27 -1
- package/lib/types/slash/catalog.d.ts +56 -0
- package/lib/types/slash/matcher.d.ts +51 -0
- package/lib/types/slash/parser.d.ts +46 -0
- package/lib/types/slash/policy.d.ts +40 -0
- package/lib/types/slash/remotes.d.ts +35 -0
- package/lib/types/types.d.ts +254 -5
- package/package.json +9 -5
- package/scripts/attach-workspace-sessions.mjs +472 -0
- package/lib/client/admin/format.js.map +0 -1
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reading which chats have an audit, and loading one on demand.
|
|
3
|
+
*
|
|
4
|
+
* The badge is a property of the chat list, so the summaries are polled for
|
|
5
|
+
* the whole visible list in one pass — one cheap `sessionAudit/summary` per
|
|
6
|
+
* chat, which is a map lookup on the host. The documents behind a badge are
|
|
7
|
+
* fetched only when its dialog opens, so a sidebar with audits in it costs
|
|
8
|
+
* nothing like a sidebar with audits rendered.
|
|
9
|
+
*/
|
|
10
|
+
import { useCallback, useEffect, useRef, useState } from "react";
|
|
11
|
+
import { startVisibilityAwarePolling } from "@yadsh/dsh-plugin-kit/client";
|
|
12
|
+
/** How often the chat list re-asks which chats have an audit. */
|
|
13
|
+
export const AUDIT_POLL_MS = 30_000;
|
|
14
|
+
/**
|
|
15
|
+
* Poll the audit summary for every chat id.
|
|
16
|
+
*
|
|
17
|
+
* @param api - the Remote facade, or `null` when the audit plugin is absent.
|
|
18
|
+
* @param sessionIds - the chats currently listed.
|
|
19
|
+
*/
|
|
20
|
+
export function useChatAudits(api, sessionIds) {
|
|
21
|
+
const [audits, setAudits] = useState(() => new Map());
|
|
22
|
+
// The ids move with every transcript frame, so they are read through a ref
|
|
23
|
+
// rather than restarting the poll.
|
|
24
|
+
const idsRef = useRef(sessionIds);
|
|
25
|
+
idsRef.current = sessionIds;
|
|
26
|
+
const alive = useRef(true);
|
|
27
|
+
const refresh = useCallback(async () => {
|
|
28
|
+
if (api === null)
|
|
29
|
+
return;
|
|
30
|
+
const ids = idsRef.current;
|
|
31
|
+
if (ids.length === 0) {
|
|
32
|
+
if (alive.current)
|
|
33
|
+
setAudits(new Map());
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const settled = await Promise.all(ids.map(async (id) => {
|
|
37
|
+
try {
|
|
38
|
+
return [id, await api.summary(id)];
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// One chat's summary failing is not the whole list failing, and a
|
|
42
|
+
// transient failure must not drop the badges already shown.
|
|
43
|
+
return [id, null];
|
|
44
|
+
}
|
|
45
|
+
}));
|
|
46
|
+
if (!alive.current)
|
|
47
|
+
return;
|
|
48
|
+
setAudits((current) => {
|
|
49
|
+
const next = new Map();
|
|
50
|
+
for (const [id, summary] of settled) {
|
|
51
|
+
if (summary === null) {
|
|
52
|
+
const previous = current.get(id);
|
|
53
|
+
if (previous !== undefined)
|
|
54
|
+
next.set(id, previous);
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
if (summary.available)
|
|
58
|
+
next.set(id, summary);
|
|
59
|
+
}
|
|
60
|
+
return sameMap(current, next) ? current : next;
|
|
61
|
+
});
|
|
62
|
+
}, [api]);
|
|
63
|
+
useEffect(() => {
|
|
64
|
+
alive.current = true;
|
|
65
|
+
void refresh();
|
|
66
|
+
const stop = startVisibilityAwarePolling(() => refresh(), AUDIT_POLL_MS);
|
|
67
|
+
return () => {
|
|
68
|
+
alive.current = false;
|
|
69
|
+
stop();
|
|
70
|
+
};
|
|
71
|
+
}, [refresh]);
|
|
72
|
+
return audits;
|
|
73
|
+
}
|
|
74
|
+
/** Reference-equal when nothing a reader would see moved. */
|
|
75
|
+
function sameMap(left, right) {
|
|
76
|
+
if (left.size !== right.size)
|
|
77
|
+
return false;
|
|
78
|
+
for (const [id, summary] of right) {
|
|
79
|
+
const other = left.get(id);
|
|
80
|
+
if (other === undefined)
|
|
81
|
+
return false;
|
|
82
|
+
if (other.verdict !== summary.verdict ||
|
|
83
|
+
other.critical !== summary.critical ||
|
|
84
|
+
other.major !== summary.major ||
|
|
85
|
+
other.minor !== summary.minor ||
|
|
86
|
+
other.observation !== summary.observation ||
|
|
87
|
+
other.other !== summary.other ||
|
|
88
|
+
other.modifiedAt !== summary.modifiedAt) {
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
export function useSessionAuditDocument(api, sessionId, open,
|
|
95
|
+
/** Reload key; the summary's `modifiedAt` changes exactly when bytes do. */
|
|
96
|
+
modifiedAt) {
|
|
97
|
+
const [state, setState] = useState({
|
|
98
|
+
loading: false,
|
|
99
|
+
audit: null,
|
|
100
|
+
error: null,
|
|
101
|
+
});
|
|
102
|
+
const alive = useRef(true);
|
|
103
|
+
useEffect(() => {
|
|
104
|
+
alive.current = true;
|
|
105
|
+
if (!open || api === null || sessionId === null) {
|
|
106
|
+
setState({ loading: false, audit: null, error: null });
|
|
107
|
+
return () => {
|
|
108
|
+
alive.current = false;
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
setState({ loading: true, audit: null, error: null });
|
|
112
|
+
void (async () => {
|
|
113
|
+
try {
|
|
114
|
+
const audit = await api.audit(sessionId);
|
|
115
|
+
if (!alive.current)
|
|
116
|
+
return;
|
|
117
|
+
setState({
|
|
118
|
+
loading: false,
|
|
119
|
+
audit: audit.available ? audit : null,
|
|
120
|
+
error: null,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
if (!alive.current)
|
|
125
|
+
return;
|
|
126
|
+
setState({
|
|
127
|
+
loading: false,
|
|
128
|
+
audit: null,
|
|
129
|
+
error: error instanceof Error ? error.message : String(error),
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
})();
|
|
133
|
+
return () => {
|
|
134
|
+
alive.current = false;
|
|
135
|
+
};
|
|
136
|
+
}, [api, sessionId, open, modifiedAt]);
|
|
137
|
+
return state;
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=use-chat-audits.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-chat-audits.js","sourceRoot":"","sources":["../../../src/client/audit/use-chat-audits.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,213 +1,21 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { memo,
|
|
3
|
-
import {
|
|
4
|
-
import { sourceFileName } from "./source-refs.js";
|
|
5
|
-
const INLINE = /(\[[^\]]+\]\([^\s)]+\)|`[^`]+`|\*\*[^*]+\*\*|\*[^*]+\*)/gu;
|
|
6
|
-
const TABLE_SEPARATOR = /^\s*\|?\s*:?-{2,}:?\s*(\|\s*:?-{2,}:?\s*)*\|?\s*$/u;
|
|
7
|
-
const ORDERED_LIST = /^\d{1,3}[.)]\s+/u;
|
|
8
|
-
const HORIZONTAL_RULE = /^\s*(?:-{3,}|\*{3,}|_{3,})\s*$/u;
|
|
9
|
-
const BLOCK_START = /^(#{1,3})\s+|```|^[-*]\s+|^\d{1,3}[.)]\s+|^>\s|(?:^\s*(?:-{3,}|\*{3,}|_{3,})\s*$)/u;
|
|
10
|
-
function safeHref(value) {
|
|
11
|
-
try {
|
|
12
|
-
const url = new URL(value);
|
|
13
|
-
return ["http:", "https:", "mailto:"].includes(url.protocol)
|
|
14
|
-
? value
|
|
15
|
-
: undefined;
|
|
16
|
-
}
|
|
17
|
-
catch {
|
|
18
|
-
return undefined;
|
|
19
|
-
}
|
|
20
|
-
}
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { memo, useMemo } from "react";
|
|
3
|
+
import { renderMarkdown } from "../markdown/render.js";
|
|
21
4
|
/**
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
|
|
27
|
-
function SourceChip({ source, label, href, onOpen, }) {
|
|
28
|
-
const target = source.path ?? source.uri ?? source.title;
|
|
29
|
-
const face = (_jsxs(_Fragment, { children: [_jsx("span", { className: "dsh-qa-srcref__icon", "data-kind": source.kind, children: _jsx(SourceIcon, { kind: source.kind }) }), _jsx("span", { className: "dsh-qa-srcref__label", children: label }), _jsxs("span", { className: "dsh-qa-srcref__card", "aria-hidden": "true", children: [_jsxs("span", { className: "dsh-qa-srcref__card-title", children: [_jsx("span", { className: "dsh-qa-srcref__icon", "data-kind": source.kind, children: _jsx(SourceIcon, { kind: source.kind }) }), source.title || label] }), _jsx("span", { className: "dsh-qa-srcref__card-target", children: target }), source.snippet === undefined ? null : (_jsx("span", { className: "dsh-qa-srcref__card-snippet", children: source.snippet }))] })] }));
|
|
30
|
-
if (href !== undefined) {
|
|
31
|
-
return (_jsx("a", { className: "dsh-qa-srcref", "data-kind": source.kind, href: href, target: "_blank", rel: "noopener noreferrer", children: face }));
|
|
32
|
-
}
|
|
33
|
-
return (_jsx("button", { type: "button", className: "dsh-qa-srcref", "data-kind": source.kind, onClick: onOpen === undefined ? undefined : () => onOpen(source), children: face }));
|
|
34
|
-
}
|
|
35
|
-
function inline(text, keyPrefix, sources = {}) {
|
|
36
|
-
const nodes = [];
|
|
37
|
-
let offset = 0;
|
|
38
|
-
for (const match of text.matchAll(INLINE)) {
|
|
39
|
-
const index = match.index;
|
|
40
|
-
if (index > offset)
|
|
41
|
-
nodes.push(text.slice(offset, index));
|
|
42
|
-
const token = match[0];
|
|
43
|
-
const key = `${keyPrefix}:${index}`;
|
|
44
|
-
if (token.startsWith("[")) {
|
|
45
|
-
const parts = /^\[([^\]]+)\]\(([^\s)]+)\)$/u.exec(token);
|
|
46
|
-
const href = parts?.[2] === undefined ? undefined : safeHref(parts[2]);
|
|
47
|
-
if (href === undefined) {
|
|
48
|
-
nodes.push(token);
|
|
49
|
-
}
|
|
50
|
-
else {
|
|
51
|
-
const source = sources.refs?.resolveUrl(href);
|
|
52
|
-
nodes.push(source === undefined ? (_jsx("a", { href: href, target: "_blank", rel: "noreferrer", children: parts?.[1] }, key)) : (_jsx(SourceChip, { source: source, label: parts?.[1] || source.title, href: href }, key)));
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
else if (token.startsWith("`")) {
|
|
56
|
-
const value = token.slice(1, -1);
|
|
57
|
-
const source = sources.refs?.resolvePath(value);
|
|
58
|
-
if (source === undefined) {
|
|
59
|
-
nodes.push(_jsx("code", { children: value }, key));
|
|
60
|
-
}
|
|
61
|
-
else if (source.path === undefined) {
|
|
62
|
-
nodes.push(_jsx(SourceChip, { source: source, label: source.title || value, href: safeHref(source.uri ?? "") }, key));
|
|
63
|
-
}
|
|
64
|
-
else if (sources.onSourceOpen === undefined) {
|
|
65
|
-
nodes.push(_jsx("code", { children: value }, key));
|
|
66
|
-
}
|
|
67
|
-
else {
|
|
68
|
-
nodes.push(_jsx(SourceChip, { source: source, label: sourceFileName(source), onOpen: sources.onSourceOpen }, key));
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
else if (token.startsWith("**")) {
|
|
72
|
-
nodes.push(_jsx("strong", { children: token.slice(2, -2) }, key));
|
|
73
|
-
}
|
|
74
|
-
else {
|
|
75
|
-
nodes.push(_jsx("em", { children: token.slice(1, -1) }, key));
|
|
76
|
-
}
|
|
77
|
-
offset = index + token.length;
|
|
78
|
-
}
|
|
79
|
-
if (offset < text.length)
|
|
80
|
-
nodes.push(text.slice(offset));
|
|
81
|
-
return nodes;
|
|
82
|
-
}
|
|
83
|
-
/** Split one GFM table row into trimmed cells, honoring escaped pipes. */
|
|
84
|
-
function splitTableRow(line) {
|
|
85
|
-
let row = line.trim();
|
|
86
|
-
if (row.startsWith("|"))
|
|
87
|
-
row = row.slice(1);
|
|
88
|
-
if (row.endsWith("|") && !row.endsWith("\\|"))
|
|
89
|
-
row = row.slice(0, -1);
|
|
90
|
-
return row
|
|
91
|
-
.split(/(?<!\\)\|/u)
|
|
92
|
-
.map((cell) => cell.trim().replace(/\\\|/gu, "|"));
|
|
93
|
-
}
|
|
94
|
-
function isTableStart(lines, index) {
|
|
95
|
-
const header = lines[index] ?? "";
|
|
96
|
-
if (!header.includes("|"))
|
|
97
|
-
return false;
|
|
98
|
-
return TABLE_SEPARATOR.test(lines[index + 1] ?? "");
|
|
99
|
-
}
|
|
100
|
-
function renderTable(lines, index, sources) {
|
|
101
|
-
const header = splitTableRow(lines[index] ?? "");
|
|
102
|
-
const aligns = splitTableRow(lines[index + 1] ?? "").map((cell) => {
|
|
103
|
-
const left = cell.startsWith(":");
|
|
104
|
-
const right = cell.endsWith(":");
|
|
105
|
-
if (left && right)
|
|
106
|
-
return "center";
|
|
107
|
-
return right ? "right" : "left";
|
|
108
|
-
});
|
|
109
|
-
let cursor = index + 2;
|
|
110
|
-
const rows = [];
|
|
111
|
-
while (cursor < lines.length &&
|
|
112
|
-
(lines[cursor] ?? "").trim() !== "" &&
|
|
113
|
-
(lines[cursor] ?? "").includes("|") &&
|
|
114
|
-
!/^(#{1,3})\s+|```|^[-*]\s+|^\d{1,3}[.)]\s+|^>\s/u.test(lines[cursor] ?? "")) {
|
|
115
|
-
rows.push(splitTableRow(lines[cursor] ?? ""));
|
|
116
|
-
cursor += 1;
|
|
117
|
-
}
|
|
118
|
-
return {
|
|
119
|
-
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}`, sources) }, `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}`, sources) }, `d:${rowIndex}:${cellIndex}`))) }, `r:${rowIndex}`))) })] }) }, `table:${index}`)),
|
|
120
|
-
next: cursor,
|
|
121
|
-
};
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* Deliberately small, HTML-free Markdown renderer for assistant-visible text.
|
|
5
|
+
* Assistant-visible Markdown. The grammar lives in `../markdown/`: blocks are
|
|
6
|
+
* parsed once per text value, inline content is resolved per block, and a link
|
|
7
|
+
* or inline-code token that names a source the owning message knows about
|
|
8
|
+
* renders as a source chip instead of plain text.
|
|
9
|
+
*
|
|
125
10
|
* Memoized on the text value: stream updates re-render only the message whose
|
|
126
11
|
* text actually changed, so committed history is never re-parsed.
|
|
127
12
|
*/
|
|
128
13
|
export const Markdown = memo(function Markdown({ text, sourceRefs, onSourceOpen, }) {
|
|
129
|
-
const
|
|
130
|
-
? {}
|
|
131
|
-
: {
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
const lines = text.replace(/\r\n?/gu, "\n").split("\n");
|
|
136
|
-
const blocks = [];
|
|
137
|
-
for (let index = 0; index < lines.length;) {
|
|
138
|
-
const line = lines[index] ?? "";
|
|
139
|
-
if (line.startsWith("```")) {
|
|
140
|
-
const language = line.slice(3).trim();
|
|
141
|
-
const code = [];
|
|
142
|
-
index += 1;
|
|
143
|
-
while (index < lines.length && !(lines[index] ?? "").startsWith("```")) {
|
|
144
|
-
code.push(lines[index] ?? "");
|
|
145
|
-
index += 1;
|
|
146
|
-
}
|
|
147
|
-
if (index < lines.length)
|
|
148
|
-
index += 1;
|
|
149
|
-
blocks.push(_jsx("pre", { children: _jsx("code", { "data-language": language || undefined, children: code.join("\n") }) }, `code:${index}`));
|
|
150
|
-
continue;
|
|
151
|
-
}
|
|
152
|
-
if (isTableStart(lines, index)) {
|
|
153
|
-
const table = renderTable(lines, index, sources);
|
|
154
|
-
blocks.push(table.node);
|
|
155
|
-
index = table.next;
|
|
156
|
-
continue;
|
|
157
|
-
}
|
|
158
|
-
if (HORIZONTAL_RULE.test(line)) {
|
|
159
|
-
blocks.push(_jsx("hr", {}, `hr:${index}`));
|
|
160
|
-
index += 1;
|
|
161
|
-
continue;
|
|
162
|
-
}
|
|
163
|
-
const heading = /^(#{1,3})\s+(.+)$/u.exec(line);
|
|
164
|
-
if (heading !== null) {
|
|
165
|
-
const content = inline(heading[2] ?? "", `heading:${index}`, sources);
|
|
166
|
-
const key = `heading:${index}`;
|
|
167
|
-
blocks.push(heading[1]?.length === 1 ? (_jsx("h2", { children: content }, key)) : heading[1]?.length === 2 ? (_jsx("h3", { children: content }, key)) : (_jsx("h4", { children: content }, key)));
|
|
168
|
-
index += 1;
|
|
169
|
-
continue;
|
|
170
|
-
}
|
|
171
|
-
if (/^[-*]\s+/u.test(line)) {
|
|
172
|
-
const items = [];
|
|
173
|
-
while (index < lines.length && /^[-*]\s+/u.test(lines[index] ?? "")) {
|
|
174
|
-
const content = (lines[index] ?? "").replace(/^[-*]\s+/u, "");
|
|
175
|
-
items.push(_jsx("li", { children: inline(content, `item:${index}`, sources) }, `item:${index}`));
|
|
176
|
-
index += 1;
|
|
177
|
-
}
|
|
178
|
-
blocks.push(_jsx("ul", { children: items }, `list:${index}`));
|
|
179
|
-
continue;
|
|
180
|
-
}
|
|
181
|
-
if (ORDERED_LIST.test(line)) {
|
|
182
|
-
const items = [];
|
|
183
|
-
while (index < lines.length && ORDERED_LIST.test(lines[index] ?? "")) {
|
|
184
|
-
const content = (lines[index] ?? "").replace(ORDERED_LIST, "");
|
|
185
|
-
items.push(_jsx("li", { children: inline(content, `oitem:${index}`, sources) }, `oitem:${index}`));
|
|
186
|
-
index += 1;
|
|
187
|
-
}
|
|
188
|
-
blocks.push(_jsx("ol", { children: items }, `olist:${index}`));
|
|
189
|
-
continue;
|
|
190
|
-
}
|
|
191
|
-
if (line.startsWith("> ")) {
|
|
192
|
-
blocks.push(_jsx("blockquote", { children: inline(line.slice(2), `quote:${index}`, sources) }, `quote:${index}`));
|
|
193
|
-
index += 1;
|
|
194
|
-
continue;
|
|
195
|
-
}
|
|
196
|
-
if (line.trim() === "") {
|
|
197
|
-
index += 1;
|
|
198
|
-
continue;
|
|
199
|
-
}
|
|
200
|
-
const paragraph = [line];
|
|
201
|
-
index += 1;
|
|
202
|
-
while (index < lines.length &&
|
|
203
|
-
(lines[index] ?? "").trim() !== "" &&
|
|
204
|
-
!BLOCK_START.test(lines[index] ?? "") &&
|
|
205
|
-
!isTableStart(lines, index)) {
|
|
206
|
-
paragraph.push(lines[index] ?? "");
|
|
207
|
-
index += 1;
|
|
208
|
-
}
|
|
209
|
-
blocks.push(_jsx("p", { children: paragraph.map((part, partIndex) => (_jsxs(Fragment, { children: [partIndex === 0 ? null : _jsx("br", {}), inline(part, `paragraph:${index}:${partIndex}`, sources)] }, `line:${partIndex}`))) }, `paragraph:${index}`));
|
|
210
|
-
}
|
|
211
|
-
return _jsx(_Fragment, { children: blocks });
|
|
14
|
+
const context = useMemo(() => ({
|
|
15
|
+
...(sourceRefs === undefined ? {} : { refs: sourceRefs }),
|
|
16
|
+
...(onSourceOpen === undefined ? {} : { onSourceOpen }),
|
|
17
|
+
}), [sourceRefs, onSourceOpen]);
|
|
18
|
+
const children = useMemo(() => renderMarkdown(text, context), [text, context]);
|
|
19
|
+
return _jsx("div", { className: "dsh-qa-md", children: children });
|
|
212
20
|
});
|
|
213
21
|
//# 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":";AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAGtC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAKvD;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,QAAQ,CAAC,EAC7C,IAAI,EACJ,UAAU,EACV,YAAY,GAKb;IACC,MAAM,OAAO,GAAG,OAAO,CACrB,GAAG,EAAE,CAAC,CAAC;QACL,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;QACzD,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC;KACxD,CAAC,EACF,CAAC,UAAU,EAAE,YAAY,CAAC,CAC3B,CAAC;IACF,MAAM,QAAQ,GAAG,OAAO,CACtB,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,EACnC,CAAC,IAAI,EAAE,OAAO,CAAC,CAChB,CAAC;IACF,OAAO,cAAK,SAAS,EAAC,WAAW,YAAE,QAAQ,GAAO,CAAC;AACrD,CAAC,CAAC,CAAC"}
|
|
@@ -2,6 +2,97 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { QaModal } from "./QaModal.js";
|
|
3
3
|
export const QA_VERSION = __DSH_QA_VERSION__;
|
|
4
4
|
export const QA_CHANGELOG = [
|
|
5
|
+
{
|
|
6
|
+
version: "0.9.0",
|
|
7
|
+
date: "2026-09-18",
|
|
8
|
+
sections: [
|
|
9
|
+
{
|
|
10
|
+
title: "Исправления",
|
|
11
|
+
items: [
|
|
12
|
+
"Вопрос модели больше не оставляет поле ввода доступным. Пока вопрос на экране, форма занимает место поля ввода: отправка сообщения рядом с ним была невозможна только потому, что ход считался занятым, а если стенд переставал считать ход идущим, поле выглядело готовым к работе, тогда как агент всё ещё ждал ответа на вопрос выше. Теперь форма вопроса владеет полем ввода до ответа или до конца хода, а само поле остаётся позади формы — набранный текст не пропадает и возвращается после ответа. Кнопка остановки хода переехала в шапку формы, поэтому завершить ход вместо ответа по-прежнему можно.",
|
|
13
|
+
"Вопрос, на который уже нельзя ответить, больше не остаётся на экране. Запрос жил до тех пор, пока его не закроют: при остановке хода вопрос снимался по сигналу самого вызова, но запрос без такого сигнала или ход, завершившийся другим путём, оставляли форму навсегда — ответ на неё уходил в никуда, а оператор видел живое на вид поле. Теперь стенд закрывает всё, что осталось от хода, как только спросивший помощник перестаёт работать, а страница продолжает сверяться со стендом, пока форма на экране: ответ, которого стенд уже не ждёт, отклоняется вместо тихой отправки.",
|
|
14
|
+
"Вопрос, оставшийся до перезагрузки страницы, снова появляется после неё. Страница читает список вопросов чата сразу при его открытии и при каждом восстановлении связи, а не только пока идёт ход: раньше перезагрузка могла показать пустое поле ввода, за которым агент продолжал ждать ответа.",
|
|
15
|
+
"Сбой при чтении персональных навыков одного аккаунта больше не прячет навыки у всех. Чтение каталога навыков, которому не повезло с файловой системой (отказ доступа, гонка чтения каталога), отдавало ошибку в реестр навыков харнесса, и тот в ответ переставал публиковать список доступных навыков целиком: модель получала «навык недоступен» на любое имя, включая навыки плагинов и корпоративные. Теперь такой сбой вырождается в «у этого аккаунта навыков не прочитано» и пишется в журнал событием skill.discover-failed, а остальной каталог продолжает публиковаться.",
|
|
16
|
+
"Раздел «Общие возможности» в консоли администратора снова видит навыки и инструменты, которые монтирует агентский пресет. Список читался «глобально», а каталог навыков стенда и семейство инструментов пресета живут в области видимости пресета: администратор не видел ни корпоративных навыков поиска, ни инструментов пресета и не мог ничего из них выдать или отозвать. Теперь страница читает реестры глазами того пресета, под которым идут QA-чаты (задаётся session.agentPreset, на стенде это qa-research), а если пресет не удалось собрать — как и раньше остаётся глобальный вид, и страница не падает.",
|
|
17
|
+
],
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
title: "Прочее",
|
|
21
|
+
items: [
|
|
22
|
+
"Оператору стенда: настройка вопросов, которая ничего не делает, теперь видна в журнале и в карточке настроек. Если вопросы включены, а инструмент ask_user_question не входит в список разрешённых (lockdown.toolPolicy.allow), форма не появится никогда; если инструмент разрешён, а вопросы выключены, каждый запрос отклоняется. Оба случая пишут в журнал одно предупреждение question.config-incomplete на чат с указанием, какой половины не хватает, а в разделе «Состояние» появилась плашка «Вопросы модели» с тем же предупреждением — сам чат при этом открывается как обычно.",
|
|
23
|
+
"Оператору стенда: в журнале появились события о ходе вопроса — запрос принят и ждёт ответа (question.claimed), ответ получен (question.answered), вопрос закрыт оператором (question.cancelled) или снят вместе с ходом (question.aborted), запрос отдан другому интерфейсу (question.delegated), ответ отклонён (question.refused). Текст ответа в журнал не попадает: только число вопросов и то, был ли среди ответов свободный текст.",
|
|
24
|
+
],
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
title: "Новое",
|
|
28
|
+
items: [
|
|
29
|
+
"В конфигурации стенда значение enabled для interaction.questions означает то же, что и interactive: включать вопросы модели стало можно любым из двух написаний.",
|
|
30
|
+
],
|
|
31
|
+
},
|
|
32
|
+
],
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
version: "0.8.0",
|
|
36
|
+
date: "2026-09-16",
|
|
37
|
+
sections: [
|
|
38
|
+
{
|
|
39
|
+
title: "Новое",
|
|
40
|
+
items: [
|
|
41
|
+
"Администратор может удалить разговор со стенда. Раньше удалить разговор было нечем: кнопка «Удалить чат» в списке убирает строку только в вашем браузере, и после перезагрузки чат возвращался, поэтому сломанные или ненужные разговоры оставались на стенде навсегда. На странице разговора в админке появилась кнопка «Удалить разговор»: она спрашивает подтверждение и удаляет сам разговор, его служебные сессии вместе с ним, оценки, разбор и собранные источники. В списке чатов кнопка осталась прежней — она по-прежнему скрывает строку только у вас.",
|
|
42
|
+
"Удаление доступно только администратору и записывается в журнал действий. Если разговор сейчас открыт на стенде, удаление откажется работать — сначала нужно, чтобы стенд его отпустил, иначе разговор вернётся при следующей записи. Там, где стенд хранит журналы не файлами, удаление тоже недоступно, и об этом будет сказано прямо, а не сделано наполовину.",
|
|
43
|
+
],
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
title: "Исправления",
|
|
47
|
+
items: [
|
|
48
|
+
"Ответы агента стали заметно отзывчивее на загруженном стенде: раньше данные о том, какие документы и страницы агент прочитал, хранились в одном общем файле стенда, и каждый ход агента — включая ходы всех его помощников — переписывал этот файл целиком. Стоимость хода росла вместе со всей накопленной историей стенда: на реальных данных один ход стоил от 7 миллисекунд на небольшом стенде до 106 на большом, и всё это время сервер не отвечал никому из пользователей. Теперь данные каждого чата лежат отдельно, и ход переписывает только свой чат: на том же объёме — 4.2 миллисекунды вместо 106. Разбор ответа и панель источников работают как раньше.",
|
|
49
|
+
"Открытие чата больше не переписывает все данные стенда. Список пользователей и записи о том, кому принадлежит какой чат, лежали в одном файле настроек, и он целиком перезаписывался при каждом действии — а записей становится на одну больше с каждым созданным чатом, так что со временем это становилось всё дороже. Теперь каждое действие записывает только своё изменение, и открытие чата стоит одинаково на стенде любого возраста.",
|
|
50
|
+
"Удалённые чаты больше не копятся в консоли администратора. Запись о том, кому принадлежит чат, переживала сам чат: «удалить» в браузере лишь скрывало его, а серверный список возвращал обратно, поэтому в «Разговорах», в счётчиках и в аналитике навсегда оставались чаты, которых уже нет. Теперь при создании новых чатов стенд убирает записи о тех, которых больше нет на стенде, — и никогда не трогает записи существующих чатов, даже очень старых.",
|
|
51
|
+
"Стенд больше не убирает записи о существующих чатах. Убирая из «Разговоров» чаты, которых нет, стенд спрашивал только о тех, что открывались после последнего запуска: чат, к которому сутки не обращались, выглядел как удалённый, и запись о нём исчезала — разговор пропадал из истории своего владельца, из счётчиков и из аналитики, хотя сам он был цел. Теперь стенд сверяется и с тем, что лежит в хранилище, а если ответить наверняка не может, не убирает ничего.",
|
|
52
|
+
"Удалённый чат больше не оставляет после себя оценок и очереди на разбор. Оценки ответов, вердикты рецензентов и очередь на разбор хранились по идентификатору чата и переживали его: в «Обратной связи», в очереди и в аналитике оставались записи о разговоре, которого уже нет, а открыть его было нельзя. Теперь вместе с записью о владении убираются и они; журнал действий администраторов остаётся нетронутым.",
|
|
53
|
+
"Админка показывает состояние на момент открытия: «Разговоры», счётчики и аналитика больше не ждут, пока кто-нибудь создаст новый чат, чтобы убрать из списка исчезнувшие.",
|
|
54
|
+
"Файл настроек стенда стал в разы меньше: политика доступа каждого чата хранилась в нём отдельной копией, хотя у всех чатов она одна и та же. На одном стенде из 25 копий различными оказались две — эта часть уменьшилась без потери данных: каждый чат по-прежнему помнит именно тот набор возможностей, с которым был открыт.",
|
|
55
|
+
"Обновление стенда до этой версии сохраняет все учётные записи, пароли и привязку чатов к пользователям: прежний файл настроек переносится автоматически при первом запуске, а сам файл не удаляется, а сохраняется рядом с пометкой о переносе.",
|
|
56
|
+
],
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
title: "Прочее",
|
|
60
|
+
items: [
|
|
61
|
+
"У хранения данных чатов появился предел: на чат сохраняются источники последних 200 ходов, на стенде — 500 последних чатов, а чат, к которому не обращались месяц, освобождает место. Это касается только служебных данных разбора: сам текст разговора не удаляется, старый чат открывается как раньше, но панель источников у него может быть пустой.",
|
|
62
|
+
"Оператору стенда: пределы хранения настраиваются (сколько ходов и чатов держать, через сколько дней освобождать, как часто убирать записи о несуществующих чатах). Значения по умолчанию подобраны под обычную нагрузку, менять их не обязательно.",
|
|
63
|
+
"Оператору стенда: в списке чатов DSH разговоры стенда показываются в разделе «Ungrouped». Так и должно быть при включённых личных папках посетителей: чат работает в своей папке внутри рабочей области, а список группирует только те чаты, чей рабочий каталог совпадает с рабочей областью целиком, и перенести чат в область задним числом нельзя. Исключение — чаты, созданные прежней настройкой, когда рабочий каталог задавался напрямую (или задавался тем же каталогом, но записанным иначе, например через прямые слэши): их можно вернуть в рабочую область командой qa-attach-sessions при остановленном стенде — она сначала показывает, что изменит, а с ключом --write вносит правку и сохраняет копию реестра рабочей области. На чаты посетителей с личными папками команда не влияет.",
|
|
64
|
+
],
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
title: "Исправления",
|
|
68
|
+
items: [
|
|
69
|
+
"Новый чат больше не открывается под чужой ролью после просмотра роли из админки. Режим предпросмотра включался один раз и оставался включённым на всю вкладку: селектор роли в шапке в это время скрыт, а плашка в углу выхода не предлагала, поэтому каждый следующий новый чат создавался как просмотр выбранной роли, например «Общий» вместо «Админ», хотя в доступе указан профиль по умолчанию «Админ». Теперь просмотр принадлежит тому переходу, которым его открыли: уход со страницы, кнопка «Назад» и повторный вход в чат его завершают, а на плашке появилась кнопка «Выйти из просмотра», возвращающая к своему профилю по умолчанию.",
|
|
70
|
+
"Просмотр роли, которая вам не назначена, теперь действительно работает. Раньше он молча подменялся вашим профилем по умолчанию: перед показом роль сверялась со списком доступных вам профилей, и любая другая роль просто не применялась, без сообщения и без чата под выбранной ролью. Просматривать можно любую включённую роль, как и предполагалось.",
|
|
71
|
+
"Инструмент, закреплённый системным конфигом стенда, теперь можно отобрать у профиля. Такие инструменты (например набор dsh_git_* для работы с историей git) входят в каждый профиль из настроек деплоя, и в админке их нельзя было снять галочкой: профиль получал их всегда. В редакторе саброли и в общих возможностях появилась третья корзина «Запрещённые»: отмеченный там инструмент снимается с профиля, что бы его ни выдавало, и запрет сильнее и общих возможностей, и навыков.",
|
|
72
|
+
"Делегированные помощники и доменные эксперты больше не могут получить инструмент, которого нет у профиля. Раньше ограничения профиля действовали только на сам чат: субагент собирается из пресета и не наследует ограничения родителя, поэтому эксперт мог пользоваться инструментом, которого роль не выдавала. Теперь у разговора есть общий потолок: дети могут дотянуться до всего, что доступно профилю, включая инструменты, которые выдаёт навык, но не дальше. Запрет из корзины «Запрещённые» действует и на них.",
|
|
73
|
+
"В карточке пользователя «Действующие возможности» больше не показывают нули и завышенные числа. Считались только явно настроенные списки: профиль без своих инструментов выглядел как «0 инструментов», хотя его чаты получают весь системный набор стенда, инструменты, выдаваемые навыками, считались как уже доступные, а навыки, которые сами объявляют эту роль в своём SKILL.md, не учитывались вовсе. Теперь числа совпадают с тем, что реально получает чат: системный набор плюс общие и ролевые инструменты, отдельно потолок выдачи по навыкам, и навыки с объявленной ролью.",
|
|
74
|
+
"Оценки ответов снова доходят до стенда. Оценка сохраняется по позиции ответа в журнале чата, а браузер эту позицию терял при сборке переписки: оставались текст, время и длительность ответа, а самой позиции не было, поэтому оценка не отправлялась — ни запроса, ни сообщения об ошибке, при этом кнопка 👍/👎 подсвечивалась и оставалась нажатой. Из-за этого в «Обратной связи» админки и в карточке пользователя всегда было пусто. Теперь оценка доезжает до сервера, а если позиция ответа всё-таки потеряется, об этом будет сказано в консоли браузера.",
|
|
75
|
+
"Кнопка «Файлы» в шапке больше не уезжает в середину строки. Свободное место делили сразу два элемента — «Новый чат» и «Администрирование», поэтому между закладками чата и правыми кнопками появлялись две пустые полосы, и «Файлы», соседняя вкладка с «Источниками», оказывалась между ними, отдельно от остальных закладок. Зависело это от настройки, к файлам не относящейся: если «Новый чат» в шапке скрыт — например, при фиксированной сессии или запрете сброса — «Файлы» сдвигались вправо, а если показан, оставались на месте. Теперь у шапки одна правая группа действий, а «Файлы» всегда стоят под «Источниками».",
|
|
76
|
+
"Разметка ответов помощника теперь такая же, как в самом DSH. Заголовки четвёртого уровня и глубже раньше показывались вместе с решётками: разделы «1. Backend: EF-модели…» в разборах MR выглядели обычной строкой с символами «####» вместо подзаголовка. Заодно появились вложенные списки, чекбоксы, картинки, ссылки по определению, автоматические ссылки из голых адресов и зачёркивание, а заголовок теперь можно подчеркнуть знаком равенства. Блок кода стал таким же, как в переписке DSH: полоса с названием языка, кнопка «Копировать» и подсветка синтаксиса для языков, которые встречаются в ответах, — C#, JavaScript и TypeScript, Python, SQL, JSON, YAML, Bash, XML с HTML, diff и других; язык, которого нет в списке или не указан вовсе, просто остаётся моноширинным. Размеры, отступы и цвета берутся из тех же токенов темы, что и переписка DSH, поэтому светлая и тёмная темы, выбранный вами размер шрифта и брендирование стенда действуют на оба места одинаково, а таблицы, цитаты, отступы списков и воздух между блоками стали ближе к оригиналу.",
|
|
77
|
+
"Разбор разметки больше не замедляет печать длинных ответов с обильными выделениями: поиск пары для «звёздочек», подчёркиваний и зачёркиваний стал однопроходным, поэтому десятки тысяч разделителей в одном сообщении больше не подвешивают потоковую печать. Заодно чекбоксы задач в списках получили доступное для скринридеров название, а всплывающее превью источника объявляется описанием своей плашки.",
|
|
78
|
+
"Служебные сессии субагентов больше нельзя открыть из браузера. Делегированный прогон — работа эксперта внутри одного ответа — не является чатом: владельца у него нет, а найденные источники передаются родительскому чату автоматически. Раньше такую сессию можно было напрямую провести через допуск: она записывалась в чаты попытавшегося, хотя открыть её всё равно было нельзя. Теперь сервер отказывает в допуске и не записывает её ни за кем — даже если сессия осталась с прошлого запуска стенда и ещё не загружена в память, — а бесхозяйные давние чаты больше не забираются молча первым обратившимся: сессия старше 120 секунд без закреплённого владельца получает отказ вместо тихого присоединения. Свои чаты это не затрагивает — закрепление хранится на сервере и переживает рестарт стенда.",
|
|
79
|
+
"В истории чатов больше не появляются «лишние» чаты-двойники от работы помощников. Делегированный прогон — работа эксперта внутри одного ответа — не является чатом, но в историю он всё-таки попадал: достаточно было открыть его транскрипт, и сессия записывалась за тем, кто её открыл. Выглядело это как задвоение — рядом с настоящим чатом появлялась строка с формулировкой задания эксперта и перепиской короче на пару ходов, открыть которую для продолжения было нельзя. Теперь такие сессии не записываются ни за кем и не показываются в истории: список и счётчик чатов в настройках считают только настоящие чаты (даже если браузер помнит такую сессию с прошлой версии), а записи, оставшиеся от прежних версий, стенд убирает сам при создании следующего чата. Число разговоров в админке перестаёт считать эти служебные сессии.",
|
|
80
|
+
"Неудачная попытка начать чат больше не оставляет пустой чат в истории. Если стенд отказывал в создании — например, из-за инструмента, которого нет в этой сборке, или из-за профиля прав, который перестал разрешаться, — в истории появлялась и оставалась пустая строка «Новый чат». Убрать её было нельзя: кнопка удаления убирала строку только в этом браузере, а запись о владении на сервере возвращала её обратно. Теперь отказ откатывает и запись: в истории ничего не появляется, а повторная отправка начинает чат с чистого листа.",
|
|
81
|
+
"Роль пользователя в админке теперь проверяется на сервере. Раньше подделанный запрос мог сохранить роль вне допустимых значений — не «Пользователь», «Рецензент» или «Админ», а произвольную строку. Такой аккаунт переставал работать целиком: таблицы прав не знали такой роли, и любой запрос этого пользователя падал с внутренней ошибкой, пока роль не правили вручную в файле. Теперь такая роль отклоняется обычным отказом «invalid-role», и сохранённая роль не меняется.",
|
|
82
|
+
"Служебные данные стенда создаются доступными только владельцу процесса: базы учётных записей, качества и политик ролей, а также отдельные файлы источников каждого чата получают права 0600 в Linux и macOS (Windows использует собственные механизмы доступа). Выгрузка сессии из памяти не удаляет сохранённые источники: они переживают перезапуск стенда, а их настраиваемые сроки и пределы хранения описаны выше.",
|
|
83
|
+
],
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
title: "Новое",
|
|
87
|
+
items: [
|
|
88
|
+
"У чата, по которому проводился аудит, появилась отметка в истории и кнопка, открывающая сам аудит. Аудит — это разбор переписки, который делает отдельный модуль аудита: вердикт, оценки по направлениям, замечания и рекомендации. В истории чатов такая строка помечается галочкой и вердиктом, а по клику открывается окно с тремя вкладками — «Отчёт» (полный текст разбора таблицами и списками), «Замечания» (структурированный список с причинами и рекомендациями) и «JSON» (исходный документ разбора целиком). Отметка появляется поверх истории, ничего не пересканируя: данные о том, у каких чатов есть аудит, спрашиваются у модуля аудита, а сам разбор загружается только при открытии окна. Если модуль аудита не установлен, история выглядит как раньше — без отметок и без пустых мест.",
|
|
89
|
+
"В конфигурации появились два ключа входа. accounts.maxAuthAttemptsPerMinute — лимит попыток входа и регистрации в минуту на весь стенд: раньше он был жёстко зашит на 30, теперь настраивается от 1 до 600 (по умолчанию — прежние 30). entry.cookieBootstrap — управляет самостоятельной выдачей host-cookie маршрутом /qa через одноразовый обмен ?token=…: ключ существовал в настройках по умолчанию, но в схеме конфигурации его не было, поэтому выключить его было нельзя; теперь это обычный логический переключатель (по умолчанию включён, поведение не изменилось).",
|
|
90
|
+
"В поле ввода можно вызывать навыки и команды. Навык вызывается как /generate-tkp — это обычный ход модели, в который штатный механизм DSH подставляет инструкции навыка; в палитре видны и те навыки, которые доступны только человеку (disable-model-invocation), а скрытые (user-invocable: false) не появляются. Команда вызывается как /compact — её выполняет сам стенд, модели она не отправляется, а её ход и результат видны в переписке отдельной служебной строкой. Палитра открывается по «/» над полем ввода: ↑/↓ выбирают, Tab и Enter подставляют вызов (второй Enter отправляет), Escape закрывает; на телефоне то же самое одним касанием. Если навык и команда называются одинаково, палитра показывает обе строки, а набранное вручную /plan спросит, что имелось в виду, вместо того чтобы угадывать. Неизвестное /что-то больше не уходит модели как обычный текст.",
|
|
91
|
+
"Новое поведение выключено по умолчанию и ничего не меняет до включения: пока оператор не включит lockdown.allowSlashCommands, «/» в начале сообщения отвергается прежним сообщением. Включив переключатель, оператор отдельно решает, что именно разрешено — списки навыков и команд в новой настройке slashCommands (для команд по умолчанию не разрешено ничего: установленный плагин со своими командами не должен появляться в палитре сам). Слэш-действия не расширяют права: песочница, белый список инструментов и подтверждения остаются прежними. Если стенд включает переключатель, но список не описывает, действует режим совместимости — все доступные человеку навыки и ни одной команды — и стенд один раз сообщает об этом в журнале.",
|
|
92
|
+
],
|
|
93
|
+
},
|
|
94
|
+
],
|
|
95
|
+
},
|
|
5
96
|
{
|
|
6
97
|
version: "0.7.4",
|
|
7
98
|
date: "2026-09-16",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QaChangelog.js","sourceRoot":"","sources":["../../../src/client/components/QaChangelog.tsx"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"QaChangelog.js","sourceRoot":"","sources":["../../../src/client/components/QaChangelog.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAWvC,MAAM,CAAC,MAAM,UAAU,GAAG,kBAAkB,CAAC;AAW7C,MAAM,CAAC,MAAM,YAAY,GAAgC;IACvD;QACE,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,YAAY;QAClB,QAAQ,EAAE;YACR;gBACE,KAAK,EAAE,aAAa;gBACpB,KAAK,EAAE;oBACL,olBAAolB;oBACplB,4jBAA4jB;oBAC5jB,mSAAmS;oBACnS,ojBAAojB;oBACpjB,wlBAAwlB;iBACzlB;aACF;YACD;gBACE,KAAK,EAAE,QAAQ;gBACf,KAAK,EAAE;oBACL,4jBAA4jB;oBAC5jB,2aAA2a;iBAC5a;aACF;YACD;gBACE,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE;oBACL,kKAAkK;iBACnK;aACF;SACF;KACF;IACD;QACE,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,YAAY;QAClB,QAAQ,EAAE;YACR;gBACE,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE;oBACL,miBAAmiB;oBACniB,mWAAmW;iBACpW;aACF;YACD;gBACE,KAAK,EAAE,aAAa;gBACpB,KAAK,EAAE;oBACL,yoBAAyoB;oBACzoB,8aAA8a;oBAC9a,8bAA8b;oBAC9b,8cAA8c;oBAC9c,uZAAuZ;oBACvZ,2KAA2K;oBAC3K,iUAAiU;oBACjU,iPAAiP;iBAClP;aACF;YACD;gBACE,KAAK,EAAE,QAAQ;gBACf,KAAK,EAAE;oBACL,yVAAyV;oBACzV,oPAAoP;oBACpP,0wBAA0wB;iBAC3wB;aACF;YACD;gBACE,KAAK,EAAE,aAAa;gBACpB,KAAK,EAAE;oBACL,qnBAAqnB;oBACrnB,2VAA2V;oBAC3V,2dAA2d;oBAC3d,6fAA6f;oBAC7f,0jBAA0jB;oBAC1jB,oiBAAoiB;oBACpiB,mmBAAmmB;oBACnmB,ohCAAohC;oBACphC,gZAAgZ;oBAChZ,oxBAAoxB;oBACpxB,uzBAAuzB;oBACvzB,ihBAAihB;oBACjhB,qdAAqd;oBACrd,yZAAyZ;iBAC1Z;aACF;YACD;gBACE,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE;oBACL,6wBAA6wB;oBAC7wB,gjBAAgjB;oBAChjB,y1BAAy1B;oBACz1B,utBAAutB;iBACxtB;aACF;SACF;KACF;IACD;QACE,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,YAAY;QAClB,QAAQ,EAAE;YACR;gBACE,KAAK,EAAE,aAAa;gBACpB,KAAK,EAAE;oBACL,kbAAkb;iBACnb;aACF;SACF;KACF;IACD;QACE,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,YAAY;QAClB,QAAQ,EAAE;YACR;gBACE,KAAK,EAAE,aAAa;gBACpB,KAAK,EAAE;oBACL,ywBAAywB;iBAC1wB;aACF;SACF;KACF;IACD;QACE,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,YAAY;QAClB,QAAQ,EAAE;YACR;gBACE,KAAK,EAAE,aAAa;gBACpB,KAAK,EAAE;oBACL,0YAA0Y;oBAC1Y,+RAA+R;oBAC/R,yKAAyK;oBACzK,gKAAgK;oBAChK,qJAAqJ;oBACrJ,iKAAiK;oBACjK,sRAAsR;iBACvR;aACF;SACF;KACF;IACD;QACE,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,YAAY;QAClB,QAAQ,EAAE;YACR;gBACE,KAAK,EAAE,aAAa;gBACpB,KAAK,EAAE;oBACL,6eAA6e;iBAC9e;aACF;YACD;gBACE,KAAK,EAAE,QAAQ;gBACf,KAAK,EAAE;oBACL,oXAAoX;iBACrX;aACF;SACF;KACF;IACD;QACE,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,YAAY;QAClB,QAAQ,EAAE;YACR;gBACE,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE;oBACL,qTAAqT;oBACrT,oSAAoS;oBACpS,sLAAsL;oBACtL,ycAAyc;oBACzc,qSAAqS;oBACrS,6YAA6Y;oBAC7Y,uOAAuO;oBACvO,mUAAmU;oBACnU,sKAAsK;oBACtK,mTAAmT;oBACnT,2dAA2d;oBAC3d,uRAAuR;oBACvR,ibAAib;oBACjb,oRAAoR;oBACpR,0NAA0N;oBAC1N,kNAAkN;oBAClN,4XAA4X;iBAC7X;aACF;YACD;gBACE,KAAK,EAAE,aAAa;gBACpB,KAAK,EAAE;oBACL,4VAA4V;oBAC5V,4QAA4Q;iBAC7Q;aACF;SACF;KACF;IACD;QACE,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,YAAY;QAClB,QAAQ,EAAE;YACR;gBACE,KAAK,EAAE,aAAa;gBACpB,KAAK,EAAE;oBACL,+XAA+X;oBAC/X,4WAA4W;iBAC7W;aACF;SACF;KACF;IACD;QACE,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,YAAY;QAClB,QAAQ,EAAE;YACR;gBACE,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE;oBACL,yoBAAyoB;oBACzoB,oSAAoS;oBACpS,yzBAAyzB;oBACzzB,oQAAoQ;oBACpQ,+gBAA+gB;oBAC/gB,iXAAiX;oBACjX,sMAAsM;oBACtM,+mBAA+mB;oBAC/mB,6mBAA6mB;iBAC9mB;aACF;YACD;gBACE,KAAK,EAAE,aAAa;gBACpB,KAAK,EAAE;oBACL,uVAAuV;oBACvV,qGAAqG;oBACrG,iNAAiN;oBACjN,2NAA2N;oBAC3N,8LAA8L;oBAC9L,sIAAsI;iBACvI;aACF;SACF;KACF;IACD;QACE,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,YAAY;QAClB,QAAQ,EAAE;YACR;gBACE,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE;oBACL,umBAAumB;oBACvmB,kaAAka;oBACla,ghBAAghB;oBAChhB,wWAAwW;oBACxW,wVAAwV;iBACzV;aACF;YACD;gBACE,KAAK,EAAE,aAAa;gBACpB,KAAK,EAAE;oBACL,sPAAsP;oBACtP,mIAAmI;oBACnI,yKAAyK;iBAC1K;aACF;SACF;KACF;IACD;QACE,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,YAAY;QAClB,QAAQ,EAAE;YACR;gBACE,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE;oBACL,uOAAuO;oBACvO,2KAA2K;oBAC3K,qKAAqK;oBACrK,oJAAoJ;oBACpJ,gOAAgO;oBAChO,8GAA8G;oBAC9G,oRAAoR;oBACpR,2GAA2G;oBAC3G,mKAAmK;iBACpK;aACF;YACD;gBACE,KAAK,EAAE,WAAW;gBAClB,KAAK,EAAE;oBACL,+PAA+P;oBAC/P,oJAAoJ;iBACrJ;aACF;YACD;gBACE,KAAK,EAAE,aAAa;gBACpB,KAAK,EAAE;oBACL,+KAA+K;iBAChL;aACF;SACF;KACF;IACD;QACE,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,YAAY;QAClB,QAAQ,EAAE;YACR;gBACE,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE;oBACL,uHAAuH;oBACvH,6IAA6I;oBAC7I,mFAAmF;oBACnF,qHAAqH;oBACrH,gEAAgE;iBACjE;aACF;YACD;gBACE,KAAK,EAAE,aAAa;gBACpB,KAAK,EAAE;oBACL,wIAAwI;oBACxI,yFAAyF;oBACzF,oIAAoI;oBACpI,2IAA2I;oBAC3I,uHAAuH;oBACvH,uEAAuE;iBACxE;aACF;SACF;KACF;IACD;QACE,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,YAAY;QAClB,QAAQ,EAAE;YACR;gBACE,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE;oBACL,2HAA2H;oBAC3H,yHAAyH;oBACzH,4FAA4F;oBAC5F,gEAAgE;oBAChE,kGAAkG;oBAClG,+HAA+H;oBAC/H,yFAAyF;oBACzF,gEAAgE;iBACjE;aACF;YACD;gBACE,KAAK,EAAE,aAAa;gBACpB,KAAK,EAAE;oBACL,uGAAuG;iBACxG;aACF;SACF;KACF;IACD;QACE,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,YAAY;QAClB,QAAQ,EAAE;YACR;gBACE,KAAK,EAAE,aAAa;gBACpB,KAAK,EAAE;oBACL,4EAA4E;iBAC7E;aACF;SACF;KACF;IACD;QACE,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,YAAY;QAClB,QAAQ,EAAE;YACR;gBACE,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE;oBACL,6HAA6H;oBAC7H,4FAA4F;oBAC5F,kGAAkG;oBAClG,6FAA6F;oBAC7F,uIAAuI;oBACvI,mEAAmE;oBACnE,gFAAgF;iBACjF;aACF;SACF;KACF;CACF,CAAC;AAQF;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAA4B;IAC3D,OAAO,CACL,KAAC,OAAO,IACN,IAAI,EAAE,KAAK,CAAC,IAAI,EAChB,KAAK,EAAC,iFAAgB,EACtB,UAAU,EAAC,4HAAwB,EACnC,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,wEAAwE;QACxE,kCAAkC;QAClC,IAAI,kBAEH,YAAY,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAC3B,mBAA6B,SAAS,EAAC,yBAAyB,aAC9D,cAAI,SAAS,EAAC,2BAA2B,sDAC/B,KAAK,CAAC,OAAO,EACrB,eAAM,SAAS,EAAC,wBAAwB,YAAE,KAAK,CAAC,IAAI,GAAQ,EAC3D,KAAK,CAAC,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,CAC9B,eAAM,SAAS,EAAC,2BAA2B,2DAAe,CAC3D,CAAC,CAAC,CAAC,IAAI,IACL,EACJ,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAC/B,eAAyB,SAAS,EAAC,2BAA2B,aAC5D,aAAI,SAAS,EAAC,iCAAiC,YAC5C,OAAO,CAAC,KAAK,GACX,EACL,aAAI,SAAS,EAAC,wBAAwB,YACnC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAC3B,uBAAgB,IAAI,IAAX,IAAI,CAAa,CAC3B,CAAC,GACC,KARG,OAAO,CAAC,KAAK,CASjB,CACP,CAAC,KAnBU,KAAK,CAAC,OAAO,CAoBjB,CACX,CAAC,GACM,CACX,CAAC;AACJ,CAAC"}
|