@deepseek-ai/dsh-client-ui-conversation 0.1.3-alpha.2 → 0.1.5-alpha.2

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.
@@ -239,7 +239,7 @@ export interface ComposerKeyboard {
239
239
  readonly snapshot: InputState;
240
240
  /** The shell-owned Lexical editor the composer binds its contenteditable to. */
241
241
  readonly editor: LexicalEditor;
242
- /** Submit with an explicit delivery mode resolved by the keyboard policy. */
242
+ /** Submit with an explicit delivery mode resolved by the submission policy (Enter gestures and the primary Send button). */
243
243
  submit(mode: InputSubmitMode): void;
244
244
  /**
245
245
  * Steer every still-pending queued message into the running turn (the
@@ -200,9 +200,10 @@ export interface CompactionSummaryNode {
200
200
  * Fallback for surface events this UI version does not know: the documented
201
201
  * default arm of `SessionEventMap`, which is merge-extensible, so the
202
202
  * projection's switch cannot end in `assertNever`. No event produces this node
203
- * because `isAppendSurfaceEvent` admits only the three types in core's
204
- * `SurfaceEventType`, and each has its own arm — and it exists so widening that
205
- * set core-side degrades to a raw row instead of dropping the event silently.
203
+ * because `isAppendSurfaceEvent` admits only the four types in core's
204
+ * `SurfaceEventType`, and each has its own arm (`system/message` is claimed by
205
+ * a Chat Definition that renders no transcript row) — and it exists so widening
206
+ * that set core-side degrades to a raw row instead of dropping the event silently.
206
207
  */
207
208
  export interface UnknownSurfaceNode {
208
209
  kind: 'unknown';
@@ -2,20 +2,51 @@ import type { ContentBlock, ToolSchema } from '@deepseek-ai/dsh-llm/types';
2
2
  import type { SessionEvent } from '@deepseek-ai/dsh-session/types';
3
3
  import type { AssistantProvenanceView, AssistantRequestConfig } from './records.ts';
4
4
  export type { AssistantProvenanceView, AssistantRequestConfig, } from './records.ts';
5
- /** Complete model-visible request header in force for an ordinary generation. */
5
+ /**
6
+ * Complete model-visible request state in force for an ordinary generation:
7
+ * the `request/header` config and tools plus the system prompt held by the
8
+ * current `system/message` surface node.
9
+ */
6
10
  export interface ConversationPromptSnapshot {
7
11
  /** Provider/model and sampling configuration from the effective request header. */
8
12
  config: AssistantRequestConfig;
9
- /** Rendered system prompt text; empty when the request had no system prompt. */
13
+ /**
14
+ * Rendered text of the `system/message` surface node in force for the
15
+ * request; empty when the surface has no system prompt or the node lies
16
+ * outside the loaded history window.
17
+ */
10
18
  system: string;
11
19
  /** Complete tool catalog sent with the request, including tools that were never called. */
12
20
  tools: readonly ToolSchema[];
13
21
  }
14
- /** System/tool change introduced while preparing one ordinary request. */
22
+ /** Effective prompt or introduced system node, anchored at the event that establishes it. */
23
+ export interface SystemPromptNode {
24
+ /** Sequence of the system event or replacement that establishes this prompt. */
25
+ seq: number;
26
+ /** Unix epoch ms of that event. */
27
+ time: number;
28
+ /** Turn the loop committed the node in. */
29
+ turn: number;
30
+ /** Step the loop committed the node in. */
31
+ step: number;
32
+ /** Rendered system prompt text; empty records "no system prompt". */
33
+ text: string;
34
+ /**
35
+ * True for a prompt appended after an earlier loaded system node: an
36
+ * in-history update the model reads at this position, presented where it
37
+ * was committed rather than by the next request header.
38
+ */
39
+ update: boolean;
40
+ }
41
+ /** System/tool change introduced while preparing one ordinary request, or by an in-history prompt update. */
15
42
  export interface RequestPromptChange {
16
- /** Sequence of the request/header event that introduced this state. */
43
+ /**
44
+ * Sequence of the event that introduced this state: the `system/message`
45
+ * node when it introduced, replaced, or updated the system prompt, otherwise the
46
+ * `request/header` event.
47
+ */
17
48
  seq: number;
18
- /** Unix epoch ms from the request/header event. */
49
+ /** Unix epoch ms of that event. */
19
50
  time: number;
20
51
  /** How the model-visible prompt differs from the previous recorded state. */
21
52
  kind: 'initial' | 'system' | 'tools' | 'system-and-tools';
@@ -24,7 +55,7 @@ export interface RequestPromptChange {
24
55
  }
25
56
  /** Canonical prompt snapshot and any model-visible change introduced by one request header. */
26
57
  export interface RequestPromptInspection {
27
- /** Complete prompt state recorded by the header. */
58
+ /** Complete prompt state in force for the header's request. */
28
59
  prompt: ConversationPromptSnapshot;
29
60
  /** System/tool change relative to the preceding loaded header. */
30
61
  change?: RequestPromptChange;
@@ -34,14 +65,17 @@ export interface RequestPromptInspection {
34
65
  * Trajectory Definitions receive it from the uiConversation service because a
35
66
  * client bundle cannot value-import another plugin's module.
36
67
  */
37
- export type RequestPromptInspector = (previous: ConversationPromptSnapshot | undefined, event: SessionEvent<'request/header'>) => RequestPromptInspection;
68
+ export type RequestPromptInspector = (previous: ConversationPromptSnapshot | undefined, event: SessionEvent<'request/header'>, system: SystemPromptNode | undefined) => RequestPromptInspection;
38
69
  /**
39
- * Canonicalize one request header and classify its model-visible prompt change.
70
+ * Canonicalize one request header against the system node in force and
71
+ * classify the model-visible prompt change.
40
72
  * @param previous - Prompt from the preceding loaded request header, when available.
41
73
  * @param event - Durable full request header to inspect.
74
+ * @param system - Effective nonempty system prompt after loaded surface replacements; empty when removed.
75
+ * An in-history update already presented its text at its own position, so the header reports no system change for it.
42
76
  * @returns The canonical prompt and an initial/system/tool change when it can be established.
43
77
  */
44
- export declare function inspectRequestPrompt(previous: ConversationPromptSnapshot | undefined, event: SessionEvent<'request/header'>): RequestPromptInspection;
78
+ export declare function inspectRequestPrompt(previous: ConversationPromptSnapshot | undefined, event: SessionEvent<'request/header'>, system: SystemPromptNode | undefined): RequestPromptInspection;
45
79
  /** Lifecycle fields shared by ordinary generation and compaction requests. */
46
80
  interface RequestViewBase {
47
81
  /** Sequence that opened the operation represented by this request. */
@@ -12,7 +12,7 @@ import type { WorkspaceId } from '@deepseek-ai/dsh-workspace/types';
12
12
  import type { ComposerBlock } from './composer-blocks.ts';
13
13
  import type { ComposerKeyboard, DraftAttachmentId, EditSelection, InputActions, InputNotice, InputState } from './input.ts';
14
14
  import type { createConversationStore } from '../stores.ts';
15
- import type { ComposerSubmitGesture, InputSubmitMode } from './composer-submission.ts';
15
+ import type { BusyEnterBehavior } from './composer-submission.ts';
16
16
  import type { ConversationSnapshot } from './snapshot.ts';
17
17
  import type { ViewTab } from './views.ts';
18
18
  /** Browser-owned draft attachment that has not crossed the durable Host boundary. */
@@ -109,6 +109,11 @@ export type UseConversation = SnapshotSelectorHook<ConversationSnapshot>;
109
109
  export type UseConversationViews = SnapshotSelectorHook<readonly ViewTab[]>;
110
110
  declare module '@deepseek-ai/dsh-client-ui-slots' {
111
111
  interface SlotMap {
112
+ /** Conversation shell beneath its root-scoped main-panel entry. */
113
+ 'main.conversation': {
114
+ kind: 'single';
115
+ scope: 'session-maybe';
116
+ };
112
117
  /** Strict per-Session Conversation body. */
113
118
  'conversation.session': {
114
119
  kind: 'single';
@@ -137,6 +142,17 @@ declare module '@deepseek-ai/dsh-client-ui-slots' {
137
142
  scope: 'session';
138
143
  owner: ConversationHeaderActionOwnerProps;
139
144
  };
145
+ /**
146
+ * The header's far-right corner, past the utilities' edge and into the
147
+ * header's own padding, for one control. The corner is laid out only while
148
+ * its occupant renders something; an occupant with nothing to show renders
149
+ * nothing, and the utilities take the header's edge.
150
+ */
151
+ 'conversation.session.header.corner': {
152
+ kind: 'single';
153
+ scope: 'session';
154
+ owner: ConversationHeaderCornerOwnerProps;
155
+ };
140
156
  /** Registered Conversation target Views, rendered one at a time. */
141
157
  'conversation.view': {
142
158
  kind: 'list';
@@ -249,6 +265,11 @@ export interface ConversationHeaderActionOwnerProps {
249
265
  /** Marker field: entries receive no owner-specific values. */
250
266
  children?: never;
251
267
  }
268
+ /** The header corner's occupant derives its state from standard Session props. */
269
+ export interface ConversationHeaderCornerOwnerProps {
270
+ /** Marker field: the occupant receives no owner-specific values. */
271
+ children?: never;
272
+ }
252
273
  /** Plain breadcrumb data handed to the optional lineage renderer. */
253
274
  export interface ConversationHeaderLineageOwnerProps {
254
275
  /** Session represented by this breadcrumb title. */
@@ -331,11 +352,15 @@ export interface ComposerBarInjected {
331
352
  resolveDraftAttachments: ((ids: readonly DraftAttachmentId[]) => readonly ComposerAttachment[]) | undefined;
332
353
  /** Restart one failed file upload; absent without a session. */
333
354
  retryFileUpload: ((id: DraftAttachmentId) => void) | undefined;
334
- resolveSubmitMode: (running: boolean, gesture: ComposerSubmitGesture, steeringAvailable: boolean) => InputSubmitMode;
335
355
  toggleCommandMenu: ((selection: EditSelection) => void) | undefined;
336
356
  stop: (() => void) | undefined;
337
357
  command: ((line: string) => Promise<boolean>) | undefined;
338
358
  hooks: {
359
+ /**
360
+ * Live busy-state submission preference: the delivery mode plain Enter
361
+ * and the primary Send button use while the addressed agent is busy.
362
+ */
363
+ busyEnter: ObservableSnapshot<BusyEnterBehavior>;
339
364
  /** Live per-draft upload states for file-kind drafts. */
340
365
  fileUploads: ObservableSnapshot<DraftFileUploads>;
341
366
  notices: ObservableSnapshot<InputNotice | null>;
@@ -367,13 +392,13 @@ export interface HeroBrandMarkOwnerProps {
367
392
  className?: string | undefined;
368
393
  }
369
394
  /** Full props of the resident optional-Session Conversation shell. */
370
- export type ConversationSlotProps = PropsRuntime<'conversation'> & PropsRenderSlots<'conversation.session' | 'conversation.session.header' | 'conversation.composer' | 'conversation.composer.bar' | 'conversation.input.dock' | 'conversation.hero.brand.mark' | 'conversation.hero.workspace' | 'conversation.hero.agentPreset'> & InjectFace<ConversationInjected> & PropsLocale<'conversation'>;
395
+ export type ConversationSlotProps = PropsRuntime<'main.conversation'> & PropsRenderSlots<'conversation.session' | 'conversation.session.header' | 'conversation.composer' | 'conversation.composer.bar' | 'conversation.input.dock' | 'conversation.hero.brand.mark' | 'conversation.hero.workspace' | 'conversation.hero.agentPreset'> & InjectFace<ConversationInjected> & PropsLocale<'conversation'>;
371
396
  /** Shared target-neutral Conversation store handle. */
372
397
  export type ConversationStore = ReturnType<typeof createConversationStore>;
373
398
  /** Full props of the strict Session body. */
374
399
  export type ConversationSessionSlotProps = PropsRuntime<'conversation.session'> & PropsRenderSlots<'conversation.view'> & PropsStore<ConversationStore> & InjectFace<ConversationSessionInjected>;
375
400
  /** Full props of the strict Session header. */
376
- export type ConversationSessionHeaderSlotProps = PropsRuntime<'conversation.session.header'> & PropsRenderSlots<'conversation.session.header.lineage' | 'conversation.session.header.actions' | 'conversation.session.header.utilities'> & PropsStore<ConversationStore> & InjectFace<ConversationSessionHeaderInjected> & PropsLocale<'conversation'>;
401
+ export type ConversationSessionHeaderSlotProps = PropsRuntime<'conversation.session.header'> & PropsRenderSlots<'conversation.session.header.lineage' | 'conversation.session.header.actions' | 'conversation.session.header.utilities' | 'conversation.session.header.corner'> & PropsStore<ConversationStore> & InjectFace<ConversationSessionHeaderInjected> & PropsLocale<'conversation'>;
377
402
  /** Full props of the draft-attachment renderer. */
378
403
  export type ComposerAttachmentsProps = PropsRuntime<'conversation.input.attachments'> & PropsLocale<'conversation'>;
379
404
  /** Owner share common to blank-session Workspace pickers. */
@@ -0,0 +1,35 @@
1
+ /** Immutable system-only interpretation of the loaded Session surface. */
2
+ import type { SessionEvent } from '@deepseek-ai/dsh-session/types';
3
+ import type { SystemPromptNode } from './request-inspection.ts';
4
+ interface PositionedSystem {
5
+ readonly position: number;
6
+ readonly node: SystemPromptNode;
7
+ }
8
+ /** Prompt facts at one log prefix; earlier instances remain valid for historical cards. */
9
+ export interface SystemPromptState {
10
+ /** Earliest relevant loaded event; older unindexed endpoints have unknown surface positions. */
11
+ readonly firstSeq: number;
12
+ /** Missing endpoint order makes the prompt unavailable until prepend replay supplies it. */
13
+ readonly uncertain: boolean;
14
+ /** Loaded system nodes in surface order, including empty dormant nodes. */
15
+ readonly nodes: readonly PositionedSystem[];
16
+ /** Surviving replacement endpoints only, mapped to inherited surface positions. */
17
+ readonly replacements: ReadonlyMap<number, number>;
18
+ /** Effective prompt and its change origin; empty text records removal, undefined means unavailable. */
19
+ readonly effective: SystemPromptNode | undefined;
20
+ /** System event at this position, if any; only this node may own an update card. */
21
+ readonly introduced: SystemPromptNode | undefined;
22
+ }
23
+ /** Pure interpretation supplied to target-owned Definitions through uiConversation. */
24
+ export type SystemPromptInspector = (previous: SystemPromptState | undefined, event: SessionEvent) => SystemPromptState;
25
+ /**
26
+ * Apply a system event or positional replacement without retaining ordinary messages.
27
+ * Replacement positions inherit their start endpoint, not their chronological seq.
28
+ * Unknown older endpoint order withholds the prompt until prepend replay resolves it.
29
+ * @param previous - Interpretation at the preceding relevant event in the loaded window.
30
+ * @param event - System message or surface replacement already admitted by Session.
31
+ * @returns Immutable surviving system facts and the effective nonempty prompt.
32
+ */
33
+ export declare function inspectSystemPrompt(previous: SystemPromptState | undefined, event: SessionEvent): SystemPromptState;
34
+ export {};
35
+ //# sourceMappingURL=system-prompt.d.ts.map
@@ -6,7 +6,8 @@ import type { SessionEvent, SessionId } from '@deepseek-ai/dsh-session/types';
6
6
  import { type ObservableSnapshot } from '@deepseek-ai/dsh-client-store';
7
7
  import type { ConversationViewSnapshotMap } from '../contract/conversation.ts';
8
8
  import type { ConversationSnapshot } from '../contract/snapshot.ts';
9
- import type { ConversationPromptSnapshot, RequestPromptInspection } from '../contract/request-inspection.ts';
9
+ import type { ConversationPromptSnapshot, RequestPromptInspection, SystemPromptNode } from '../contract/request-inspection.ts';
10
+ import { type SystemPromptState } from '../contract/system-prompt.ts';
10
11
  import { ConversationEventRegistry } from './event-registry.ts';
11
12
  import { ConversationViewRegistry } from './view-registry.ts';
12
13
  /** Observable faces published for one Session's Conversation assembly. */
@@ -72,16 +73,25 @@ export declare class UiConversation extends Service {
72
73
  */
73
74
  seedImageUrl(sessionId: SessionId, attachment: ImageAttachmentRef, url: string): boolean;
74
75
  /**
75
- * Canonicalize one `request/header` event against the previous prompt state.
76
+ * Interpret a system message or surface replacement for target-owned prompt Definitions.
77
+ * @param previous - System facts at the preceding relevant loaded event.
78
+ * @param event - Durable system message or positional replacement.
79
+ * @returns Immutable prompt interpretation at this event.
80
+ */
81
+ inspectSystemPrompt(previous: SystemPromptState | undefined, event: SessionEvent): SystemPromptState;
82
+ /**
83
+ * Canonicalize one `request/header` event against the previous prompt state
84
+ * and the `system/message` node in force.
76
85
  *
77
86
  * A pure interpretation shared by the Chat and Trajectory Definitions, exposed
78
87
  * as a service method because cross-plugin value imports are forbidden in
79
88
  * client bundles.
80
89
  * @param previous - prompt recorded by the preceding loaded header, if any.
81
90
  * @param event - the `request/header` session event to interpret.
91
+ * @param system - effective prompt after loaded surface replacements, if any.
82
92
  * @returns the canonical prompt snapshot and any model-visible change.
83
93
  */
84
- inspectRequestPrompt(previous: ConversationPromptSnapshot | undefined, event: SessionEvent<'request/header'>): RequestPromptInspection;
94
+ inspectRequestPrompt(previous: ConversationPromptSnapshot | undefined, event: SessionEvent<'request/header'>, system: SystemPromptNode | undefined): RequestPromptInspection;
85
95
  private drop;
86
96
  }
87
97
  //# sourceMappingURL=assembly.d.ts.map
@@ -10,8 +10,9 @@ export { EMPTY_CONVERSATION_SNAPSHOT, conversationPhase } from './contract/snaps
10
10
  export type { ConversationPhase, ConversationSnapshot, } from './contract/snapshot.ts';
11
11
  export type { AssistantBlock, AssistantMessageNode, AssistantProvenanceView, AssistantRequestConfig, AssistantTiming, CommandNode, CompactionSummaryNode, ContextMessageNode, ConversationNode, ModelRetryNode, PartialAssistant, RunningToolCall, SteeringMessageNode, TodoItem, ToolCallBlock, ToolResultNode, TurnErrorNode, TurnMaxTokensNode, UnknownSurfaceNode, UserMessageNode, } from './contract/records.ts';
12
12
  export type { ContextProvenanceView, ContextRole, KnownContextForm, } from './contract/context-provenance.ts';
13
- export type { ConversationPromptSnapshot, RequestInspectionSnapshot, RequestPromptChange, RequestPromptInspection, RequestPromptInspector, RequestView, } from './contract/request-inspection.ts';
13
+ export type { ConversationPromptSnapshot, RequestInspectionSnapshot, RequestPromptChange, RequestPromptInspection, RequestPromptInspector, RequestView, SystemPromptNode, } from './contract/request-inspection.ts';
14
14
  export { inspectRequestPrompt } from './contract/request-inspection.ts';
15
+ export type { SystemPromptState, SystemPromptInspector } from './contract/system-prompt.ts';
15
16
  export type { ConversationStoreState, ConversationViewRequest, ViewTab } from './contract/views.ts';
16
17
  export { ConversationNodeAssembler } from './conversation/assembler.ts';
17
18
  export type { ConversationEventDefinitions, ConversationViewDefinitions, } from './conversation/assembler.ts';
@@ -21,7 +22,7 @@ export { ConversationLocationIndex } from './conversation/location-index.ts';
21
22
  export type { ConversationLocationDataChange } from './conversation/location-index.ts';
22
23
  export { ConversationViewRegistry } from './conversation/view-registry.ts';
23
24
  export type { ConversationKey } from './locales.ts';
24
- export type { ComposerAttachment, ComposerAttachmentsOwnerProps, ComposerAttachmentsProps, ComposerFileAttachment, ComposerImageAttachment, DraftFileUpload, DraftFileUploads, ComposerBarInjected, ComposerBarOwnerProps, ComposerBarProps, ComposerChainProps, ConversationHeaderActionOwnerProps, ConversationHeaderLineageOwnerProps, ConversationInjected, ConversationSessionHeaderInjected, ConversationSessionHeaderSlotProps, ConversationSessionInjected, ConversationSessionSlotProps, ConversationSlotProps, ConversationStore, ConvViewOwnerProps, ConvViewProps, EmptyWorkspaceOwnerProps, HeroAgentPresetOwnerProps, HeroBrandMarkOwnerProps, InputControlOwnerProps, InputZone, MessageImageLoader, MessageImageSource, MessageImagesOwnerProps, RenderMessageImages, UseConversation, UseConversationViews, } from './contract/slots.ts';
25
+ export type { ComposerAttachment, ComposerAttachmentsOwnerProps, ComposerAttachmentsProps, ComposerFileAttachment, ComposerImageAttachment, DraftFileUpload, DraftFileUploads, ComposerBarInjected, ComposerBarOwnerProps, ComposerBarProps, ComposerChainProps, ConversationHeaderActionOwnerProps, ConversationHeaderCornerOwnerProps, ConversationHeaderLineageOwnerProps, ConversationInjected, ConversationSessionHeaderInjected, ConversationSessionHeaderSlotProps, ConversationSessionInjected, ConversationSessionSlotProps, ConversationSlotProps, ConversationStore, ConvViewOwnerProps, ConvViewProps, EmptyWorkspaceOwnerProps, HeroAgentPresetOwnerProps, HeroBrandMarkOwnerProps, InputControlOwnerProps, InputZone, MessageImageLoader, MessageImageSource, MessageImagesOwnerProps, RenderMessageImages, UseConversation, UseConversationViews, } from './contract/slots.ts';
25
26
  export type { ArbitrateKey, ArbitrateOutcome, BeginCommandRequest, CommandClaim, ConsumeTokenRequest, DraftAttachmentId, InputActions, InputState, InsertReferenceRequest, InsertTextRequest, PickOutcome, ReferenceInsert, SessionInput, SessionInputResolver, SubmitAttachment, SubmitOutcome, TokenSpan, } from './contract/input.ts';
26
27
  export type { ComposerBlock, ComposerBlocks } from './contract/composer-blocks.ts';
27
28
  declare module '@deepseek-ai/cordis' {
@@ -1,7 +1,7 @@
1
1
  /**
2
- * Composer submission policy. It owns the live busy-Enter
3
- * preference and resolves keyboard gestures into queue/steer delivery modes;
4
- * Host and Agent keep the actual delivery-window authority.
2
+ * Composer submission policy. It owns the live busy-Enter preference and
3
+ * resolves submission gestures into queue/steer delivery modes; Host and
4
+ * Agent keep the actual delivery-window authority.
5
5
  */
6
6
  import { type SnapshotStore } from '@deepseek-ai/dsh-client-store';
7
7
  import type { SettingsScope } from '@deepseek-ai/dsh-client-ui-settings/client';
@@ -9,12 +9,25 @@ import type { BusyEnterBehavior, ComposerSubmitGesture, InputSubmitMode } from '
9
9
  import type { ConversationSettings } from '../../submission-settings.ts';
10
10
  export { DEFAULT_BUSY_ENTER_BEHAVIOR } from '../../submission-settings.ts';
11
11
  /**
12
- * Busy-Enter policy used by both the composer inject face and its Settings row.
13
- * Direct `steer` is intentionally best-effort: AgentLoop turns a closed-window
14
- * submission into the next waking Queue item.
12
+ * Resolve one submission gesture against the busy-Enter preference. Plain
13
+ * Enter and the primary Send button share the `enter` gesture, so the button
14
+ * delivers exactly what Enter would. Direct `steer` is intentionally
15
+ * best-effort: AgentLoop turns a closed-window submission into the next waking
16
+ * Queue item.
17
+ * @param preferred - the live busy-Enter preference.
18
+ * @param running - whether the addressed agent currently reports busy.
19
+ * @param gesture - plain Enter (or the Send button) or the Cmd/Ctrl-accelerated chord.
20
+ * @param steeringAvailable - whether this session transport supports steering.
21
+ * @returns Queue outside steer-capable busy state; otherwise the preferred mode or its opposite.
22
+ */
23
+ export declare function resolveSubmitMode(preferred: BusyEnterBehavior, running: boolean, gesture: ComposerSubmitGesture, steeringAvailable: boolean): InputSubmitMode;
24
+ /**
25
+ * Busy-Enter preference shared by the composer bar inject face and its
26
+ * Settings row: one live store the bar's submission gestures and Send label
27
+ * read, backed by the Host user-settings document when one is composed.
15
28
  */
16
29
  export declare class ComposerSubmissionPolicy {
17
- /** Reactive preference source for the Settings row. */
30
+ /** Reactive preference source for the composer bar and the Settings row. */
18
31
  readonly busyEnter: SnapshotStore<BusyEnterBehavior>;
19
32
  private readonly host;
20
33
  /**
@@ -25,16 +38,8 @@ export declare class ComposerSubmissionPolicy {
25
38
  */
26
39
  constructor(host?: SettingsScope<ConversationSettings>);
27
40
  /**
28
- * Resolve one keyboard gesture without changing state.
29
- * @param running - whether the addressed agent currently reports busy.
30
- * @param gesture - plain Enter or the Cmd/Ctrl-accelerated chord.
31
- * @param steeringAvailable - whether this session transport supports steering.
32
- * @returns Queue outside steer-capable busy state; otherwise the preferred mode or its opposite.
33
- */
34
- resolve(running: boolean, gesture: ComposerSubmitGesture, steeringAvailable: boolean): InputSubmitMode;
35
- /**
36
- * Change the plain-Enter behavior used during busy state; the live value
37
- * publishes before the durable write starts.
41
+ * Change the busy-state submission behavior; the live value publishes
42
+ * before the durable write starts.
38
43
  * @param behavior - Queue or Steer.
39
44
  */
40
45
  setBusyEnter(behavior: BusyEnterBehavior): void;
@@ -16,6 +16,8 @@ export declare const zh: {
16
16
  'input.commands': string;
17
17
  'input.stop': string;
18
18
  'input.send': string;
19
+ 'input.send.queue': string;
20
+ 'input.send.steer': string;
19
21
  'input.accessMode': string;
20
22
  'attachment.pending': string;
21
23
  'attachment.scrollLeft': string;
@@ -178,6 +180,8 @@ export declare const en: {
178
180
  'input.commands': string;
179
181
  'input.stop': string;
180
182
  'input.send': string;
183
+ 'input.send.queue': string;
184
+ 'input.send.steer': string;
181
185
  'input.accessMode': string;
182
186
  'attachment.pending': string;
183
187
  'attachment.scrollLeft': string;
@@ -0,0 +1,9 @@
1
+ /** Root-scoped main occupant; Session binding belongs to its Conversation child. */
2
+ import type { PropsRenderSlots, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots';
3
+ /**
4
+ * Render the Conversation with optional current-Session binding.
5
+ * @param props - main-slot inputs and the declared Conversation renderer.
6
+ * @returns the Conversation subtree.
7
+ */
8
+ export declare function ConversationPanel({ renderSlot }: PropsRuntime<'main'> & PropsRenderSlots<'main.conversation'>): import("react").ReactNode;
9
+ //# sourceMappingURL=ConversationPanel.d.ts.map
@@ -14,5 +14,5 @@
14
14
  */
15
15
  import type { ComposerBarProps } from '../contract/slots.ts';
16
16
  export type InputBarProps = ComposerBarProps;
17
- export declare const InputBar: import("react").MemoExoticComponent<({ useSession, useInput, inputActions, keyboard, addFiles, removeAttachment, resolveDraftAttachments, retryFileUpload, resolveSubmitMode, toggleCommandMenu, stop, command, t, renderSlot, useFileUploads, useNotices, useLexicon, useMenuLauncher, useProjection, sessionId, variant, disabled: inert, blocked, workspacePickerOpen, onRequestWorkspace, placeholder, accessory, }: InputBarProps) => import("react").JSX.Element>;
17
+ export declare const InputBar: import("react").MemoExoticComponent<({ useSession, useInput, inputActions, keyboard, addFiles, removeAttachment, resolveDraftAttachments, retryFileUpload, toggleCommandMenu, stop, command, t, renderSlot, useBusyEnter, useFileUploads, useNotices, useLexicon, useMenuLauncher, useProjection, sessionId, variant, disabled: inert, blocked, workspacePickerOpen, onRequestWorkspace, placeholder, accessory, }: InputBarProps) => import("react").JSX.Element>;
18
18
  //# sourceMappingURL=InputBar.d.ts.map
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@deepseek-ai/dsh-client-ui-conversation",
3
3
  "description": "Target-neutral Conversation assembly, shell, composer, queue, and view navigation",
4
- "version": "0.1.3-alpha.2",
4
+ "version": "0.1.5-alpha.2",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -42,12 +42,6 @@
42
42
  },
43
43
  "license": "MIT",
44
44
  "dependencies": {
45
- "clsx": "^2.0.0",
46
- "@lexical/history": "^0.49.0",
47
- "@lexical/plain-text": "^0.49.0",
48
- "@lexical/text": "^0.49.0",
49
- "@lexical/utils": "^0.49.0",
50
- "lexical": "^0.49.0",
51
45
  "@deepseek-ai/schemastery": "^3.18.2"
52
46
  },
53
47
  "peerDependencies": {
@@ -60,36 +54,42 @@
60
54
  "react-dom": "^18.2.0",
61
55
  "@types/react-dom": "~18.3.0",
62
56
  "zod": "^4.4.3",
57
+ "lexical": "^0.49.0",
58
+ "clsx": "^2.0.0",
59
+ "@lexical/utils": "^0.49.0",
60
+ "@lexical/text": "^0.49.0",
61
+ "@lexical/plain-text": "^0.49.0",
62
+ "@lexical/history": "^0.49.0",
63
63
  "@deepseek-ai/cordis": "^4.0.2",
64
- "@deepseek-ai/dsh-api-remotes": "^0.1.3-alpha.2",
65
- "@deepseek-ai/dsh-api-session-controller": "^0.1.3-alpha.2",
66
- "@deepseek-ai/dsh-api-workspace-controller": "^0.1.3-alpha.2",
67
- "@deepseek-ai/dsh-attachment": "^0.1.3-alpha.2",
68
- "@deepseek-ai/dsh-brand": "^0.1.3-alpha.2",
69
- "@deepseek-ai/dsh-client-locale": "^0.1.3-alpha.2",
70
- "@deepseek-ai/dsh-client-file-upload": "^0.1.3-alpha.2",
71
- "@deepseek-ai/dsh-client-store": "^0.1.3-alpha.2",
72
- "@deepseek-ai/dsh-client-test-runtime": "^0.1.3-alpha.2",
73
- "@deepseek-ai/dsh-client-ui-layout": "^0.1.3-alpha.2",
74
- "@deepseek-ai/dsh-client-ui-renderer": "^0.1.3-alpha.2",
75
- "@deepseek-ai/dsh-client-ui-session": "^0.1.3-alpha.2",
76
- "@deepseek-ai/dsh-client-ui-settings": "^0.1.3-alpha.2",
77
- "@deepseek-ai/dsh-client-ui-workspace": "^0.1.3-alpha.2",
78
- "@deepseek-ai/dsh-client-ui-slots": "^0.1.3-alpha.2",
79
- "@deepseek-ai/dsh-client-ui-primitives": "^0.1.3-alpha.2",
80
- "@deepseek-ai/dsh-commands": "^0.1.3-alpha.2",
81
- "@deepseek-ai/dsh-goal": "^0.1.3-alpha.2",
82
- "@deepseek-ai/dsh-llm": "^0.1.3-alpha.2",
83
- "@deepseek-ai/dsh-llm-retry": "^0.1.3-alpha.2",
84
- "@deepseek-ai/dsh-permission-presets": "^0.1.3-alpha.2",
85
- "@deepseek-ai/dsh-plan-mode": "^0.1.3-alpha.2",
86
- "@deepseek-ai/dsh-session": "^0.1.3-alpha.2",
87
- "@deepseek-ai/dsh-token-meter": "^0.1.3-alpha.2",
88
- "@deepseek-ai/dsh-tool-todo": "^0.1.3-alpha.2",
89
- "@deepseek-ai/dsh-util-crypto": "^0.1.3-alpha.2",
90
- "@deepseek-ai/dsh-workspace": "^0.1.3-alpha.2",
91
- "@deepseek-ai/dsh-util-workspace-path": "^0.1.3-alpha.2",
92
- "@deepseek-ai/dsh-settings": "^0.1.3-alpha.2"
64
+ "@deepseek-ai/dsh-api-session-controller": "^0.1.5-alpha.2",
65
+ "@deepseek-ai/dsh-api-remotes": "^0.1.5-alpha.2",
66
+ "@deepseek-ai/dsh-attachment": "^0.1.5-alpha.2",
67
+ "@deepseek-ai/dsh-api-workspace-controller": "^0.1.5-alpha.2",
68
+ "@deepseek-ai/dsh-client-locale": "^0.1.5-alpha.2",
69
+ "@deepseek-ai/dsh-client-file-upload": "^0.1.5-alpha.2",
70
+ "@deepseek-ai/dsh-client-store": "^0.1.5-alpha.2",
71
+ "@deepseek-ai/dsh-client-test-runtime": "^0.1.5-alpha.2",
72
+ "@deepseek-ai/dsh-client-ui-layout": "^0.1.5-alpha.2",
73
+ "@deepseek-ai/dsh-client-ui-primitives": "^0.1.5-alpha.2",
74
+ "@deepseek-ai/dsh-client-ui-renderer": "^0.1.5-alpha.2",
75
+ "@deepseek-ai/dsh-client-ui-session": "^0.1.5-alpha.2",
76
+ "@deepseek-ai/dsh-client-ui-settings": "^0.1.5-alpha.2",
77
+ "@deepseek-ai/dsh-client-ui-workspace": "^0.1.5-alpha.2",
78
+ "@deepseek-ai/dsh-client-ui-slots": "^0.1.5-alpha.2",
79
+ "@deepseek-ai/dsh-commands": "^0.1.5-alpha.2",
80
+ "@deepseek-ai/dsh-goal": "^0.1.5-alpha.2",
81
+ "@deepseek-ai/dsh-llm": "^0.1.5-alpha.2",
82
+ "@deepseek-ai/dsh-llm-retry": "^0.1.5-alpha.2",
83
+ "@deepseek-ai/dsh-permission-presets": "^0.1.5-alpha.2",
84
+ "@deepseek-ai/dsh-plan-mode": "^0.1.5-alpha.2",
85
+ "@deepseek-ai/dsh-session": "^0.1.5-alpha.2",
86
+ "@deepseek-ai/dsh-token-meter": "^0.1.5-alpha.2",
87
+ "@deepseek-ai/dsh-tool-todo": "^0.1.5-alpha.2",
88
+ "@deepseek-ai/dsh-util-crypto": "^0.1.5-alpha.2",
89
+ "@deepseek-ai/dsh-brand": "^0.1.5-alpha.2",
90
+ "@deepseek-ai/dsh-workspace": "^0.1.5-alpha.2",
91
+ "@deepseek-ai/dsh-util-workspace-path": "^0.1.5-alpha.2",
92
+ "@deepseek-ai/dsh-settings": "^0.1.5-alpha.2"
93
93
  },
94
94
  "files": [
95
95
  "lib/index.js",