@yadsh/dsh-qa-surface 0.15.2 → 0.15.4
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 +49 -8
- package/lib/access/model.js +15 -0
- package/lib/access/model.js.map +1 -1
- package/lib/access/service.js +56 -16
- package/lib/access/service.js.map +1 -1
- package/lib/approvals.js +42 -1
- package/lib/approvals.js.map +1 -1
- package/lib/client/QaSessionController.js +103 -3
- package/lib/client/QaSessionController.js.map +1 -1
- package/lib/client/QaSurface.js +6 -1
- package/lib/client/QaSurface.js.map +1 -1
- package/lib/client/QaTranscriptAdapter.js +33 -3
- package/lib/client/QaTranscriptAdapter.js.map +1 -1
- package/lib/client/components/QaChangelog.js +31 -0
- package/lib/client/components/QaChangelog.js.map +1 -1
- package/lib/client/components/QaComposer.js +3 -0
- package/lib/client/components/QaComposer.js.map +1 -1
- package/lib/client/components/QaHeader.js +29 -3
- package/lib/client/components/QaHeader.js.map +1 -1
- package/lib/client/components/QaRightRail.js +20 -1
- package/lib/client/components/QaRightRail.js.map +1 -1
- package/lib/client/components/QaSidebar.js +12 -2
- package/lib/client/components/QaSidebar.js.map +1 -1
- package/lib/client/components/QaSourcesPanel.js +1 -1
- package/lib/client/components/QaSourcesPanel.js.map +1 -1
- package/lib/client/components/QaWorkGroup.js +13 -7
- package/lib/client/components/QaWorkGroup.js.map +1 -1
- package/lib/client/components/QaWorkspaceBrowser.js +5 -1
- package/lib/client/components/QaWorkspaceBrowser.js.map +1 -1
- package/lib/client/settings/styles.js +16 -10
- package/lib/client/settings/styles.js.map +1 -1
- package/lib/client/slash/SlashPalette.js +3 -1
- package/lib/client/slash/SlashPalette.js.map +1 -1
- package/lib/client/styles.js +31 -15
- package/lib/client/styles.js.map +1 -1
- package/lib/client.js +343 -153
- package/lib/client.js.map +1 -1
- package/lib/enforcement/skill-policy.js +2 -1
- package/lib/enforcement/skill-policy.js.map +1 -1
- package/lib/index.js +11 -9
- package/lib/index.js.map +1 -1
- package/lib/qa-tools/file-delete-gate.js +35 -10
- package/lib/qa-tools/file-delete-gate.js.map +1 -1
- package/lib/qa-tools/file-delete.js +1 -1
- package/lib/qa-tools/file-delete.js.map +1 -1
- package/lib/slash/catalog.js.map +1 -1
- package/lib/typert.host.js +75 -75
- package/lib/typert.remote-client.js +75 -75
- package/lib/types/access/model.d.ts +13 -0
- package/lib/types/access/service.d.ts +26 -0
- package/lib/types/approvals.d.ts +18 -1
- package/lib/types/client/QaSessionController.d.ts +23 -0
- package/lib/types/client/components/QaHeader.d.ts +10 -1
- package/lib/types/client/components/QaRightRail.d.ts +7 -1
- package/lib/types/client/components/QaSidebar.d.ts +5 -0
- package/lib/types/client/components/QaWorkGroup.d.ts +5 -2
- package/lib/types/client/settings/styles.d.ts +6 -0
- package/lib/types/index.d.ts +6 -4
- package/lib/types/qa-tools/file-delete-gate.d.ts +24 -7
- package/lib/types/slash/catalog.d.ts +5 -0
- package/lib/types/types.d.ts +5 -2
- package/package.json +4 -4
|
@@ -64,6 +64,19 @@ export declare function withdrawnSkillNames(config: QaCapabilityConfig): Readonl
|
|
|
64
64
|
*/
|
|
65
65
|
export declare function personalUserSkillNames(config: QaCapabilityConfig, ownSkills: ReadonlySet<string> | undefined): readonly string[];
|
|
66
66
|
export declare function resolveCapabilityPolicy({ config, subroleId, systemTools, systemSkills, available: installed, skillMetadata, revision, }: ResolveCapabilityPolicyInput): QaEffectiveCapabilityPolicy;
|
|
67
|
+
/**
|
|
68
|
+
* The skills a person may invoke under one policy — the whole of the
|
|
69
|
+
* user-facing allow-list, and the one place it is read.
|
|
70
|
+
*
|
|
71
|
+
* An empty `userSkills` means the role keeps no separate user list, not that it
|
|
72
|
+
* grants nothing, so the model-facing set stands in for it. A typed gesture is
|
|
73
|
+
* admitted or refused by this list and the palette is narrowed by it, so both
|
|
74
|
+
* have to derive it here: a name the palette offers but the line refuses, or
|
|
75
|
+
* one the palette hides while the line would accept, is one rule read two ways.
|
|
76
|
+
*
|
|
77
|
+
* @param policy - the effective capability policy of one session.
|
|
78
|
+
*/
|
|
79
|
+
export declare function userInvocableSkillNames(policy: QaEffectiveCapabilityPolicy): readonly string[];
|
|
67
80
|
export interface ResolveSkillAccessInput {
|
|
68
81
|
readonly config: QaCapabilityConfig;
|
|
69
82
|
/** Every discovered skill with its normalized metadata. */
|
|
@@ -158,6 +158,32 @@ export declare class QaAccessService {
|
|
|
158
158
|
policyForSessionOwner(owner: {
|
|
159
159
|
readonly id: string;
|
|
160
160
|
} | undefined, sessionId: string, agent: Agent): Promise<QaResolvedSessionPolicy | undefined>;
|
|
161
|
+
/**
|
|
162
|
+
* The policy one session record answers with: the snapshot it froze, or the
|
|
163
|
+
* role as it is configured now when the chat has never frozen one.
|
|
164
|
+
*
|
|
165
|
+
* Every read of a session's capabilities goes through here, so a chat that is
|
|
166
|
+
* running and a chat nobody has woken cannot disagree about what its role
|
|
167
|
+
* grants.
|
|
168
|
+
*/
|
|
169
|
+
private policyForRecord;
|
|
170
|
+
/**
|
|
171
|
+
* The policy of a chat this process holds no live agent for.
|
|
172
|
+
*
|
|
173
|
+
* A cold chat has an owner and a role, and the reads that name its
|
|
174
|
+
* capabilities must narrow it by the rule above — the same one a live chat is
|
|
175
|
+
* narrowed by — rather than answer "no role opinion" because the agent that
|
|
176
|
+
* carries the capability snapshot happens to be asleep. What a cold chat has
|
|
177
|
+
* no answer for is that snapshot: the catalog the deployment mounts for every
|
|
178
|
+
* chat stands in for the agent's own, which is why the project layer of this
|
|
179
|
+
* chat's workspace is missing from it, and why nothing is frozen onto the
|
|
180
|
+
* session record here — a palette read must not decide what a later turn may
|
|
181
|
+
* do.
|
|
182
|
+
*
|
|
183
|
+
* @returns the resolved policy; the ownership check is the refusal, so a
|
|
184
|
+
* foreign browser never reaches it.
|
|
185
|
+
*/
|
|
186
|
+
policyForColdSession(token: string, sessionId: string): Promise<QaEffectiveCapabilityPolicy>;
|
|
161
187
|
/** The browser's entry point: the token resolves the owning account. */
|
|
162
188
|
policyForSession(token: string, sessionId: string, agent: Agent): Promise<QaResolvedSessionPolicy | undefined>;
|
|
163
189
|
/** Activation history of one session, for review and quality analysis. */
|
package/lib/types/approvals.d.ts
CHANGED
|
@@ -14,6 +14,15 @@ export interface QaApprovalExecution {
|
|
|
14
14
|
readonly agent?: Agent;
|
|
15
15
|
readonly signal?: AbortSignal;
|
|
16
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* How long a parked request may hold a turn before it is failed closed. The
|
|
19
|
+
* request is a question to a person who may have walked away, and while it
|
|
20
|
+
* waits the whole turn — including any parent of a delegated caller — waits
|
|
21
|
+
* with it. A stand measured one at 1 h 06 m with nothing on the operator's
|
|
22
|
+
* screen but a thinking timer; minutes is the right unit for a yes/no about
|
|
23
|
+
* one tool call, and an expired request is refused, never assumed allowed.
|
|
24
|
+
*/
|
|
25
|
+
export declare const QA_APPROVAL_PARK_TIMEOUT_MS: number;
|
|
17
26
|
/**
|
|
18
27
|
* Interactive resolution of the tool policy `ask` decision.
|
|
19
28
|
*
|
|
@@ -30,6 +39,14 @@ export interface QaApprovalExecution {
|
|
|
30
39
|
* approved automatically, and the allow-list, the workspace fence and the
|
|
31
40
|
* read-only sandbox still run on the resolved call.
|
|
32
41
|
*
|
|
42
|
+
* Two callers never reach the card. A delegated child is refused on the spot:
|
|
43
|
+
* it has no one to answer it — the harness already refuses a question from an
|
|
44
|
+
* agent owned by another live agent — so a parked approval of a child would
|
|
45
|
+
* hold the parent turn for a reply that cannot arrive, which is what an answer
|
|
46
|
+
* reviewer did on a stand until a person rejected it 12,5 minutes later. And a
|
|
47
|
+
* request the operator does not answer expires: the wait is bounded by
|
|
48
|
+
* `QA_APPROVAL_PARK_TIMEOUT_MS` and fails closed like a refusal.
|
|
49
|
+
*
|
|
33
50
|
* Only sessions this deployment attested are touched. Any other session's ask
|
|
34
51
|
* is handed back to the chain untouched, so an operator instance that also
|
|
35
52
|
* serves ordinary chats keeps its own approval flow.
|
|
@@ -56,7 +73,7 @@ export declare class QaApprovalGate {
|
|
|
56
73
|
* attested chat answers under the chat the operator is looking at.
|
|
57
74
|
*/
|
|
58
75
|
private ownerOf;
|
|
59
|
-
/** Park one call until the operator answers, the turn
|
|
76
|
+
/** Park one call until the operator answers, the turn ends, or the wait expires. */
|
|
60
77
|
private request;
|
|
61
78
|
private resolve;
|
|
62
79
|
/** Fail the requests one session's agent owns; a child never holds the chat. */
|
|
@@ -423,6 +423,29 @@ export declare class QaSessionController {
|
|
|
423
423
|
* somebody else retired in between is no more this one's to finish.
|
|
424
424
|
*/
|
|
425
425
|
private bind;
|
|
426
|
+
/**
|
|
427
|
+
* Whether this browser's Session catalog names one id. The Host answers a
|
|
428
|
+
* retain from exactly this set, so a refusal of a listed session is a refusal
|
|
429
|
+
* of a session it knows — never the race this adoption can wait out.
|
|
430
|
+
*/
|
|
431
|
+
private catalogLists;
|
|
432
|
+
/**
|
|
433
|
+
* Wait for this browser's Session catalog to come to know one id, after
|
|
434
|
+
* {@link bind} was refused a reference to it, and answer whether the chat on
|
|
435
|
+
* screen still belongs to the adoption that asked (`false` — it moved on, and
|
|
436
|
+
* nothing is retained). Only an id the catalog does not name reaches here: a
|
|
437
|
+
* refusal of a session it already lists is not this race and goes back as it
|
|
438
|
+
* came, so there is always a row to wait for. A refusal is only final once
|
|
439
|
+
* that row has had its chance: this is the one window where the race is
|
|
440
|
+
* repairable rather than reportable, so the failure the caller reads stays the
|
|
441
|
+
* Host's own refusal, not a timeout nobody asked for.
|
|
442
|
+
*
|
|
443
|
+
* Both timestamps are logged because the race is intermittent and the stand
|
|
444
|
+
* keeps no other trace of it: the server never sees a retain, so its journal
|
|
445
|
+
* cannot say which chat lost the create, and the next round needs the id and
|
|
446
|
+
* the two moments to line this up with its own observations.
|
|
447
|
+
*/
|
|
448
|
+
private awaitCatalogRow;
|
|
426
449
|
/**
|
|
427
450
|
* Give up on an adoption the chat on screen has outgrown, and answer whether
|
|
428
451
|
* that is what happened (`true` — the caller has nothing left to publish).
|
|
@@ -32,7 +32,9 @@ export interface QaHeaderProps {
|
|
|
32
32
|
readonly onToggleAgents: () => void;
|
|
33
33
|
/** Whether the deployment shows the sources control in the header at all. */
|
|
34
34
|
readonly sourcesVisible: boolean;
|
|
35
|
+
/** Sources of the chat so far; 0 prints no badge but never closes the panel. */
|
|
35
36
|
readonly sourcesCount: number;
|
|
37
|
+
/** Whether collection has settled: a running turn's 0 is not yet a none. */
|
|
36
38
|
readonly sourcesComplete: boolean;
|
|
37
39
|
readonly sourcesOpen: boolean;
|
|
38
40
|
readonly onOpenSources: () => void;
|
|
@@ -72,6 +74,13 @@ export interface QaHeaderProps {
|
|
|
72
74
|
readonly showReset: boolean;
|
|
73
75
|
readonly resetDisabled: boolean;
|
|
74
76
|
readonly onReset: () => void;
|
|
77
|
+
/**
|
|
78
|
+
* Offered while a panel is in front of the conversation: the «Чат» marker
|
|
79
|
+
* then becomes the control that puts the conversation back, which is what its
|
|
80
|
+
* selected look already promises. Omitted while the chat is all there is —
|
|
81
|
+
* a control that returns the reader to where they stand is a dead button.
|
|
82
|
+
*/
|
|
83
|
+
readonly onBackToChat?: () => void;
|
|
75
84
|
}
|
|
76
|
-
export declare function QaHeader({ logoUrl, title, viewingSubagent, onCloseSubagent, roleSelector, themeSwitcher, administration, agentCount, agentsOpen, onToggleAgents, sourcesVisible, sourcesCount, sourcesComplete, sourcesOpen, onOpenSources, fileCount, filesEnabled, filesOpen, onOpenFiles, settings, history, panelLauncher, showReset, resetDisabled, onReset, }: QaHeaderProps): import("react/jsx-runtime").JSX.Element;
|
|
85
|
+
export declare function QaHeader({ logoUrl, title, viewingSubagent, onCloseSubagent, roleSelector, themeSwitcher, administration, agentCount, agentsOpen, onToggleAgents, sourcesVisible, sourcesCount, sourcesComplete, sourcesOpen, onOpenSources, fileCount, filesEnabled, filesOpen, onOpenFiles, settings, history, panelLauncher, showReset, resetDisabled, onReset, onBackToChat, }: QaHeaderProps): import("react/jsx-runtime").JSX.Element;
|
|
77
86
|
//# sourceMappingURL=QaHeader.d.ts.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
2
|
import type { QaRailTab } from "../use-session-ui-state.js";
|
|
3
3
|
/** One rail tab's strip chip: label, live count, and its body is the panel. */
|
|
4
4
|
export interface QaRailTabModel {
|
|
@@ -18,6 +18,12 @@ export interface QaRightRailProps {
|
|
|
18
18
|
* The chat's right rail: a fixed column whose top edge is the tab strip,
|
|
19
19
|
* mirroring the Harness right Sidebar's chrome. Tabs are plain chips with
|
|
20
20
|
* counts; the strip's last control collapses the whole column.
|
|
21
|
+
*
|
|
22
|
+
* On the phone layout the column is the whole surface, so the strip's control
|
|
23
|
+
* is the only way back and Escape has to answer from anywhere on the page —
|
|
24
|
+
* the focus may well still sit in the composer behind the panel. A dialog above
|
|
25
|
+
* the rail keeps the key: the innermost thing on the page is what the reader
|
|
26
|
+
* means to dismiss.
|
|
21
27
|
*/
|
|
22
28
|
export declare function QaRightRail({ tabs, activeTab, onTabSelect, onClose, }: QaRightRailProps): import("react/jsx-runtime").JSX.Element | null;
|
|
23
29
|
//# sourceMappingURL=QaRightRail.d.ts.map
|
|
@@ -7,6 +7,11 @@ export interface QaChatRow {
|
|
|
7
7
|
readonly running: boolean;
|
|
8
8
|
readonly active: boolean;
|
|
9
9
|
readonly meta: string;
|
|
10
|
+
/**
|
|
11
|
+
* The chat's whole name, held back from the row only because the row had to
|
|
12
|
+
* be cut to fit; absent when the title is shown in full.
|
|
13
|
+
*/
|
|
14
|
+
readonly fullName?: string;
|
|
10
15
|
readonly updatedAt: number;
|
|
11
16
|
/** Chat owner's display name; present in the admin ownership view only. */
|
|
12
17
|
readonly ownerName?: string;
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import type { QaWorkItem } from "../../types.js";
|
|
2
2
|
export interface QaWorkGroupProps {
|
|
3
|
-
/**
|
|
4
|
-
|
|
3
|
+
/**
|
|
4
|
+
* "error" marks a turn the host ended with a provider failure; "stopped"
|
|
5
|
+
* marks one a person ended, whose answer arrived as a prefix.
|
|
6
|
+
*/
|
|
7
|
+
readonly status: "running" | "complete" | "error" | "stopped";
|
|
5
8
|
readonly startedAt?: number;
|
|
6
9
|
readonly endedAt?: number;
|
|
7
10
|
readonly items: readonly QaWorkItem[];
|
|
@@ -8,6 +8,12 @@
|
|
|
8
8
|
* pair rather than a hard-coded outline: the Host's `focus.css` suppresses an
|
|
9
9
|
* outline under pointer modality at a specificity our rule cannot win, so a
|
|
10
10
|
* hard-coded ring is one that goes missing rather than one that degrades.
|
|
11
|
+
*
|
|
12
|
+
* The type scale is the surface's: text the operator reads in order to decide —
|
|
13
|
+
* section titles, field labels, the values in the controls, the toggle copy —
|
|
14
|
+
* is 16px, a control's own label and an outcome line are 14px, and only chrome
|
|
15
|
+
* stays small on purpose: the «Изменено» badge (9px), the status chips (11px),
|
|
16
|
+
* the monospace data rows (11px) and the footer note (10px).
|
|
11
17
|
*/
|
|
12
18
|
export declare const QA_SETTINGS_STYLES: string;
|
|
13
19
|
//# sourceMappingURL=styles.d.ts.map
|
package/lib/types/index.d.ts
CHANGED
|
@@ -107,10 +107,12 @@ export declare class QaSurface extends TypertRemoteService {
|
|
|
107
107
|
* check and the deployment's lockdown is the boundary, exactly as it is for
|
|
108
108
|
* every other remote.
|
|
109
109
|
*
|
|
110
|
-
* The grant
|
|
111
|
-
*
|
|
112
|
-
*
|
|
113
|
-
*
|
|
110
|
+
* The grant is {@link userInvocableSkillNames} — the one list the typed
|
|
111
|
+
* gesture is admitted or refused by — for every chat that has a role, woken
|
|
112
|
+
* or not: the palette a visitor sees before the chat runs is narrowed by that
|
|
113
|
+
* same rule, so it can neither offer a name the line would refuse nor hide
|
|
114
|
+
* one it would accept. `undefined` is answered only where the deployment has
|
|
115
|
+
* no roles to consult at all.
|
|
114
116
|
*/
|
|
115
117
|
private slashSessionGrant;
|
|
116
118
|
/**
|
|
@@ -2,8 +2,21 @@ import type { Context } from "@deepseek-ai/cordis";
|
|
|
2
2
|
import type { QaSessionOwnership } from "../session-ownership.js";
|
|
3
3
|
/** The one QA tool whose every call is parked for the operator. */
|
|
4
4
|
export declare const QA_FILE_DELETE_TOOL = "file_delete";
|
|
5
|
-
/**
|
|
6
|
-
|
|
5
|
+
/**
|
|
6
|
+
* Why the gate answers `ask` before the chain can decide alone. The card the
|
|
7
|
+
* operator reads shows this verbatim, so it is written in the language of the
|
|
8
|
+
* surface rather than in the language of the tool chain.
|
|
9
|
+
*/
|
|
10
|
+
export declare const QA_FILE_DELETE_ASK_REASON = "\u0423\u0434\u0430\u043B\u0435\u043D\u0438\u0435 \u0444\u0430\u0439\u043B\u0430 \u0440\u0430\u0431\u043E\u0447\u0435\u0433\u043E \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u0438\u044F \u043E\u043F\u0435\u0440\u0430\u0442\u043E\u0440\u0430.";
|
|
11
|
+
/**
|
|
12
|
+
* Why the gate answers `deny` — not `ask` — for a delegated caller. A child has
|
|
13
|
+
* no one to confirm to it: its card would sit over the parent's composer and
|
|
14
|
+
* stop the parent turn until a person answers something they were never asked
|
|
15
|
+
* about. Deleting a file is not a step a delegation was ever given, so the call
|
|
16
|
+
* is refused where it is raised, and the reason tells the child to report
|
|
17
|
+
* instead of trying again.
|
|
18
|
+
*/
|
|
19
|
+
export declare const QA_FILE_DELETE_DELEGATED_DENY_REASON = "a delegated call cannot delete a workspace file: no operator can confirm it. Report the file that is in the way instead of removing it";
|
|
7
20
|
/**
|
|
8
21
|
* The inner half of `file_delete`'s safety: the decision that composes the
|
|
9
22
|
* approval flow around one destructive tool.
|
|
@@ -20,7 +33,10 @@ export declare const QA_FILE_DELETE_ASK_REASON = "deleting a workspace file requ
|
|
|
20
33
|
* behavior and refuses the call — nothing is ever deleted without a person.
|
|
21
34
|
*
|
|
22
35
|
* Any other tool, and any caller this deployment did not attest, is handed
|
|
23
|
-
* back to the chain untouched.
|
|
36
|
+
* back to the chain untouched. A delegated child of an attested chat is the one
|
|
37
|
+
* attested caller that gets no card: it is refused here, on the name, whatever
|
|
38
|
+
* the deployment's approval mode is — the same refusal the answer reviewer of a
|
|
39
|
+
* stand needed before its parent turn could end.
|
|
24
40
|
*/
|
|
25
41
|
export declare class QaFileDeleteGate {
|
|
26
42
|
private readonly ctx;
|
|
@@ -33,10 +49,11 @@ export declare class QaFileDeleteGate {
|
|
|
33
49
|
dispose(): void;
|
|
34
50
|
private handle;
|
|
35
51
|
/**
|
|
36
|
-
*
|
|
37
|
-
* children included
|
|
38
|
-
*
|
|
52
|
+
* The attested chat a call belongs to and the session that made it, delegated
|
|
53
|
+
* children included — the same ownership service the approval gate reads, so
|
|
54
|
+
* one chat is parked under exactly one surface. The two differ for a child,
|
|
55
|
+
* and a child is the caller that cannot be confirmed by anyone.
|
|
39
56
|
*/
|
|
40
|
-
private
|
|
57
|
+
private rootOf;
|
|
41
58
|
}
|
|
42
59
|
//# sourceMappingURL=file-delete-gate.d.ts.map
|
|
@@ -39,6 +39,11 @@ export interface BuildSlashCatalogOptions {
|
|
|
39
39
|
* The session role's own user-skill grant, when the access system is on.
|
|
40
40
|
* `undefined` means the role system has no opinion, which is its state on a
|
|
41
41
|
* deployment that never enabled roles — not "grant nothing".
|
|
42
|
+
*
|
|
43
|
+
* This is the only grant a read may answer with, whatever the chat looks
|
|
44
|
+
* like: a chat that is running and a chat nobody has woken are narrowed by
|
|
45
|
+
* the same allow-list and the same role, because the palette that names a
|
|
46
|
+
* skill this chat may not invoke teaches the visitor a gesture that fails.
|
|
42
47
|
*/
|
|
43
48
|
readonly grantedSkills?: readonly string[] | undefined;
|
|
44
49
|
readonly commandSurface: QaSlashCommandSurface;
|
package/lib/types/types.d.ts
CHANGED
|
@@ -1522,8 +1522,11 @@ export type QaMessage = QaUserMessage | {
|
|
|
1522
1522
|
readonly id: string;
|
|
1523
1523
|
readonly role: "work";
|
|
1524
1524
|
readonly turn: number;
|
|
1525
|
-
/**
|
|
1526
|
-
|
|
1525
|
+
/**
|
|
1526
|
+
* "error" marks a turn the host ended with a provider failure; "stopped"
|
|
1527
|
+
* marks one the user ended, whose answer is a prefix rather than a reply.
|
|
1528
|
+
*/
|
|
1529
|
+
readonly status: "running" | "complete" | "error" | "stopped";
|
|
1527
1530
|
readonly startedAt?: number;
|
|
1528
1531
|
readonly endedAt?: number;
|
|
1529
1532
|
readonly items: readonly QaWorkItem[];
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yadsh/dsh-qa-surface",
|
|
3
|
-
"version": "0.15.
|
|
3
|
+
"version": "0.15.4",
|
|
4
4
|
"description": "A focused end-user QA surface backed by native DeepSeek Harness sessions",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -135,11 +135,11 @@
|
|
|
135
135
|
"dependencies": {
|
|
136
136
|
"yaml": "^2.9.0",
|
|
137
137
|
"zod": "^4.4.3",
|
|
138
|
-
"@yadsh/dsh-audit-core": "^0.1.1",
|
|
139
138
|
"@yadsh/dsh-audit-ui": "^0.1.2",
|
|
139
|
+
"@yadsh/dsh-audit-core": "^0.1.1",
|
|
140
140
|
"@yadsh/dsh-plugin-kit": "^0.5.0",
|
|
141
|
-
"@yadsh/dsh-
|
|
142
|
-
"@yadsh/dsh-
|
|
141
|
+
"@yadsh/dsh-plugin-log": "^0.4.1",
|
|
142
|
+
"@yadsh/dsh-documents": "^0.6.2"
|
|
143
143
|
},
|
|
144
144
|
"devDependencies": {
|
|
145
145
|
"@deepseek-ai/cordis": "4.0.4",
|