@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,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Small pure projections of the session state shared by surface regions: the
|
|
3
|
+
* composer's status line and the conversation title. Keeping them out of
|
|
4
|
+
* QaSurface leaves that file pure composition.
|
|
5
|
+
*/
|
|
6
|
+
/** The composer's status line, or null when nothing is due. */
|
|
7
|
+
export function statusText(state, runningPhrase) {
|
|
8
|
+
if (state.phase === "creating")
|
|
9
|
+
return "Подключаюсь…";
|
|
10
|
+
if (state.phase === "reconnecting")
|
|
11
|
+
return "Связь потерялась. Подключаюсь снова…";
|
|
12
|
+
if (state.phase === "running")
|
|
13
|
+
return runningPhrase;
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
/** The conversation title derived from the first user prompt, clipped. */
|
|
17
|
+
export function titleFromMessages(state) {
|
|
18
|
+
const firstUser = state.messages.find((message) => message.role === "user");
|
|
19
|
+
if (firstUser === undefined)
|
|
20
|
+
return null;
|
|
21
|
+
const title = firstUser.text.replace(/\s+/gu, " ").trim();
|
|
22
|
+
if (title === "")
|
|
23
|
+
return null;
|
|
24
|
+
if (title.length <= 52)
|
|
25
|
+
return title;
|
|
26
|
+
return `${title.slice(0, 51).trimEnd()}…`;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=surface-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"surface-utils.js","sourceRoot":"","sources":["../../../src/client/components/surface-utils.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AAEH,+DAA+D;AAC/D,MAAM,UAAU,UAAU,CACxB,KAAqB,EACrB,aAA4B;IAE5B,IAAI,KAAK,CAAC,KAAK,KAAK,UAAU;QAAE,OAAO,cAAc,CAAC;IACtD,IAAI,KAAK,CAAC,KAAK,KAAK,cAAc;QAChC,OAAO,sCAAsC,CAAC;IAChD,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;QAAE,OAAO,aAAa,CAAC;IACpD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,iBAAiB,CAAC,KAAqB;IACrD,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IAC5E,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACzC,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1D,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAC9B,IAAI,KAAK,CAAC,MAAM,IAAI,EAAE;QAAE,OAAO,KAAK,CAAC;IACrC,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { useEffect, useState } from "react";
|
|
2
|
+
import { DEFAULT_THINKING_PHRASES, thinkingPhrase, } from "../../thinking-phrases.js";
|
|
3
|
+
export { DEFAULT_THINKING_PHRASES, thinkingPhrase };
|
|
4
|
+
/** Re-render cadence; a phrase only changes on an interval edge. */
|
|
5
|
+
const CLOCK_TICK_MS = 1_000;
|
|
6
|
+
/**
|
|
7
|
+
* Phrase for a turn that started at `startedAt`. Every reader that passes the
|
|
8
|
+
* same start time and phrase list lands on the same phrase, so the composer
|
|
9
|
+
* hint and the work list never disagree.
|
|
10
|
+
*/
|
|
11
|
+
export function useThinkingPhrase(running, startedAt, phrases = DEFAULT_THINKING_PHRASES) {
|
|
12
|
+
const [now, setNow] = useState(() => Date.now());
|
|
13
|
+
useEffect(() => {
|
|
14
|
+
if (!running)
|
|
15
|
+
return;
|
|
16
|
+
setNow(Date.now());
|
|
17
|
+
const timer = setInterval(() => setNow(Date.now()), CLOCK_TICK_MS);
|
|
18
|
+
return () => clearInterval(timer);
|
|
19
|
+
}, [running]);
|
|
20
|
+
if (!running)
|
|
21
|
+
return null;
|
|
22
|
+
return thinkingPhrase(now - (startedAt ?? now), phrases);
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=thinking-phrases.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thinking-phrases.js","sourceRoot":"","sources":["../../../src/client/components/thinking-phrases.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EACL,wBAAwB,EACxB,cAAc,GACf,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,wBAAwB,EAAE,cAAc,EAAE,CAAC;AAEpD,oEAAoE;AACpE,MAAM,aAAa,GAAG,KAAK,CAAC;AAE5B;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAC/B,OAAgB,EAChB,SAA6B,EAC7B,OAAO,GAAsB,wBAAwB;IAErD,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAEjD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACnB,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,aAAa,CAAC,CAAC;QACnE,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,OAAO,cAAc,CAAC,GAAG,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;AAC3D,CAAC"}
|
|
@@ -11,41 +11,16 @@ function wireFailure(error) {
|
|
|
11
11
|
return message === "" ? code : `${code}: ${message}`;
|
|
12
12
|
}
|
|
13
13
|
/**
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* `agent-preset/selected`, which the client projection replays. The session
|
|
14
|
+
* Ask the QA Host boundary to create a fully composed session. The browser
|
|
15
|
+
* supplies only its account token and cannot select cwd, workspace, owner,
|
|
16
|
+
* preset, model, or permission policy. The resulting session
|
|
18
17
|
* is addressed only here — no prompt can run before the caller attests the
|
|
19
18
|
* composed preset.
|
|
20
19
|
*/
|
|
21
20
|
export async function createQaSession(args) {
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
: config.session.cwd !== null
|
|
27
|
-
? { cwd: config.session.cwd }
|
|
28
|
-
: {}),
|
|
29
|
-
});
|
|
30
|
-
const id = String(created);
|
|
31
|
-
if (config.session.agentPreset !== null) {
|
|
32
|
-
const selectedPreset = await api.selectAgentPreset(id, config.session.agentPreset);
|
|
33
|
-
if (!selectedPreset.ok) {
|
|
34
|
-
throw new Error(wireFailure(selectedPreset.error));
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
if (config.session.provider !== null && config.session.model !== null) {
|
|
38
|
-
const selected = await api.selectModel({
|
|
39
|
-
sessionId: id,
|
|
40
|
-
provider: config.session.provider,
|
|
41
|
-
model: config.session.model,
|
|
42
|
-
...(config.session.reasoningEffort === null
|
|
43
|
-
? {}
|
|
44
|
-
: { reasoningEffort: config.session.reasoningEffort }),
|
|
45
|
-
});
|
|
46
|
-
if (!selected.ok)
|
|
47
|
-
throw new Error(wireFailure(selected.error));
|
|
48
|
-
}
|
|
49
|
-
return id;
|
|
21
|
+
const created = await args.createSession(args.token);
|
|
22
|
+
if (!created.ok)
|
|
23
|
+
throw new Error(wireFailure(created.error));
|
|
24
|
+
return created.value;
|
|
50
25
|
}
|
|
51
26
|
//# sourceMappingURL=create-session.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-session.js","sourceRoot":"","sources":["../../src/client/create-session.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"create-session.js","sourceRoot":"","sources":["../../src/client/create-session.ts"],"names":[],"mappings":"AAEA;;6EAE6E;AAC7E,SAAS,WAAW,CAAC,KAAc;IACjC,MAAM,IAAI,GACR,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,IAAI,KAAK;QAC5D,CAAC,CAAC,MAAM,CAAE,KAA4B,CAAC,IAAI,IAAI,EAAE,CAAC;QAClD,CAAC,CAAC,EAAE,CAAC;IACT,MAAM,OAAO,GACX,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,SAAS,IAAI,KAAK;QAC/D,CAAC,CAAC,MAAM,CAAE,KAA+B,CAAC,OAAO,IAAI,EAAE,CAAC;QACxD,CAAC,CAAC,EAAE,CAAC;IACT,OAAO,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,OAAO,EAAE,CAAC;AACvD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAGrC;IACC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrD,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7D,OAAO,OAAO,CAAC,KAAK,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QA-facing copy for provider failures, keyed by the stable failure code the
|
|
3
|
+
* host records on retry and turn-end events. Raw provider messages never
|
|
4
|
+
* reach these rows — they can carry stack traces and local paths — so every
|
|
5
|
+
* text here derives from the code alone.
|
|
6
|
+
*/
|
|
7
|
+
/** Short cause label used inside the retry row copy. */
|
|
8
|
+
function failureCause(code) {
|
|
9
|
+
switch (code) {
|
|
10
|
+
case "TRANSPORT":
|
|
11
|
+
return "обрыв связи";
|
|
12
|
+
case "STREAM_CLOSED":
|
|
13
|
+
return "поток оборвался";
|
|
14
|
+
case "TIMEOUT":
|
|
15
|
+
return "таймаут провайдера";
|
|
16
|
+
case "RATE_LIMIT":
|
|
17
|
+
return "лимит запросов";
|
|
18
|
+
case "SERVER":
|
|
19
|
+
return "ошибка провайдера";
|
|
20
|
+
case "EMPTY_RESPONSE":
|
|
21
|
+
return "пустой ответ";
|
|
22
|
+
case undefined:
|
|
23
|
+
return "сбой";
|
|
24
|
+
default:
|
|
25
|
+
return `сбой (${code})`;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/** Terminal turn-failure row shown after the work group. */
|
|
29
|
+
export function turnErrorCopy(code) {
|
|
30
|
+
switch (code) {
|
|
31
|
+
case "TRANSPORT":
|
|
32
|
+
case "STREAM_CLOSED":
|
|
33
|
+
case "TIMEOUT":
|
|
34
|
+
return "Обрыв связи с провайдером. Ответ не сохранился — отправь запрос ещё раз.";
|
|
35
|
+
case "RATE_LIMIT":
|
|
36
|
+
return "Провайдер ограничил частоту запросов — попытки исчерпаны. Попробуй ещё раз через минуту.";
|
|
37
|
+
case "QUOTA":
|
|
38
|
+
return "Квота провайдера исчерпана — сообщи оператору стенда.";
|
|
39
|
+
case "AUTH":
|
|
40
|
+
return "Провайдер отклонил доступ (ключ или права) — сообщи оператору стенда.";
|
|
41
|
+
case "SERVER":
|
|
42
|
+
return "Провайдер вернул ошибку сервера — попытки исчерпаны. Попробуй ещё раз позже.";
|
|
43
|
+
default:
|
|
44
|
+
return "Помощнику не удалось завершить ответ.";
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/** Work-group row for one host-scheduled model-request retry. */
|
|
48
|
+
export function retryWorkCopy(node) {
|
|
49
|
+
const attempt = node.mode === "normal" && typeof node.maxRetries === "number"
|
|
50
|
+
? `${node.retry} из ${node.maxRetries}`
|
|
51
|
+
: `${node.retry} (без лимита)`;
|
|
52
|
+
switch (node.retryState) {
|
|
53
|
+
case "scheduled": {
|
|
54
|
+
const seconds = Math.max(1, Math.round(node.delayMs / 1_000));
|
|
55
|
+
return `Сбой запроса к провайдеру (${failureCause(node.failureCode)}) — повторная попытка ${attempt} через ${seconds} с`;
|
|
56
|
+
}
|
|
57
|
+
case "started":
|
|
58
|
+
return `Сбой запроса к провайдеру (${failureCause(node.failureCode)}) — повторная попытка ${attempt} выполняется`;
|
|
59
|
+
case "cancelled":
|
|
60
|
+
return `Повторная попытка ${attempt} отменена (ход прерван)`;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=failure-copy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"failure-copy.js","sourceRoot":"","sources":["../../src/client/failure-copy.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,wDAAwD;AACxD,SAAS,YAAY,CAAC,IAAwB;IAC5C,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,WAAW;YACd,OAAO,aAAa,CAAC;QACvB,KAAK,eAAe;YAClB,OAAO,iBAAiB,CAAC;QAC3B,KAAK,SAAS;YACZ,OAAO,oBAAoB,CAAC;QAC9B,KAAK,YAAY;YACf,OAAO,gBAAgB,CAAC;QAC1B,KAAK,QAAQ;YACX,OAAO,mBAAmB,CAAC;QAC7B,KAAK,gBAAgB;YACnB,OAAO,cAAc,CAAC;QACxB,KAAK,SAAS;YACZ,OAAO,MAAM,CAAC;QAChB;YACE,OAAO,SAAS,IAAI,GAAG,CAAC;IAC5B,CAAC;AACH,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,aAAa,CAAC,IAAwB;IACpD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,WAAW,CAAC;QACjB,KAAK,eAAe,CAAC;QACrB,KAAK,SAAS;YACZ,OAAO,0EAA0E,CAAC;QACpF,KAAK,YAAY;YACf,OAAO,0FAA0F,CAAC;QACpG,KAAK,OAAO;YACV,OAAO,uDAAuD,CAAC;QACjE,KAAK,MAAM;YACT,OAAO,uEAAuE,CAAC;QACjF,KAAK,QAAQ;YACX,OAAO,8EAA8E,CAAC;QACxF;YACE,OAAO,uCAAuC,CAAC;IACnD,CAAC;AACH,CAAC;AAWD,iEAAiE;AACjE,MAAM,UAAU,aAAa,CAAC,IAAqB;IACjD,MAAM,OAAO,GACX,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ;QAC3D,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,UAAU,EAAE;QACvC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,eAAe,CAAC;IACnC,QAAQ,IAAI,CAAC,UAAU,EAAE,CAAC;QACxB,KAAK,WAAW,EAAE,CAAC;YACjB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC;YAC9D,OAAO,8BAA8B,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,yBAAyB,OAAO,UAAU,OAAO,IAAI,CAAC;QAC3H,CAAC;QACD,KAAK,SAAS;YACZ,OAAO,8BAA8B,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,yBAAyB,OAAO,cAAc,CAAC;QACpH,KAAK,WAAW;YACd,OAAO,qBAAqB,OAAO,yBAAyB,CAAC;IACjE,CAAC;AACH,CAAC"}
|
package/lib/client/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import qaSurfaceRemote from "@yadsh/dsh-qa-surface/remote";
|
|
2
|
+
import { registerSettingsCard } from "@yadsh/dsh-plugin-kit/client";
|
|
2
3
|
import { QaConfigController } from "./QaConfigController.js";
|
|
3
4
|
import { matchesQaRoute, QaRouteController } from "./QaRouteController.js";
|
|
4
5
|
import { QaAccountsController } from "./QaAccountsController.js";
|
|
@@ -6,10 +7,13 @@ import { QaChatIndex } from "./chat-index.js";
|
|
|
6
7
|
import { QaSurface } from "./QaSurface.js";
|
|
7
8
|
import { QaWelcomeNoticeStep } from "./components/QaWelcomeNotice.js";
|
|
8
9
|
import { QA_SURFACE_STYLES } from "./styles.js";
|
|
9
|
-
|
|
10
|
+
import { QA_SURFACE_SETTINGS_NAMESPACE } from "../shared/settings.js";
|
|
11
|
+
import { qaStorageNamespace } from "../shared/session-key.js";
|
|
12
|
+
import { QaSettingsCard } from "./settings/card.js";
|
|
13
|
+
import { QA_SETTINGS_STYLES } from "./settings/styles.js";
|
|
10
14
|
const QA_WELCOME_SLOT_ID = "welcome-notice";
|
|
11
15
|
function qaWelcomeStorageKey(config) {
|
|
12
|
-
return `${config
|
|
16
|
+
return `${qaStorageNamespace(config)}:welcome-notice`;
|
|
13
17
|
}
|
|
14
18
|
export const inject = [
|
|
15
19
|
"slots",
|
|
@@ -45,7 +49,7 @@ export async function apply(ctx) {
|
|
|
45
49
|
// A standalone index view over the same prefix: reads the chat ids
|
|
46
50
|
// this browser accumulated before accounts existed.
|
|
47
51
|
const snapshot = config.getSnapshot().config;
|
|
48
|
-
const index = new QaChatIndex(window.localStorage,
|
|
52
|
+
const index = new QaChatIndex(window.localStorage, qaStorageNamespace(snapshot));
|
|
49
53
|
const ids = [...index.chatIds()];
|
|
50
54
|
const active = index.activeId();
|
|
51
55
|
if (active !== null && !ids.includes(active))
|
|
@@ -54,13 +58,16 @@ export async function apply(ctx) {
|
|
|
54
58
|
},
|
|
55
59
|
forgetChat: (sessionId) => {
|
|
56
60
|
const snapshot = config.getSnapshot().config;
|
|
57
|
-
new QaChatIndex(window.localStorage,
|
|
61
|
+
new QaChatIndex(window.localStorage, qaStorageNamespace(snapshot)).forgetChat(sessionId);
|
|
58
62
|
},
|
|
59
63
|
});
|
|
60
64
|
const route = new QaRouteController();
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
65
|
+
// One binding for both readers: the surface projects it into the page's
|
|
66
|
+
// configuration, the settings card edits the same namespace through it.
|
|
67
|
+
const settingsScope = ctx.settingsScope.bind({
|
|
68
|
+
namespace: QA_SURFACE_SETTINGS_NAMESPACE,
|
|
69
|
+
});
|
|
70
|
+
const config = new QaConfigController(settingsScope, async () => {
|
|
64
71
|
// Settings RPCs are loopback-pinned by the gateway, so a browser the
|
|
65
72
|
// Host serves over the LAN reads the effective configuration here.
|
|
66
73
|
const described = await policyRemote.describe();
|
|
@@ -71,6 +78,23 @@ export async function apply(ctx) {
|
|
|
71
78
|
// declarations during an incremental source typecheck.
|
|
72
79
|
return described.value;
|
|
73
80
|
});
|
|
81
|
+
// The operator edits this deployment through the shared plugin-cards
|
|
82
|
+
// tab: the same namespace the page reads, plus the Host's own answer
|
|
83
|
+
// about what it resolved. Its stylesheet is the card shell, not the QA
|
|
84
|
+
// page's palette.
|
|
85
|
+
ctx.effect(() => {
|
|
86
|
+
const cardFace = {
|
|
87
|
+
scope: settingsScope,
|
|
88
|
+
describe: () => policyRemote.describe(),
|
|
89
|
+
};
|
|
90
|
+
return registerSettingsCard(remoteContext, {
|
|
91
|
+
key: QA_SURFACE_SETTINGS_NAMESPACE,
|
|
92
|
+
pluginName: "@yadsh/dsh-qa-surface",
|
|
93
|
+
styles: QA_SETTINGS_STYLES,
|
|
94
|
+
component: QaSettingsCard,
|
|
95
|
+
inject: () => cardFace,
|
|
96
|
+
});
|
|
97
|
+
}, "dsh-qa-surface: settings-card");
|
|
74
98
|
const syncRoute = () => {
|
|
75
99
|
const snapshot = config.getSnapshot();
|
|
76
100
|
route.configure(snapshot.config, snapshot.status === "ready" || snapshot.status === "unavailable");
|
|
@@ -162,8 +186,15 @@ export async function apply(ctx) {
|
|
|
162
186
|
api: qaApi,
|
|
163
187
|
connection: ctx.connection.generation,
|
|
164
188
|
secureSession,
|
|
189
|
+
createSession: (token) => policyRemote.createSession(token),
|
|
165
190
|
sourceApi,
|
|
166
191
|
accounts,
|
|
192
|
+
// The upload service is optional on the page: a deployment that
|
|
193
|
+
// does not serve it keeps images, and a staged file refuses the
|
|
194
|
+
// send with a message instead of losing the draft. Read through
|
|
195
|
+
// the untyped service lookup on purpose — the QA bundle does not
|
|
196
|
+
// link the upload package.
|
|
197
|
+
fileUpload: () => ctx.get("fileUpload"),
|
|
167
198
|
}),
|
|
168
199
|
}, QaSurface));
|
|
169
200
|
});
|
package/lib/client/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.tsx"],"names":[],"mappings":"AAIA,OAAO,eAAe,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stage every pending file on the Host and collect the receipts the prompt
|
|
3
|
+
* cites. Sequential on purpose: a partial batch must be attributable to the
|
|
4
|
+
* exact file that failed, and the visitor's file counts are small.
|
|
5
|
+
* `service` is undefined on a page the deployment serves without the upload
|
|
6
|
+
* plugin, which leaves attachments unavailable rather than broken. The
|
|
7
|
+
* receipt is opaque and host-minted — the upload service answers with a
|
|
8
|
+
* plain string, and only the session wire brand knows it as an id.
|
|
9
|
+
*/
|
|
10
|
+
export async function stageQaFiles(service, session, files) {
|
|
11
|
+
if (service === undefined)
|
|
12
|
+
return { kind: "unavailable" };
|
|
13
|
+
const receipts = new Map();
|
|
14
|
+
for (const file of files) {
|
|
15
|
+
try {
|
|
16
|
+
const result = await service.upload(session.sessionId, file.blob, file.name);
|
|
17
|
+
if (!result.ok) {
|
|
18
|
+
console.error("dsh-qa-surface: file upload refused", result.error);
|
|
19
|
+
return { kind: "failed" };
|
|
20
|
+
}
|
|
21
|
+
receipts.set(file.id, result.value.receiptId);
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
console.error("dsh-qa-surface: file upload failed", error);
|
|
25
|
+
return { kind: "failed" };
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return { kind: "ok", receipts };
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Assemble the wire content of one prompt: the text part, images riding the
|
|
32
|
+
* prompt inline, and files cited by their staged receipts. The visitor's own
|
|
33
|
+
* order decides the prompt order, so images and files are assembled from one
|
|
34
|
+
* walk over the drafts; an unpaired file receipt (a draft kept while its
|
|
35
|
+
* staging failed elsewhere) degrades to an empty receipt rather than
|
|
36
|
+
* dropping the attachment.
|
|
37
|
+
*/
|
|
38
|
+
export function buildQaPromptContent(prompt, attachments, receipts) {
|
|
39
|
+
return [
|
|
40
|
+
...(prompt === "" ? [] : [{ type: "text", text: prompt }]),
|
|
41
|
+
...attachments.map((attachment) => attachment.kind === "image"
|
|
42
|
+
? {
|
|
43
|
+
type: "image",
|
|
44
|
+
mediaType: attachment.mediaType,
|
|
45
|
+
data: attachment.data,
|
|
46
|
+
name: attachment.name,
|
|
47
|
+
}
|
|
48
|
+
: {
|
|
49
|
+
type: "file",
|
|
50
|
+
receiptId: receipts.get(attachment.id) ?? "",
|
|
51
|
+
}),
|
|
52
|
+
];
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=prompt-content.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-content.js","sourceRoot":"","sources":["../../src/client/prompt-content.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAiC,EACjC,OAAoB,EACpB,KAA6B;IAM7B,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;IAC1D,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CACjC,OAAO,CAAC,SAAS,EACjB,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,IAAI,CACV,CAAC;YACF,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;gBACnE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;YAC5B,CAAC;YACD,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC,CAAC;YAC3D,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAClC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAClC,MAAc,EACd,WAAyC,EACzC,QAAqC;IAErC,OAAO;QACL,GAAG,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QACnE,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAChC,UAAU,CAAC,IAAI,KAAK,OAAO;YACzB,CAAC,CAAC;gBACE,IAAI,EAAE,OAAgB;gBACtB,SAAS,EAAE,UAAU,CAAC,SAAS;gBAC/B,IAAI,EAAE,UAAU,CAAC,IAAI;gBACrB,IAAI,EAAE,UAAU,CAAC,IAAI;aACtB;YACH,CAAC,CAAC;gBACE,IAAI,EAAE,MAAe;gBACrB,SAAS,EAAE,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE;aAC7C,CACN;KACiB,CAAC;AACvB,CAAC"}
|
|
@@ -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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"}
|