@yadsh/dsh-qa-surface 0.1.1 → 0.3.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/CHANGELOG.md +151 -0
- package/README.md +239 -16
- package/SPEC-dsh-qa-surface.md +600 -96
- package/capability-policy.json +5 -0
- package/compatibility.json +18 -4
- package/cordis.patch.yml +11 -0
- package/docs/ARCHITECTURE.md +50 -8
- package/docs/COMPATIBILITY.md +5 -4
- package/docs/CONFIGURATION.md +184 -3
- package/docs/SOURCES-MIGRATION.md +28 -0
- package/docs/SOURCES-PROVENANCE-AUDIT.md +88 -0
- package/docs/SPEC-dsh-qa-surface-accounts.md +219 -0
- package/docs/SPEC-dsh-qa-surface-sources-provenance.md +1692 -0
- package/lib/accounts/index.js +2 -0
- package/lib/accounts/index.js.map +1 -0
- package/lib/accounts/store.js +478 -0
- package/lib/accounts/store.js.map +1 -0
- package/lib/attestation.js +10 -0
- package/lib/attestation.js.map +1 -0
- package/lib/cli.js +143 -0
- package/lib/cli.js.map +1 -0
- package/lib/client/QaAccountsController.js +329 -0
- package/lib/client/QaAccountsController.js.map +1 -0
- package/lib/client/QaConfigController.js +111 -4
- package/lib/client/QaConfigController.js.map +1 -1
- package/lib/client/QaSessionController.js +621 -163
- package/lib/client/QaSessionController.js.map +1 -1
- package/lib/client/QaSurface.js +303 -24
- package/lib/client/QaSurface.js.map +1 -1
- package/lib/client/QaTranscriptAdapter.js +324 -49
- package/lib/client/QaTranscriptAdapter.js.map +1 -1
- package/lib/client/attestation.js +66 -0
- package/lib/client/attestation.js.map +1 -0
- package/lib/client/chat-index.js +86 -0
- package/lib/client/chat-index.js.map +1 -0
- package/lib/client/components/Markdown.js +124 -13
- package/lib/client/components/Markdown.js.map +1 -1
- package/lib/client/components/QaAgentsDrawer.js +40 -0
- package/lib/client/components/QaAgentsDrawer.js.map +1 -0
- package/lib/client/components/QaAuthGate.js +40 -0
- package/lib/client/components/QaAuthGate.js.map +1 -0
- package/lib/client/components/QaChangelog.js +112 -0
- package/lib/client/components/QaChangelog.js.map +1 -0
- package/lib/client/components/QaComposer.js +132 -15
- package/lib/client/components/QaComposer.js.map +1 -1
- package/lib/client/components/QaMessage.js +214 -10
- package/lib/client/components/QaMessage.js.map +1 -1
- package/lib/client/components/QaSidebar.js +167 -0
- package/lib/client/components/QaSidebar.js.map +1 -0
- package/lib/client/components/QaSourcesDrawer.js +127 -0
- package/lib/client/components/QaSourcesDrawer.js.map +1 -0
- package/lib/client/components/QaTurnRail.js +281 -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 +142 -0
- package/lib/client/components/QaWidthHandle.js.map +1 -0
- package/lib/client/components/QaWorkGroup.js +135 -0
- package/lib/client/components/QaWorkGroup.js.map +1 -0
- package/lib/client/components/VariantSwitcher.js +29 -0
- package/lib/client/components/VariantSwitcher.js.map +1 -0
- package/lib/client/components/format.js +48 -0
- package/lib/client/components/format.js.map +1 -0
- package/lib/client/components/source-refs.js +78 -0
- package/lib/client/components/source-refs.js.map +1 -0
- package/lib/client/create-session.js +51 -0
- package/lib/client/create-session.js.map +1 -0
- package/lib/client/index.js +166 -35
- 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/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/settlement.js +24 -0
- package/lib/client/settlement.js.map +1 -0
- package/lib/client/styles.js +450 -43
- 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 +15 -0
- package/lib/client/types.js.map +1 -0
- package/lib/client/use-session-ui-state.js +68 -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/wait-for.js +49 -0
- package/lib/client/wait-for.js.map +1 -0
- package/lib/client.js +12551 -918
- package/lib/client.js.map +1 -1
- package/lib/config.js +226 -58
- package/lib/config.js.map +1 -1
- package/lib/entry-redirect.js +44 -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 +354 -72
- package/lib/index.js.map +1 -1
- package/lib/launch-token.js +42 -0
- package/lib/launch-token.js.map +1 -0
- package/lib/lockdown-policy.js +20 -0
- package/lib/lockdown-policy.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 +283 -10
- package/lib/resolve-config.js.map +1 -1
- package/lib/secure-session.js +212 -0
- package/lib/secure-session.js.map +1 -0
- package/lib/typert.host.d.ts +3 -0
- package/lib/typert.host.js +784 -0
- package/lib/typert.remote-client.d.ts +40 -0
- package/lib/typert.remote-client.js +597 -0
- package/lib/types/accounts/index.d.ts +2 -0
- package/lib/types/accounts/store.d.ts +121 -0
- package/lib/types/attestation.d.ts +17 -0
- package/lib/types/cli.d.ts +9 -0
- package/lib/types/client/QaAccountsController.d.ts +95 -0
- package/lib/types/client/QaConfigController.d.ts +35 -3
- package/lib/types/client/QaSessionController.d.ts +146 -20
- package/lib/types/client/QaSurface.d.ts +11 -5
- package/lib/types/client/QaTranscriptAdapter.d.ts +13 -3
- package/lib/types/client/attestation.d.ts +25 -0
- package/lib/types/client/chat-index.d.ts +28 -0
- package/lib/types/client/components/Markdown.d.ts +17 -3
- package/lib/types/client/components/QaAgentsDrawer.d.ts +25 -0
- 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 +12 -2
- package/lib/types/client/components/QaMessage.d.ts +22 -2
- package/lib/types/client/components/QaSidebar.d.ts +69 -0
- package/lib/types/client/components/QaSourcesDrawer.d.ts +20 -0
- package/lib/types/client/components/QaTurnRail.d.ts +59 -0
- package/lib/types/client/components/QaWelcomeNotice.d.ts +27 -0
- package/lib/types/client/components/QaWidthHandle.d.ts +36 -0
- package/lib/types/client/components/QaWorkGroup.d.ts +19 -0
- package/lib/types/client/components/VariantSwitcher.d.ts +19 -0
- package/lib/types/client/components/format.d.ts +9 -0
- package/lib/types/client/components/source-refs.d.ts +16 -0
- package/lib/types/client/create-session.d.ts +16 -0
- package/lib/types/client/index.d.ts +2 -5
- package/lib/types/client/project-session-state.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/settlement.d.ts +6 -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 +93 -0
- package/lib/types/client/use-session-ui-state.d.ts +35 -0
- package/lib/types/client/use-transcript-view.d.ts +20 -0
- package/lib/types/client/wait-for.d.ts +11 -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 +67 -7
- package/lib/types/launch-token.d.ts +21 -0
- package/lib/types/lockdown-policy.d.ts +18 -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/secure-session.d.ts +31 -0
- package/lib/types/types.d.ts +304 -1
- package/package.json +70 -27
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { SessionSummary } from "@deepseek-ai/dsh-api-session-controller/client";
|
|
2
|
+
/** One row of the agents panel: a subagent session of the open chat. */
|
|
3
|
+
export interface QaSubagentRow {
|
|
4
|
+
readonly id: string;
|
|
5
|
+
readonly title: string;
|
|
6
|
+
readonly running: boolean;
|
|
7
|
+
readonly completed: boolean;
|
|
8
|
+
readonly meta: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Direct subagent children of the open chat, running first. Reads the host
|
|
12
|
+
* session list's lineage (parentId + origin), so no extra subscription beyond
|
|
13
|
+
* the list the surface already follows.
|
|
14
|
+
*/
|
|
15
|
+
export declare function collectSubagents(byId: Readonly<Record<string, SessionSummary>>, rootId: string | null, now?: number): readonly QaSubagentRow[];
|
|
16
|
+
export interface QaAgentsDrawerProps {
|
|
17
|
+
readonly agents: readonly QaSubagentRow[];
|
|
18
|
+
/** The subagent currently watched, if any. */
|
|
19
|
+
readonly activeId: string | null;
|
|
20
|
+
readonly onView: (id: string, title: string) => void;
|
|
21
|
+
readonly onClose: () => void;
|
|
22
|
+
}
|
|
23
|
+
/** Right-hand panel listing the chat's subagents. */
|
|
24
|
+
export declare function QaAgentsDrawer({ agents, activeId, onView, onClose, }: QaAgentsDrawerProps): import("react/jsx-runtime").JSX.Element;
|
|
25
|
+
//# sourceMappingURL=QaAgentsDrawer.d.ts.map
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { QaAccountsController, QaAccountsSnapshot } from "../QaAccountsController.js";
|
|
2
|
+
export interface QaAuthGateProps {
|
|
3
|
+
readonly accounts: QaAccountsController;
|
|
4
|
+
readonly snapshot: QaAccountsSnapshot;
|
|
5
|
+
readonly title: string;
|
|
6
|
+
readonly logoUrl: string | null;
|
|
7
|
+
readonly allowRegistration: boolean;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* The full-frame login/registration card shown instead of the chat while the
|
|
11
|
+
* deployment has accounts enabled and the browser holds no valid identity.
|
|
12
|
+
* Errors are the Host's coarse codes rendered as audience-safe copy.
|
|
13
|
+
*/
|
|
14
|
+
export declare function QaAuthGate(props: QaAuthGateProps): import("react/jsx-runtime").JSX.Element;
|
|
15
|
+
//# sourceMappingURL=QaAuthGate.d.ts.map
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export declare const QA_VERSION: string;
|
|
2
|
+
export interface QaChangelogEntry {
|
|
3
|
+
readonly version: string;
|
|
4
|
+
readonly date: string;
|
|
5
|
+
readonly sections: readonly {
|
|
6
|
+
readonly title: string;
|
|
7
|
+
readonly items: readonly string[];
|
|
8
|
+
}[];
|
|
9
|
+
}
|
|
10
|
+
export declare const QA_CHANGELOG: readonly QaChangelogEntry[];
|
|
11
|
+
/** Props of the {@link QaChangelogModal} dialog. */
|
|
12
|
+
export interface QaChangelogModalProps {
|
|
13
|
+
readonly open: boolean;
|
|
14
|
+
readonly onClose: () => void;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* The version/changelog dialog opened from the sidebar footer. Rendering is
|
|
18
|
+
* a no-op while closed; Escape and a backdrop click close it.
|
|
19
|
+
*/
|
|
20
|
+
export declare function QaChangelogModal(props: QaChangelogModalProps): import("react/jsx-runtime").JSX.Element | null;
|
|
21
|
+
//# sourceMappingURL=QaChangelog.d.ts.map
|
|
@@ -1,11 +1,21 @@
|
|
|
1
|
+
import type { QaImageDraft } from "../../types.js";
|
|
1
2
|
export interface QaComposerProps {
|
|
2
3
|
readonly placeholder: string;
|
|
4
|
+
readonly quickQuestions?: readonly string[];
|
|
3
5
|
readonly canSend: boolean;
|
|
4
6
|
readonly canStop: boolean;
|
|
5
7
|
readonly running: boolean;
|
|
6
8
|
readonly showStop: boolean;
|
|
7
|
-
readonly
|
|
9
|
+
readonly status: string | null;
|
|
10
|
+
readonly images: readonly QaImageDraft[];
|
|
11
|
+
readonly onImagesChange: (images: readonly QaImageDraft[]) => void;
|
|
12
|
+
readonly onSend: (text: string, images: readonly QaImageDraft[]) => Promise<boolean>;
|
|
8
13
|
readonly onStop: () => Promise<void>;
|
|
9
14
|
}
|
|
10
|
-
|
|
15
|
+
/**
|
|
16
|
+
* Memoized with the default shallow compare: every prop is a scalar, a
|
|
17
|
+
* stable array or a stable callback, so a stream of transcript frames never
|
|
18
|
+
* re-renders the composer and typing stays responsive while an answer runs.
|
|
19
|
+
*/
|
|
20
|
+
export declare const QaComposer: import("react").MemoExoticComponent<(props: QaComposerProps) => import("react/jsx-runtime").JSX.Element>;
|
|
11
21
|
//# sourceMappingURL=QaComposer.d.ts.map
|
|
@@ -1,8 +1,28 @@
|
|
|
1
|
-
import type { QaMessage as QaMessageModel } from "../../types.js";
|
|
1
|
+
import type { QaMessage as QaMessageModel, QaSource, QaTurnSources } from "../../types.js";
|
|
2
2
|
export interface QaMessageProps {
|
|
3
3
|
readonly message: QaMessageModel;
|
|
4
4
|
readonly renderMarkdown: boolean;
|
|
5
5
|
readonly showTimestamp: boolean;
|
|
6
|
+
/**
|
|
7
|
+
* Storage prefix persisted message ratings live under. Callers scope it to
|
|
8
|
+
* the chat: message ids repeat across chats (`assistant:<seq>`).
|
|
9
|
+
*/
|
|
10
|
+
readonly stateKey?: string;
|
|
11
|
+
/** Ask for a fresh variant of this answer; omit to hide the control. */
|
|
12
|
+
readonly onRegenerate?: () => void;
|
|
13
|
+
/** Resolve one durable attachment into a viewable URL. */
|
|
14
|
+
readonly resolveImage?: (attachmentId: string) => Promise<string>;
|
|
15
|
+
/** Open the drawer at the exact canonical snapshot shown in this footer. */
|
|
16
|
+
readonly onOpenSources?: (sources: readonly QaSource[], complete: boolean, incompleteOrigins: QaTurnSources["incompleteOrigins"]) => void;
|
|
17
|
+
/** Open one path-backed source's detail (an inline footnote click). */
|
|
18
|
+
readonly onSourceDetail?: (source: QaSource) => void;
|
|
6
19
|
}
|
|
7
|
-
|
|
20
|
+
/**
|
|
21
|
+
* Whether two transcript messages render identically. The transcript
|
|
22
|
+
* projection rebuilds every message object on each published frame, so the
|
|
23
|
+
* memoized row compares rendered content instead of references; string
|
|
24
|
+
* comparison is by value, which keeps fresh copies cheap to recognize.
|
|
25
|
+
*/
|
|
26
|
+
export declare function sameMessage(a: QaMessageModel, b: QaMessageModel): boolean;
|
|
27
|
+
export declare const QaMessage: import("react").MemoExoticComponent<({ message, renderMarkdown, showTimestamp, stateKey, onRegenerate, resolveImage, onOpenSources, onSourceDetail, }: QaMessageProps) => import("react/jsx-runtime").JSX.Element>;
|
|
8
28
|
//# sourceMappingURL=QaMessage.d.ts.map
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { SessionSummary } from "@deepseek-ai/dsh-api-session-controller/client";
|
|
2
|
+
/** One renderable row of the chat-history sidebar. */
|
|
3
|
+
export interface QaChatRow {
|
|
4
|
+
readonly id: string;
|
|
5
|
+
readonly title: string;
|
|
6
|
+
readonly running: boolean;
|
|
7
|
+
readonly active: boolean;
|
|
8
|
+
readonly meta: string;
|
|
9
|
+
readonly updatedAt: number;
|
|
10
|
+
/** Chat owner's display name; present in the admin ownership view only. */
|
|
11
|
+
readonly ownerName?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Project this browser's indexed chat ids onto the host session list, most
|
|
15
|
+
* recently updated first. Opening a chat is not an update: only the host's
|
|
16
|
+
* `updatedAt` (fresh messages) orders the list. Ids the host no longer lists
|
|
17
|
+
* are skipped (the controller prunes them on switch).
|
|
18
|
+
*/
|
|
19
|
+
export declare function buildChatRows(chatIds: readonly string[], byId: Readonly<Record<string, SessionSummary>>, activeId: string | null, ownerNameOf?: (sessionId: string) => string | undefined, now?: number): readonly QaChatRow[];
|
|
20
|
+
/** One per-owner section of the admin sidebar grouping. */
|
|
21
|
+
export interface QaSidebarSection {
|
|
22
|
+
/**
|
|
23
|
+
* Section header; chats nobody claimed group under "Без владельца". An
|
|
24
|
+
* empty name renders no header (the flat, non-grouped mode).
|
|
25
|
+
*/
|
|
26
|
+
readonly name: string;
|
|
27
|
+
readonly rows: readonly QaChatRow[];
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Group rows into per-owner sections for the admin view. Sections order by
|
|
31
|
+
* their freshest row so the busiest users float up; unclaimed chats go last.
|
|
32
|
+
* Row order inside a section is already the global updatedAt order.
|
|
33
|
+
*/
|
|
34
|
+
export declare function buildOwnerSections(rows: readonly QaChatRow[]): readonly QaSidebarSection[];
|
|
35
|
+
export interface QaSidebarProps {
|
|
36
|
+
readonly rows: readonly QaChatRow[];
|
|
37
|
+
/**
|
|
38
|
+
* Render per-owner sections instead of the flat list; the admin ownership
|
|
39
|
+
* view. Rows without an owner name fall into a trailing section.
|
|
40
|
+
*/
|
|
41
|
+
readonly groupByOwner?: boolean;
|
|
42
|
+
/** Deployment brand shown next to the logo (also while collapsed). */
|
|
43
|
+
readonly title: string;
|
|
44
|
+
/** Optional image logo; a built-in mark is drawn when null. */
|
|
45
|
+
readonly logoUrl: string | null;
|
|
46
|
+
/** Storage prefix used to remember the collapsed state across reloads. */
|
|
47
|
+
readonly stateKey: string;
|
|
48
|
+
readonly showNewChat: boolean;
|
|
49
|
+
readonly busy: boolean;
|
|
50
|
+
readonly onSwitch: (sessionId: string) => void;
|
|
51
|
+
readonly onNewChat: () => void;
|
|
52
|
+
/** Removes a chat from this browser's index; omit to hide the control. */
|
|
53
|
+
readonly onDelete?: (sessionId: string) => void;
|
|
54
|
+
/** The signed-in account; omit when accounts are disabled. */
|
|
55
|
+
readonly account?: {
|
|
56
|
+
readonly email: string;
|
|
57
|
+
readonly role: string;
|
|
58
|
+
readonly onLogout: () => void;
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Whether two sidebar row lists show the same thing. Rows are rebuilt on
|
|
63
|
+
* every surface render (relative timestamps drift), so the memoized sidebar
|
|
64
|
+
* compares by content and skips frames that only move the transcript.
|
|
65
|
+
*/
|
|
66
|
+
export declare function sameChatRows(a: readonly QaChatRow[], b: readonly QaChatRow[]): boolean;
|
|
67
|
+
/** The per-browser chat history shown beside the QA conversation. */
|
|
68
|
+
export declare const QaSidebar: import("react").MemoExoticComponent<(props: QaSidebarProps) => import("react/jsx-runtime").JSX.Element>;
|
|
69
|
+
//# sourceMappingURL=QaSidebar.d.ts.map
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { QaSource, QaTurnSources, ResolvedQaSurfaceConfig } from "../../types.js";
|
|
2
|
+
import type { QaBoundSourceApi } from "../types.js";
|
|
3
|
+
export declare function SourceIcon({ kind }: {
|
|
4
|
+
readonly kind: QaSource["kind"];
|
|
5
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
6
|
+
export interface QaSourcesDrawerProps {
|
|
7
|
+
readonly sources: readonly QaSource[];
|
|
8
|
+
readonly complete: boolean;
|
|
9
|
+
readonly incompleteOrigins?: QaTurnSources["incompleteOrigins"];
|
|
10
|
+
readonly sessionId: string | null;
|
|
11
|
+
readonly sourceApi: QaBoundSourceApi;
|
|
12
|
+
readonly display: ResolvedQaSurfaceConfig["sources"]["display"];
|
|
13
|
+
readonly filePreview: ResolvedQaSurfaceConfig["sources"]["filePreview"];
|
|
14
|
+
/** Open straight onto this source's detail (an inline footnote click). */
|
|
15
|
+
readonly initialDetail?: QaSource | null;
|
|
16
|
+
readonly onClose: () => void;
|
|
17
|
+
}
|
|
18
|
+
/** Canonical grouped source panel and safe local-file preview. */
|
|
19
|
+
export declare function QaSourcesDrawer({ sources, complete, incompleteOrigins, sessionId, sourceApi, display, filePreview, initialDetail, onClose, }: QaSourcesDrawerProps): import("react/jsx-runtime").JSX.Element;
|
|
20
|
+
//# sourceMappingURL=QaSourcesDrawer.d.ts.map
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { type RefObject } from "react";
|
|
2
|
+
import type { QaMessage } from "../../types.js";
|
|
3
|
+
/**
|
|
4
|
+
* One mark of the turn rail: the user prompt that opens the turn, a bounded
|
|
5
|
+
* answer preview for the hover tooltip, and the message id that anchors the
|
|
6
|
+
* jump (the prompt's message slot in the transcript).
|
|
7
|
+
*/
|
|
8
|
+
export interface QaTurnRailItem {
|
|
9
|
+
/** 1-based position in the visible transcript; also the React key. */
|
|
10
|
+
readonly turn: number;
|
|
11
|
+
/** The user message id that opens the turn (scroll anchor). */
|
|
12
|
+
readonly id: string;
|
|
13
|
+
readonly prompt: string;
|
|
14
|
+
readonly response: string;
|
|
15
|
+
}
|
|
16
|
+
/** Transcript attribute marking the message slot that opens a turn. */
|
|
17
|
+
export declare const QA_TURN_ANCHOR_ATTRIBUTE = "data-dsh-qa-turn-anchor";
|
|
18
|
+
/** Scroll distance from the floor at which the rail still calls it "at bottom". */
|
|
19
|
+
export declare const QA_TURN_FOLLOW_PX = 96;
|
|
20
|
+
/** The reading line: reading offset from the scrollport top while scrolling. */
|
|
21
|
+
export declare const QA_TURN_READING_PX = 96;
|
|
22
|
+
/**
|
|
23
|
+
* Rail ladder of the visible transcript: every user prompt opens a turn, the
|
|
24
|
+
* first non-empty answer after it fills the response preview. Hidden variant
|
|
25
|
+
* answers never reach this list because callers pass the already-filtered
|
|
26
|
+
* messages.
|
|
27
|
+
*/
|
|
28
|
+
export declare function buildTurnRailItems(messages: readonly QaMessage[]): readonly QaTurnRailItem[];
|
|
29
|
+
/** Deep equality guard so the memoized rail skips streaming commits. */
|
|
30
|
+
export declare function sameTurnRailItems(left: readonly QaTurnRailItem[], right: readonly QaTurnRailItem[]): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Turn owning the transcript's reading line, or the newest one while the
|
|
33
|
+
* reader follows the live tail. Anchors above the line are scanned in flow
|
|
34
|
+
* order; the last one at or above it owns the mark.
|
|
35
|
+
*/
|
|
36
|
+
export declare function computeActiveTurn(scroller: HTMLElement, items: readonly QaTurnRailItem[]): number | null;
|
|
37
|
+
export interface QaTurnRailProps {
|
|
38
|
+
readonly items: readonly QaTurnRailItem[];
|
|
39
|
+
readonly activeTurn: number | null;
|
|
40
|
+
/** Turn still generating; its mark pulses. */
|
|
41
|
+
readonly busyTurn: number | null;
|
|
42
|
+
/** The transcript scroller the rail floats over and measures its band from. */
|
|
43
|
+
readonly scrollerRef: RefObject<HTMLDivElement | null>;
|
|
44
|
+
readonly onNavigate: (item: QaTurnRailItem) => void;
|
|
45
|
+
}
|
|
46
|
+
declare function QaTurnRailView({ items, activeTurn, busyTurn, scrollerRef, onNavigate, }: QaTurnRailProps): import("react/jsx-runtime").JSX.Element | null;
|
|
47
|
+
/**
|
|
48
|
+
* Fixed-pitch rail of every turn of the visible transcript, floating over the
|
|
49
|
+
* transcript's right gutter: the active mark follows the reading line, a
|
|
50
|
+
* hover/focus preview shows the prompt and answer, and a click lands the
|
|
51
|
+
* transcript on that turn. Memoized like the harness rail — the transcript
|
|
52
|
+
* re-renders on every streaming delta, and the rail only changes when a turn
|
|
53
|
+
* is added or becomes active.
|
|
54
|
+
*/
|
|
55
|
+
export declare const QaTurnRail: import("react").MemoExoticComponent<typeof QaTurnRailView>;
|
|
56
|
+
/** Land the transcript on a turn's prompt row, harness-style. */
|
|
57
|
+
export declare function turnScrollTarget(scroller: HTMLElement, row: HTMLElement): number;
|
|
58
|
+
export {};
|
|
59
|
+
//# sourceMappingURL=QaTurnRail.d.ts.map
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { SettingsOnboardingOwnerProps } from "@deepseek-ai/dsh-client-ui-settings/client";
|
|
2
|
+
import type { StorageLike } from "../types.js";
|
|
3
|
+
/** Bump when the notice changes materially and must be acknowledged again. */
|
|
4
|
+
export declare const QA_WELCOME_NOTICE_VERSION = "2026-09-12.1";
|
|
5
|
+
export declare const QA_WELCOME_NOTICE_COPY: Readonly<{
|
|
6
|
+
title: "Перед началом тестирования";
|
|
7
|
+
paragraphs: readonly string[];
|
|
8
|
+
continueLabel: "Понятно, продолжить";
|
|
9
|
+
}>;
|
|
10
|
+
export interface QaWelcomeNoticeFace {
|
|
11
|
+
readonly storage: StorageLike;
|
|
12
|
+
readonly storageKey: string;
|
|
13
|
+
}
|
|
14
|
+
export interface QaWelcomeNoticeProps extends QaWelcomeNoticeFace {
|
|
15
|
+
readonly complete?: () => void;
|
|
16
|
+
}
|
|
17
|
+
export interface QaWelcomeNoticeStepProps extends SettingsOnboardingOwnerProps, QaWelcomeNoticeFace {
|
|
18
|
+
}
|
|
19
|
+
/** Route-scoped replacement for DSH's stock `welcome-notice` onboarding step. */
|
|
20
|
+
export declare function QaWelcomeNotice(props: QaWelcomeNoticeProps): import("react").ReactPortal | null;
|
|
21
|
+
/**
|
|
22
|
+
* Invisible shadow for DSH's stock welcome step. The host coordinator removes
|
|
23
|
+
* onboarding content as soon as a chat stops being blank, so the visible QA
|
|
24
|
+
* notice is owned by the route overlay above instead of this lifecycle.
|
|
25
|
+
*/
|
|
26
|
+
export declare function QaWelcomeNoticeStep(props: QaWelcomeNoticeStepProps): null;
|
|
27
|
+
//# sourceMappingURL=QaWelcomeNotice.d.ts.map
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { type RefObject } from "react";
|
|
2
|
+
/** DSH's dragged content-width floor; a lower operator cap still wins. */
|
|
3
|
+
export declare const QA_CONTENT_MIN_WIDTH = 640;
|
|
4
|
+
/**
|
|
5
|
+
* Space kept outside the content: 88px per side leaves room for the handle,
|
|
6
|
+
* its inset, and a safe zone that remains draggable in both directions.
|
|
7
|
+
*/
|
|
8
|
+
export declare const QA_CONTENT_EDGE_BUDGET = 176;
|
|
9
|
+
export declare function readQaContentWidth(storage: Pick<Storage, "getItem">, key: string): number | null;
|
|
10
|
+
export declare function writeQaContentWidth(storage: Pick<Storage, "setItem">, key: string, width: number): void;
|
|
11
|
+
/** Resolve the centered content width for the currently available column. */
|
|
12
|
+
export declare function resolveQaContentWidth(columnWidth: number, preference: number | null, maxContentWidth: number): number;
|
|
13
|
+
interface QaWidthHandleProps {
|
|
14
|
+
readonly side: "left" | "right";
|
|
15
|
+
readonly onStart: () => number;
|
|
16
|
+
readonly onDrag: (width: number) => void;
|
|
17
|
+
readonly onCommit: (width: number) => void;
|
|
18
|
+
readonly onEnd: () => void;
|
|
19
|
+
}
|
|
20
|
+
/** Pointer-captured, rAF-throttled symmetric content-width handle. */
|
|
21
|
+
export declare function QaWidthHandle(props: QaWidthHandleProps): import("react/jsx-runtime").JSX.Element;
|
|
22
|
+
interface UseQaContentWidthOptions {
|
|
23
|
+
readonly active: boolean;
|
|
24
|
+
readonly root: RefObject<HTMLDivElement | null>;
|
|
25
|
+
readonly storage: Pick<Storage, "getItem" | "setItem">;
|
|
26
|
+
readonly storageKey: string;
|
|
27
|
+
readonly maxContentWidth: number;
|
|
28
|
+
}
|
|
29
|
+
export declare function useQaContentWidth({ active, root, storage, storageKey, maxContentWidth, }: UseQaContentWidthOptions): {
|
|
30
|
+
readonly onStart: () => number;
|
|
31
|
+
readonly onDrag: (requestedWidth: number) => void;
|
|
32
|
+
readonly onCommit: (requestedWidth: number) => void;
|
|
33
|
+
readonly onEnd: () => void;
|
|
34
|
+
};
|
|
35
|
+
export {};
|
|
36
|
+
//# sourceMappingURL=QaWidthHandle.d.ts.map
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { QaWorkItem } from "../../types.js";
|
|
2
|
+
export interface QaWorkGroupProps {
|
|
3
|
+
readonly status: "running" | "complete";
|
|
4
|
+
readonly startedAt?: number;
|
|
5
|
+
readonly endedAt?: number;
|
|
6
|
+
readonly items: readonly QaWorkItem[];
|
|
7
|
+
readonly renderMarkdown: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare const THINKING_PHRASES: readonly string[];
|
|
10
|
+
/**
|
|
11
|
+
* Whether two work items render identically. The transcript projection
|
|
12
|
+
* rebuilds every item object on each published frame, so memoized work rows
|
|
13
|
+
* compare by rendered content instead of by reference.
|
|
14
|
+
*/
|
|
15
|
+
export declare function sameWorkItem(a: QaWorkItem, b: QaWorkItem): boolean;
|
|
16
|
+
/** Whether two work item lists render identically, item for item. */
|
|
17
|
+
export declare function sameWorkItems(a: readonly QaWorkItem[], b: readonly QaWorkItem[]): boolean;
|
|
18
|
+
export declare const QaWorkGroup: import("react").MemoExoticComponent<({ status, startedAt, endedAt, items, renderMarkdown, }: QaWorkGroupProps) => import("react/jsx-runtime").JSX.Element>;
|
|
19
|
+
//# sourceMappingURL=QaWorkGroup.d.ts.map
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { QaMessage } from "../../types.js";
|
|
2
|
+
export interface QaVariantGroup {
|
|
3
|
+
/** The user message that anchors the group. */
|
|
4
|
+
readonly groupId: string;
|
|
5
|
+
/** Answer turns triggered by that message, in order. */
|
|
6
|
+
readonly turns: readonly number[];
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Group answer turns under the user message that triggered them. The session
|
|
10
|
+
* has no truncation seam, so a regenerated answer is a real follow-up turn;
|
|
11
|
+
* consecutive turns after one user message read as its variants.
|
|
12
|
+
*/
|
|
13
|
+
export declare function collectVariantGroups(messages: readonly QaMessage[]): readonly QaVariantGroup[];
|
|
14
|
+
export declare function VariantSwitcher({ count, offset, onStep, }: {
|
|
15
|
+
readonly count: number;
|
|
16
|
+
readonly offset: number;
|
|
17
|
+
readonly onStep: (offset: number) => void;
|
|
18
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
19
|
+
//# sourceMappingURL=VariantSwitcher.d.ts.map
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Shared time formatting for the QA surface UI. */
|
|
2
|
+
/** `только что`, `5 мин`, `3 ч`, `2 дн` or a ru-RU date past the week. */
|
|
3
|
+
export declare function relativeTime(timestamp: number, now: number): string;
|
|
4
|
+
/** `9 сент 15:44` - compact ru-RU day/month plus time. */
|
|
5
|
+
export declare function formatDayTime(timestamp: number): string;
|
|
6
|
+
/** `1,1 с` below ten seconds, `8 с` above. */
|
|
7
|
+
export declare function formatSeconds(ms: number): string;
|
|
8
|
+
export declare function formatWorkDuration(durationMs: number): string;
|
|
9
|
+
//# sourceMappingURL=format.d.ts.map
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { QaSource } from "../../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Match layer between assistant text and the canonical turn sources: markdown
|
|
4
|
+
* links resolve by normalized URL, inline-code tokens by file path. A token
|
|
5
|
+
* that matches nothing keeps its plain rendering — the surface never guesses.
|
|
6
|
+
*/
|
|
7
|
+
export interface QaSourceRefs {
|
|
8
|
+
/** Identity of the source set; memo comparators compare this. */
|
|
9
|
+
readonly signature: string;
|
|
10
|
+
resolveUrl(url: string): QaSource | undefined;
|
|
11
|
+
resolvePath(token: string): QaSource | undefined;
|
|
12
|
+
}
|
|
13
|
+
/** Display name for a file-backed source: the file name alone, case kept. */
|
|
14
|
+
export declare function sourceFileName(source: QaSource): string;
|
|
15
|
+
export declare function buildSourceRefs(sources: readonly QaSource[]): QaSourceRefs;
|
|
16
|
+
//# sourceMappingURL=source-refs.d.ts.map
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ResolvedQaSurfaceConfig } from "../types.js";
|
|
2
|
+
import type { QaSessions, QaSessionsApi } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Create one Host session and pin the configured preset and model onto the
|
|
5
|
+
* still-blank session. The creation wire takes no preset, so
|
|
6
|
+
* agentPresets/select recomposes the agent and durably logs
|
|
7
|
+
* `agent-preset/selected`, which the client projection replays. The session
|
|
8
|
+
* is addressed only here — no prompt can run before the caller attests the
|
|
9
|
+
* composed preset.
|
|
10
|
+
*/
|
|
11
|
+
export declare function createQaSession(args: {
|
|
12
|
+
readonly sessions: QaSessions;
|
|
13
|
+
readonly api: QaSessionsApi;
|
|
14
|
+
readonly config: ResolvedQaSurfaceConfig;
|
|
15
|
+
}): Promise<string>;
|
|
16
|
+
//# sourceMappingURL=create-session.d.ts.map
|
|
@@ -1,18 +1,15 @@
|
|
|
1
1
|
import type { Context } from "@deepseek-ai/cordis";
|
|
2
2
|
import type { ConnectionHandle } from "@deepseek-ai/dsh-client-connection/client";
|
|
3
|
-
import type { ISessions } from "@deepseek-ai/dsh-client-runtime/client";
|
|
4
|
-
import type { SettingsScopeBinder } from "@deepseek-ai/dsh-client-ui-settings/client";
|
|
5
3
|
declare module "@deepseek-ai/cordis" {
|
|
6
4
|
interface Context {
|
|
7
5
|
connection: ConnectionHandle;
|
|
8
|
-
sessions: ISessions;
|
|
9
|
-
settingsScope: SettingsScopeBinder;
|
|
10
6
|
}
|
|
11
7
|
}
|
|
12
8
|
export declare const inject: string[];
|
|
13
9
|
/** Register the route-aware, full-frame QA entry in the additive overlay slot. */
|
|
14
|
-
export declare function apply(ctx: Context): void
|
|
10
|
+
export declare function apply(ctx: Context): Promise<() => Promise<void>>;
|
|
15
11
|
export { QaConfigController } from "./QaConfigController.js";
|
|
12
|
+
export { QaAccountsController } from "./QaAccountsController.js";
|
|
16
13
|
export { QaRouteController, matchesQaRoute } from "./QaRouteController.js";
|
|
17
14
|
export { QaSessionController } from "./QaSessionController.js";
|
|
18
15
|
export { projectTranscript } from "./QaTranscriptAdapter.js";
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { SessionFace } from "@deepseek-ai/dsh-api-session-controller/client";
|
|
2
|
+
import type { ConversationSnapshot } from "@deepseek-ai/dsh-client-ui-conversation/client";
|
|
3
|
+
import type { QaSessionState, QaSubagentView, QaTurnSources, ResolvedQaSurfaceConfig } from "../types.js";
|
|
4
|
+
/** Everything the bound-chat projection reads; the computation is pure. */
|
|
5
|
+
export interface QaBoundProjectionInput {
|
|
6
|
+
readonly connected: boolean;
|
|
7
|
+
readonly sessionId: string;
|
|
8
|
+
readonly sessionSnapshot: ReturnType<SessionFace["getSnapshot"]>;
|
|
9
|
+
readonly conversationSnapshot: ConversationSnapshot | undefined;
|
|
10
|
+
/** Turn bundles with the Host provenance already merged in (Host wins). */
|
|
11
|
+
readonly sourceBundles: readonly QaTurnSources[];
|
|
12
|
+
readonly operationError: string | null;
|
|
13
|
+
readonly policyReady: boolean;
|
|
14
|
+
readonly admissionPending: boolean;
|
|
15
|
+
readonly chatsRevision: number;
|
|
16
|
+
readonly viewingSubagent: QaSubagentView | null;
|
|
17
|
+
readonly config: ResolvedQaSurfaceConfig;
|
|
18
|
+
/**
|
|
19
|
+
* The chat owner's display name for author labels; present only when an
|
|
20
|
+
* admin reads a foreign chat (chat-level, not per-message).
|
|
21
|
+
*/
|
|
22
|
+
readonly author?: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Project one bound chat into the observable surface state: phase, transcript
|
|
26
|
+
* with per-turn sources, footer sources, and the composer's capabilities.
|
|
27
|
+
* Side effects (host-bundle refresh, notifications) live in the controller.
|
|
28
|
+
*/
|
|
29
|
+
export declare function projectBoundSessionState(input: QaBoundProjectionInput): QaSessionState;
|
|
30
|
+
//# sourceMappingURL=project-session-state.d.ts.map
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { QaSecureSession } from "./types.js";
|
|
2
|
+
import type { ResolvedQaSurfaceConfig } from "../types.js";
|
|
3
|
+
export type QaAttestationOutcome = {
|
|
4
|
+
readonly ok: true;
|
|
5
|
+
} | {
|
|
6
|
+
readonly ok: false;
|
|
7
|
+
/** The identity is absent or expired; the caller returns to the gate. */
|
|
8
|
+
readonly authRequired: boolean;
|
|
9
|
+
readonly reason: string | null;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* One send-time policy attestation against the Host admission gate. The
|
|
13
|
+
* QA-facing message stays generic by design; the coarse reason plus an
|
|
14
|
+
* operator hint go to the console once per refusal.
|
|
15
|
+
*/
|
|
16
|
+
export declare function attestQaPolicy(args: {
|
|
17
|
+
readonly secureSession: QaSecureSession;
|
|
18
|
+
readonly token: string;
|
|
19
|
+
readonly sessionId: string;
|
|
20
|
+
readonly lockdown: ResolvedQaSurfaceConfig["lockdown"];
|
|
21
|
+
readonly report: boolean;
|
|
22
|
+
}): Promise<QaAttestationOutcome>;
|
|
23
|
+
//# sourceMappingURL=session-admission.d.ts.map
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-chat cache of resolved attachment URLs. Attachment reads are
|
|
3
|
+
* session-scoped (the loader reads the bound session's durable store), and
|
|
4
|
+
* attachment ids are only unique within a chat, so both the cache and the
|
|
5
|
+
* blob lifetime are keyed by chat, not by the page.
|
|
6
|
+
*/
|
|
7
|
+
export declare class SessionAssetRepository {
|
|
8
|
+
private readonly bySession;
|
|
9
|
+
/** Resolve one attachment of one chat, deduplicating concurrent reads. */
|
|
10
|
+
resolve(sessionId: string, attachmentId: string, load: (attachmentId: string) => Promise<string>): Promise<string>;
|
|
11
|
+
/**
|
|
12
|
+
* Revoke the chat's blob URLs and drop its cache. Data URLs need no
|
|
13
|
+
* revocation; a failed resolution never produced a URL at all.
|
|
14
|
+
*/
|
|
15
|
+
release(sessionId: string): void;
|
|
16
|
+
dispose(): void;
|
|
17
|
+
}
|
|
18
|
+
/** Revoke one blob URL; data URLs (and other runtimes) need nothing. */
|
|
19
|
+
export declare function revokeObjectUrlIfBlob(url: string): void;
|
|
20
|
+
//# sourceMappingURL=session-assets.d.ts.map
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { QaTurnSources } from "../types.js";
|
|
2
|
+
import type { QaSourceApi } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Host-side provenance of the bound chat. The client projects turn sources
|
|
5
|
+
* from durable conversation events; the Host bundle (which also carries
|
|
6
|
+
* subagent-inherited evidence) is fetched on the side and merged by turn,
|
|
7
|
+
* Host data winning over the projection.
|
|
8
|
+
*/
|
|
9
|
+
export declare class QaHostSourceBridge {
|
|
10
|
+
private readonly sourceApi;
|
|
11
|
+
private readonly token;
|
|
12
|
+
private bundles;
|
|
13
|
+
private signature;
|
|
14
|
+
private refreshing;
|
|
15
|
+
/** Bumped on reset so a stale in-flight fetch never lands. */
|
|
16
|
+
private generation;
|
|
17
|
+
constructor(sourceApi: QaSourceApi, token: () => string);
|
|
18
|
+
/** Leave the chat: drop its bundles; merging degrades to the projection. */
|
|
19
|
+
reset(): void;
|
|
20
|
+
merge(projected: readonly QaTurnSources[]): readonly QaTurnSources[];
|
|
21
|
+
/**
|
|
22
|
+
* Fetch the Host bundles of one chat; a changed payload republishes through
|
|
23
|
+
* the callback. Repeated calls coalesce while one is in flight, and a
|
|
24
|
+
* response that outlives the chat is dropped.
|
|
25
|
+
*/
|
|
26
|
+
refresh(sessionId: string, onChanged: () => void): Promise<void>;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=session-sources.d.ts.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ToolResultNode } from "@deepseek-ai/dsh-client-ui-conversation/client";
|
|
2
|
+
import type { QaWorkItem } from "../types.js";
|
|
3
|
+
export declare function flattenToolOutput(node: ToolResultNode): string | null;
|
|
4
|
+
export declare function toolStatus(node: ToolResultNode): "ok" | "error" | "stopped";
|
|
5
|
+
export declare function workTool(callId: string, name: string, argsRaw: string, status: "running" | "ok" | "error" | "stopped", startedAt: number | undefined, endedAt: number | undefined, output: string | null): QaWorkItem;
|
|
6
|
+
//# sourceMappingURL=tool-presentation.d.ts.map
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ConversationSnapshot } from "@deepseek-ai/dsh-client-ui-conversation/client";
|
|
2
|
+
import type { LegacyConversationSlice } from "@deepseek-ai/dsh-client-ui-chat/client";
|
|
3
|
+
import type { QaSource, QaTurnSources } from "../types.js";
|
|
4
|
+
/** The transcript-bearing Chat slice of one Conversation snapshot (absent before the view activates). */
|
|
5
|
+
export declare function chatLegacyOf(snapshot: ConversationSnapshot | undefined): LegacyConversationSlice;
|
|
6
|
+
/**
|
|
7
|
+
* Rebuild canonical turn bundles from durable tool-result metadata. Since the
|
|
8
|
+
* metadata is persisted by DSH, this projection is identical on live updates
|
|
9
|
+
* and replay and requires no assistant-authored bibliography.
|
|
10
|
+
*/
|
|
11
|
+
export declare function projectTurnSources(snapshot: ConversationSnapshot | undefined, sessionId?: string, workspaceRoot?: string): readonly QaTurnSources[];
|
|
12
|
+
/** Visible evidence sources for the latest turn, shared by the drawer/footer. */
|
|
13
|
+
export declare function projectSources(snapshot: ConversationSnapshot | undefined, sessionId?: string, workspaceRoot?: string): readonly QaSource[];
|
|
14
|
+
//# sourceMappingURL=turn-sources.d.ts.map
|