@yadsh/dsh-qa-surface 0.3.0 → 0.4.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 +153 -12
- package/lib/account-remotes.js +100 -0
- package/lib/account-remotes.js.map +1 -0
- package/lib/accounts/credentials.js +27 -0
- package/lib/accounts/credentials.js.map +1 -0
- package/lib/accounts/errors.js +9 -0
- package/lib/accounts/errors.js.map +1 -0
- package/lib/accounts/file.js +101 -0
- package/lib/accounts/file.js.map +1 -0
- package/lib/accounts/store.js +144 -161
- package/lib/accounts/store.js.map +1 -1
- package/lib/accounts/token.js +61 -0
- package/lib/accounts/token.js.map +1 -0
- package/lib/attachment-rules.js +111 -0
- package/lib/attachment-rules.js.map +1 -0
- package/lib/cli.js +122 -9
- package/lib/cli.js.map +1 -1
- package/lib/client/QaAccountsController.js +32 -2
- package/lib/client/QaAccountsController.js.map +1 -1
- package/lib/client/QaSessionController.js +47 -65
- package/lib/client/QaSessionController.js.map +1 -1
- package/lib/client/QaSurface.js +121 -107
- package/lib/client/QaSurface.js.map +1 -1
- package/lib/client/QaTranscriptAdapter.js +71 -6
- package/lib/client/QaTranscriptAdapter.js.map +1 -1
- package/lib/client/attachments.js +150 -0
- package/lib/client/attachments.js.map +1 -0
- package/lib/client/attestation.js +1 -1
- package/lib/client/attestation.js.map +1 -1
- package/lib/client/base64.js +16 -0
- package/lib/client/base64.js.map +1 -0
- package/lib/client/chat-files.js +48 -0
- package/lib/client/chat-files.js.map +1 -0
- package/lib/client/components/Markdown.js +1 -1
- package/lib/client/components/Markdown.js.map +1 -1
- package/lib/client/components/QaChangelog.js +38 -19
- package/lib/client/components/QaChangelog.js.map +1 -1
- package/lib/client/components/QaComposer.js +56 -74
- package/lib/client/components/QaComposer.js.map +1 -1
- package/lib/client/components/QaFileAttachment.js +19 -0
- package/lib/client/components/QaFileAttachment.js.map +1 -0
- package/lib/client/components/QaFilesPanel.js +45 -0
- package/lib/client/components/QaFilesPanel.js.map +1 -0
- package/lib/client/components/QaHeader.js +34 -0
- package/lib/client/components/QaHeader.js.map +1 -0
- package/lib/client/components/QaMessage.js +17 -4
- package/lib/client/components/QaMessage.js.map +1 -1
- package/lib/client/components/QaModal.js +31 -0
- package/lib/client/components/QaModal.js.map +1 -0
- package/lib/client/components/QaProfile.js +64 -0
- package/lib/client/components/QaProfile.js.map +1 -0
- package/lib/client/components/QaRightRail.js +15 -0
- package/lib/client/components/QaRightRail.js.map +1 -0
- package/lib/client/components/QaSidebar.js +6 -1
- package/lib/client/components/QaSidebar.js.map +1 -1
- package/lib/client/components/{QaSourcesDrawer.js → QaSourcesPanel.js} +3 -3
- package/lib/client/components/QaSourcesPanel.js.map +1 -0
- package/lib/client/components/QaTurnRail.js +15 -0
- package/lib/client/components/QaTurnRail.js.map +1 -1
- package/lib/client/components/QaWidthHandle.js +25 -20
- package/lib/client/components/QaWidthHandle.js.map +1 -1
- package/lib/client/components/QaWorkGroup.js +19 -20
- package/lib/client/components/QaWorkGroup.js.map +1 -1
- package/lib/client/components/surface-utils.js +28 -0
- package/lib/client/components/surface-utils.js.map +1 -0
- package/lib/client/components/thinking-phrases.js +24 -0
- package/lib/client/components/thinking-phrases.js.map +1 -0
- package/lib/client/create-session.js +7 -32
- package/lib/client/create-session.js.map +1 -1
- package/lib/client/failure-copy.js +63 -0
- package/lib/client/failure-copy.js.map +1 -0
- package/lib/client/index.js +38 -7
- package/lib/client/index.js.map +1 -1
- package/lib/client/prompt-content.js +54 -0
- package/lib/client/prompt-content.js.map +1 -0
- package/lib/client/settings/card.js +143 -0
- package/lib/client/settings/card.js.map +1 -0
- package/lib/client/settings/fields.js +145 -0
- package/lib/client/settings/fields.js.map +1 -0
- package/lib/client/settings/format.js +255 -0
- package/lib/client/settings/format.js.map +1 -0
- package/lib/client/settings/sections/access.js +25 -0
- package/lib/client/settings/sections/access.js.map +1 -0
- package/lib/client/settings/sections/accounts.js +47 -0
- package/lib/client/settings/sections/accounts.js.map +1 -0
- package/lib/client/settings/sections/attachments.js +46 -0
- package/lib/client/settings/sections/attachments.js.map +1 -0
- package/lib/client/settings/sections/branding.js +28 -0
- package/lib/client/settings/sections/branding.js.map +1 -0
- package/lib/client/settings/sections/common.js +20 -0
- package/lib/client/settings/sections/common.js.map +1 -0
- package/lib/client/settings/sections/embedding.js +19 -0
- package/lib/client/settings/sections/embedding.js.map +1 -0
- package/lib/client/settings/sections/interface.js +60 -0
- package/lib/client/settings/sections/interface.js.map +1 -0
- package/lib/client/settings/sections/lockdown.js +82 -0
- package/lib/client/settings/sections/lockdown.js.map +1 -0
- package/lib/client/settings/sections/session.js +53 -0
- package/lib/client/settings/sections/session.js.map +1 -0
- package/lib/client/settings/sections/sources.js +72 -0
- package/lib/client/settings/sections/sources.js.map +1 -0
- package/lib/client/settings/sections/status.js +37 -0
- package/lib/client/settings/sections/status.js.map +1 -0
- package/lib/client/settings/sections.js +23 -0
- package/lib/client/settings/sections.js.map +1 -0
- package/lib/client/settings/styles.js +57 -0
- package/lib/client/settings/styles.js.map +1 -0
- package/lib/client/stream-publisher.js +47 -0
- package/lib/client/stream-publisher.js.map +1 -0
- package/lib/client/styles.js +85 -19
- package/lib/client/styles.js.map +1 -1
- package/lib/client/types.js.map +1 -1
- package/lib/client/use-right-rail.js +96 -0
- package/lib/client/use-right-rail.js.map +1 -0
- package/lib/client/use-session-ui-state.js +26 -19
- package/lib/client/use-session-ui-state.js.map +1 -1
- package/lib/client.js +4788 -869
- package/lib/client.js.map +1 -1
- package/lib/config-resolvers/accounts.js +60 -0
- package/lib/config-resolvers/accounts.js.map +1 -0
- package/lib/config-resolvers/attachments.js +28 -0
- package/lib/config-resolvers/attachments.js.map +1 -0
- package/lib/config-resolvers/basics.js +59 -0
- package/lib/config-resolvers/basics.js.map +1 -0
- package/lib/config-resolvers/defaults.js +132 -0
- package/lib/config-resolvers/defaults.js.map +1 -0
- package/lib/config-resolvers/lockdown.js +79 -0
- package/lib/config-resolvers/lockdown.js.map +1 -0
- package/lib/config-resolvers/session.js +42 -0
- package/lib/config-resolvers/session.js.map +1 -0
- package/lib/config-resolvers/shared.js +42 -0
- package/lib/config-resolvers/shared.js.map +1 -0
- package/lib/config-resolvers/sources.js +81 -0
- package/lib/config-resolvers/sources.js.map +1 -0
- package/lib/config-resolvers/ui.js +20 -0
- package/lib/config-resolvers/ui.js.map +1 -0
- package/lib/config.js +65 -4
- package/lib/config.js.map +1 -1
- package/lib/entry-redirect.js +2 -1
- package/lib/entry-redirect.js.map +1 -1
- package/lib/index.js +123 -74
- package/lib/index.js.map +1 -1
- package/lib/profile.js +214 -0
- package/lib/profile.js.map +1 -0
- package/lib/prompt-notes.js +231 -0
- package/lib/prompt-notes.js.map +1 -0
- package/lib/resolve-config.js +35 -410
- package/lib/resolve-config.js.map +1 -1
- package/lib/secure-session.js +82 -16
- package/lib/secure-session.js.map +1 -1
- package/lib/shared/session-key.js +18 -0
- package/lib/shared/session-key.js.map +1 -0
- package/lib/shared/settings.js +10 -0
- package/lib/shared/settings.js.map +1 -0
- package/lib/thinking-phrases.js +68 -0
- package/lib/thinking-phrases.js.map +1 -0
- package/lib/typert.host.js +162 -17
- package/lib/typert.remote-client.d.ts +5 -1
- package/lib/typert.remote-client.js +132 -13
- package/lib/types/account-remotes.d.ts +42 -0
- package/lib/types/accounts/credentials.d.ts +14 -0
- package/lib/types/accounts/errors.d.ts +11 -0
- package/lib/types/accounts/file.d.ts +82 -0
- package/lib/types/accounts/store.d.ts +66 -43
- package/lib/types/accounts/token.d.ts +31 -0
- package/lib/types/attachment-rules.d.ts +44 -0
- package/lib/types/cli.d.ts +2 -2
- package/lib/types/client/QaAccountsController.d.ts +8 -1
- package/lib/types/client/QaSessionController.d.ts +16 -16
- package/lib/types/client/QaSurface.d.ts +7 -1
- package/lib/types/client/attachments.d.ts +54 -0
- package/lib/types/client/base64.d.ts +10 -0
- package/lib/types/client/chat-files.d.ts +30 -0
- package/lib/types/client/components/QaChangelog.d.ts +1 -1
- package/lib/types/client/components/QaComposer.d.ts +8 -4
- package/lib/types/client/components/QaFileAttachment.d.ts +14 -0
- package/lib/types/client/components/QaFilesPanel.d.ts +15 -0
- package/lib/types/client/components/QaHeader.d.ts +41 -0
- package/lib/types/client/components/QaMessage.d.ts +3 -1
- package/lib/types/client/components/QaModal.d.ts +26 -0
- package/lib/types/client/components/QaProfile.d.ts +25 -0
- package/lib/types/client/components/QaRightRail.d.ts +23 -0
- package/lib/types/client/components/QaSidebar.d.ts +14 -0
- package/lib/types/client/components/{QaSourcesDrawer.d.ts → QaSourcesPanel.d.ts} +7 -4
- package/lib/types/client/components/QaTurnRail.d.ts +6 -0
- package/lib/types/client/components/QaWidthHandle.d.ts +14 -7
- package/lib/types/client/components/QaWorkGroup.d.ts +5 -3
- package/lib/types/client/components/surface-utils.d.ts +11 -0
- package/lib/types/client/components/thinking-phrases.d.ts +9 -0
- package/lib/types/client/create-session.d.ts +6 -9
- package/lib/types/client/failure-copy.d.ts +19 -0
- package/lib/types/client/prompt-content.d.ts +30 -0
- package/lib/types/client/settings/card.d.ts +23 -0
- package/lib/types/client/settings/fields.d.ts +139 -0
- package/lib/types/client/settings/format.d.ts +108 -0
- package/lib/types/client/settings/sections/access.d.ts +9 -0
- package/lib/types/client/settings/sections/accounts.d.ts +9 -0
- package/lib/types/client/settings/sections/attachments.d.ts +15 -0
- package/lib/types/client/settings/sections/branding.d.ts +8 -0
- package/lib/types/client/settings/sections/common.d.ts +28 -0
- package/lib/types/client/settings/sections/embedding.d.ts +8 -0
- package/lib/types/client/settings/sections/interface.d.ts +9 -0
- package/lib/types/client/settings/sections/lockdown.d.ts +9 -0
- package/lib/types/client/settings/sections/session.d.ts +9 -0
- package/lib/types/client/settings/sections/sources.d.ts +9 -0
- package/lib/types/client/settings/sections/status.d.ts +22 -0
- package/lib/types/client/settings/sections.d.ts +25 -0
- package/lib/types/client/settings/styles.d.ts +8 -0
- package/lib/types/client/stream-publisher.d.ts +28 -0
- package/lib/types/client/types.d.ts +29 -1
- package/lib/types/client/use-right-rail.d.ts +56 -0
- package/lib/types/client/use-session-ui-state.d.ts +13 -7
- package/lib/types/config-resolvers/accounts.d.ts +15 -0
- package/lib/types/config-resolvers/attachments.d.ts +6 -0
- package/lib/types/config-resolvers/basics.d.ts +8 -0
- package/lib/types/config-resolvers/defaults.d.ts +4 -0
- package/lib/types/config-resolvers/lockdown.d.ts +10 -0
- package/lib/types/config-resolvers/session.d.ts +6 -0
- package/lib/types/config-resolvers/shared.d.ts +16 -0
- package/lib/types/config-resolvers/sources.d.ts +6 -0
- package/lib/types/config-resolvers/ui.d.ts +6 -0
- package/lib/types/index.d.ts +20 -13
- package/lib/types/profile.d.ts +76 -0
- package/lib/types/prompt-notes.d.ts +110 -0
- package/lib/types/resolve-config.d.ts +8 -3
- package/lib/types/secure-session.d.ts +26 -1
- package/lib/types/shared/session-key.d.ts +23 -0
- package/lib/types/shared/settings.d.ts +10 -0
- package/lib/types/thinking-phrases.d.ts +17 -0
- package/lib/types/types.d.ts +123 -5
- package/lib/types/user-workspace.d.ts +38 -0
- package/lib/user-workspace.js +231 -0
- package/lib/user-workspace.js.map +1 -0
- package/package.json +14 -7
- package/CHANGELOG.md +0 -176
- package/SPEC-dsh-qa-surface.md +0 -2425
- package/docs/ARCHITECTURE.md +0 -66
- package/docs/COMPATIBILITY.md +0 -14
- package/docs/CONFIGURATION.md +0 -199
- package/docs/EMBEDDING.md +0 -13
- package/docs/SOURCES-MIGRATION.md +0 -28
- package/docs/SOURCES-PROVENANCE-AUDIT.md +0 -88
- package/docs/SPEC-dsh-qa-surface-accounts.md +0 -219
- package/docs/SPEC-dsh-qa-surface-sources-provenance.md +0 -1692
- package/lib/client/components/QaSourcesDrawer.js.map +0 -1
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Shared controls of the QA Surface card body.
|
|
4
|
+
*
|
|
5
|
+
* Every control edits the settings namespace through the same path-addressed
|
|
6
|
+
* write, and text and number drafts commit on blur or Enter rather than per
|
|
7
|
+
* keystroke: a half-typed path or an emptied number is a value the Host
|
|
8
|
+
* refuses, and a refusal mid-typing would clear the field the user is still
|
|
9
|
+
* editing. Controls that must land together (a provider with its model, the
|
|
10
|
+
* per-user sandbox with its flag) write every path in one mutation, because
|
|
11
|
+
* the Host validates the section as a whole.
|
|
12
|
+
*/
|
|
13
|
+
import { useEffect, useState } from "react";
|
|
14
|
+
import { formatIdentityFields, parseIdentityFields, parseNumberDraft, } from "./format.js";
|
|
15
|
+
/** Section frame: title, optional modified marker, optional trailing control. */
|
|
16
|
+
export function Section(props) {
|
|
17
|
+
return (_jsxs("section", { className: "qa-card-section", children: [_jsxs("div", { className: "qa-card-section__title", children: [_jsxs("h3", { children: [props.title, props.modified ? (_jsx("span", { className: "qa-card-modified", children: "\u0438\u0437\u043C\u0435\u043D\u0435\u043D\u043E" })) : null] }), props.aside ??
|
|
18
|
+
(props.hint === undefined ? null : (_jsx("span", { className: "qa-card-muted", children: props.hint })))] }), props.children] }));
|
|
19
|
+
}
|
|
20
|
+
/** Small clearing control shown beside a section the user layer overrides. */
|
|
21
|
+
export function ResetButton(props) {
|
|
22
|
+
return (_jsx("button", { type: "button", className: "qa-card-btn link", disabled: props.disabled, onClick: props.onClick, children: props.label }));
|
|
23
|
+
}
|
|
24
|
+
/** Two-state control with a label and an explanatory hint. */
|
|
25
|
+
export function Toggle(props) {
|
|
26
|
+
return (_jsxs("label", { className: "qa-card-toggle-row", children: [_jsxs("span", { className: "qa-card-toggle-copy", children: [_jsx("strong", { children: props.label }), _jsx("span", { children: props.hint })] }), _jsx("input", { className: "qa-card-toggle", type: "checkbox", checked: props.checked, disabled: props.disabled, onChange: (event) => {
|
|
27
|
+
props.onChange(event.currentTarget.checked);
|
|
28
|
+
} })] }));
|
|
29
|
+
}
|
|
30
|
+
/** Fixed-option control for the schema's string unions. */
|
|
31
|
+
export function SelectField(props) {
|
|
32
|
+
return (_jsxs("label", { className: "qa-card-field", children: [_jsx("span", { children: props.label }), _jsx("select", { className: "qa-card-control", value: props.value, disabled: props.disabled, onChange: (event) => {
|
|
33
|
+
props.onChange(event.currentTarget.value);
|
|
34
|
+
}, children: props.options.map((option) => (_jsx("option", { value: option.value, children: option.label }, option.value))) }), props.hint === undefined ? null : (_jsx("span", { className: "qa-card-muted", children: props.hint }))] }));
|
|
35
|
+
}
|
|
36
|
+
/** Text control; the draft commits on blur and on Enter. */
|
|
37
|
+
export function TextField(props) {
|
|
38
|
+
const [draft, setDraft] = useState(props.value);
|
|
39
|
+
useEffect(() => {
|
|
40
|
+
setDraft(props.value);
|
|
41
|
+
}, [props.value]);
|
|
42
|
+
const commit = () => {
|
|
43
|
+
if (draft !== props.value)
|
|
44
|
+
props.onChange(draft);
|
|
45
|
+
};
|
|
46
|
+
const shared = {
|
|
47
|
+
className: "qa-card-control",
|
|
48
|
+
value: draft,
|
|
49
|
+
placeholder: props.placeholder ?? "",
|
|
50
|
+
disabled: props.disabled,
|
|
51
|
+
onChange: (event) => {
|
|
52
|
+
setDraft(event.currentTarget.value);
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
return (_jsxs("label", { className: "qa-card-field", children: [_jsx("span", { children: props.label }), props.multiline === true ? (_jsx("textarea", { ...shared, rows: props.rows ?? 3, onBlur: commit })) : (_jsx("input", { ...shared, type: "text", onBlur: commit, onKeyDown: (event) => {
|
|
56
|
+
if (event.key === "Enter")
|
|
57
|
+
commit();
|
|
58
|
+
} })), props.hint === undefined ? null : (_jsx("span", { className: "qa-card-muted", children: props.hint }))] }));
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Whole-number control; the draft commits on blur and on Enter. A value
|
|
62
|
+
* outside the range snaps into it on commit, so the field never holds a
|
|
63
|
+
* number the Host would refuse outright.
|
|
64
|
+
*/
|
|
65
|
+
export function NumberField(props) {
|
|
66
|
+
const [draft, setDraft] = useState(String(props.value));
|
|
67
|
+
useEffect(() => {
|
|
68
|
+
setDraft(String(props.value));
|
|
69
|
+
}, [props.value]);
|
|
70
|
+
const commit = () => {
|
|
71
|
+
const next = parseNumberDraft(draft, props.min, props.max);
|
|
72
|
+
if (next === null) {
|
|
73
|
+
setDraft(String(props.value));
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
setDraft(String(next));
|
|
77
|
+
if (next !== props.value)
|
|
78
|
+
props.onChange(next);
|
|
79
|
+
};
|
|
80
|
+
return (_jsxs("label", { className: "qa-card-field", children: [_jsxs("span", { children: [props.label, " ", _jsxs("span", { className: "qa-card-muted", children: ["(", props.min, "\u2013", props.max, ")"] })] }), _jsx("input", { className: "qa-card-control", type: "number", inputMode: "numeric", min: props.min, max: props.max, value: draft, disabled: props.disabled, onChange: (event) => {
|
|
81
|
+
setDraft(event.currentTarget.value);
|
|
82
|
+
}, onBlur: commit, onKeyDown: (event) => {
|
|
83
|
+
if (event.key === "Enter")
|
|
84
|
+
commit();
|
|
85
|
+
} }), props.hint === undefined ? null : (_jsx("span", { className: "qa-card-muted", children: props.hint }))] }));
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* List control for string arrays. The draft parses on commit so a separator
|
|
89
|
+
* the user is still typing never becomes a stored entry.
|
|
90
|
+
*/
|
|
91
|
+
export function ListField(props) {
|
|
92
|
+
// The draft follows the stored text, not the array identity: a caller that
|
|
93
|
+
// passes an equal but fresh list (an unset field, whose default is written
|
|
94
|
+
// as a literal) would otherwise reset the control on every render and eat
|
|
95
|
+
// what the user is typing.
|
|
96
|
+
const stored = props.value.join("\n");
|
|
97
|
+
const [draft, setDraft] = useState(stored);
|
|
98
|
+
useEffect(() => {
|
|
99
|
+
setDraft(stored);
|
|
100
|
+
}, [stored]);
|
|
101
|
+
const commit = () => {
|
|
102
|
+
const next = props.parse(draft);
|
|
103
|
+
if (next.join("\u0000") !== props.value.join("\u0000")) {
|
|
104
|
+
props.onCommit(next);
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
return (_jsxs("label", { className: "qa-card-field", children: [_jsx("span", { children: props.label }), _jsx("textarea", { className: "qa-card-control", rows: props.rows ?? 4, value: draft, placeholder: props.placeholder ?? "", disabled: props.disabled, onChange: (event) => {
|
|
108
|
+
setDraft(event.currentTarget.value);
|
|
109
|
+
}, onBlur: commit }), props.hint === undefined ? null : (_jsx("span", { className: "qa-card-muted", children: props.hint }))] }));
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* The deployment's declared profile fields, one `key = подпись` per line. The
|
|
113
|
+
* control keeps its own draft so a line still being typed is not parsed into
|
|
114
|
+
* the stored array.
|
|
115
|
+
*/
|
|
116
|
+
export function IdentitiesField(props) {
|
|
117
|
+
const value = formatIdentityFields(props.value.flatMap((field) => field.key === undefined
|
|
118
|
+
? []
|
|
119
|
+
: [{ key: field.key, label: field.label ?? field.key }]));
|
|
120
|
+
const [draft, setDraft] = useState(value);
|
|
121
|
+
useEffect(() => {
|
|
122
|
+
setDraft(value);
|
|
123
|
+
}, [value]);
|
|
124
|
+
const commit = () => {
|
|
125
|
+
const next = parseIdentityFields(draft);
|
|
126
|
+
if (formatIdentityFields(next) !== value)
|
|
127
|
+
props.onCommit(next);
|
|
128
|
+
};
|
|
129
|
+
return (_jsxs("label", { className: "qa-card-field", children: [_jsx("span", { children: "\u041F\u043E\u043B\u044F \u043F\u0440\u043E\u0444\u0438\u043B\u044F \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F" }), _jsx("textarea", { className: "qa-card-control", rows: 4, value: draft, placeholder: "jira = Jira\nconfluence = Confluence", disabled: props.disabled, onChange: (event) => {
|
|
130
|
+
setDraft(event.currentTarget.value);
|
|
131
|
+
}, onBlur: commit }), _jsx("span", { className: "qa-card-muted", children: "\u041F\u043E \u0441\u0442\u0440\u043E\u043A\u0435 \u043D\u0430 \u043F\u043E\u043B\u0435, \u0444\u043E\u0440\u043C\u0430\u0442 \u00AB\u043A\u043B\u044E\u0447 = \u043F\u043E\u0434\u043F\u0438\u0441\u044C\u00BB. \u041A\u043B\u044E\u0447 \u2014 \u043B\u0430\u0442\u0438\u043D\u0438\u0446\u0430 \u0432 \u043D\u0438\u0436\u043D\u0435\u043C \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0435, \u0434\u043E 8 \u043F\u043E\u043B\u0435\u0439. \u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C \u0437\u0430\u043F\u043E\u043B\u043D\u044F\u0435\u0442 \u044D\u0442\u0438 \u043F\u043E\u043B\u044F \u0432 \u0441\u0432\u043E\u0451\u043C \u043F\u0440\u043E\u0444\u0438\u043B\u0435, \u0438 \u043E\u043D\u0438 \u0443\u0445\u043E\u0434\u044F\u0442 \u0432 \u0441\u0438\u0441\u0442\u0435\u043C\u043D\u0443\u044E \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0443." })] }));
|
|
132
|
+
}
|
|
133
|
+
/** Status chip pair: label and value with the mode's tone. */
|
|
134
|
+
export function Chip(props) {
|
|
135
|
+
return (_jsxs("span", { className: props.tone === undefined ? "qa-card-chip" : `qa-card-chip ${props.tone}`, children: [props.label, " ", _jsx("b", { children: props.value })] }));
|
|
136
|
+
}
|
|
137
|
+
/** Prose notice: informational or warning, never a control. */
|
|
138
|
+
export function Notice(props) {
|
|
139
|
+
return (_jsx("div", { className: `qa-card-notice ${props.tone}`, role: "status", children: props.children }));
|
|
140
|
+
}
|
|
141
|
+
/** Fixed facts of the composed policy, shown as label/value rows. */
|
|
142
|
+
export function Facts(props) {
|
|
143
|
+
return (_jsx("div", { className: "qa-card-rows", children: props.items.map((item) => (_jsxs("div", { className: "qa-card-row", children: [_jsxs("span", { children: [_jsx("b", { children: item.label }), item.note === undefined ? null : (_jsxs("span", { className: "qa-card-muted", children: [" ", item.note] }))] }), _jsx("code", { children: item.value })] }, item.label))) }));
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=fields.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fields.js","sourceRoot":"","sources":["../../../src/client/settings/fields.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure presentation helpers of the QA Surface settings card.
|
|
3
|
+
*
|
|
4
|
+
* Kept out of the components so the wording and the draft parsing are
|
|
5
|
+
* unit-testable without a DOM, and so every place that renders the same value
|
|
6
|
+
* renders it identically. Nothing here may reach the Host config surface: the
|
|
7
|
+
* card bundle must not pull schemastery into the page.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Header badge: the route the page answers on, or that the surface is off.
|
|
11
|
+
* The route is the one fact an operator scanning the plugin list looks for.
|
|
12
|
+
*/
|
|
13
|
+
export function badgeText(enabled, routePath) {
|
|
14
|
+
if (enabled === false)
|
|
15
|
+
return "Выключено";
|
|
16
|
+
return routePath === undefined || routePath === "" ? "/qa" : routePath;
|
|
17
|
+
}
|
|
18
|
+
/** Wording of the session-policy control. */
|
|
19
|
+
export function describeSessionPolicy(policy) {
|
|
20
|
+
switch (policy) {
|
|
21
|
+
case "new-on-load":
|
|
22
|
+
return {
|
|
23
|
+
label: "Новый чат при каждой загрузке",
|
|
24
|
+
hint: "Каждый заход начинается с пустой беседы; прошлые чаты остаются в истории хоста.",
|
|
25
|
+
};
|
|
26
|
+
case "fixed":
|
|
27
|
+
return {
|
|
28
|
+
label: "Один фиксированный чат",
|
|
29
|
+
hint: "Все посетители работают в одной заранее созданной сессии.",
|
|
30
|
+
};
|
|
31
|
+
case "browser-persistent":
|
|
32
|
+
return {
|
|
33
|
+
label: "Чат закреплён за браузером",
|
|
34
|
+
hint: "Перезагрузка страницы возвращает ту же беседу этого браузера.",
|
|
35
|
+
};
|
|
36
|
+
default:
|
|
37
|
+
return {
|
|
38
|
+
label: "Чат закреплён за браузером",
|
|
39
|
+
hint: "Перезагрузка страницы возвращает ту же беседу этого браузера.",
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/** Wording of the sandbox-mode control. */
|
|
44
|
+
export function describeSandbox(mode) {
|
|
45
|
+
switch (mode) {
|
|
46
|
+
case "workspace-write":
|
|
47
|
+
return {
|
|
48
|
+
label: "Запись в рабочее пространство",
|
|
49
|
+
hint: "Допустима только вместе с персональными рабочими пространствами аккаунтов.",
|
|
50
|
+
};
|
|
51
|
+
default:
|
|
52
|
+
return {
|
|
53
|
+
label: "Только чтение",
|
|
54
|
+
hint: "Инструменты не могут изменить рабочую директорию сессии.",
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Parse a numeric control's draft text.
|
|
60
|
+
* @param text - raw input value.
|
|
61
|
+
* @param min - lowest accepted value, clamped into range on commit.
|
|
62
|
+
* @param max - highest accepted value, clamped into range on commit.
|
|
63
|
+
* @returns the integer, or null when the field is empty or not numeric (the
|
|
64
|
+
* caller leaves the stored value alone rather than writing a NaN).
|
|
65
|
+
*/
|
|
66
|
+
export function parseNumberDraft(text, min, max) {
|
|
67
|
+
const trimmed = text.trim();
|
|
68
|
+
if (trimmed.length === 0)
|
|
69
|
+
return null;
|
|
70
|
+
const value = Number(trimmed);
|
|
71
|
+
if (!Number.isFinite(value))
|
|
72
|
+
return null;
|
|
73
|
+
return Math.min(max, Math.max(min, Math.round(value)));
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Parse a one-entry-per-line list control's draft text. Questions and phrases
|
|
77
|
+
* are free copy, so a comma inside an entry must stay part of that entry.
|
|
78
|
+
*/
|
|
79
|
+
export function parseLineList(text) {
|
|
80
|
+
return text
|
|
81
|
+
.split(/\r?\n/u)
|
|
82
|
+
.map((entry) => entry.trim())
|
|
83
|
+
.filter((entry) => entry.length > 0);
|
|
84
|
+
}
|
|
85
|
+
/** Parse a list control whose entries may also be comma-separated. */
|
|
86
|
+
export function parseCommaList(text) {
|
|
87
|
+
return text
|
|
88
|
+
.split(/[\n,]/u)
|
|
89
|
+
.map((entry) => entry.trim())
|
|
90
|
+
.filter((entry) => entry.length > 0);
|
|
91
|
+
}
|
|
92
|
+
/** Identity keys are lowercase labels; the same shape the Host enforces. */
|
|
93
|
+
const IDENTITY_KEY = /^[a-z][a-z0-9_-]{0,31}$/u;
|
|
94
|
+
/** Longest accepted display label of one identity field (Host rule). */
|
|
95
|
+
const IDENTITY_LABEL_MAX = 40;
|
|
96
|
+
/**
|
|
97
|
+
* Parse the identity-field control: one `key = подпись` entry per line. A
|
|
98
|
+
* missing label falls back to the key, and an entry whose key cannot exist on
|
|
99
|
+
* the Host is dropped here rather than refused as a whole write.
|
|
100
|
+
*/
|
|
101
|
+
export function parseIdentityFields(text) {
|
|
102
|
+
const fields = [];
|
|
103
|
+
const seen = new Set();
|
|
104
|
+
for (const line of text.split(/\r?\n/u)) {
|
|
105
|
+
const [rawKey = "", ...rest] = line.split("=");
|
|
106
|
+
const key = rawKey.trim().toLowerCase();
|
|
107
|
+
if (!IDENTITY_KEY.test(key) || seen.has(key))
|
|
108
|
+
continue;
|
|
109
|
+
seen.add(key);
|
|
110
|
+
const label = rest.join("=").trim().slice(0, IDENTITY_LABEL_MAX);
|
|
111
|
+
fields.push({ key, label: label === "" ? key : label });
|
|
112
|
+
}
|
|
113
|
+
return fields;
|
|
114
|
+
}
|
|
115
|
+
/** Render declared identity fields back into the control's draft text. */
|
|
116
|
+
export function formatIdentityFields(fields) {
|
|
117
|
+
return (fields ?? [])
|
|
118
|
+
.map((field) => `${field.key} = ${field.label}`)
|
|
119
|
+
.join("\n");
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Prerequisites `accounts.perUserWorkspace` cannot run without. The Host
|
|
123
|
+
* refuses the configuration while any of them is unmet, and the sandbox mode
|
|
124
|
+
* is the one entry the card must write together with the flag: both
|
|
125
|
+
* `workspace-write` alone and per-user workspaces alone are refused.
|
|
126
|
+
*/
|
|
127
|
+
export function perUserWorkspaceGaps(config) {
|
|
128
|
+
const gaps = [];
|
|
129
|
+
if (config.accounts?.enabled !== true)
|
|
130
|
+
gaps.push("включены аккаунты");
|
|
131
|
+
if ((config.session?.workspaceId ?? null) === null)
|
|
132
|
+
gaps.push("задан session.workspaceId");
|
|
133
|
+
if (config.session?.policy === "fixed")
|
|
134
|
+
gaps.push("политика сессии не «фиксированный чат»");
|
|
135
|
+
if (config.lockdown?.enabled !== true)
|
|
136
|
+
gaps.push("включена блокировка");
|
|
137
|
+
if (config.lockdown?.enforceFixedWorkspace !== true)
|
|
138
|
+
gaps.push("включён lockdown.enforceFixedWorkspace");
|
|
139
|
+
if (config.lockdown?.sandboxMode !== "workspace-write")
|
|
140
|
+
gaps.push("sandboxMode = «запись в рабочее пространство»");
|
|
141
|
+
return gaps;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Whether the raw user layer carries this path, which is what marks a field
|
|
145
|
+
* overridden — a value equal to the composition default is still an override.
|
|
146
|
+
* @param user - raw user section from the settings snapshot.
|
|
147
|
+
* @param path - path from the section root.
|
|
148
|
+
* @returns true when every segment exists in the user layer.
|
|
149
|
+
*/
|
|
150
|
+
export function isOverridden(user, path) {
|
|
151
|
+
let cursor = user;
|
|
152
|
+
for (const segment of path) {
|
|
153
|
+
if (typeof cursor !== "object" ||
|
|
154
|
+
cursor === null ||
|
|
155
|
+
Array.isArray(cursor)) {
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
const record = cursor;
|
|
159
|
+
if (!Object.hasOwn(record, segment))
|
|
160
|
+
return false;
|
|
161
|
+
cursor = record[segment];
|
|
162
|
+
}
|
|
163
|
+
return true;
|
|
164
|
+
}
|
|
165
|
+
/** Top-level keys the user layer carries; the reset-all action clears exactly these. */
|
|
166
|
+
export function overriddenKeys(user) {
|
|
167
|
+
if (typeof user !== "object" || user === null || Array.isArray(user)) {
|
|
168
|
+
return [];
|
|
169
|
+
}
|
|
170
|
+
return Object.keys(user).sort();
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Read a path out of a settings section.
|
|
174
|
+
* @param value - section root (the snapshot's effective value or user layer).
|
|
175
|
+
* @param path - path from the section root.
|
|
176
|
+
* @returns the value found, or undefined when any segment is absent.
|
|
177
|
+
*/
|
|
178
|
+
export function readPath(value, path) {
|
|
179
|
+
let cursor = value;
|
|
180
|
+
for (const segment of path) {
|
|
181
|
+
if (typeof cursor !== "object" || cursor === null)
|
|
182
|
+
return undefined;
|
|
183
|
+
cursor = cursor[segment];
|
|
184
|
+
}
|
|
185
|
+
return cursor;
|
|
186
|
+
}
|
|
187
|
+
/** Empty in every form the resolver accepts: absent, null, or an empty string. */
|
|
188
|
+
function isEmptySetting(value) {
|
|
189
|
+
return value === undefined || value === null || value === "";
|
|
190
|
+
}
|
|
191
|
+
/** Whether two settings values are the same as the Host would store them. */
|
|
192
|
+
function isSameSetting(left, right) {
|
|
193
|
+
if (isEmptySetting(left) && isEmptySetting(right))
|
|
194
|
+
return true;
|
|
195
|
+
return JSON.stringify(left) === JSON.stringify(right);
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Whether a settled mutation left the section holding what it asked for.
|
|
199
|
+
*
|
|
200
|
+
* The scope resolves a Host-rejected write instead of rejecting it — it
|
|
201
|
+
* reloads Host state and returns — so acceptance is confirmed here. The
|
|
202
|
+
* namespace revision advances on every committed change, and a write that
|
|
203
|
+
* changed nothing is indistinguishable from a refusal; in that one case the
|
|
204
|
+
* section itself answers whether the value already stood.
|
|
205
|
+
* @param entries - writes the mutation asked for.
|
|
206
|
+
* @param cleared - paths the mutation asked to clear.
|
|
207
|
+
* @param snapshot - the scope snapshot as it stands after the settlement.
|
|
208
|
+
* @returns true when the mutation's intent is visible in the section.
|
|
209
|
+
*/
|
|
210
|
+
export function mutationLanded(entries, cleared, snapshot) {
|
|
211
|
+
for (const entry of entries) {
|
|
212
|
+
if (!isSameSetting(readPath(snapshot.value, entry.path), entry.value)) {
|
|
213
|
+
return false;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
for (const path of cleared) {
|
|
217
|
+
if (isOverridden(snapshot.user, path))
|
|
218
|
+
return false;
|
|
219
|
+
}
|
|
220
|
+
return true;
|
|
221
|
+
}
|
|
222
|
+
/** Wall-clock stamp of the last Host answer, for the status line. */
|
|
223
|
+
export function formatClock(timestamp) {
|
|
224
|
+
if (timestamp === undefined || !Number.isFinite(timestamp))
|
|
225
|
+
return "—";
|
|
226
|
+
return new Date(timestamp).toLocaleTimeString("ru-RU", {
|
|
227
|
+
hour: "2-digit",
|
|
228
|
+
minute: "2-digit",
|
|
229
|
+
second: "2-digit",
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Count with the Russian form of its noun: 1 ключ, 2 ключа, 5 ключей.
|
|
234
|
+
* @param count - counted value.
|
|
235
|
+
* @param forms - singular, few, and many forms of the noun.
|
|
236
|
+
* @returns the counted noun as the copy renders it.
|
|
237
|
+
*/
|
|
238
|
+
export function pluralRu(count, forms) {
|
|
239
|
+
const mod100 = count % 100;
|
|
240
|
+
const mod10 = count % 10;
|
|
241
|
+
if (mod100 >= 11 && mod100 <= 14)
|
|
242
|
+
return `${String(count)} ${forms[2]}`;
|
|
243
|
+
if (mod10 === 1)
|
|
244
|
+
return `${String(count)} ${forms[0]}`;
|
|
245
|
+
if (mod10 >= 2 && mod10 <= 4)
|
|
246
|
+
return `${String(count)} ${forms[1]}`;
|
|
247
|
+
return `${String(count)} ${forms[2]}`;
|
|
248
|
+
}
|
|
249
|
+
/** Thousands separator so long byte budgets stay readable. */
|
|
250
|
+
export function formatCount(value) {
|
|
251
|
+
if (value === undefined || !Number.isFinite(value))
|
|
252
|
+
return "—";
|
|
253
|
+
return Math.round(value).toLocaleString("ru-RU");
|
|
254
|
+
}
|
|
255
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/client/settings/format.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Access and route: the only section whose consequences reach beyond this
|
|
4
|
+
* plugin's namespace — the path it claims on the Host and where external
|
|
5
|
+
* visitors of the harness root land.
|
|
6
|
+
*/
|
|
7
|
+
import { Notice, Section, TextField, Toggle } from "../fields.js";
|
|
8
|
+
import { overriddenAny, resetAside, } from "./common.js";
|
|
9
|
+
/** Where the page lives and who may reach it. */
|
|
10
|
+
export function AccessSection(props) {
|
|
11
|
+
const config = props.config;
|
|
12
|
+
const disabled = !props.writable;
|
|
13
|
+
const paths = [["enabled"], ["route"], ["entry"]];
|
|
14
|
+
const modified = overriddenAny(props, paths);
|
|
15
|
+
return (_jsxs(Section, { title: "\u0414\u043E\u0441\u0442\u0443\u043F \u0438 \u043C\u0430\u0440\u0448\u0440\u0443\u0442", modified: modified, aside: resetAside(props, paths), children: [_jsxs("div", { className: "qa-card-grid", children: [_jsx(Toggle, { checked: config?.enabled ?? true, disabled: disabled, label: "\u0421\u0442\u0440\u0430\u043D\u0438\u0446\u0430 \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u0430", hint: "\u0412\u044B\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u0430\u044F \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430 \u043D\u0435 \u043E\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043F\u043E \u043C\u0430\u0440\u0448\u0440\u0443\u0442\u0443 \u0438 \u043D\u0435 \u043F\u0435\u0440\u0435\u043D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0432\u043D\u0435\u0448\u043D\u0438\u0435 \u0432\u0445\u043E\u0434\u044B.", onChange: (value) => {
|
|
16
|
+
props.write(["enabled"], value);
|
|
17
|
+
} }), _jsx(Toggle, { checked: config?.route?.matchChildren ?? true, disabled: disabled, label: "\u0412\u043A\u043B\u044E\u0447\u0430\u044F \u0432\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043F\u0443\u0442\u0438", hint: "\u041C\u0430\u0440\u0448\u0440\u0443\u0442 \u0441 \u0432\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u043C\u0438 \u0430\u0434\u0440\u0435\u0441\u0430\u043C\u0438 \u043E\u0441\u0442\u0430\u0451\u0442\u0441\u044F \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0435\u0439 \u043F\u043E\u043C\u043E\u0449\u043D\u0438\u043A\u0430.", onChange: (value) => {
|
|
18
|
+
props.write(["route", "matchChildren"], value);
|
|
19
|
+
} }), _jsx(TextField, { label: "\u041F\u0443\u0442\u044C \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B", value: config?.route?.path ?? "/qa", disabled: disabled, placeholder: "/qa", hint: "\u041D\u0430\u0447\u0438\u043D\u0430\u0435\u0442\u0441\u044F \u0441 \u00AB/\u00BB; \u043D\u0435\u043B\u044C\u0437\u044F \u0437\u0430\u043D\u044F\u0442\u044C \u00AB/\u00BB, \u00AB/api\u00BB \u0438 \u00AB/plugins\u00BB. \u0421\u043C\u0435\u043D\u0430 \u043F\u0443\u0442\u0438 \u043F\u0435\u0440\u0435\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u043C\u0430\u0440\u0448\u0440\u0443\u0442 \u043D\u0430 \u0445\u043E\u0441\u0442\u0435.", onChange: (value) => {
|
|
20
|
+
props.write(["route", "path"], value);
|
|
21
|
+
} }), _jsx(Toggle, { checked: config?.entry?.redirectNonLoopback ?? true, disabled: disabled, label: "\u0412\u043D\u0435\u0448\u043D\u0438\u0435 \u0432\u0445\u043E\u0434\u044B \u2014 \u043D\u0430 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443 \u043F\u043E\u043C\u043E\u0449\u043D\u0438\u043A\u0430", hint: "\u041A\u043E\u0440\u0435\u043D\u044C \u0445\u0430\u0440\u043D\u0435\u0441\u0441\u0430, \u043E\u0442\u043A\u0440\u044B\u0442\u044B\u0439 \u043F\u043E \u0432\u043D\u0435\u0448\u043D\u0435\u043C\u0443 \u0430\u0434\u0440\u0435\u0441\u0443, \u043F\u0435\u0440\u0435\u0430\u0434\u0440\u0435\u0441\u0443\u0435\u0442\u0441\u044F \u0441\u044E\u0434\u0430. \u041B\u043E\u043A\u0430\u043B\u044C\u043D\u044B\u0439 \u0432\u0445\u043E\u0434 \u043E\u043F\u0435\u0440\u0430\u0442\u043E\u0440\u0430 \u043D\u0435 \u0437\u0430\u0442\u0440\u0430\u0433\u0438\u0432\u0430\u0435\u0442\u0441\u044F.", onChange: (value) => {
|
|
22
|
+
props.write(["entry", "redirectNonLoopback"], value);
|
|
23
|
+
} })] }), (config?.entry?.redirectNonLoopback ?? true) ? (_jsx(Notice, { tone: "info", children: "\u041F\u0435\u0440\u0435\u043D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u043E: \u043B\u044E\u0431\u043E\u0439, \u043A\u0442\u043E \u043E\u0442\u043A\u0440\u044B\u043B \u0445\u0430\u0440\u043D\u0435\u0441\u0441 \u043F\u043E \u0432\u043D\u0435\u0448\u043D\u0435\u043C\u0443 \u0430\u0434\u0440\u0435\u0441\u0443, \u043F\u043E\u043F\u0430\u0434\u0451\u0442 \u043D\u0430 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443 \u043F\u043E\u043C\u043E\u0449\u043D\u0438\u043A\u0430, \u0430 \u043D\u0435 \u0432 \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u0430." })) : (_jsx(Notice, { tone: "warn", children: "\u041F\u0435\u0440\u0435\u043D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u0432\u044B\u043A\u043B\u044E\u0447\u0435\u043D\u043E: \u0432\u043D\u0435\u0448\u043D\u0438\u0439 \u043F\u043E\u0441\u0435\u0442\u0438\u0442\u0435\u043B\u044C \u043A\u043E\u0440\u043D\u044F \u0445\u0430\u0440\u043D\u0435\u0441\u0441\u0430 \u043E\u0441\u0442\u0430\u0451\u0442\u0441\u044F \u0432 \u043F\u043E\u043B\u043D\u043E\u043C \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u0430. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044C, \u0447\u0442\u043E \u043E\u043D \u0437\u0430\u043A\u0440\u044B\u0442 \u0434\u0440\u0443\u0433\u0438\u043C\u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043C\u0438." }))] }));
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=access.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"access.js","sourceRoot":"","sources":["../../../../src/client/settings/sections/access.tsx"],"names":[],"mappings":";AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EACL,aAAa,EACb,UAAU,GAGX,MAAM,aAAa,CAAC;AAErB,iDAAiD;AACjD,MAAM,UAAU,aAAa,CAAC,KAAkB;IAC9C,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;IACjC,MAAM,KAAK,GAAiB,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC7C,OAAO,CACL,MAAC,OAAO,IACN,KAAK,EAAC,wFAAkB,EACxB,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,aAE/B,eAAK,SAAS,EAAC,cAAc,aAC3B,KAAC,MAAM,IACL,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,IAAI,EAChC,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAC,mGAAmB,EACzB,IAAI,EAAC,qaAAiF,EACtF,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;4BAClB,KAAK,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC;wBAClC,CAAC,GACD,EACF,KAAC,MAAM,IACL,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,IAAI,IAAI,EAC7C,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAC,4HAAwB,EAC9B,IAAI,EAAC,iUAA6D,EAClE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;4BAClB,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,eAAe,CAAC,EAAE,KAAK,CAAC,CAAC;wBACjD,CAAC,GACD,EACF,KAAC,SAAS,IACR,KAAK,EAAC,2EAAe,EACrB,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,IAAI,KAAK,EACnC,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAC,KAAK,EACjB,IAAI,EAAC,4cAAyG,EAC9G,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;4BAClB,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC;wBACxC,CAAC,GACD,EACF,KAAC,MAAM,IACL,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,IAAI,IAAI,EACnD,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAC,uMAAuC,EAC7C,IAAI,EAAC,gkBAA+G,EACpH,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;4BAClB,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,qBAAqB,CAAC,EAAE,KAAK,CAAC,CAAC;wBACvD,CAAC,GACD,IACE,EACL,CAAC,MAAM,EAAE,KAAK,EAAE,mBAAmB,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAC9C,KAAC,MAAM,IAAC,IAAI,EAAC,MAAM,isBAGV,CACV,CAAC,CAAC,CAAC,CACF,KAAC,MAAM,IAAC,IAAI,EAAC,MAAM,qyBAIV,CACV,IACO,CACX,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Accounts: the account gate, the self-declared profile, and per-user
|
|
4
|
+
* workspaces. The per-user toggle lands together with the sandbox mode —
|
|
5
|
+
* the Host accepts that pairing or nothing.
|
|
6
|
+
*/
|
|
7
|
+
import { IdentitiesField, Notice, NumberField, Section, Toggle, } from "../fields.js";
|
|
8
|
+
import { perUserWorkspaceGaps } from "../format.js";
|
|
9
|
+
import { overriddenAny, resetAside, } from "./common.js";
|
|
10
|
+
/** The account gate, the self-declared profile, and per-user workspaces. */
|
|
11
|
+
export function AccountsSection(props) {
|
|
12
|
+
const config = props.config;
|
|
13
|
+
const disabled = !props.writable;
|
|
14
|
+
const accounts = config?.accounts;
|
|
15
|
+
const enabled = accounts?.enabled ?? false;
|
|
16
|
+
const profile = accounts?.profile;
|
|
17
|
+
const perUser = accounts?.perUserWorkspace ?? false;
|
|
18
|
+
const gaps = perUser ? [] : perUserWorkspaceGaps(config ?? {});
|
|
19
|
+
const paths = [["accounts"]];
|
|
20
|
+
const modified = overriddenAny(props, paths);
|
|
21
|
+
return (_jsxs(Section, { title: "\u0410\u043A\u043A\u0430\u0443\u043D\u0442\u044B", modified: modified, aside: resetAside(props, paths), children: [_jsxs("div", { className: "qa-card-grid", children: [_jsx(Toggle, { checked: enabled, disabled: disabled, label: "\u0412\u0445\u043E\u0434 \u043F\u043E \u0430\u043A\u043A\u0430\u0443\u043D\u0442\u0430\u043C", hint: "\u041F\u043E\u043A\u0430 \u0432\u044B\u043A\u043B\u044E\u0447\u0435\u043D\u043E, \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430 \u043E\u0442\u043A\u0440\u044B\u0442\u0430 \u0432\u0441\u044F\u043A\u043E\u043C\u0443, \u043A\u0442\u043E \u0434\u043E \u043D\u0435\u0451 \u0434\u043E\u0448\u0451\u043B.", onChange: (value) => {
|
|
22
|
+
props.write(["accounts", "enabled"], value);
|
|
23
|
+
} }), _jsx(Toggle, { checked: accounts?.allowRegistration ?? true, disabled: disabled || !enabled, label: "\u0421\u0430\u043C\u043E\u0441\u0442\u043E\u044F\u0442\u0435\u043B\u044C\u043D\u0430\u044F \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044F", hint: "\u041F\u043E\u0441\u0435\u0442\u0438\u0442\u0435\u043B\u044C \u043C\u043E\u0436\u0435\u0442 \u0437\u0430\u0432\u0435\u0441\u0442\u0438 \u0430\u043A\u043A\u0430\u0443\u043D\u0442 \u0441\u0430\u043C. \u041F\u0435\u0440\u0432\u044B\u0439 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439 \u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u0441\u044F \u0430\u0434\u043C\u0438\u043D\u0438\u0441\u0442\u0440\u0430\u0442\u043E\u0440\u043E\u043C.", onChange: (value) => {
|
|
24
|
+
props.write(["accounts", "allowRegistration"], value);
|
|
25
|
+
} }), _jsx(NumberField, { label: "\u0421\u0440\u043E\u043A \u0436\u0438\u0437\u043D\u0438 \u0432\u0445\u043E\u0434\u0430, \u0434\u043D\u0435\u0439", value: accounts?.sessionTtlDays ?? 30, min: 1, max: 365, disabled: disabled || !enabled, hint: "\u0427\u0435\u0440\u0435\u0437 \u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0434\u043D\u0435\u0439 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0443 \u043F\u0440\u0438\u0434\u0451\u0442\u0441\u044F \u0432\u043E\u0439\u0442\u0438 \u0437\u0430\u043D\u043E\u0432\u043E.", onChange: (value) => {
|
|
26
|
+
props.write(["accounts", "sessionTtlDays"], value);
|
|
27
|
+
} }), _jsx(Toggle, { checked: accounts?.showOtherUsersChats ?? false, disabled: disabled || !enabled, label: "\u0410\u0434\u043C\u0438\u043D\u0438\u0441\u0442\u0440\u0430\u0442\u043E\u0440\u0430\u043C \u0432\u0438\u0434\u043D\u044B \u0447\u0443\u0436\u0438\u0435 \u0447\u0430\u0442\u044B", hint: "\u041E\u0431\u044B\u0447\u043D\u044B\u0439 \u0430\u043A\u043A\u0430\u0443\u043D\u0442 \u0432\u0438\u0434\u0438\u0442 \u0442\u043E\u043B\u044C\u043A\u043E \u0441\u0432\u043E\u0438 \u0447\u0430\u0442\u044B; \u044D\u0442\u0430 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430 \u043E\u0442\u043A\u0440\u044B\u0432\u0430\u0435\u0442 \u0430\u0434\u043C\u0438\u043D\u0438\u0441\u0442\u0440\u0430\u0442\u043E\u0440\u0430\u043C \u0441\u043F\u0438\u0441\u043E\u043A \u0432\u0441\u0435\u0445.", onChange: (value) => {
|
|
28
|
+
props.write(["accounts", "showOtherUsersChats"], value);
|
|
29
|
+
} })] }), enabled ? (_jsx(Notice, { tone: "info", children: "\u0410\u043A\u043A\u0430\u0443\u043D\u0442\u044B \u043D\u0430\u0437\u044B\u0432\u0430\u044E\u0442 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F \u0438 \u0437\u0430\u043A\u0440\u0435\u043F\u043B\u044F\u044E\u0442 \u0437\u0430 \u043D\u0438\u043C \u0447\u0430\u0442\u044B. \u041E\u043D\u0438 \u043D\u0435 \u043E\u0442\u0433\u043E\u0440\u0430\u0436\u0438\u0432\u0430\u044E\u0442 \u0445\u0430\u0440\u043D\u0435\u0441\u0441: \u0441\u0435\u0441\u0441\u0438\u044F \u043F\u043E\u043C\u043E\u0449\u043D\u0438\u043A\u0430 \u0432\u0441\u0451 \u0440\u0430\u0432\u043D\u043E \u0436\u0438\u0432\u0451\u0442 \u0432 \u043F\u0440\u0430\u0432\u0430\u0445 \u043F\u0440\u043E\u0446\u0435\u0441\u0441\u0430 \u0445\u043E\u0441\u0442\u0430." })) : (_jsx(Notice, { tone: "info", children: "\u0410\u043A\u043A\u0430\u0443\u043D\u0442\u044B \u0432\u044B\u043A\u043B\u044E\u0447\u0435\u043D\u044B: \u0432\u0441\u0435 \u043F\u043E\u0441\u0435\u0442\u0438\u0442\u0435\u043B\u0438 \u0430\u043D\u043E\u043D\u0438\u043C\u043D\u044B, \u0447\u0430\u0442\u044B \u043D\u0435 \u0437\u0430\u043A\u0440\u0435\u043F\u043B\u044F\u044E\u0442\u0441\u044F \u0437\u0430 \u0447\u0435\u043B\u043E\u0432\u0435\u043A\u043E\u043C, \u0430 \u043E\u0431\u0449\u0430\u044F \u0438\u0441\u0442\u043E\u0440\u0438\u044F \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0430 \u043A\u0430\u0436\u0434\u043E\u043C\u0443." })), enabled && (accounts?.showOtherUsersChats ?? false) ? (_jsx(Notice, { tone: "warn", children: "\u0410\u0434\u043C\u0438\u043D\u0438\u0441\u0442\u0440\u0430\u0442\u043E\u0440\u044B \u0432\u0438\u0434\u044F\u0442 \u0447\u0430\u0442\u044B \u0434\u0440\u0443\u0433\u0438\u0445 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u0439. \u042D\u0442\u043E \u043E\u0441\u043E\u0437\u043D\u0430\u043D\u043D\u043E\u0435 \u0440\u0435\u0448\u0435\u043D\u0438\u0435 \u0441\u0442\u0435\u043D\u0434\u0430: \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0435 \u0447\u0443\u0436\u0438\u0445 \u0434\u0438\u0430\u043B\u043E\u0433\u043E\u0432 \u043F\u043E\u043F\u0430\u0434\u0430\u0435\u0442 \u043D\u0430 \u044D\u043A\u0440\u0430\u043D \u0442\u043E\u043C\u0443, \u043A\u0442\u043E \u0438\u0445 \u043D\u0435 \u0432\u0451\u043B." })) : null, _jsx("div", { className: "qa-card-grid", children: _jsx(Toggle, { checked: perUser, disabled: disabled || !enabled, label: "\u041E\u0442\u0434\u0435\u043B\u044C\u043D\u043E\u0435 \u0440\u0430\u0431\u043E\u0447\u0435\u0435 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u043E \u043A\u0430\u0436\u0434\u043E\u043C\u0443", hint: "\u0421\u0435\u0441\u0441\u0438\u0438 \u0440\u0430\u0441\u0445\u043E\u0434\u044F\u0442\u0441\u044F \u043F\u043E \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430\u043C \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u0439 \u0432\u043D\u0443\u0442\u0440\u0438 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0433\u043E \u0440\u0430\u0431\u043E\u0447\u0435\u0433\u043E \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u0430. \u0421\u043E\u0445\u0440\u0430\u043D\u044F\u0435\u0442\u0441\u044F \u0432\u043C\u0435\u0441\u0442\u0435 \u0441 \u0440\u0435\u0436\u0438\u043C\u043E\u043C \u043F\u0435\u0441\u043E\u0447\u043D\u0438\u0446\u044B \u00AB\u0437\u0430\u043F\u0438\u0441\u044C\u00BB, \u0438\u043D\u0430\u0447\u0435 \u0445\u043E\u0441\u0442 \u043E\u0442\u0432\u0435\u0440\u0433\u0430\u0435\u0442 \u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044E.", onChange: (value) => {
|
|
30
|
+
props.writeMany([
|
|
31
|
+
{ path: ["accounts", "perUserWorkspace"], value },
|
|
32
|
+
{
|
|
33
|
+
path: ["lockdown", "sandboxMode"],
|
|
34
|
+
value: value ? "workspace-write" : "read-only",
|
|
35
|
+
},
|
|
36
|
+
]);
|
|
37
|
+
} }) }), !perUser && gaps.length > 0 ? (_jsxs(Notice, { tone: "info", children: ["\u0414\u043B\u044F \u043F\u0435\u0440\u0441\u043E\u043D\u0430\u043B\u044C\u043D\u044B\u0445 \u0440\u0430\u0431\u043E\u0447\u0438\u0445 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432 \u043D\u0443\u0436\u043D\u043E \u0435\u0449\u0451: ", gaps.join("; "), "."] })) : null, _jsxs("div", { className: "qa-card-grid", children: [_jsx(Toggle, { checked: profile?.enabled ?? true, disabled: disabled || !enabled, label: "\u041F\u0440\u043E\u0444\u0438\u043B\u044C \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F", hint: "\u0424\u043E\u0440\u043C\u0430 \u00AB\u043E \u0441\u0435\u0431\u0435\u00BB \u0432 \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 \u043F\u043E\u043C\u043E\u0449\u043D\u0438\u043A\u0430; \u0431\u0435\u0437 \u0430\u043A\u043A\u0430\u0443\u043D\u0442\u043E\u0432 \u0435\u0451 \u043D\u0435\u043A\u043E\u043C\u0443 \u0437\u0430\u043F\u043E\u043B\u043D\u044F\u0442\u044C.", onChange: (value) => {
|
|
38
|
+
props.write(["accounts", "profile", "enabled"], value);
|
|
39
|
+
} }), _jsx(Toggle, { checked: profile?.inject ?? true, disabled: disabled || !enabled || !(profile?.enabled ?? true), label: "\u041F\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044C \u043F\u0440\u043E\u0444\u0438\u043B\u044C \u043F\u043E\u043C\u043E\u0449\u043D\u0438\u043A\u0443", hint: "\u0418\u043C\u044F, \u043F\u043E\u0447\u0442\u0430 \u0438 \u0437\u0430\u043F\u043E\u043B\u043D\u0435\u043D\u043D\u044B\u0435 \u043F\u043E\u043B\u044F \u043F\u0440\u043E\u0444\u0438\u043B\u044F \u0443\u0445\u043E\u0434\u044F\u0442 \u0432 \u0441\u0438\u0441\u0442\u0435\u043C\u043D\u0443\u044E \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0443, \u0447\u0442\u043E\u0431\u044B \u043F\u043E\u043C\u043E\u0449\u043D\u0438\u043A \u0437\u043D\u0430\u043B, \u0441 \u043A\u0435\u043C \u0433\u043E\u0432\u043E\u0440\u0438\u0442.", onChange: (value) => {
|
|
40
|
+
props.write(["accounts", "profile", "inject"], value);
|
|
41
|
+
} }), _jsx(NumberField, { label: "\u041F\u0440\u0435\u0434\u0435\u043B \u0434\u043B\u0438\u043D\u044B \u0438\u043D\u0441\u0442\u0440\u0443\u043A\u0446\u0438\u0439, \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432", value: profile?.instructionsMaxLength ?? 2000, min: 200, max: 20_000, disabled: disabled || !enabled || !(profile?.enabled ?? true), hint: "\u0421\u043A\u043E\u043B\u044C\u043A\u043E \u0441\u0432\u043E\u0431\u043E\u0434\u043D\u043E\u0433\u043E \u0442\u0435\u043A\u0441\u0442\u0430 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C \u043C\u043E\u0436\u0435\u0442 \u043D\u0430\u043F\u0438\u0441\u0430\u0442\u044C \u043E \u0442\u043E\u043C, \u043A\u0430\u043A \u0435\u043C\u0443 \u043E\u0442\u0432\u0435\u0447\u0430\u0442\u044C.", onChange: (value) => {
|
|
42
|
+
props.write(["accounts", "profile", "instructionsMaxLength"], value);
|
|
43
|
+
} })] }), _jsx(IdentitiesField, { value: profile?.identities ?? [], disabled: disabled || !enabled || !(profile?.enabled ?? true), onCommit: (fields) => {
|
|
44
|
+
props.write(["accounts", "profile", "identities"], fields);
|
|
45
|
+
} })] }));
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=accounts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../../../src/client/settings/sections/accounts.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Attachments: what a visitor may attach to one message. Like the interface
|
|
4
|
+
* section, the list fields show the value in effect — a stored list, else the
|
|
5
|
+
* Host's resolved one — so an untouched deployment never sees an empty box
|
|
6
|
+
* for a setting that is active.
|
|
7
|
+
*/
|
|
8
|
+
import { DEFAULT_QA_TEXT_EXTENSIONS } from "../../../attachment-rules.js";
|
|
9
|
+
import { ListField, Notice, NumberField, Section, Toggle } from "../fields.js";
|
|
10
|
+
import { parseCommaList } from "../format.js";
|
|
11
|
+
import { overriddenAny, resetAside, } from "./common.js";
|
|
12
|
+
/**
|
|
13
|
+
* What a visitor may attach to one message. Files never ride the prompt
|
|
14
|
+
* inline: the browser stages them on the Host and the prompt cites the
|
|
15
|
+
* receipt, so the model resolves the stored copy through its file tools — the
|
|
16
|
+
* deployment's tool allow-list has to keep `read` for that to be useful.
|
|
17
|
+
*/
|
|
18
|
+
export function AttachmentsSection(props) {
|
|
19
|
+
const config = props.config;
|
|
20
|
+
const disabled = !props.writable;
|
|
21
|
+
const attachments = config?.attachments;
|
|
22
|
+
const textFiles = attachments?.textFiles ?? true;
|
|
23
|
+
const pastedTextLines = attachments?.pastedTextLines ?? 200;
|
|
24
|
+
const maxFileBytes = attachments?.maxFileBytes ?? 10_485_760;
|
|
25
|
+
const maxPending = attachments?.maxPending ?? 8;
|
|
26
|
+
const paths = [["attachments"]];
|
|
27
|
+
const modified = overriddenAny(props, paths);
|
|
28
|
+
// The field shows the list in effect: a stored list wins, the Host's
|
|
29
|
+
// resolved list stands in for it, then the built-in default.
|
|
30
|
+
const stored = attachments?.extensions;
|
|
31
|
+
const extensions = stored !== undefined && stored.length > 0
|
|
32
|
+
? stored
|
|
33
|
+
: (props.effective?.attachments.extensions ?? DEFAULT_QA_TEXT_EXTENSIONS);
|
|
34
|
+
return (_jsxs(Section, { title: "\u0412\u043B\u043E\u0436\u0435\u043D\u0438\u044F", modified: modified, aside: resetAside(props, paths), children: [_jsxs("div", { className: "qa-card-grid", children: [_jsx(Toggle, { checked: textFiles, disabled: disabled, label: "\u0422\u0435\u043A\u0441\u0442\u043E\u0432\u044B\u0435 \u0444\u0430\u0439\u043B\u044B", hint: "\u041A \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F\u043C \u043C\u043E\u0436\u043D\u043E \u043F\u0440\u0438\u043A\u043B\u0430\u0434\u044B\u0432\u0430\u0442\u044C md, txt, log \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0442\u0435\u043A\u0441\u0442\u043E\u0432\u044B\u0435 \u0444\u0430\u0439\u043B\u044B. \u0412\u044B\u043A\u043B\u044E\u0447\u0435\u043D\u043E \u2014 \u0442\u043E\u043B\u044C\u043A\u043E \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F.", onChange: (value) => {
|
|
35
|
+
props.write(["attachments", "textFiles"], value);
|
|
36
|
+
} }), _jsx(NumberField, { label: "\u041F\u0435\u0440\u0435\u043D\u043E\u0441\u0438\u0442\u044C \u0432\u0441\u0442\u0430\u0432\u043A\u0443, \u0441\u0442\u0440\u043E\u043A", value: pastedTextLines, min: 0, max: 10_000, disabled: disabled || !textFiles, hint: "\u0412\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442 \u0434\u043B\u0438\u043D\u043D\u0435\u0435 \u044D\u0442\u043E\u0433\u043E \u0447\u0438\u0441\u043B\u0430 \u0441\u0442\u0440\u043E\u043A \u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u0441\u044F \u0432\u043B\u043E\u0436\u0435\u043D\u0438\u0435\u043C. 0 \u043E\u0442\u043A\u043B\u044E\u0447\u0430\u0435\u0442 \u043F\u0435\u0440\u0435\u043D\u043E\u0441.", onChange: (value) => {
|
|
37
|
+
props.write(["attachments", "pastedTextLines"], value);
|
|
38
|
+
} }), _jsx(NumberField, { label: "\u041B\u0438\u043C\u0438\u0442 \u0444\u0430\u0439\u043B\u0430, \u0431\u0430\u0439\u0442", value: maxFileBytes, min: 1_024, max: 52_428_800, disabled: disabled || !textFiles, hint: "\u041F\u0440\u0435\u0434\u0435\u043B\u044C\u043D\u044B\u0439 \u0440\u0430\u0437\u043C\u0435\u0440 \u043E\u0434\u043D\u043E\u0433\u043E \u043F\u0440\u0438\u043A\u043B\u0430\u0434\u044B\u0432\u0430\u0435\u043C\u043E\u0433\u043E \u0444\u0430\u0439\u043B\u0430.", onChange: (value) => {
|
|
39
|
+
props.write(["attachments", "maxFileBytes"], value);
|
|
40
|
+
} }), _jsx(NumberField, { label: "\u0412\u043B\u043E\u0436\u0435\u043D\u0438\u0439 \u043D\u0430 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435", value: maxPending, min: 1, max: 40, disabled: disabled, hint: "\u0418\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F \u0438 \u0444\u0430\u0439\u043B\u044B \u0441\u0447\u0438\u0442\u0430\u044E\u0442\u0441\u044F \u0432\u043C\u0435\u0441\u0442\u0435.", onChange: (value) => {
|
|
41
|
+
props.write(["attachments", "maxPending"], value);
|
|
42
|
+
} })] }), _jsx(ListField, { label: "\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u044F \u0442\u0435\u043A\u0441\u0442\u043E\u0432\u044B\u0445 \u0444\u0430\u0439\u043B\u043E\u0432", value: extensions, disabled: disabled || !textFiles, placeholder: "md\\ntxt\\nlog", hint: "\u041F\u043E \u043E\u0434\u043D\u043E\u043C\u0443 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u044E \u043D\u0430 \u0441\u0442\u0440\u043E\u043A\u0443, \u0431\u0435\u0437 \u0442\u043E\u0447\u043A\u0438. \u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E \u043F\u0440\u0438\u043D\u0438\u043C\u0430\u0435\u0442\u0441\u044F \u0432\u0441\u0451, \u0447\u0442\u043E \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u043F\u043E\u043C\u0435\u0447\u0430\u0435\u0442 \u043A\u0430\u043A text/*.", parse: parseCommaList, onCommit: (values) => {
|
|
43
|
+
props.write(["attachments", "extensions"], values);
|
|
44
|
+
} }), _jsx(Notice, { tone: "info", children: "\u0424\u0430\u0439\u043B \u0441\u043E\u0445\u0440\u0430\u043D\u044F\u0435\u0442\u0441\u044F \u043D\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u043A\u0430\u043A \u0435\u0441\u0442\u044C, \u0430 \u0432 \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0435 \u043C\u043E\u0434\u0435\u043B\u0438 \u0443\u043A\u0430\u0437\u044B\u0432\u0430\u0435\u0442\u0441\u044F \u043F\u0443\u0442\u044C \u043A \u043A\u043E\u043F\u0438\u0438: \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0435 \u0447\u0438\u0442\u0430\u0435\u0442 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442 \u0447\u0442\u0435\u043D\u0438\u044F. \u0414\u0435\u0440\u0436\u0438\u0442\u0435 \u00ABread\u00BB \u0432 \u0441\u043F\u0438\u0441\u043A\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043D\u043D\u044B\u0445 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432, \u0438\u043D\u0430\u0447\u0435 \u0432\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u043E\u0441\u0442\u0430\u043D\u0435\u0442\u0441\u044F \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u043C \u0434\u043B\u044F \u043C\u043E\u0434\u0435\u043B\u0438." })] }));
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=attachments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachments.js","sourceRoot":"","sources":["../../../../src/client/settings/sections/attachments.tsx"],"names":[],"mappings":"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"}
|