@yadsh/dsh-qa-surface 0.2.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 +236 -20
- package/compatibility.json +11 -3
- 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/index.js +2 -0
- package/lib/accounts/index.js.map +1 -0
- package/lib/accounts/store.js +461 -0
- package/lib/accounts/store.js.map +1 -0
- 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/attestation.js.map +1 -1
- package/lib/cli.js +256 -0
- package/lib/cli.js.map +1 -0
- package/lib/client/QaAccountsController.js +359 -0
- package/lib/client/QaAccountsController.js.map +1 -0
- package/lib/client/QaSessionController.js +238 -180
- package/lib/client/QaSessionController.js.map +1 -1
- package/lib/client/QaSurface.js +281 -105
- package/lib/client/QaSurface.js.map +1 -1
- package/lib/client/QaTranscriptAdapter.js +95 -244
- 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 +7 -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 +54 -13
- package/lib/client/components/Markdown.js.map +1 -1
- package/lib/client/components/QaAuthGate.js +40 -0
- package/lib/client/components/QaAuthGate.js.map +1 -0
- package/lib/client/components/QaChangelog.js +131 -0
- package/lib/client/components/QaChangelog.js.map +1 -0
- 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 +61 -18
- 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 +68 -20
- package/lib/client/components/QaSidebar.js.map +1 -1
- package/lib/client/components/QaSourcesPanel.js +127 -0
- package/lib/client/components/QaSourcesPanel.js.map +1 -0
- package/lib/client/components/QaTurnRail.js +296 -0
- package/lib/client/components/QaTurnRail.js.map +1 -0
- package/lib/client/components/QaWelcomeNotice.js +125 -0
- package/lib/client/components/QaWelcomeNotice.js.map +1 -0
- package/lib/client/components/QaWidthHandle.js +147 -0
- package/lib/client/components/QaWidthHandle.js.map +1 -0
- package/lib/client/components/QaWorkGroup.js +19 -20
- package/lib/client/components/QaWorkGroup.js.map +1 -1
- package/lib/client/components/source-refs.js +78 -0
- package/lib/client/components/source-refs.js.map +1 -0
- 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 +26 -0
- package/lib/client/create-session.js.map +1 -0
- package/lib/client/failure-copy.js +63 -0
- package/lib/client/failure-copy.js.map +1 -0
- package/lib/client/index.js +135 -16
- package/lib/client/index.js.map +1 -1
- package/lib/client/project-session-state.js +78 -0
- package/lib/client/project-session-state.js.map +1 -0
- package/lib/client/prompt-content.js +54 -0
- package/lib/client/prompt-content.js.map +1 -0
- package/lib/client/session-admission.js +38 -0
- package/lib/client/session-admission.js.map +1 -0
- package/lib/client/session-assets.js +52 -0
- package/lib/client/session-assets.js.map +1 -0
- package/lib/client/session-sources.js +61 -0
- package/lib/client/session-sources.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/settlement.js +24 -0
- package/lib/client/settlement.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 +225 -17
- package/lib/client/styles.js.map +1 -1
- package/lib/client/tool-presentation.js +102 -0
- package/lib/client/tool-presentation.js.map +1 -0
- package/lib/client/turn-sources.js +98 -0
- package/lib/client/turn-sources.js.map +1 -0
- package/lib/client/types.js +2 -0
- 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 +75 -0
- package/lib/client/use-session-ui-state.js.map +1 -0
- package/lib/client/use-transcript-view.js +44 -0
- package/lib/client/use-transcript-view.js.map +1 -0
- package/lib/client.js +9052 -1345
- 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 +279 -102
- package/lib/config.js.map +1 -1
- package/lib/entry-redirect.js +45 -0
- package/lib/entry-redirect.js.map +1 -0
- package/lib/host-route.js +25 -1
- package/lib/host-route.js.map +1 -1
- package/lib/index.js +258 -23
- package/lib/index.js.map +1 -1
- package/lib/launch-token.js +42 -0
- package/lib/launch-token.js.map +1 -0
- 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/provenance/collector.js +40 -0
- package/lib/provenance/collector.js.map +1 -0
- package/lib/provenance/connectors.js +147 -0
- package/lib/provenance/connectors.js.map +1 -0
- package/lib/provenance/dedupe.js +89 -0
- package/lib/provenance/dedupe.js.map +1 -0
- package/lib/provenance/extractors.js +340 -0
- package/lib/provenance/extractors.js.map +1 -0
- package/lib/provenance/file-preview.js +39 -0
- package/lib/provenance/file-preview.js.map +1 -0
- package/lib/provenance/host-store.js +387 -0
- package/lib/provenance/host-store.js.map +1 -0
- package/lib/provenance/index.js +9 -0
- package/lib/provenance/index.js.map +1 -0
- package/lib/provenance/normalize.js +128 -0
- package/lib/provenance/normalize.js.map +1 -0
- package/lib/provenance/reported.js +53 -0
- package/lib/provenance/reported.js.map +1 -0
- package/lib/provenance/types.js +2 -0
- package/lib/provenance/types.js.map +1 -0
- package/lib/resolve-config.js +35 -249
- package/lib/resolve-config.js.map +1 -1
- package/lib/secure-session.js +122 -14
- 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 +749 -11
- package/lib/typert.remote-client.d.ts +23 -3
- package/lib/typert.remote-client.js +593 -6
- 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/index.d.ts +2 -0
- package/lib/types/accounts/store.d.ts +144 -0
- package/lib/types/accounts/token.d.ts +31 -0
- package/lib/types/attachment-rules.d.ts +44 -0
- package/lib/types/attestation.d.ts +1 -1
- package/lib/types/cli.d.ts +9 -0
- package/lib/types/client/QaAccountsController.d.ts +102 -0
- package/lib/types/client/QaConfigController.d.ts +1 -1
- package/lib/types/client/QaSessionController.d.ts +61 -22
- package/lib/types/client/QaSurface.d.ts +14 -3
- package/lib/types/client/QaTranscriptAdapter.d.ts +5 -10
- 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/Markdown.d.ts +11 -1
- package/lib/types/client/components/QaAgentsDrawer.d.ts +1 -1
- package/lib/types/client/components/QaAuthGate.d.ts +15 -0
- package/lib/types/client/components/QaChangelog.d.ts +21 -0
- 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 +12 -3
- 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 +44 -2
- package/lib/types/client/components/QaSourcesPanel.d.ts +23 -0
- package/lib/types/client/components/QaTurnRail.d.ts +65 -0
- package/lib/types/client/components/QaWelcomeNotice.d.ts +27 -0
- package/lib/types/client/components/QaWidthHandle.d.ts +43 -0
- package/lib/types/client/components/QaWorkGroup.d.ts +5 -3
- package/lib/types/client/components/source-refs.d.ts +16 -0
- 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 +13 -0
- package/lib/types/client/failure-copy.d.ts +19 -0
- package/lib/types/client/index.d.ts +1 -0
- package/lib/types/client/project-session-state.d.ts +30 -0
- package/lib/types/client/prompt-content.d.ts +30 -0
- package/lib/types/client/session-admission.d.ts +23 -0
- package/lib/types/client/session-assets.d.ts +20 -0
- package/lib/types/client/session-sources.d.ts +28 -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/settlement.d.ts +6 -0
- package/lib/types/client/stream-publisher.d.ts +28 -0
- package/lib/types/client/tool-presentation.d.ts +6 -0
- package/lib/types/client/turn-sources.d.ts +14 -0
- package/lib/types/client/types.d.ts +101 -9
- package/lib/types/client/use-right-rail.d.ts +56 -0
- package/lib/types/client/use-session-ui-state.d.ts +41 -0
- package/lib/types/client/use-transcript-view.d.ts +20 -0
- 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/entry-redirect.d.ts +20 -0
- package/lib/types/host-route.d.ts +14 -1
- package/lib/types/index.d.ts +54 -3
- package/lib/types/launch-token.d.ts +21 -0
- package/lib/types/profile.d.ts +76 -0
- package/lib/types/prompt-notes.d.ts +110 -0
- package/lib/types/provenance/collector.d.ts +26 -0
- package/lib/types/provenance/connectors.d.ts +11 -0
- package/lib/types/provenance/dedupe.d.ts +6 -0
- package/lib/types/provenance/extractors.d.ts +14 -0
- package/lib/types/provenance/file-preview.d.ts +10 -0
- package/lib/types/provenance/host-store.d.ts +54 -0
- package/lib/types/provenance/index.d.ts +10 -0
- package/lib/types/provenance/normalize.d.ts +13 -0
- package/lib/types/provenance/reported.d.ts +5 -0
- package/lib/types/provenance/types.d.ts +78 -0
- package/lib/types/resolve-config.d.ts +8 -3
- package/lib/types/secure-session.d.ts +36 -2
- 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 +290 -16
- 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 +71 -47
- package/CHANGELOG.md +0 -93
- 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 -112
- package/docs/EMBEDDING.md +0 -13
- package/lib/client/components/QaSourcesDrawer.js +0 -46
- package/lib/client/components/QaSourcesDrawer.js.map +0 -1
- package/lib/types/client/components/QaSourcesDrawer.d.ts +0 -8
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { CardShell, bindSettingsExternalStore, startVisibilityAwarePolling, } from "@yadsh/dsh-plugin-kit/client";
|
|
3
|
+
import { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore, } from "react";
|
|
4
|
+
import { badgeText, isOverridden, mutationLanded, overriddenKeys, pluralRu, } from "./format.js";
|
|
5
|
+
import { AccessSection, AttachmentsSection, AccountsSection, BrandingSection, EmbeddingSection, InterfaceSection, LockdownSection, SessionSection, SourcesSection, StatusSection, } from "./sections.js";
|
|
6
|
+
const REFRESH_INTERVAL_MS = 5_000;
|
|
7
|
+
/** Shown when a settled mutation left the configuration unchanged. */
|
|
8
|
+
const REFUSED_MESSAGE = "Хост отклонил изменение: значение не сохранилось. Обычно так отвечает несовместимая комбинация полей — проверьте связанные значения этого раздела. Точную причину хост пишет в свой журнал.";
|
|
9
|
+
function displayError(error) {
|
|
10
|
+
if (error instanceof Error)
|
|
11
|
+
return error.message;
|
|
12
|
+
if (typeof error === "string")
|
|
13
|
+
return error;
|
|
14
|
+
if (typeof error === "object" && error !== null) {
|
|
15
|
+
const message = error.message;
|
|
16
|
+
if (typeof message === "string")
|
|
17
|
+
return message;
|
|
18
|
+
}
|
|
19
|
+
return "Хост отклонил изменение настроек помощника.";
|
|
20
|
+
}
|
|
21
|
+
export function QaSettingsCard({ scope, describe }) {
|
|
22
|
+
const store = useMemo(() => bindSettingsExternalStore(scope), [scope]);
|
|
23
|
+
const settings = useSyncExternalStore(store.subscribe, store.getSnapshot, store.getSnapshot);
|
|
24
|
+
const config = settings.value;
|
|
25
|
+
const writable = settings.status === "ready" && settings.writable;
|
|
26
|
+
const [effective, setEffective] = useState(null);
|
|
27
|
+
// Two channels on purpose: a healthy status poll must not erase what a write
|
|
28
|
+
// reported, or an operator would watch a refusal flash and vanish while the
|
|
29
|
+
// value stayed unsaved.
|
|
30
|
+
const [hostError, setHostError] = useState(null);
|
|
31
|
+
const [writeError, setWriteError] = useState(null);
|
|
32
|
+
const [refreshing, setRefreshing] = useState(false);
|
|
33
|
+
const [refreshedAt, setRefreshedAt] = useState(undefined);
|
|
34
|
+
const activeRequest = useRef(0);
|
|
35
|
+
const refresh = useCallback(async () => {
|
|
36
|
+
const request = ++activeRequest.current;
|
|
37
|
+
setRefreshing(true);
|
|
38
|
+
try {
|
|
39
|
+
const result = await describe();
|
|
40
|
+
if (request !== activeRequest.current)
|
|
41
|
+
return;
|
|
42
|
+
if (result.ok) {
|
|
43
|
+
setEffective(result.value);
|
|
44
|
+
setHostError(null);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
// A Host that stopped answering must not leave a stale configuration
|
|
48
|
+
// on screen looking like the running one.
|
|
49
|
+
setEffective(null);
|
|
50
|
+
setHostError(displayError(result.error));
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch (cause) {
|
|
54
|
+
if (request === activeRequest.current) {
|
|
55
|
+
setEffective(null);
|
|
56
|
+
setHostError(displayError(cause));
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
finally {
|
|
60
|
+
if (request === activeRequest.current) {
|
|
61
|
+
setRefreshing(false);
|
|
62
|
+
setRefreshedAt(Date.now());
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}, [describe]);
|
|
66
|
+
useEffect(() => {
|
|
67
|
+
const stopPolling = startVisibilityAwarePolling(refresh, REFRESH_INTERVAL_MS);
|
|
68
|
+
return () => {
|
|
69
|
+
stopPolling();
|
|
70
|
+
activeRequest.current += 1;
|
|
71
|
+
};
|
|
72
|
+
}, [refresh]);
|
|
73
|
+
/**
|
|
74
|
+
* Path-addressed writes into the namespace. The scope's mutation operations
|
|
75
|
+
* are typed for the wire's JSON values, which a control's value satisfies by
|
|
76
|
+
* construction; the cast keeps that boundary in one place.
|
|
77
|
+
*
|
|
78
|
+
* A write the Host refuses does not reject the scope's promise: the scope
|
|
79
|
+
* reloads Host state and settles normally. Acceptance is therefore confirmed
|
|
80
|
+
* against the namespace — the revision advances on every committed change,
|
|
81
|
+
* and a write that changed nothing is answered by the section itself —
|
|
82
|
+
* because a refusal the operator cannot see is a control that silently does
|
|
83
|
+
* nothing.
|
|
84
|
+
*/
|
|
85
|
+
const applyMutation = useCallback(async (entries, cleared) => {
|
|
86
|
+
const before = scope.getSnapshot().revision;
|
|
87
|
+
const ops = [
|
|
88
|
+
...entries.map((entry) => ({
|
|
89
|
+
op: "set",
|
|
90
|
+
path: [...entry.path],
|
|
91
|
+
value: entry.value,
|
|
92
|
+
})),
|
|
93
|
+
...cleared.map((path) => ({ op: "unset", path: [...path] })),
|
|
94
|
+
];
|
|
95
|
+
try {
|
|
96
|
+
await scope.mutate(ops);
|
|
97
|
+
}
|
|
98
|
+
catch (cause) {
|
|
99
|
+
setWriteError(displayError(cause));
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const after = scope.getSnapshot();
|
|
103
|
+
const landed = after.revision !== before || mutationLanded(entries, cleared, after);
|
|
104
|
+
// Held until a later write lands: the message names what to look at, and
|
|
105
|
+
// a timer that clears it would only hide the problem.
|
|
106
|
+
setWriteError(landed ? null : REFUSED_MESSAGE);
|
|
107
|
+
}, [scope]);
|
|
108
|
+
const write = useCallback((path, value) => {
|
|
109
|
+
void applyMutation([{ path, value }], []);
|
|
110
|
+
}, [applyMutation]);
|
|
111
|
+
const writeMany = useCallback((entries) => {
|
|
112
|
+
void applyMutation(entries, []);
|
|
113
|
+
}, [applyMutation]);
|
|
114
|
+
const unset = useCallback((path) => {
|
|
115
|
+
void applyMutation([], [path]);
|
|
116
|
+
}, [applyMutation]);
|
|
117
|
+
const overridden = useCallback((path) => isOverridden(settings.user, path), [settings.user]);
|
|
118
|
+
const overrides = overriddenKeys(settings.user);
|
|
119
|
+
const resetAll = useCallback(() => {
|
|
120
|
+
void applyMutation([], overrides.map((key) => [key]));
|
|
121
|
+
}, [applyMutation, overrides]);
|
|
122
|
+
if (settings.status === "unavailable")
|
|
123
|
+
return null;
|
|
124
|
+
const enabled = effective?.enabled ?? config?.enabled ?? true;
|
|
125
|
+
const routePath = effective?.route.path ?? config?.route?.path;
|
|
126
|
+
const sectionProps = {
|
|
127
|
+
config,
|
|
128
|
+
effective,
|
|
129
|
+
writable,
|
|
130
|
+
write,
|
|
131
|
+
writeMany,
|
|
132
|
+
unset,
|
|
133
|
+
overridden,
|
|
134
|
+
};
|
|
135
|
+
return (_jsx(CardShell, { title: "\u041F\u043E\u043C\u043E\u0449\u043D\u0438\u043A QA", description: "\u0421\u0442\u0440\u0430\u043D\u0438\u0446\u0430 \u0432\u043E\u043F\u0440\u043E\u0441\u043E\u0432 \u0438 \u043E\u0442\u0432\u0435\u0442\u043E\u0432 \u043D\u0430 \u0441\u0435\u0441\u0441\u0438\u044F\u0445 DeepSeek Harness: \u043C\u0430\u0440\u0448\u0440\u0443\u0442, \u043E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u0435, \u0441\u0435\u0441\u0441\u0438\u044F, \u043F\u043E\u043B\u0438\u0442\u0438\u043A\u0430 \u0437\u0430\u043F\u0443\u0441\u043A\u0430, \u0430\u043A\u043A\u0430\u0443\u043D\u0442\u044B \u0438 \u0438\u0441\u0442\u043E\u0447\u043D\u0438\u043A\u0438.", badge: _jsx("span", { className: "dsh-plugin-card__badge", children: badgeText(enabled, routePath) }), label: (open) => `${open ? "Скрыть" : "Показать"} настройки: Помощник QA`, bodyClassName: "qa-card-body", children: settings.status === "loading" ? (_jsx("p", { className: "qa-card-muted", children: "\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u044E \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u043F\u043E\u043C\u043E\u0449\u043D\u0438\u043A\u0430\u2026" })) : (_jsxs(_Fragment, { children: [writeError !== null ? (_jsx("div", { className: "qa-card-error", children: writeError })) : null, hostError !== null ? (_jsx("div", { className: "qa-card-error", children: hostError })) : null, _jsx(StatusSection, { effective: effective, config: config, refreshing: refreshing, refreshedAt: refreshedAt, overrides: overrides.length, onRefresh: () => {
|
|
136
|
+
void refresh();
|
|
137
|
+
} }), _jsx(AccessSection, { ...sectionProps }), _jsx(BrandingSection, { ...sectionProps }), _jsx(SessionSection, { ...sectionProps }), _jsx(InterfaceSection, { ...sectionProps }), _jsx(LockdownSection, { ...sectionProps }), _jsx(AccountsSection, { ...sectionProps }), _jsx(SourcesSection, { ...sectionProps }), _jsx(AttachmentsSection, { ...sectionProps }), _jsx(EmbeddingSection, { ...sectionProps }), _jsxs("div", { className: "qa-card-footer", children: [_jsx("p", { className: "qa-card-footer-note", children: "\u0418\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u0443\u0445\u043E\u0434\u044F\u0442 \u043D\u0430 \u0440\u0430\u0431\u043E\u0442\u0430\u044E\u0449\u0438\u0439 Host \u0441\u0440\u0430\u0437\u0443: \u043C\u0430\u0440\u0448\u0440\u0443\u0442 \u043F\u0435\u0440\u0435\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044F, \u043F\u043E\u043B\u0438\u0442\u0438\u043A\u0430 \u043F\u0440\u0438\u043C\u0435\u043D\u044F\u0435\u0442\u0441\u044F \u043F\u0440\u0438 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u043C \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u0438\u0438 \u0441\u0435\u0441\u0441\u0438\u0438. \u041F\u0440\u0430\u0432\u043A\u0438 \u043B\u043E\u0436\u0430\u0442\u0441\u044F \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u043C \u0441\u043B\u043E\u0435\u043C \u043F\u043E\u0432\u0435\u0440\u0445 \u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044B\u0432\u0430\u043D\u0438\u044F, \u043F\u043E\u044D\u0442\u043E\u043C\u0443 \u0438\u0445 \u043C\u043E\u0436\u043D\u043E \u0441\u0431\u0440\u043E\u0441\u0438\u0442\u044C \u2014 \u043D\u043E \u043D\u0435 \u043E\u0442\u043C\u0435\u043D\u0438\u0442\u044C \u043F\u043E\u0432\u0435\u0434\u0435\u043D\u0438\u0435, \u0437\u0430\u0448\u0438\u0442\u043E\u0435 \u0432 \u0441\u0430\u043C\u043E\u043C \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044B\u0432\u0430\u043D\u0438\u0438." }), overrides.length > 0 ? (_jsxs("button", { type: "button", className: "qa-card-btn", disabled: !writable, onClick: resetAll, children: ["\u0421\u0431\u0440\u043E\u0441\u0438\u0442\u044C", " ", pluralRu(overrides.length, [
|
|
138
|
+
"переопределение",
|
|
139
|
+
"переопределения",
|
|
140
|
+
"переопределений",
|
|
141
|
+
])] })) : null] })] })) }));
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=card.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"card.js","sourceRoot":"","sources":["../../../src/client/settings/card.tsx"],"names":[],"mappings":"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"}
|
|
@@ -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":"AAAA;;;;;;;GAOG;AAUH;;;GAGG;AACH,MAAM,UAAU,SAAS,CACvB,OAA4B,EAC5B,SAA6B;IAE7B,IAAI,OAAO,KAAK,KAAK;QAAE,OAAO,WAAW,CAAC;IAC1C,OAAO,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACzE,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,qBAAqB,CACnC,MAA0B;IAE1B,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,aAAa;YAChB,OAAO;gBACL,KAAK,EAAE,+BAA+B;gBACtC,IAAI,EAAE,iFAAiF;aACxF,CAAC;QACJ,KAAK,OAAO;YACV,OAAO;gBACL,KAAK,EAAE,wBAAwB;gBAC/B,IAAI,EAAE,2DAA2D;aAClE,CAAC;QACJ,KAAK,oBAAoB;YACvB,OAAO;gBACL,KAAK,EAAE,4BAA4B;gBACnC,IAAI,EAAE,+DAA+D;aACtE,CAAC;QACJ;YACE,OAAO;gBACL,KAAK,EAAE,4BAA4B;gBACnC,IAAI,EAAE,+DAA+D;aACtE,CAAC;IACN,CAAC;AACH,CAAC;AAED,2CAA2C;AAC3C,MAAM,UAAU,eAAe,CAAC,IAAwB;IACtD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,iBAAiB;YACpB,OAAO;gBACL,KAAK,EAAE,+BAA+B;gBACtC,IAAI,EAAE,4EAA4E;aACnF,CAAC;QACJ;YACE,OAAO;gBACL,KAAK,EAAE,eAAe;gBACtB,IAAI,EAAE,0DAA0D;aACjE,CAAC;IACN,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAC9B,IAAY,EACZ,GAAW,EACX,GAAW;IAEX,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACzC,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACzD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,IAAI;SACR,KAAK,CAAC,QAAQ,CAAC;SACf,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;SAC5B,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,IAAI;SACR,KAAK,CAAC,QAAQ,CAAC;SACf,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;SAC5B,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACzC,CAAC;AAQD,4EAA4E;AAC5E,MAAM,YAAY,GAAG,0BAA0B,CAAC;AAEhD,wEAAwE;AACxE,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAE9B;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,MAAM,MAAM,GAAyB,EAAE,CAAC;IACxC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxC,MAAM,CAAC,MAAM,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/C,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACxC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QACvD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC;QACjE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,oBAAoB,CAClC,MAAiD;IAEjD,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;SAClB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;SAC/C,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAuB;IAC1D,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,MAAM,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI;QAAE,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACtE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,WAAW,IAAI,IAAI,CAAC,KAAK,IAAI;QAChD,IAAI,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IACzC,IAAI,MAAM,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO;QACpC,IAAI,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IACtD,IAAI,MAAM,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI;QAAE,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACxE,IAAI,MAAM,CAAC,QAAQ,EAAE,qBAAqB,KAAK,IAAI;QACjD,IAAI,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IACtD,IAAI,MAAM,CAAC,QAAQ,EAAE,WAAW,KAAK,iBAAiB;QACpD,IAAI,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;IAC7D,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,IAAa,EAAE,IAAuB;IACjE,IAAI,MAAM,GAAY,IAAI,CAAC;IAC3B,KAAK,MAAM,OAAO,IAAI,IAAI,EAAE,CAAC;QAC3B,IACE,OAAO,MAAM,KAAK,QAAQ;YAC1B,MAAM,KAAK,IAAI;YACf,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EACrB,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,MAAM,GAAG,MAAiC,CAAC;QACjD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;YAAE,OAAO,KAAK,CAAC;QAClD,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,cAAc,CAAC,IAAa;IAC1C,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACrE,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,IAA+B,CAAC,CAAC,IAAI,EAAE,CAAC;AAC7D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAc,EAAE,IAAuB;IAC9D,IAAI,MAAM,GAAY,KAAK,CAAC;IAC5B,KAAK,MAAM,OAAO,IAAI,IAAI,EAAE,CAAC;QAC3B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO,SAAS,CAAC;QACpE,MAAM,GAAI,MAAkC,CAAC,OAAO,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,kFAAkF;AAClF,SAAS,cAAc,CAAC,KAAc;IACpC,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;AAC/D,CAAC;AAED,6EAA6E;AAC7E,SAAS,aAAa,CAAC,IAAa,EAAE,KAAc;IAClD,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/D,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AACxD,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,cAAc,CAC5B,OAGG,EACH,OAAuC,EACvC,QAA6D;IAE7D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YACtE,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,IAAI,YAAY,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;IACtD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,WAAW,CAAC,SAA6B;IACvD,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,GAAG,CAAC;IACvE,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,kBAAkB,CAAC,OAAO,EAAE;QACrD,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,SAAS;QACjB,MAAM,EAAE,SAAS;KAClB,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,QAAQ,CACtB,KAAa,EACb,KAAwC;IAExC,MAAM,MAAM,GAAG,KAAK,GAAG,GAAG,CAAC;IAC3B,MAAM,KAAK,GAAG,KAAK,GAAG,EAAE,CAAC;IACzB,IAAI,MAAM,IAAI,EAAE,IAAI,MAAM,IAAI,EAAE;QAAE,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IACxE,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IACvD,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IACpE,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AACxC,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,WAAW,CAAC,KAAyB;IACnD,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IAC/D,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;AACnD,CAAC"}
|
|
@@ -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"}
|