@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,147 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useLayoutEffect, useRef, useState, } from "react";
|
|
3
|
+
/**
|
|
4
|
+
* Space kept outside the content: 88px per side leaves room for the handle,
|
|
5
|
+
* its inset, and a safe zone that remains draggable in both directions. It is
|
|
6
|
+
* the whole ceiling too: like DSH, the page bounds the width, so a wide column
|
|
7
|
+
* lets the transcript fill it.
|
|
8
|
+
*/
|
|
9
|
+
export const QA_CONTENT_EDGE_BUDGET = 176;
|
|
10
|
+
const QA_ADAPTIVE_MIN_WIDTH = 680;
|
|
11
|
+
const QA_ADAPTIVE_MAX_WIDTH = 920;
|
|
12
|
+
export function readQaContentWidth(storage, key) {
|
|
13
|
+
try {
|
|
14
|
+
const raw = storage.getItem(key);
|
|
15
|
+
if (raw === null)
|
|
16
|
+
return null;
|
|
17
|
+
const value = Number(raw);
|
|
18
|
+
return Number.isFinite(value) && value > 0 ? value : null;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export function writeQaContentWidth(storage, key, width) {
|
|
25
|
+
try {
|
|
26
|
+
storage.setItem(key, `${width}`);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
// Denied durable storage only costs persistence across reloads.
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Resolve the centered content width for the currently available column. The
|
|
34
|
+
* operator sets only the floor; the column is the ceiling, so the content may
|
|
35
|
+
* grow until its handles reach the edge budget and a wider window keeps
|
|
36
|
+
* widening it. A column too narrow even for the floor wins over the floor —
|
|
37
|
+
* there is nothing else to give up.
|
|
38
|
+
*/
|
|
39
|
+
export function resolveQaContentWidth(columnWidth, preference, minContentWidth) {
|
|
40
|
+
const available = Math.max(0, columnWidth - QA_CONTENT_EDGE_BUDGET);
|
|
41
|
+
const minimum = Math.min(minContentWidth, available);
|
|
42
|
+
const adaptive = Math.max(QA_ADAPTIVE_MIN_WIDTH, Math.min(columnWidth * 0.64, QA_ADAPTIVE_MAX_WIDTH));
|
|
43
|
+
const requested = preference ?? Math.max(adaptive, minimum);
|
|
44
|
+
return Math.min(Math.max(requested, minimum), available);
|
|
45
|
+
}
|
|
46
|
+
/** Pointer-captured, rAF-throttled symmetric content-width handle. */
|
|
47
|
+
export function QaWidthHandle(props) {
|
|
48
|
+
const [dragging, setDragging] = useState(false);
|
|
49
|
+
const base = useRef(0);
|
|
50
|
+
const origin = useRef(0);
|
|
51
|
+
const latest = useRef(0);
|
|
52
|
+
const frame = useRef(null);
|
|
53
|
+
const callbacks = useRef(props);
|
|
54
|
+
callbacks.current = props;
|
|
55
|
+
const outwardWidth = () => {
|
|
56
|
+
const delta = latest.current - origin.current;
|
|
57
|
+
const outward = callbacks.current.side === "right" ? delta : -delta;
|
|
58
|
+
return base.current + outward * 2;
|
|
59
|
+
};
|
|
60
|
+
const cancelFrame = useCallback(() => {
|
|
61
|
+
if (frame.current === null)
|
|
62
|
+
return;
|
|
63
|
+
cancelAnimationFrame(frame.current);
|
|
64
|
+
frame.current = null;
|
|
65
|
+
}, []);
|
|
66
|
+
useEffect(() => cancelFrame, [cancelFrame]);
|
|
67
|
+
const onPointerDown = useCallback((event) => {
|
|
68
|
+
event.preventDefault();
|
|
69
|
+
event.currentTarget.setPointerCapture(event.pointerId);
|
|
70
|
+
origin.current = event.clientX;
|
|
71
|
+
latest.current = event.clientX;
|
|
72
|
+
base.current = callbacks.current.onStart();
|
|
73
|
+
setDragging(true);
|
|
74
|
+
}, []);
|
|
75
|
+
const onPointerMove = useCallback((event) => {
|
|
76
|
+
const box = event.currentTarget.getBoundingClientRect();
|
|
77
|
+
event.currentTarget.style.setProperty("--dsh-qa-width-handle-pointer-y", `${event.clientY - box.top}px`);
|
|
78
|
+
if (!event.currentTarget.hasPointerCapture(event.pointerId))
|
|
79
|
+
return;
|
|
80
|
+
latest.current = event.clientX;
|
|
81
|
+
frame.current ??= requestAnimationFrame(() => {
|
|
82
|
+
frame.current = null;
|
|
83
|
+
callbacks.current.onDrag(outwardWidth());
|
|
84
|
+
});
|
|
85
|
+
}, []);
|
|
86
|
+
const onPointerUp = useCallback((event) => {
|
|
87
|
+
if (!event.currentTarget.hasPointerCapture(event.pointerId))
|
|
88
|
+
return;
|
|
89
|
+
event.currentTarget.releasePointerCapture(event.pointerId);
|
|
90
|
+
cancelFrame();
|
|
91
|
+
latest.current = event.clientX;
|
|
92
|
+
if (latest.current !== origin.current) {
|
|
93
|
+
callbacks.current.onCommit(outwardWidth());
|
|
94
|
+
}
|
|
95
|
+
setDragging(false);
|
|
96
|
+
callbacks.current.onEnd();
|
|
97
|
+
}, [cancelFrame]);
|
|
98
|
+
const onPointerCancel = useCallback(() => {
|
|
99
|
+
cancelFrame();
|
|
100
|
+
setDragging(false);
|
|
101
|
+
callbacks.current.onEnd();
|
|
102
|
+
}, [cancelFrame]);
|
|
103
|
+
return (_jsx("div", { className: "dsh-qa-width-handle", "data-side": props.side, "data-width-handle": props.side, "data-dragging": dragging || undefined, onPointerDown: onPointerDown, onPointerMove: onPointerMove, onPointerUp: onPointerUp, onPointerCancel: onPointerCancel, onLostPointerCapture: onPointerCancel }));
|
|
104
|
+
}
|
|
105
|
+
export function useQaContentWidth({ active, root, storage, storageKey, minContentWidth, }) {
|
|
106
|
+
const publish = useCallback(() => {
|
|
107
|
+
const element = root.current;
|
|
108
|
+
if (element === null)
|
|
109
|
+
return;
|
|
110
|
+
const preference = readQaContentWidth(storage, storageKey);
|
|
111
|
+
const width = resolveQaContentWidth(element.offsetWidth, preference, minContentWidth);
|
|
112
|
+
element.style.setProperty("--dsh-qa-content-width", `${width}px`);
|
|
113
|
+
}, [minContentWidth, root, storage, storageKey]);
|
|
114
|
+
useLayoutEffect(() => {
|
|
115
|
+
if (!active)
|
|
116
|
+
return;
|
|
117
|
+
const element = root.current;
|
|
118
|
+
if (element === null)
|
|
119
|
+
return;
|
|
120
|
+
publish();
|
|
121
|
+
const observer = new ResizeObserver(publish);
|
|
122
|
+
observer.observe(element);
|
|
123
|
+
return () => observer.disconnect();
|
|
124
|
+
}, [active, publish, root]);
|
|
125
|
+
const onStart = useCallback(() => {
|
|
126
|
+
const element = root.current;
|
|
127
|
+
if (element === null)
|
|
128
|
+
return minContentWidth;
|
|
129
|
+
return resolveQaContentWidth(element.offsetWidth, readQaContentWidth(storage, storageKey), minContentWidth);
|
|
130
|
+
}, [minContentWidth, root, storage, storageKey]);
|
|
131
|
+
const onDrag = useCallback((requestedWidth) => {
|
|
132
|
+
const element = root.current;
|
|
133
|
+
if (element === null)
|
|
134
|
+
return;
|
|
135
|
+
const width = resolveQaContentWidth(element.offsetWidth, requestedWidth, minContentWidth);
|
|
136
|
+
element.style.setProperty("--dsh-qa-content-width", `${width}px`);
|
|
137
|
+
}, [minContentWidth, root]);
|
|
138
|
+
const onCommit = useCallback((requestedWidth) => {
|
|
139
|
+
const element = root.current;
|
|
140
|
+
if (element === null)
|
|
141
|
+
return;
|
|
142
|
+
const width = resolveQaContentWidth(element.offsetWidth, requestedWidth, minContentWidth);
|
|
143
|
+
writeQaContentWidth(storage, storageKey, width);
|
|
144
|
+
}, [minContentWidth, root, storage, storageKey]);
|
|
145
|
+
return { onStart, onDrag, onCommit, onEnd: publish };
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=QaWidthHandle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QaWidthHandle.js","sourceRoot":"","sources":["../../../src/client/components/QaWidthHandle.tsx"],"names":[],"mappings":"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"}
|
|
@@ -2,14 +2,7 @@ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-run
|
|
|
2
2
|
import { memo, useEffect, useRef, useState } from "react";
|
|
3
3
|
import { formatWorkDuration } from "./format.js";
|
|
4
4
|
import { Markdown } from "./Markdown.js";
|
|
5
|
-
|
|
6
|
-
"Скребу по сусекам…",
|
|
7
|
-
"Кумекаю…",
|
|
8
|
-
"Навожу резкость…",
|
|
9
|
-
"Собираю мысли в кучку…",
|
|
10
|
-
"Раскладываю по полочкам…",
|
|
11
|
-
"Сверяю приметы…",
|
|
12
|
-
]);
|
|
5
|
+
import { thinkingPhrase } from "./thinking-phrases.js";
|
|
13
6
|
function Chevron({ open }) {
|
|
14
7
|
return (_jsx("svg", { className: "dsh-qa-work__chevron", "data-open": open || undefined, viewBox: "0 0 14 14", "aria-hidden": "true", children: _jsx("path", { d: "m5.25 3.5 3.5 3.5-3.5 3.5" }) }));
|
|
15
8
|
}
|
|
@@ -97,17 +90,19 @@ const QaTextWorkItem = memo(function QaTextWorkItem({ item, renderMarkdown, }) {
|
|
|
97
90
|
return (_jsxs("section", { className: "dsh-qa-work-item dsh-qa-work-item--text", "data-state": item.status, "aria-label": item.kind === "reasoning" ? "Рассуждение" : "Ход работы", children: [_jsxs("div", { className: "dsh-qa-work-item__text-head", children: [_jsx("span", { className: "dsh-qa-work-item__icon", children: _jsx(ThinkIcon, {}) }), _jsx("span", { className: "dsh-qa-work-item__label", children: item.kind === "reasoning" ? "Размышление" : "Ход работы" })] }), _jsx("div", { className: "dsh-qa-work-item__text", children: renderMarkdown ? _jsx(Markdown, { text: item.text }) : item.text })] }));
|
|
98
91
|
}, (prev, next) => prev.renderMarkdown === next.renderMarkdown &&
|
|
99
92
|
sameWorkItem(prev.item, next.item));
|
|
100
|
-
export const QaWorkGroup = memo(function QaWorkGroup({ status, startedAt, endedAt, items, renderMarkdown, }) {
|
|
93
|
+
export const QaWorkGroup = memo(function QaWorkGroup({ status, startedAt, endedAt, items, renderMarkdown, thinkingPhrases, }) {
|
|
101
94
|
const [open, setOpen] = useState(status === "running");
|
|
102
95
|
const [now, setNow] = useState(() => Date.now());
|
|
103
96
|
const previousStatus = useRef(status);
|
|
104
97
|
useEffect(() => {
|
|
105
|
-
if (previousStatus.current === "running" &&
|
|
98
|
+
if (previousStatus.current === "running" &&
|
|
99
|
+
(status === "complete" || status === "error")) {
|
|
106
100
|
setOpen(false);
|
|
107
101
|
}
|
|
108
|
-
else if (previousStatus.current === "complete"
|
|
109
|
-
|
|
110
|
-
|
|
102
|
+
else if (previousStatus.current === "complete" ||
|
|
103
|
+
previousStatus.current === "error") {
|
|
104
|
+
if (status === "running")
|
|
105
|
+
setOpen(true);
|
|
111
106
|
}
|
|
112
107
|
previousStatus.current = status;
|
|
113
108
|
}, [status]);
|
|
@@ -118,18 +113,22 @@ export const QaWorkGroup = memo(function QaWorkGroup({ status, startedAt, endedA
|
|
|
118
113
|
const timer = setInterval(() => setNow(Date.now()), 1_000);
|
|
119
114
|
return () => clearInterval(timer);
|
|
120
115
|
}, [startedAt, status]);
|
|
121
|
-
const
|
|
122
|
-
|
|
123
|
-
: formatWorkDuration((endedAt ?? now) - startedAt);
|
|
116
|
+
const elapsed = (endedAt ?? now) - (startedAt ?? now);
|
|
117
|
+
const duration = startedAt === undefined ? null : formatWorkDuration(elapsed);
|
|
124
118
|
const label = status === "running"
|
|
125
|
-
? `${
|
|
126
|
-
:
|
|
127
|
-
?
|
|
128
|
-
|
|
119
|
+
? `${thinkingPhrase(elapsed, thinkingPhrases)}${duration === null ? "" : ` (${duration})`}`
|
|
120
|
+
: status === "error"
|
|
121
|
+
? duration === null
|
|
122
|
+
? "Ход прерван"
|
|
123
|
+
: `Прервано за ${duration}`
|
|
124
|
+
: duration === null
|
|
125
|
+
? "Ход работы"
|
|
126
|
+
: `Готово за ${duration}`;
|
|
129
127
|
return (_jsxs("section", { className: "dsh-qa-work", "data-state": status, children: [_jsxs("button", { type: "button", className: "dsh-qa-work__toggle", "aria-expanded": open, onClick: () => setOpen((value) => !value), children: [status === "running" ? (_jsx("span", { className: "dsh-qa-work__spinner", "aria-hidden": "true" })) : null, _jsx("span", { children: label }), _jsx(Chevron, { open: open })] }), open ? (_jsx("div", { className: "dsh-qa-work__body", children: items.map((item) => item.kind === "tool" ? (_jsx(QaToolWorkItem, { item: item }, item.id)) : (_jsx(QaTextWorkItem, { item: item, renderMarkdown: renderMarkdown }, item.id))) })) : null] }));
|
|
130
128
|
}, (prev, next) => prev.status === next.status &&
|
|
131
129
|
prev.startedAt === next.startedAt &&
|
|
132
130
|
prev.endedAt === next.endedAt &&
|
|
133
131
|
prev.renderMarkdown === next.renderMarkdown &&
|
|
132
|
+
prev.thinkingPhrases === next.thinkingPhrases &&
|
|
134
133
|
sameWorkItems(prev.items, next.items));
|
|
135
134
|
//# sourceMappingURL=QaWorkGroup.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QaWorkGroup.js","sourceRoot":"","sources":["../../../src/client/components/QaWorkGroup.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"QaWorkGroup.js","sourceRoot":"","sources":["../../../src/client/components/QaWorkGroup.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/** http(s) URLs only, case-folded authority, hash and trailing slash gone. */
|
|
2
|
+
function normalizeUrl(value) {
|
|
3
|
+
try {
|
|
4
|
+
const url = new URL(value);
|
|
5
|
+
if (url.protocol !== "http:" && url.protocol !== "https:")
|
|
6
|
+
return undefined;
|
|
7
|
+
url.hash = "";
|
|
8
|
+
if (url.pathname.length > 1) {
|
|
9
|
+
url.pathname = url.pathname.replace(/\/+$/u, "");
|
|
10
|
+
}
|
|
11
|
+
return `${url.protocol}//${url.host.toLowerCase()}${url.pathname}${url.search}`;
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return undefined;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
/** Separators normalized for comparison, not for display. */
|
|
18
|
+
function normalizePath(value) {
|
|
19
|
+
return value.trim().replace(/\\/gu, "/").replace(/\/+$/u, "").toLowerCase();
|
|
20
|
+
}
|
|
21
|
+
function basename(value) {
|
|
22
|
+
const slash = value.lastIndexOf("/");
|
|
23
|
+
return slash < 0 ? value : value.slice(slash + 1);
|
|
24
|
+
}
|
|
25
|
+
/** Display name for a file-backed source: the file name alone, case kept. */
|
|
26
|
+
export function sourceFileName(source) {
|
|
27
|
+
const normalized = (source.path ?? source.uri ?? source.title)
|
|
28
|
+
.trim()
|
|
29
|
+
.replace(/\\/gu, "/");
|
|
30
|
+
const slash = normalized.lastIndexOf("/");
|
|
31
|
+
const name = slash < 0 ? normalized : normalized.slice(slash + 1);
|
|
32
|
+
return name === "" ? source.title : name;
|
|
33
|
+
}
|
|
34
|
+
const NO_REFS = {
|
|
35
|
+
signature: "",
|
|
36
|
+
resolveUrl: () => undefined,
|
|
37
|
+
resolvePath: () => undefined,
|
|
38
|
+
};
|
|
39
|
+
export function buildSourceRefs(sources) {
|
|
40
|
+
if (sources.length === 0)
|
|
41
|
+
return NO_REFS;
|
|
42
|
+
const byUrl = new Map();
|
|
43
|
+
const paths = [];
|
|
44
|
+
for (const source of sources) {
|
|
45
|
+
if (source.uri !== undefined) {
|
|
46
|
+
const key = normalizeUrl(source.uri);
|
|
47
|
+
if (key !== undefined)
|
|
48
|
+
byUrl.set(key, source);
|
|
49
|
+
}
|
|
50
|
+
if (source.path !== undefined) {
|
|
51
|
+
paths.push({ normalized: normalizePath(source.path), source });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
signature: sources.map((source) => source.id).join("|"),
|
|
56
|
+
resolveUrl(url) {
|
|
57
|
+
const key = normalizeUrl(url);
|
|
58
|
+
return key === undefined ? undefined : byUrl.get(key);
|
|
59
|
+
},
|
|
60
|
+
resolvePath(token) {
|
|
61
|
+
const normalized = normalizePath(token);
|
|
62
|
+
if (normalized === "")
|
|
63
|
+
return undefined;
|
|
64
|
+
const exact = paths.find((path) => path.normalized === normalized);
|
|
65
|
+
if (exact !== undefined)
|
|
66
|
+
return exact.source;
|
|
67
|
+
if (!normalized.includes("/")) {
|
|
68
|
+
// A bare file name is ambiguous the moment two sources share it.
|
|
69
|
+
const named = paths.filter((path) => basename(path.normalized) === normalized);
|
|
70
|
+
return named.length === 1 ? named[0]?.source : undefined;
|
|
71
|
+
}
|
|
72
|
+
// A partial directory path must stay unambiguous the same way.
|
|
73
|
+
const suffix = paths.filter((path) => path.normalized.endsWith(`/${normalized}`));
|
|
74
|
+
return suffix.length === 1 ? suffix[0]?.source : undefined;
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=source-refs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-refs.js","sourceRoot":"","sources":["../../../src/client/components/source-refs.ts"],"names":[],"mappings":"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"}
|
|
@@ -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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** The wire failure's code plus its message — preset composition reasons (a
|
|
2
|
+
* broken loader entry, a missing tool) ride the message and never anywhere
|
|
3
|
+
* else, so collapsing to the code costs the operator the whole diagnosis. */
|
|
4
|
+
function wireFailure(error) {
|
|
5
|
+
const code = typeof error === "object" && error !== null && "code" in error
|
|
6
|
+
? String(error.code ?? "")
|
|
7
|
+
: "";
|
|
8
|
+
const message = typeof error === "object" && error !== null && "message" in error
|
|
9
|
+
? String(error.message ?? "")
|
|
10
|
+
: "";
|
|
11
|
+
return message === "" ? code : `${code}: ${message}`;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
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
|
|
17
|
+
* is addressed only here — no prompt can run before the caller attests the
|
|
18
|
+
* composed preset.
|
|
19
|
+
*/
|
|
20
|
+
export async function createQaSession(args) {
|
|
21
|
+
const created = await args.createSession(args.token);
|
|
22
|
+
if (!created.ok)
|
|
23
|
+
throw new Error(wireFailure(created.error));
|
|
24
|
+
return created.value;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=create-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|