@deepseek-ai/dsh-client-ui-conversation 0.1.7-rc.1 → 0.1.7-rc.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.
- package/README.i18n.yaml +36 -5
- package/README.md +9 -3
- package/README.zh.md +9 -3
- package/lib/client.js +306 -14
- package/lib/types/client/contract/slots.d.ts +2 -0
- package/lib/types/client/conversation/assembler.d.ts +5 -0
- package/lib/types/client/conversation/assembly.d.ts +6 -0
- package/lib/types/client/input/editor/keymap.d.ts +1 -1
- package/lib/types/client/locales.d.ts +32 -0
- package/lib/types/client/skeleton/InputBar.d.ts +1 -1
- package/lib/types/client/stop-sequence.d.ts +32 -0
- package/lib/types/client/stop-shortcut.d.ts +17 -0
- package/lib/types/client/view-selection.d.ts +2 -2
- package/package.json +33 -32
package/README.i18n.yaml
CHANGED
|
@@ -1,6 +1,37 @@
|
|
|
1
|
-
# Bilingual-pair consistency record (docs/i18n/README.md):
|
|
2
|
-
#
|
|
3
|
-
#
|
|
1
|
+
# Bilingual-pair consistency record for README.md (docs/i18n/README.md): per heading
|
|
2
|
+
# section, a hash of its English and Chinese blocks outside code blocks and generated regions.
|
|
3
|
+
# After editing either side, bring the other along and re-record with:
|
|
4
4
|
# pnpm run verify-translation-pairing --write packages/client/ui-conversation/README.md
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
/:
|
|
6
|
+
en: 0ca51f37788dcbdb
|
|
7
|
+
zh: 14d73c6bc8d4e17f
|
|
8
|
+
/deepseek-ai-dsh-client-ui-conversation:
|
|
9
|
+
en: 71d52109076d859d
|
|
10
|
+
zh: 8e63171fbd9bde48
|
|
11
|
+
/deepseek-ai-dsh-client-ui-conversation/summary:
|
|
12
|
+
en: bac0bf0d7330f3b1
|
|
13
|
+
zh: 84a895f4b26d8490
|
|
14
|
+
/deepseek-ai-dsh-client-ui-conversation/table-of-contents:
|
|
15
|
+
en: 9c1c4905952fea5e
|
|
16
|
+
zh: d1506dd6fc1018d1
|
|
17
|
+
/deepseek-ai-dsh-client-ui-conversation/conversation-assembly:
|
|
18
|
+
en: 13ae68865fa315d7
|
|
19
|
+
zh: c152f020abf20f35
|
|
20
|
+
/deepseek-ai-dsh-client-ui-conversation/shell-and-standard-props:
|
|
21
|
+
en: ea2f1e81b1f9a38a
|
|
22
|
+
zh: a2d4745b3e93e5a9
|
|
23
|
+
/deepseek-ai-dsh-client-ui-conversation/temporary-composer-entries:
|
|
24
|
+
en: bb1244310f5c0382
|
|
25
|
+
zh: 824b84077432b559
|
|
26
|
+
/deepseek-ai-dsh-client-ui-conversation/model-experience:
|
|
27
|
+
en: e0a05b73ba3e4318
|
|
28
|
+
zh: dc85ab8433bb4456
|
|
29
|
+
/deepseek-ai-dsh-client-ui-conversation/model-experience/kv-cache-effect:
|
|
30
|
+
en: 9f4e0da7c8addf88
|
|
31
|
+
zh: 1a33d9981af75643
|
|
32
|
+
/deepseek-ai-dsh-client-ui-conversation/known-limitations-and-deferred-work:
|
|
33
|
+
en: 38d243630d0e4c38
|
|
34
|
+
zh: a58cdc35b664020b
|
|
35
|
+
/deepseek-ai-dsh-client-ui-conversation/known-limitations-and-deferred-work/dev-note:
|
|
36
|
+
en: 48c7f1797012293f
|
|
37
|
+
zh: ec56b609a1b5fb9e
|
package/README.md
CHANGED
|
@@ -27,6 +27,8 @@ English | [中文](README.zh.md)
|
|
|
27
27
|
|
|
28
28
|
`UiConversation.events` is the single registry for event Definitions, and `UiConversation.views` is the single registry for target snapshot builders. Both registries reject duplicate keys, preserve registration order, return idempotent disposers, and rebuild existing bindings when their contribution roster changes. `UiConversation.binding(bindingOrSessionId)` returns one identity-stable Conversation binding for the current Session Controller binding. It does not open another event source. A View Definition may declare `toolCallFocus` to translate a tool-call id into its focus identity. Conversation supplies an Inspect callback only while such a target has a visible View entry; Chat consumes this callback without selecting a target.
|
|
29
29
|
|
|
30
|
+
`ConversationBinding.openTurn` is an identity-stable, read-only source of the latest turn number when its start is loaded and it remains open, or `undefined` otherwise. Observed turn changes publish synchronously even when no View is active. Fixed stop input reads this source alongside Session running and pending-interaction state. Unloading the Session binding detaches its event-source subscription.
|
|
31
|
+
|
|
30
32
|
The adapter passes each `SessionEventLikeEntry` directly to the assembler. Its outer `type` distinguishes durable events from Client-only transient events, while its inner `event` always exposes `type`, `seq`, `time`, and `data`; Definitions receive that inner `SessionEventLike`. Replacement windows may include both entry variants, while historical prepends carry durable entries and live appends may carry either. Definitions use the same match/start/update interface for durable and transient events. The earliest loaded start initializes State; every later Match, including another start for that identity, updates it. Definitions that do not consume Assistant deltas return `null` for `assistant/live-chunk`. Replacement windows and revision gaps rebuild from the complete loaded window; contiguous append, prepend, and Assistant-settlement revisions use incremental assembly. Settlement removes only the named attempt's transient matches, applies its optional durable entry, and recomputes the affected Contexts from their remaining earliest start, refreshing predecessor indexes and dependents without replacing unrelated target nodes. A Context with no remaining start has no State. Its key and previously published nodes remain available to later evidence until a full window rebuild; the owning Definition may hide those nodes. The assembler owns Context matching, Turn/Step locations, target node materialization, target activity, and stable target sources. `ConversationSnapshot` contains only target-neutral views and active-target facts; Session lifecycle state remains in `SessionSnapshot`.
|
|
31
33
|
|
|
32
34
|
A target becomes active when shell selection resolves it or when its source receives a first subscriber. The assembler replaces that target from current Contexts once and keeps it active for later incremental flushes; creating a source does not activate it and unsubscription does not deactivate it.
|
|
@@ -46,11 +48,11 @@ The composer measures its expanded control groups after size, content, visibilit
|
|
|
46
48
|
|
|
47
49
|
The context-occupancy button shows a ring and percentage below the input card, after the Session statistics. Clicking it opens the token breakdown in a panel kept inside the viewport, including when no statistics are shown; the button stays hidden until context usage and capacity are available.
|
|
48
50
|
|
|
49
|
-
With
|
|
51
|
+
With Coding Tools off, the shell hides only Trajectory; other plugin-contributed Views remain available. The View tab bar is hidden when fewer than two Views are available. Turning Coding Tools off while Trajectory is active returns to Chat; stored View preferences and recorded Session data remain intact. Turning it on makes Trajectory available again. View owners receive the available roster so their navigation actions can follow the same visibility.
|
|
50
52
|
|
|
51
53
|
The composer registers the File command action and owns its label, availability, and native file-dialog callback. Menu availability and invocation both consult the mounted composer's current attachment-intake policy. Unmounting or locking the composer disables that action; disposing the plugin removes its registration. The callback binding stays inside the input module.
|
|
52
54
|
|
|
53
|
-
`SessionInputShell` owns one Lexical editor per Session through its private [DraftEditorRuntime](src/client/input/editor/runtime.ts), while retaining submission, attachment selection, and recovery decisions. [DraftEditor](src/client/input/editor/DraftEditor.tsx) renders the borrowed editor; InputBar retains its Hooks and refs and installs DOM behavior through [view-binding](src/client/input/editor/view-binding.ts). Editor-facing types live in [draft-editor.ts](src/client/contract/draft-editor.ts), with shared input and submission types in [input.ts](src/client/contract/input.ts). This separation does not support simultaneous editable roots for one Session; [the two-stage isolation proposal](../../../.agents/notes/proposed/architecture/2026-09-14-composer-model-and-draft-editor.md) defines the remaining work.
|
|
55
|
+
`SessionInputShell` owns one Lexical editor per Session through its private [DraftEditorRuntime](src/client/input/editor/runtime.ts), while retaining submission, attachment selection, and recovery decisions. [DraftEditor](src/client/input/editor/DraftEditor.tsx) renders the borrowed editor; InputBar retains its Hooks and refs and installs DOM behavior through [view-binding](src/client/input/editor/view-binding.ts). Editor-facing types live in [draft-editor.ts](src/client/contract/draft-editor.ts), with shared input and submission types in [input.ts](src/client/contract/input.ts). Background editor updates retain the draft selection without changing the document selection or reclaiming focus from another control; explicit Composer focus restores its selection. This separation does not support simultaneous editable roots for one Session; [the two-stage isolation proposal](../../../.agents/notes/proposed/architecture/2026-09-14-composer-model-and-draft-editor.md) defines the remaining work.
|
|
54
56
|
|
|
55
57
|
Claimed commands retain their identity and highlight when only their arguments and trailing separator are deleted; editing the command name releases the claim. The same rules apply to every command and locale, including `/goal`, `/目标`, `/plan`, and `/计划`. Command hints and ordinary placeholders remain hidden throughout IME composition and reappear only after the editor commits the final text and the corresponding input is empty.
|
|
56
58
|
|
|
@@ -58,7 +60,7 @@ Workspace selection uses `uiWorkspace.openWorkspace` to prepare the target and c
|
|
|
58
60
|
|
|
59
61
|
The package occupies the root-scoped `main` key `conversation`. Its `main.conversation` shell keeps the resident `conversation.header` outside the optional-Session `conversation.content` Component Factory. The header hosts root-scoped navigation without a selected Session; titles, actions, and View tabs remain in its strict Session child. The Factory owns the shared body and Composer, reads the current Session through its standard Hook, and exposes strict-Session `views` plus root-scoped `widthControls` local positions. Its default adapter renders the existing `conversation.session` entry, while the main occurrence selects the width handles; an embedded occurrence can replace `views` and omit those handles without rendering the main Header. The shared body and Composer register the queue and Todo docks. The Todo dock uses the shared panel elevation above the composer; its rows use the shared idle, ongoing, and done markers for pending, in-progress, and completed items. `ctx.uiSession.provide()` materializes the Conversation and input sources from the same Session binding and supplies `inputActions` as a stable standard prop.
|
|
60
62
|
|
|
61
|
-
A blank Session retains the header's leading and corner controls, including the right-sidebar opener, while hiding its title, actions, utilities, and View tabs. Selecting a Workspace creates the Session needed by these controls; the first message is not required. Without a selected Session, the strict header is absent; the resident
|
|
63
|
+
A blank Session retains the header's leading and corner controls, including the right-sidebar opener, while hiding its title, actions, utilities, and View tabs. Selecting a Workspace creates the Session needed by these controls; the first message is not required. Without a selected Session, the strict header is absent; the resident header keeps a 40px window strip on macOS desktop that it owns as its drag row, and no empty vertical space on Web, Windows, or Linux. Sidebar entries retain their own data and execution prerequisites. A started Session header uses one row when fewer than two Views are available; the tab row reserves space only while rendered.
|
|
62
64
|
|
|
63
65
|
View selection is deterministic: a registered persisted selection wins, otherwise registered `chat` wins, otherwise no View renders. It never chooses the first registered View. Shell phase combines Session lifecycle with the active-target set; no target-specific snapshot is read by the shell.
|
|
64
66
|
|
|
@@ -70,6 +72,8 @@ The width-handle indicator follows the pointer only during a captured drag; ordi
|
|
|
70
72
|
|
|
71
73
|
The resident composer survives no-Session and Session transitions. Whitespace hides its placeholder; a whitespace-only draft without attachments cannot be sent. The no-Session state keeps the same composer surface mounted but inert while the Workspace picker connects a blank Session. The surface is a shell-owned Lexical editor: reference chips are atomic decorator nodes carrying the owner's serialization identity (submission expands them through the owner codec), claimed slash commands stay styled leading text, folder text references carry the folder glyph as an icon prefix, and the draft's clipboard projection is mirrored into the per-Session Conversation store. QueueDock reads `next-turn` from the Session `inbox` projection, including cold recovered messages, and excludes only requestIds still owned by local transcript submissions. Other queued rows retain their normal display and actions. Queue operations address exact queue occurrences through the scoped `ctx.conversation` service; queue previews render sent text through the shared inline reference projection from `ui-primitives` (wire session forms fold to their label) and show local or durable images and files in original attachment order. Images use thumbnails; files use compact name-and-size cards. An edit exposes the literal sent text in a textarea that grows with its content, so line breaks survive re-editing; Enter saves, Shift+Enter breaks the line, and Escape cancels. Durable thumbnails resolve through the session image URL cache. Busy Enter behavior is stored in the Host-backed `ui-conversation` settings namespace. The composer keymap arbitrates the trigger menu's keys through the slash pipeline — Tab settles the highlighted completion (or drills a drillable one), Escape and Shift+Tab leave the menu without settling — and leaves every other key to the editor. An overlay that takes the keyboard hands it back through `SessionInput.focus()`, which rides Lexical's own focus so the caret returns where the draft left it rather than at the start.
|
|
72
74
|
|
|
75
|
+
Plain Enter uses the configured delivery mode, exactly Ctrl+Enter or Cmd+Enter uses its complement, and Shift+Enter inserts a line break. Enter with Alt, AltGraph, both Ctrl and Cmd, or Shift plus Ctrl/Cmd leaves the draft and command menu unchanged and keeps the DOM event available to application shortcuts. The Conversation plugin registers the fixed send, newline, complementary-delivery, command-menu, and reference-menu rows and reserves their bindings until it unloads.
|
|
76
|
+
|
|
73
77
|
Default sends commit optimistically: Enter clears the draft, occurrence table, and undo history in the same transaction, keeps the composer in `plain`, and runs the send as a detached attempt, so typing and further sends continue during the flight. `sendSession` registers a Session submission echo (`session.beginSubmission`) with the delivery mode before serializing, preserving selected image and file order in `pendingSubmissions`; Session derives the placement from that mode and its current running state, so idle sends use the transcript, busy Queue sends use QueueDock, and busy Steer sends use the pending-steering surface. It then yields one paint, encodes images through the browser's native `FileReader` data-URL path, and cites staged file receipts. Command submissions use the same receipts for generic files, so sending `/goal` or `/plan` never reads those browser files again. The prompt reuses the submission `requestId`; Session retires the echo once at its display handoff, correlated by that `rpcId`. Concurrent failures are restored together in submission order until the user edits the restored content; command submissions keep the frozen `submitting` phase. Detached attempts retain their attachment ids through admission and Session scope disposal. An observed retirement immediately exposes each image preview through the durable cache, replaces it with the canonical URL after fetching the admitted attachment, revokes each URL after its use ends, and releases file cards. Selected generic files enter one FIFO background-upload queue; `maxConcurrentFileUploads` defaults to two active Worker transports, the Conversation service retains queued and active operations plus byte progress across Session navigation, and removing a draft skips its queued transfer or aborts its active transport. Where the browser shell exposes `__DSH_HOST_PATHS__` (the Desktop application), dropped or pasted folders and dropped, picked, or pasted non-image files with a real path become `@path` chips; images keep uploading. Drag-and-drop and paste identify directories through the browser entry API; when that API is absent or returns no entry, pasted items retain ordinary file handling. The file picker cannot select directories. References require the `ui-reference` plugin and the original paths to remain readable by the model's file tools. Paths inside the workspace are relative; others remain absolute. The whole batch is validated before insertion, retains source order and selected text, and uses whitespace-separated, closed-quote mentions. A browser without the bridge refuses dropped or pasted folders; a Desktop folder without a reported path is rejected separately. Continuable subagents disable attachment intake and skip local echoes because their transport does not preserve the browser request id.
|
|
74
78
|
|
|
75
79
|
Queued submission echoes show “Sending…” beside disabled edit, remove, and steer buttons; a collapsed dock keeps the sending status in its header. A matching Host queue row replaces the echo and enables each action according to its normal text-content and running-state requirements. Prompt acknowledgement alone does not enable queue actions. A failed submission removes its echo and displays an error; the composer restores the failed draft when it is empty or still contains the previous automatic restoration, preserving subsequently typed text.
|
|
@@ -80,6 +84,8 @@ File chips and editable skill references share a whole-reference hover backgroun
|
|
|
80
84
|
|
|
81
85
|
When another writer owns the Session, the send-error toast asks the user to quit other running DSH instances and retry.
|
|
82
86
|
|
|
87
|
+
Two independent Escape presses in the focused Chat or Composer stop its current running turn and preserve queued messages. The interval comes from the shortcuts plugin’s `stopSequenceMs` configuration (500 ms by default). A menu, approval, modal, terminal, embedded webpage, composition, repeated key, changed input region, Session or turn breaks the sequence. The shortcut uses the same scoped cancellation as the Stop button. The plugin registers Stop as a fixed action in the `input` display group. Its registration reserves plain Escape against editable shortcuts and supplies the `Esc Esc` sequence shown in the Stop button’s hover and keyboard-focus tooltip.
|
|
88
|
+
|
|
83
89
|
<a id="temporary-composer-entries"></a>
|
|
84
90
|
## Temporary composer entries
|
|
85
91
|
|
package/README.zh.md
CHANGED
|
@@ -27,6 +27,8 @@ kind: "package-reference"
|
|
|
27
27
|
|
|
28
28
|
`UiConversation.events` 是 event Definition 的唯一 registry,`UiConversation.views` 是 target snapshot builder 的唯一 registry。两者都拒绝重复 key、保持注册顺序、返回幂等 disposer,并在 contribution roster 变化时重建现有 binding。`UiConversation.binding(bindingOrSessionId)` 为当前 Session Controller binding 返回 identity 稳定的 Conversation binding,不会另开事件源。 View Definition 可以声明 `toolCallFocus`,将工具调用 id 转换为自身的焦点标识。仅当此目标拥有可见的 View 条目时,Conversation 才提供 Inspect 回调;Chat 直接使用回调,不选择目标。
|
|
29
29
|
|
|
30
|
+
`ConversationBinding.openTurn` 是对象标识稳定的只读来源:最新轮次的开始事件已加载且尚未结束时提供其编号,否则为 `undefined`。观察到的轮次变化同步发布,即使没有活动视图也是如此。固定停止输入同时读取这个来源、会话运行状态和待处理交互状态。卸载会话绑定会解除其事件源订阅。
|
|
31
|
+
|
|
30
32
|
适配器把每个 `SessionEventLikeEntry` 直接交给 assembler。外层 `type` 区分持久事件与 Client-only transient event,内部 `event` 则统一公开 `type`、`seq`、`time` 与 `data`;Definition 接收这个内部 `SessionEventLike`。replacement window 可以包含两种 entry,历史 prepend 携带持久 entry,实时 append 则可以携带任一种。持久与瞬态事件使用同一组 match/start/update 接口。当前最早的 start 初始化 State;后续所有 Match,包括同一身份的其他 start,都用于更新。不消费 Assistant delta 的 Definition 对 `assistant/live-chunk` 返回 `null`。replace window 或 revision 断档从完整已加载窗口重建;连续 revision 的 append、prepend 与 Assistant settlement 使用增量组装。settlement 只删除具名 attempt 的 transient match,应用可选持久 entry,并从剩余最早的 start 重算受影响的 Context,刷新前序索引及 dependent,不替换无关 target node。没有剩余 start 的 Context 不保留 State,但其 key 和已发布节点仍保留,供后续证据复用,直到完整窗口重建;所属 Definition 可以隐藏这些节点。assembler 拥有 Context 匹配、Turn/Step location、target node 物化、target activity 和稳定 target source。`ConversationSnapshot` 只包含与 target 无关的 View 与 active-target 事实;Session lifecycle 状态仍属于 `SessionSnapshot`。
|
|
31
33
|
|
|
32
34
|
shell 选择解析出 target 或 target source 收到首个 subscriber 时,该 target 进入 active 状态。assembler 从当前 Context 对它执行一次 replace,并使它参与后续增量 flush;创建 source 不会激活 target,取消订阅也不会停用 target。
|
|
@@ -46,11 +48,11 @@ target package 通过 declaration merge 扩展 snapshot 与 Location data map,
|
|
|
46
48
|
|
|
47
49
|
上下文占用按钮在输入卡片下方、会话统计右侧显示圆环和百分比。点击按钮可在视口内的面板查看 token 构成,没有统计项时面板也不会越界;上下文用量和容量尚不可用时,按钮保持隐藏。
|
|
48
50
|
|
|
49
|
-
|
|
51
|
+
关闭代码工作工具时,外壳仅隐藏 Trajectory;其他插件贡献的 View 仍然可用。可用 View 少于两个时隐藏 View 标签栏。在 Trajectory 激活时关闭代码工作工具会返回 Chat;已保存的 View 偏好和 Session 记录保持不变。开启后,Trajectory 恢复可用。View 所有者接收可用列表,使导航操作跟随相同的可见性。
|
|
50
52
|
|
|
51
53
|
输入框注册「文件」命令动作,负责其标题、可用性和原生文件选择器回调。菜单可用性与实际调用都读取已挂载输入框当前的附件接收策略。输入框卸载或锁定后该动作不可用,插件 dispose(资源释放)时移除注册。回调绑定留在输入模块内部。
|
|
52
54
|
|
|
53
|
-
`SessionInputShell` 通过私有 [DraftEditorRuntime](src/client/input/editor/runtime.ts) 为每个 Session 持有一个 Lexical editor,同时保留提交、附件选择和恢复决策。[DraftEditor](src/client/input/editor/DraftEditor.tsx) 呈现借用的 editor;InputBar 保留钩子与 refs,并通过 [view-binding](src/client/input/editor/view-binding.ts) 安装 DOM 行为。编辑器类型位于 [draft-editor.ts](src/client/contract/draft-editor.ts),共享输入和提交类型位于 [input.ts](src/client/contract/input.ts)
|
|
55
|
+
`SessionInputShell` 通过私有 [DraftEditorRuntime](src/client/input/editor/runtime.ts) 为每个 Session 持有一个 Lexical editor,同时保留提交、附件选择和恢复决策。[DraftEditor](src/client/input/editor/DraftEditor.tsx) 呈现借用的 editor;InputBar 保留钩子与 refs,并通过 [view-binding](src/client/input/editor/view-binding.ts) 安装 DOM 行为。编辑器类型位于 [draft-editor.ts](src/client/contract/draft-editor.ts),共享输入和提交类型位于 [input.ts](src/client/contract/input.ts)。编辑器后台更新会保留草稿选区,不修改文档选区或从其他控件夺回焦点;显式聚焦 Composer 时恢复其选区。这一拆分不支持同一 Session 同时挂载多个可编辑 root;[两阶段隔离提案](../../../.agents/notes/proposed/architecture/2026-09-14-composer-model-and-draft-editor.zh.md) 定义剩余工作。
|
|
54
56
|
|
|
55
57
|
已认领的命令在仅删除参数和末尾分隔空格时保留身份与高亮,改动命令名才会释放认领。所有命令和语言使用相同规则,包括 `/goal`、`/目标`、`/plan` 和 `/计划`。输入法组合输入期间,命令提示和普通占位文字持续隐藏,直到编辑器提交最终文字且对应输入为空时才重新显示。
|
|
56
58
|
|
|
@@ -58,7 +60,7 @@ target package 通过 declaration merge 扩展 snapshot 与 Location data map,
|
|
|
58
60
|
|
|
59
61
|
本包占据 root 作用域 `main` 中的 `conversation` key。其 `main.conversation` 外壳将常驻的 `conversation.header` 放在可选 Session 的 `conversation.content` Component Factory 外。未选中 Session 时,头部仍承载根作用域导航;标题、操作和 View 标签保留在严格 Session 子组件中。Factory 拥有共享正文与 Composer,通过其标准 Hook 读取当前 Session,并公开 strict-Session `views` 与 root-scoped `widthControls` 两个局部位置。默认 adapter 渲染现有 `conversation.session` entry,主 occurrence 选择宽度拖拽条;嵌入式 occurrence 可以替换 `views`、省略拖拽条,且不渲染主 Header。共享正文与 Composer 注册 queue dock 和 Todo dock。Todo dock 在 composer 上方使用共享面板 elevation;其中的行分别以共享 idle、ongoing 与 done 标记表示待处理、进行中与已完成。`ctx.uiSession.provide()` 从同一个 Session binding 物化 Conversation 与 input source,并将 `inputActions` 作为稳定标准 prop 提供。
|
|
60
62
|
|
|
61
|
-
blank Session 保留 header 的 leading 与 corner 控件,包括右侧栏展开入口,同时隐藏标题、actions、utilities 和 View tabs。选择 Workspace 会创建这些控件所需的 Session,无需先发送消息。没有选中 Session 时,strict header
|
|
63
|
+
blank Session 保留 header 的 leading 与 corner 控件,包括右侧栏展开入口,同时隐藏标题、actions、utilities 和 View tabs。选择 Workspace 会创建这些控件所需的 Session,无需先发送消息。没有选中 Session 时,strict header 不挂载;常驻 header 在 macOS 桌面保留 40px 的窗口顶条,由它自己作为拖拽行持有,在 Web、Windows 或 Linux 上不预留空白高度。侧栏各入口仍遵循自身的数据与执行环境要求。 已开始的 Session 在可用 View 少于两个时使用单行标题栏,仅在渲染标签行时保留其高度。
|
|
62
64
|
|
|
63
65
|
View 选择规则固定:有效且已注册的持久化选择优先,其次是已注册的 `chat`,否则不渲染 View;绝不选择第一个已注册 View。Shell phase 只组合 Session lifecycle 与 active-target set,不读取任何 target-specific 快照。
|
|
64
66
|
|
|
@@ -70,6 +72,8 @@ Session 首次绑定或缓存的 Session 成为 current 时,shell 会在渲染
|
|
|
70
72
|
|
|
71
73
|
常驻 composer 在无 Session 与有 Session 之间保持挂载。输入空白字符会隐藏占位提示;没有附件的纯空白草稿无法发送。无 Session 时,同一个编辑器表面保持 inert,Workspace picker 连接 blank Session。该表面是 shell 所有的 Lexical 编辑器:引用 chip 是携带 owner 序列化身份的原子 decorator 节点(提交时经 owner codec 展开),已认领的 slash command 保持为带样式的行首文本,文件夹文本引用以图标前缀携带文件夹图形,草稿的剪贴板投影镜像到逐 Session Conversation store。QueueDock 从 Session 的 `inbox` 投影读取 `next-turn`,包含从冷状态恢复的消息,仅排除仍由本地 transcript 提交承接的 requestId。其他排队行保留正常展示和操作。Queue 操作通过 scoped `ctx.conversation` service 寻址准确的 queue occurrence;queue 预览经 `ui-primitives` 的共享行内引用投影渲染已发送文本(wire 会话形式折叠为其标签),并按原始附件顺序展示本地或持久化的图片和文件。图片使用缩略图,文件使用紧凑的名称与大小卡片。编辑态在可随内容增高的 textarea 中展示字面发送文本,因此重新编辑不会丢失换行;Enter 保存,Shift+Enter 换行,Escape 取消。持久化缩略图通过会话图片 URL 缓存解析。繁忙时 Enter 行为保存在 Host-backed `ui-conversation` settings namespace。 composer 键盘映射经斜杠流水线裁决触发菜单的按键——Tab 确认高亮补全项(可下钻项则下钻),Escape 与 Shift+Tab 离开菜单且不选定——其余按键交给编辑器自身。 接管键盘的浮层通过 `SessionInput.focus()` 把键盘还回来,该路径走 Lexical 自己的 focus,因此光标回到草稿原来的位置而不是开头。
|
|
72
74
|
|
|
75
|
+
普通 Enter 使用已配置的投递模式,严格的 Ctrl+Enter 或 Cmd+Enter 使用互补模式,Shift+Enter 插入换行。带 Alt、AltGraph、同时带 Ctrl 与 Cmd,或 Shift 与 Ctrl/Cmd 的 Enter 保持草稿和指令菜单不变,并将 DOM 事件留给应用快捷键。Conversation 插件注册发送、换行、互补投递、命令菜单和引用菜单的固定条目,并在卸载前保留这些键位。
|
|
76
|
+
|
|
73
77
|
默认发送采用乐观提交:Enter 在同一事务里清空草稿、occurrence 表和撤销历史,composer 保持 `plain`,发送作为 detached attempt 运行,发送期间可以继续输入和提交。`sendSession` 在序列化之前用投递模式注册 Session 提交回显(`session.beginSubmission`),并在 `pendingSubmissions` 中保留图片与文件的选择顺序;Session 根据该模式与当前运行状态推导位置,因此空闲发送进入 transcript(文本记录),繁忙时 Queue 进入 QueueDock,繁忙时 Steer 进入 pending-steering 区域。随后让出一帧,图片经浏览器原生 `FileReader` data-URL 路径编码,文件则引用已暂存凭证。命令提交也用同一凭证表示通用文件,因此发送 `/goal` 或 `/plan` 时不会再次读取这些浏览器文件。提示词复用提交 `requestId`;Session 按同一 `rpcId` 关联展示接管,并仅退休回显一次。多个并发发送失败时,在用户编辑还原内容之前按提交顺序合并还原;命令提交保持冻结的 `submitting` 阶段。Detached attempt 持有附件 id,直到 admission 完成或 Session scope 销毁。回显以 observed 退休时,durable 图片缓存立即公开每个预览 URL,读取 admitted 附件后用规范化 URL 替换预览,并在各 URL 停止使用后撤销,同时释放文件卡。选中的通用文件进入同一个先进先出的后台上传队列;`maxConcurrentFileUploads` 默认允许两个 Worker transport 同时运行,Conversation 服务在切换 Session 时继续持有排队和运行中的传输操作及字节进度,移除草稿会跳过排队中的传输或中止正在运行的传输。浏览器 shell 暴露 `__DSH_HOST_PATHS__` 时(桌面应用),拖入或粘贴的文件夹以及拖入、选择或粘贴的带真实路径的非图片文件会成为 `@路径` chip;图片仍然上传。拖放和粘贴通过浏览器 entry API 识别目录;该 API 不可用或没有返回 entry 时,粘贴项沿用普通文件处理。文件选择器不能选择目录。引用需要启用 `ui-reference` 插件,原路径也必须仍可由模型的文件工具读取。工作区内的路径使用相对形式,其他路径保留绝对形式。整批文件先校验再插入,保留来源顺序和已选中的文字,引用之间有空白分隔,含空格的路径使用闭合引号。没有该桥的浏览器会拒绝拖入或粘贴的文件夹,桌面端无法获取文件夹路径时单独报错。continuable 子代理禁用附件入口,也不创建本地回显,因为其 transport 不保留浏览器 request id。
|
|
74
78
|
|
|
75
79
|
排队提交的本地回显在禁用的编辑、删除、插话按钮旁显示“发送中…”;折叠后的队列在标题栏保留发送状态。匹配的 Host 队列行替换回显后,各操作按原有的纯文本内容和运行状态要求启用。仅收到提示词确认不会启用队列操作。提交失败会移除回显并显示错误;输入框为空或仍保留上一次自动恢复的内容时,composer 恢复失败草稿,保留用户随后输入的文字。
|
|
@@ -80,6 +84,8 @@ Send 和 Stop 按钮禁用时不显示提示气泡,轮次结束后由 Stop 切
|
|
|
80
84
|
|
|
81
85
|
当会话被其他写句柄占用时,发送失败的 toast 提示用户退出其他正在运行的 DSH 后重试。
|
|
82
86
|
|
|
87
|
+
在获得焦点的 Chat 或 Composer 中连续独立按下两次 Esc,可停止当前运行轮次并保留排队消息。间隔由 shortcuts 插件的 `stopSequenceMs` 配置决定,默认 500 ms。菜单、审批、模态层、终端、内嵌网页、输入法、重复按键,以及输入区域、Session 或轮次变化会清空序列。快捷键与 Stop 按钮调用同一作用域取消操作。插件将 Stop 注册为 `input` 展示分组中的固定操作。该注册使普通 Esc 不能分配给可编辑快捷键,并为 Stop 按钮的悬停和键盘聚焦提示提供 `Esc Esc` 序列。
|
|
88
|
+
|
|
83
89
|
<a id="temporary-composer-entries"></a>
|
|
84
90
|
## 临时 composer entry
|
|
85
91
|
|
package/lib/client.js
CHANGED
|
@@ -1908,6 +1908,16 @@ window.__ModuleLoader__.load({
|
|
|
1908
1908
|
this.resetViewBuilders();
|
|
1909
1909
|
}
|
|
1910
1910
|
/**
|
|
1911
|
+
* Read the current open turn without activating a View.
|
|
1912
|
+
* @returns the latest turn number when its start is loaded and it remains open, otherwise undefined.
|
|
1913
|
+
*/
|
|
1914
|
+
openTurn() {
|
|
1915
|
+
const snapshot = this.locationIndex.snapshot();
|
|
1916
|
+
const latest = snapshot.turnOrder.at(-1);
|
|
1917
|
+
const turn = latest === void 0 ? void 0 : snapshot.turns.get(latest);
|
|
1918
|
+
return turn?.status === "open" && turn.start !== void 0 ? turn.turn : void 0;
|
|
1919
|
+
}
|
|
1920
|
+
/**
|
|
1911
1921
|
* Replace the complete loaded window after open, resync, or gap repair.
|
|
1912
1922
|
* @param entries - complete contiguous window.
|
|
1913
1923
|
* @param hasMore - whether older history remains outside the window.
|
|
@@ -2910,6 +2920,7 @@ window.__ModuleLoader__.load({
|
|
|
2910
2920
|
var BoundConversation = class {
|
|
2911
2921
|
assembler;
|
|
2912
2922
|
snapshot;
|
|
2923
|
+
openTurn;
|
|
2913
2924
|
viewStore;
|
|
2914
2925
|
targetSources = /* @__PURE__ */ new Map();
|
|
2915
2926
|
revision = -1;
|
|
@@ -2919,6 +2930,7 @@ window.__ModuleLoader__.load({
|
|
|
2919
2930
|
this.assembler = assembler;
|
|
2920
2931
|
this.viewStore = assembler;
|
|
2921
2932
|
this.snapshot = (0, _deepseek_ai_dsh_client_store.createSnapshotStore)(this.currentSnapshot());
|
|
2933
|
+
this.openTurn = (0, _deepseek_ai_dsh_client_store.createSnapshotStore)(assembler.openTurn());
|
|
2922
2934
|
this.replace(feed.getSnapshot());
|
|
2923
2935
|
this.disposeFeed = feed.subscribe(() => {
|
|
2924
2936
|
this.accept(feed.getSnapshot());
|
|
@@ -2942,6 +2954,7 @@ window.__ModuleLoader__.load({
|
|
|
2942
2954
|
}
|
|
2943
2955
|
activate(target) {
|
|
2944
2956
|
if (this.assembler.activateTarget(target)) this.snapshot.set(this.currentSnapshot());
|
|
2957
|
+
this.openTurn.set(this.assembler.openTurn());
|
|
2945
2958
|
}
|
|
2946
2959
|
rebuild() {
|
|
2947
2960
|
this.publish(this.assembler.rebuildRegistry());
|
|
@@ -3002,6 +3015,7 @@ window.__ModuleLoader__.load({
|
|
|
3002
3015
|
}
|
|
3003
3016
|
flush() {
|
|
3004
3017
|
if (this.assembler.flush()) this.snapshot.set(this.currentSnapshot());
|
|
3018
|
+
this.openTurn.set(this.assembler.openTurn());
|
|
3005
3019
|
}
|
|
3006
3020
|
currentSnapshot() {
|
|
3007
3021
|
return {
|
|
@@ -3060,6 +3074,7 @@ window.__ModuleLoader__.load({
|
|
|
3060
3074
|
* Resolve the Conversation binding for one Controller binding or Session id.
|
|
3061
3075
|
* @param source - Session binding or identity.
|
|
3062
3076
|
* @returns stable Conversation binding.
|
|
3077
|
+
* @throws if the Session is unknown or its binding is no longer current.
|
|
3063
3078
|
*/
|
|
3064
3079
|
binding(source) {
|
|
3065
3080
|
const sessionId = typeof source === "string" ? source : source.sessionId;
|
|
@@ -6217,7 +6232,7 @@ window.__ModuleLoader__.load({
|
|
|
6217
6232
|
function po(t) {
|
|
6218
6233
|
return t instanceof _o;
|
|
6219
6234
|
}
|
|
6220
|
-
const mo = "history-push", xo = "history-merge", Co = "paste", ko = "skip-scroll-into-view", No = "skip-selection-focus", wo = "composition-end", Oo = "!important";
|
|
6235
|
+
const mo = "history-push", xo = "history-merge", Co = "paste", ko = "skip-scroll-into-view", bo = "skip-dom-selection", No = "skip-selection-focus", wo = "composition-end", Oo = "!important";
|
|
6221
6236
|
function Mo(t) {
|
|
6222
6237
|
const e = {};
|
|
6223
6238
|
if (!t) return e;
|
|
@@ -12324,7 +12339,7 @@ window.__ModuleLoader__.load({
|
|
|
12324
12339
|
};
|
|
12325
12340
|
//#endregion
|
|
12326
12341
|
//#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-conversation/src/client/input/editor/composer-editor.module.css.mjs
|
|
12327
|
-
const css$7 = ".q44v1G_reference{line-height:inherit;vertical-align:baseline;color:var(--dsw-alias-state-business-primary);-webkit-box-decoration-break:clone;box-decoration-break:clone;background:0 0;
|
|
12342
|
+
const css$7 = ".q44v1G_reference{border-radius:var(--dsw-radius-sm);line-height:inherit;vertical-align:baseline;color:var(--dsw-alias-state-business-primary);-webkit-box-decoration-break:clone;box-decoration-break:clone;background:0 0;padding:0 4px}.q44v1G_reference:hover{background:var(--dsw-alias-state-business-tertiary)}.q44v1G_openable{cursor:pointer}.q44v1G_textRef{max-width:100%;display:inline-block}";
|
|
12328
12343
|
const tagId$7 = "@deepseek-ai/dsh-client-ui-conversation/composer-editor.module.css";
|
|
12329
12344
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$7) + "]") === null) {
|
|
12330
12345
|
const tag = document.createElement("style");
|
|
@@ -13139,7 +13154,15 @@ window.__ModuleLoader__.load({
|
|
|
13139
13154
|
* @returns unregister callback that also detaches the editor root.
|
|
13140
13155
|
*/
|
|
13141
13156
|
register() {
|
|
13142
|
-
const
|
|
13157
|
+
const preserveExternalSelection = () => {
|
|
13158
|
+
const root = this.editor.getRootElement();
|
|
13159
|
+
if (root !== null && !root.contains(root.ownerDocument.activeElement)) Al(bo);
|
|
13160
|
+
return false;
|
|
13161
|
+
};
|
|
13162
|
+
const unregister = Eu(O$1(this.editor), this.editor.registerCommand(Mn$1, () => {
|
|
13163
|
+
this.editor.update(preserveExternalSelection, { discrete: true });
|
|
13164
|
+
return false;
|
|
13165
|
+
}, 4), this.editor.registerCommand(Ie$2, preserveExternalSelection, 4), this.editor.registerNodeTransform(zi, preserveExternalSelection), registerReferenceActivation(this.editor, (source, reference) => this.deps.openReference(source, reference)), O(this.editor, z(), HISTORY_MERGE_DELAY_MS), this.editor.registerUpdateListener(() => {
|
|
13143
13166
|
this.deps.onUpdate();
|
|
13144
13167
|
}), registerClaimDecoration(this.editor, () => this.deps.activeClaimToken()), registerTextRefDecoration(this.editor, () => this.deps.lexicon(), () => this.deps.activeClaimToken()), () => {
|
|
13145
13168
|
this.lexiconOff?.();
|
|
@@ -14381,6 +14404,10 @@ window.__ModuleLoader__.load({
|
|
|
14381
14404
|
const PLAN_NEXT_ACTION_EN = "describe your task to generate plan";
|
|
14382
14405
|
/** Simplified Chinese dictionary (the key-set source of truth). */
|
|
14383
14406
|
const zh = {
|
|
14407
|
+
"shortcut.newline": "换行",
|
|
14408
|
+
"shortcut.complementary": "使用互补的 Queue/Steer 方式",
|
|
14409
|
+
"shortcut.slash": "打开命令菜单",
|
|
14410
|
+
"shortcut.mention": "打开引用菜单",
|
|
14384
14411
|
"hint.plan": PLAN_NEXT_ACTION_ZH,
|
|
14385
14412
|
"hint.goal": "输入目标,智能体将持续执行",
|
|
14386
14413
|
"hint.goal.active": "当前目标进行中。可输入 edit 修改 / pause 暂停 / resume 继续 / clear 清除",
|
|
@@ -14461,6 +14488,7 @@ window.__ModuleLoader__.load({
|
|
|
14461
14488
|
"tool.title.createSchedule": "创建定时任务",
|
|
14462
14489
|
"tool.title.listSchedules": "查看定时任务",
|
|
14463
14490
|
"tool.title.deleteSchedule": "删除定时任务",
|
|
14491
|
+
"tool.title.updateSchedule": "修改定时任务",
|
|
14464
14492
|
"detail.state": "状态",
|
|
14465
14493
|
"detail.todo.completed": "已完成",
|
|
14466
14494
|
"detail.todo.in_progress": "进行中",
|
|
@@ -14499,6 +14527,17 @@ window.__ModuleLoader__.load({
|
|
|
14499
14527
|
"detail.schedule.empty": "没有定时任务",
|
|
14500
14528
|
"detail.schedule.deleted": "已删除",
|
|
14501
14529
|
"detail.schedule.count": "{count} 个定时任务",
|
|
14530
|
+
"detail.schedule.daily": "每天 {time}({zone})",
|
|
14531
|
+
"detail.schedule.weekly": "每周 {days} {time}({zone})",
|
|
14532
|
+
"detail.schedule.cron": "Cron {expression}({zone})",
|
|
14533
|
+
"detail.weekday.1": "周一",
|
|
14534
|
+
"detail.weekday.2": "周二",
|
|
14535
|
+
"detail.weekday.3": "周三",
|
|
14536
|
+
"detail.weekday.4": "周四",
|
|
14537
|
+
"detail.weekday.5": "周五",
|
|
14538
|
+
"detail.weekday.6": "周六",
|
|
14539
|
+
"detail.weekday.7": "周日",
|
|
14540
|
+
"detail.weekday.join": "、",
|
|
14502
14541
|
"tool.title.inspectProviders": "检查提供方",
|
|
14503
14542
|
"tool.title.queryRuntime": "查询运行时",
|
|
14504
14543
|
"tool.title.inspectPlugins": "检查动态插件",
|
|
@@ -14731,6 +14770,10 @@ window.__ModuleLoader__.load({
|
|
|
14731
14770
|
};
|
|
14732
14771
|
/** English dictionary, checked complete against the zh key set. */
|
|
14733
14772
|
const en = {
|
|
14773
|
+
"shortcut.newline": "New line",
|
|
14774
|
+
"shortcut.complementary": "Use the complementary Queue / Steer action",
|
|
14775
|
+
"shortcut.slash": "Open command menu",
|
|
14776
|
+
"shortcut.mention": "Open reference menu",
|
|
14734
14777
|
"hint.plan": PLAN_NEXT_ACTION_EN,
|
|
14735
14778
|
"hint.goal": "describe the objective for a long-running task",
|
|
14736
14779
|
"hint.goal.active": "goal active — edit / pause / resume / clear",
|
|
@@ -14811,6 +14854,7 @@ window.__ModuleLoader__.load({
|
|
|
14811
14854
|
"tool.title.createSchedule": "Create reminder",
|
|
14812
14855
|
"tool.title.listSchedules": "List reminders",
|
|
14813
14856
|
"tool.title.deleteSchedule": "Delete reminder",
|
|
14857
|
+
"tool.title.updateSchedule": "Update reminder",
|
|
14814
14858
|
"detail.state": "Status",
|
|
14815
14859
|
"detail.todo.completed": "Completed",
|
|
14816
14860
|
"detail.todo.in_progress": "In progress",
|
|
@@ -14849,6 +14893,17 @@ window.__ModuleLoader__.load({
|
|
|
14849
14893
|
"detail.schedule.empty": "No reminders",
|
|
14850
14894
|
"detail.schedule.deleted": "Deleted",
|
|
14851
14895
|
"detail.schedule.count": "{count} reminders",
|
|
14896
|
+
"detail.schedule.daily": "Every day at {time} ({zone})",
|
|
14897
|
+
"detail.schedule.weekly": "Weekly on {days} at {time} ({zone})",
|
|
14898
|
+
"detail.schedule.cron": "Cron {expression} ({zone})",
|
|
14899
|
+
"detail.weekday.1": "Mon",
|
|
14900
|
+
"detail.weekday.2": "Tue",
|
|
14901
|
+
"detail.weekday.3": "Wed",
|
|
14902
|
+
"detail.weekday.4": "Thu",
|
|
14903
|
+
"detail.weekday.5": "Fri",
|
|
14904
|
+
"detail.weekday.6": "Sat",
|
|
14905
|
+
"detail.weekday.7": "Sun",
|
|
14906
|
+
"detail.weekday.join": ", ",
|
|
14852
14907
|
"tool.title.inspectProviders": "Inspect providers",
|
|
14853
14908
|
"tool.title.queryRuntime": "Query runtime",
|
|
14854
14909
|
"tool.title.inspectPlugins": "Inspect plugins",
|
|
@@ -15081,7 +15136,7 @@ window.__ModuleLoader__.load({
|
|
|
15081
15136
|
};
|
|
15082
15137
|
//#endregion
|
|
15083
15138
|
//#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-conversation/src/client/queue/QueueDock.module.css.mjs
|
|
15084
|
-
const css$6 = "._7yHdaG_dock{box-sizing:border-box;width:calc(100% - var(--dsh-composer-side-clearance) - var(--dsh-composer-side-clearance) - var(--dsh-composer-dock-inset) - var(--dsh-composer-dock-inset));max-width:calc(var(--dsh-composer-card-max-width) - var(--dsh-composer-dock-inset) - var(--dsh-composer-dock-inset));margin:0 auto calc(0px - var(--dsh-composer-stack-gap) - 3px);padding:0 var(--dsh-composer-dock-inset);flex:none}._7yHdaG_panel{isolation:isolate;--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);
|
|
15139
|
+
const css$6 = "._7yHdaG_dock{box-sizing:border-box;width:calc(100% - var(--dsh-composer-side-clearance) - var(--dsh-composer-side-clearance) - var(--dsh-composer-dock-inset) - var(--dsh-composer-dock-inset));max-width:calc(var(--dsh-composer-card-max-width) - var(--dsh-composer-dock-inset) - var(--dsh-composer-dock-inset));margin:0 auto calc(0px - var(--dsh-composer-stack-gap) - 3px);padding:0 var(--dsh-composer-dock-inset);flex:none}._7yHdaG_panel{isolation:isolate;border-radius:var(--dsw-radius-lg) var(--dsw-radius-lg) 0 0;--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);width:100%;padding:2px 0;position:relative;overflow:hidden}._7yHdaG_panel:before{z-index:-1;border-radius:inherit;background:var(--dsw-specific-menu);backdrop-filter:var(--dsw-menu-backdrop-filter);content:\"\";pointer-events:none;position:absolute;inset:0}._7yHdaG_panel:after{border:.5px solid var(--dsw-alias-border-l1);border-radius:inherit;content:\"\";pointer-events:none;border-bottom:none;position:absolute;inset:0}._7yHdaG_header{box-sizing:border-box;border-radius:var(--dsw-radius-md);width:100%;height:36px;color:var(--dsw-alias-label-primary);text-align:left;cursor:pointer;background:0 0;border:none;align-items:center;gap:10px;padding:4px 12px;display:flex}._7yHdaG_header:focus-visible{outline:var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-offset:-2px}._7yHdaG_header:disabled{cursor:default}._7yHdaG_lead{color:var(--dsw-alias-label-tertiary);flex:none;place-items:center;display:grid}._7yHdaG_count{min-width:0;font-family:Inter, var(--dsw-font-family);flex:auto;font-size:13px;font-weight:500;line-height:24px}._7yHdaG_chevron{width:14px;height:14px;color:var(--dsw-alias-label-tertiary);flex:none;place-items:center;display:grid}._7yHdaG_list{max-height:180px;margin:0;padding:0;list-style:none;overflow-y:auto}._7yHdaG_row{box-sizing:border-box;border-radius:var(--dsw-radius-md);align-items:center;gap:10px;width:100%;min-height:36px;padding:4px 5px 4px 12px;display:flex}._7yHdaG_row+._7yHdaG_row{box-shadow:inset 0 1px 0 var(--dsw-alias-border-l1)}._7yHdaG_attachments{flex:none;gap:4px;min-width:0;max-width:55%;display:flex;overflow:hidden}._7yHdaG_pendingRow ._7yHdaG_attachments{flex-shrink:1}._7yHdaG_file{border:.5px solid var(--dsw-alias-border-l1);border-radius:var(--dsw-radius-sm);background:var(--dsw-alias-bg-base);box-sizing:border-box;flex:0 180px;align-items:center;gap:4px;min-width:74px;height:24px;padding:0 6px;display:inline-flex;overflow:hidden}._7yHdaG_fileIcon{flex:none;width:16px;height:16px;display:inline-flex}._7yHdaG_fileName{min-width:0;color:var(--dsw-alias-label-primary-dimmed);font:var(--dsw-font-xs-13);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._7yHdaG_fileSize{color:var(--dsw-alias-label-tertiary);white-space:nowrap;flex:none;font-size:10px}._7yHdaG_thumb{border:.5px solid var(--dsw-alias-border-l1);border-radius:var(--dsw-radius-xs);background:var(--dsw-alias-bg-base);object-fit:cover;width:24px;height:24px}._7yHdaG_preview,._7yHdaG_editor{min-width:0;font:var(--dsw-font-xs-13);font-family:Inter, var(--dsw-font-family);flex:auto}._7yHdaG_preview{color:var(--dsw-alias-label-primary-dimmed);text-overflow:ellipsis;white-space:nowrap;word-break:break-word;overflow:hidden}._7yHdaG_editor{box-sizing:border-box;border:.5px solid var(--dsw-alias-border-l4);border-radius:var(--dsw-radius-sm);background:var(--dsw-alias-bg-base);min-height:28px;max-height:127px;color:var(--dsw-alias-label-primary);resize:none;outline:none;padding:3px 8px;overflow-y:auto}._7yHdaG_editor:focus{border-color:var(--dsw-alias-state-business-primary)}._7yHdaG_actions{flex:none;align-items:center;gap:10px;display:flex}._7yHdaG_status{color:var(--dsw-alias-label-tertiary);font:var(--dsw-font-xs-13);white-space:nowrap;flex:none}._7yHdaG_action{corner-shape:round;width:28px;height:28px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;border-radius:999px;flex:none;place-items:center;padding:0;display:grid}._7yHdaG_action:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}._7yHdaG_action:focus-visible{outline:var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-offset:-2px}._7yHdaG_action:disabled{cursor:default;opacity:.45}";
|
|
15085
15140
|
const tagId$6 = "@deepseek-ai/dsh-client-ui-conversation/QueueDock.module.css";
|
|
15086
15141
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$6) + "]") === null) {
|
|
15087
15142
|
const tag = document.createElement("style");
|
|
@@ -15566,7 +15621,7 @@ window.__ModuleLoader__.load({
|
|
|
15566
15621
|
};
|
|
15567
15622
|
//#endregion
|
|
15568
15623
|
//#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-conversation/src/client/settings/EnterBehaviorRow.module.css.mjs
|
|
15569
|
-
const css$5 = ".T1PP_q_row{border-bottom:.5px solid var(--dsw-alias-border-l2);align-items:center;gap:8px;padding:16px 0;display:flex}.T1PP_q_rowText{flex-direction:column;flex:1;gap:4px;min-width:0;padding-right:48px;display:flex}.T1PP_q_title{color:var(--dsw-alias-label-primary);font-size:14px;font-weight:400;line-height:22px}.T1PP_q_desc{color:var(--dsw-alias-label-tertiary);font-size:12px;font-weight:400;line-height:18px}.T1PP_q_selector{background:var(--dsw-alias-bg-module-platform);height:36px;font:inherit;color:var(--dsw-alias-label-primary);cursor:pointer;border:none;
|
|
15624
|
+
const css$5 = ".T1PP_q_row{border-bottom:.5px solid var(--dsw-alias-border-l2);align-items:center;gap:8px;padding:16px 0;display:flex}.T1PP_q_rowText{flex-direction:column;flex:1;gap:4px;min-width:0;padding-right:48px;display:flex}.T1PP_q_title{color:var(--dsw-alias-label-primary);font-size:14px;font-weight:400;line-height:22px}.T1PP_q_desc{color:var(--dsw-alias-label-tertiary);font-size:12px;font-weight:400;line-height:18px}.T1PP_q_selector{border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-module-platform);height:36px;font:inherit;color:var(--dsw-alias-label-primary);cursor:pointer;border:none;align-items:center;gap:12px;padding:0 14px;font-size:14px;line-height:22px;display:inline-flex}.T1PP_q_selector:hover{background:var(--dsw-alias-interactive-bg-hover)}.T1PP_q_chevron{flex:none}";
|
|
15570
15625
|
const tagId$5 = "@deepseek-ai/dsh-client-ui-conversation/EnterBehaviorRow.module.css";
|
|
15571
15626
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$5) + "]") === null) {
|
|
15572
15627
|
const tag = document.createElement("style");
|
|
@@ -15663,7 +15718,7 @@ window.__ModuleLoader__.load({
|
|
|
15663
15718
|
}
|
|
15664
15719
|
//#endregion
|
|
15665
15720
|
//#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-conversation/src/client/skeleton/ConversationRoot.module.css.mjs
|
|
15666
|
-
const css$4 = ".wSkVaW_root{background:var(--dsw-alias-bg-base);flex-direction:column;min-width:0;height:100%;display:flex;position:relative}.wSkVaW_header{box-sizing:border-box;border-bottom:.5px solid var(--dsw-alias-border-l3);flex:none;grid-template-columns:auto minmax(0,1fr);min-height:76px;padding:10px 28px 0 20px;display:grid}.wSkVaW_header:where(:not(:has(.wSkVaW_tabs))){min-height:0;padding-bottom:10px}.wSkVaW_headerBlank{border-bottom:none;min-height:0;padding-bottom:0}.wSkVaW_headerBlank .wSkVaW_headerCorner{margin-left:auto}html:not([data-platform=darwin]) .wSkVaW_headerSessionless{padding-top:0}html:not([data-platform=darwin]) .wSkVaW_headerSessionless .wSkVaW_titleRow{min-height:0}[data-platform=darwin] .wSkVaW_headerLeading,[data-platform=darwin] .wSkVaW_headerActions,[data-platform=darwin] .wSkVaW_headerUtilities,[data-platform=darwin] .wSkVaW_headerCorner{-webkit-app-region:no-drag}.wSkVaW_titleRow{min-height:30px;grid-column:2;align-items:center;gap:0;padding-inline-start:max(0px, calc(var(--dsh-frame-leading-clearance,0px) - 20px));display:flex;container-type:inline-size}.wSkVaW_titleCluster{flex:1;align-items:center;gap:10px;min-width:0;display:flex}.wSkVaW_headerLeading{flex:none;grid-area:1/1;align-items:center;gap:8px;display:flex}.wSkVaW_crumbs{white-space:nowrap;align-items:center;gap:4px;min-width:0;display:flex;overflow:hidden}.wSkVaW_crumbSeg{align-items:center;gap:4px;min-width:0;display:inline-flex}.wSkVaW_crumbSep{color:var(--dsw-alias-label-caption);font-size:14px;line-height:20px}.wSkVaW_crumb{max-width:220px;color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;cursor:pointer;background:0 0;border:none;
|
|
15721
|
+
const css$4 = ".wSkVaW_root{background:var(--dsw-alias-bg-base);flex-direction:column;min-width:0;height:100%;display:flex;position:relative}.wSkVaW_header{box-sizing:border-box;border-bottom:.5px solid var(--dsw-alias-border-l3);flex:none;grid-template-columns:auto minmax(0,1fr);min-height:76px;padding:10px 28px 0 20px;display:grid}.wSkVaW_header:where(:not(:has(.wSkVaW_tabs))){min-height:0;padding-bottom:10px}.wSkVaW_headerBlank{border-bottom:none;min-height:0;padding-bottom:0}.wSkVaW_headerBlank .wSkVaW_headerCorner{margin-left:auto}html:not([data-platform=darwin]) .wSkVaW_headerSessionless{padding-top:0}html:not([data-platform=darwin]) .wSkVaW_headerSessionless .wSkVaW_titleRow{min-height:0}[data-platform=darwin] .wSkVaW_headerLeading,[data-platform=darwin] .wSkVaW_headerActions,[data-platform=darwin] .wSkVaW_headerUtilities,[data-platform=darwin] .wSkVaW_headerCorner{-webkit-app-region:no-drag}.wSkVaW_titleRow{min-height:30px;grid-column:2;align-items:center;gap:0;padding-inline-start:max(0px, calc(var(--dsh-frame-leading-clearance,0px) - 20px));display:flex;container-type:inline-size}.wSkVaW_titleCluster{flex:1;align-items:center;gap:10px;min-width:0;display:flex}.wSkVaW_headerLeading{flex:none;grid-area:1/1;align-items:center;gap:8px;display:flex}.wSkVaW_crumbs{white-space:nowrap;align-items:center;gap:4px;min-width:0;display:flex;overflow:hidden}.wSkVaW_crumbSeg{align-items:center;gap:4px;min-width:0;display:inline-flex}.wSkVaW_crumbSep{color:var(--dsw-alias-label-caption);font-size:14px;line-height:20px}.wSkVaW_crumb{border-radius:var(--dsw-radius-md);max-width:220px;color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;cursor:pointer;background:0 0;border:none;padding:4px 8px;font-size:14px;line-height:20px;display:inline-block;overflow:hidden}.wSkVaW_crumbSubagent{font-size:12px;line-height:18px}button.wSkVaW_crumb:hover{background:var(--dsw-alias-interactive-bg-hover)}.wSkVaW_crumbCurrent{color:var(--dsw-alias-label-primary);cursor:default;font-weight:500}.wSkVaW_headerActions{flex:none;align-items:center;gap:8px;display:flex}.wSkVaW_headerUtilities{flex:none;align-items:center;gap:8px;margin-left:20px;display:flex}.wSkVaW_headerUtilities:empty{display:none}.wSkVaW_headerCorner{flex:none;align-items:center;margin-left:8px;margin-right:-16px;display:flex}.wSkVaW_headerCorner:empty{display:none}.wSkVaW_tabs{z-index:1;grid-column:1/-1;gap:36px;margin-top:10px;padding-left:8px;display:flex;position:relative}.wSkVaW_tab{color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;padding:0 0 9px;font-size:13px;font-weight:500;line-height:16px;position:relative}.wSkVaW_tab:after{content:\"\";background:0 0;border-radius:2px;height:2px;position:absolute;bottom:-1px;left:0;right:0}.wSkVaW_tabActive{color:var(--dsw-alias-state-business-primary)}.wSkVaW_tabActive:after{background:var(--dsw-alias-state-business-primary)}.wSkVaW_viewArea{flex-direction:column;flex:1;min-height:0;display:flex}.wSkVaW_widthHandle{z-index:0;width:min(10px, calc((100% - var(--dsh-chat-content-width)) / 2 - 24px - 24px));cursor:col-resize;position:absolute;top:0;bottom:0}.wSkVaW_widthHandle[data-side=left]{right:calc(50% + var(--dsh-chat-content-width) / 2 + 24px)}.wSkVaW_widthHandle[data-side=right]{left:calc(50% + var(--dsh-chat-content-width) / 2 + 24px)}.wSkVaW_widthHandle:after{content:\"\";background:linear-gradient(to bottom, transparent calc(var(--dsh-width-handle-pointer-y,50%) - 36px), var(--dsw-alias-scrollbar-bg-l1) calc(var(--dsh-width-handle-pointer-y,50%) - 8px), var(--dsw-alias-scrollbar-bg-l1) calc(var(--dsh-width-handle-pointer-y,50%) + 8px), transparent calc(var(--dsh-width-handle-pointer-y,50%) + 36px));opacity:0;pointer-events:none;border-radius:2px;width:2px;position:absolute;top:0;bottom:0}.wSkVaW_widthHandle[data-side=left]:after{right:4px}.wSkVaW_widthHandle[data-side=right]:after{left:4px}.wSkVaW_widthHandle:hover:after,.wSkVaW_widthHandle[data-dragging]:after{opacity:1}.wSkVaW_widthHandle[data-dragging]{z-index:8}.wSkVaW_root:has([data-conversation-composer-overlay]) .wSkVaW_widthHandle{display:none}.wSkVaW_composerStack{--dsh-composer-stack-gap:6px;gap:var(--dsh-composer-stack-gap);flex-direction:column;display:flex}.wSkVaW_composerSeat{--dsh-composer-text-max-height:336px;flex-direction:column;flex:none;display:flex}.wSkVaW_root[data-phase=active]{overflow:hidden}.wSkVaW_root[data-phase=active] .wSkVaW_header{flex:none}.wSkVaW_body{--dsh-chat-content-width:var(--dsh-chat-user-width,clamp(680px, calc(var(--dsh-conversation-column-width,0px) * .64), 920px));--dsh-composer-card-max-width:calc(var(--dsh-chat-content-width) + 32px);--dsh-composer-side-clearance:16px;--dsh-composer-dock-inset:8px;flex-direction:column;flex:1;min-height:0;display:flex;position:relative}.wSkVaW_embeddedBody{--dsh-chat-content-width:min(calc(100% - 32px), 920px);--dsh-composer-card-max-width:min(calc(100% - 16px), 952px);--dsh-composer-side-clearance:8px;--dsh-composer-dock-inset:8px;overflow:hidden}.wSkVaW_scrollBody{scrollbar-gutter:stable;flex-direction:column;flex:1;min-height:0;margin-right:2px;display:flex;overflow-y:auto}.wSkVaW_scrollBody::-webkit-scrollbar-track{margin:2px}.wSkVaW_root[data-phase=active] .wSkVaW_viewArea,.wSkVaW_embeddedBody[data-content-phase=active] .wSkVaW_viewArea{flex:1 0 auto;min-height:auto}.wSkVaW_root[data-phase=active] .wSkVaW_composerSeat,.wSkVaW_embeddedBody[data-content-phase=active] .wSkVaW_composerSeat{z-index:7;background:linear-gradient(180deg, color-mix(in srgb, var(--dsw-alias-bg-base) 0%, transparent) 0px, var(--dsw-alias-bg-base) 36px);position:sticky;bottom:0}.wSkVaW_root[data-phase=active] .wSkVaW_composerSeat:has([data-trigger-menu]){z-index:9}.wSkVaW_scrollBody:has([data-conversation-composer-overlay]){scrollbar-gutter:auto;position:relative;overflow:hidden auto}.wSkVaW_scrollBody:has([data-conversation-composer-overlay])>[data-slot=conversation\\.session]>.wSkVaW_viewArea{flex:1 1 0;min-height:0;overflow:hidden}.wSkVaW_scrollBody:has([data-conversation-composer-overlay])>.wSkVaW_composerSeat{right:var(--dsh-scrollbar-width);position:absolute;bottom:0;left:0}.wSkVaW_composerHero{width:min(calc(var(--dsh-composer-card-max-width) + 2 * var(--dsh-composer-side-clearance)), 100%);z-index:1;align-self:center;gap:8px;padding-bottom:32px}.wSkVaW_heroWorkspaceRow{align-items:center;gap:2px;min-width:0;margin-top:4px;padding:0 16px 0 20px;display:flex}.wSkVaW_root[data-phase=hero] .wSkVaW_scrollBody,.wSkVaW_embeddedBody[data-content-phase=hero] .wSkVaW_scrollBody{justify-content:center;overflow-y:auto}.wSkVaW_root[data-phase=settling] .wSkVaW_composerSeat,.wSkVaW_embeddedBody[data-content-phase=settling] .wSkVaW_composerSeat{visibility:hidden}";
|
|
15667
15722
|
const tagId$4 = "@deepseek-ai/dsh-client-ui-conversation/ConversationRoot.module.css";
|
|
15668
15723
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$4) + "]") === null) {
|
|
15669
15724
|
const tag = document.createElement("style");
|
|
@@ -15898,9 +15953,22 @@ window.__ModuleLoader__.load({
|
|
|
15898
15953
|
function ConversationRoot(props) {
|
|
15899
15954
|
return (0, react_jsx_runtime.jsx)(ConversationMainPanel, { ...props });
|
|
15900
15955
|
}
|
|
15956
|
+
/**
|
|
15957
|
+
* The text one Workspace is labeled with. A Workspace still carrying the
|
|
15958
|
+
* automatic first-use title reads as the caller's localized default name; every
|
|
15959
|
+
* other title reads verbatim in every language. A title the user typed as
|
|
15960
|
+
* exactly {@link DEFAULT_WORKSPACE_DIRECTORY} is labeled as the default too;
|
|
15961
|
+
* nothing else depends on the distinction.
|
|
15962
|
+
* @param title - stored Workspace title.
|
|
15963
|
+
* @param localizedDefault - the default Workspace name in the active language.
|
|
15964
|
+
* @returns the title to display.
|
|
15965
|
+
*/
|
|
15966
|
+
function workspaceDisplayTitle(title, localizedDefault) {
|
|
15967
|
+
return title === "default-workspace" ? localizedDefault : title;
|
|
15968
|
+
}
|
|
15901
15969
|
//#endregion
|
|
15902
15970
|
//#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-conversation/src/client/skeleton/HeroShell.module.css.mjs
|
|
15903
|
-
const css$3 = ".pXSMma_root{justify-content:center;align-items:center;min-width:0;height:100%;padding:0 24px;display:flex}.pXSMma_stack{width:100%;max-width:var(--dsh-composer-card-max-width);flex-direction:column;align-items:stretch;gap:12px;display:flex;overflow:visible}.pXSMma_headline{color:var(--dsw-alias-label-primary);flex-wrap:wrap;justify-content:center;align-items:center;gap:12px 10px;font-size:26px;font-weight:500;line-height:32px;display:flex}.pXSMma_titleGroup{flex-wrap:wrap;justify-content:center;align-items:center;gap:4px 7px;min-width:0;display:flex}.pXSMma_previewBadge{border:.5px solid var(--dsw-alias-interactive-bg-hover);background:var(--dsw-alias-state-business-tertiary);color:var(--dsw-alias-label-primary-bluish);font-family:var(--ds-font-family-code);white-space:nowrap;border-radius:
|
|
15971
|
+
const css$3 = ".pXSMma_root{justify-content:center;align-items:center;min-width:0;height:100%;padding:0 24px;display:flex}.pXSMma_stack{width:100%;max-width:var(--dsh-composer-card-max-width);flex-direction:column;align-items:stretch;gap:12px;display:flex;overflow:visible}.pXSMma_headline{color:var(--dsw-alias-label-primary);flex-wrap:wrap;justify-content:center;align-items:center;gap:12px 10px;font-size:26px;font-weight:500;line-height:32px;display:flex}.pXSMma_titleGroup{flex-wrap:wrap;justify-content:center;align-items:center;gap:4px 7px;min-width:0;display:flex}.pXSMma_previewBadge{border:.5px solid var(--dsw-alias-interactive-bg-hover);corner-shape:round;background:var(--dsw-alias-state-business-tertiary);color:var(--dsw-alias-label-primary-bluish);font-family:var(--ds-font-family-code);white-space:nowrap;border-radius:999px;align-self:flex-start;margin-top:2px;padding:1px 7px 0;font-size:12px;font-weight:500;line-height:18px}.pXSMma_fishHitbox{flex:none;justify-content:center;align-items:center;display:inline-flex}.pXSMma_fish{transform-origin:50% 60%;color:var(--dsw-alias-label-primary);display:block;overflow:visible}@keyframes pXSMma_hero-fish-swim{0%,to{transform:none}35%{transform:rotate(-4deg)translate(-.4px,-.9px)}70%{transform:rotate(1.6deg)translate(.3px,.2px)}}@media (hover:hover) and (prefers-reduced-motion:no-preference){.pXSMma_fishHitbox:hover .pXSMma_fish{animation:1.6s ease-in-out infinite pXSMma_hero-fish-swim}}.pXSMma_body{flex-direction:column;gap:12px;min-width:0;display:flex;position:relative;overflow:visible}.pXSMma_body>*{z-index:1;position:relative}.pXSMma_body>.pXSMma_workspaceRow{z-index:10;align-items:center;min-width:0;padding-left:8px;display:flex}.pXSMma_workspace{border-radius:var(--dsw-radius-sm);max-width:min(100%,360px);min-height:28px;color:var(--dsw-alias-label-primary);cursor:pointer;background:0 0;border:none;align-items:center;gap:4px;padding:0 8px;font-size:13px;font-weight:500;line-height:20px;display:inline-flex}.pXSMma_workspace:not(:disabled):hover,.pXSMma_workspace[aria-expanded=true]{background:var(--dsw-alias-interactive-bg-hover)}.pXSMma_workspace:disabled{cursor:default}.pXSMma_folder{color:var(--dsw-alias-label-primary);flex:none}.pXSMma_workspaceLabel{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.pXSMma_chevron{color:var(--dsw-alias-label-caption);flex:none}.pXSMma_modalInput{box-sizing:border-box;border:.5px solid var(--dsw-alias-border-l4);border-radius:var(--dsw-radius-lg);width:100%;height:44px;color:var(--dsw-alias-label-primary);background:0 0;outline:none;padding:7px 14px;font-size:14px;font-weight:400;line-height:22px}.pXSMma_modalInput::placeholder{color:var(--dsw-alias-label-caption)}.pXSMma_modalInput:disabled{color:var(--dsw-alias-label-dimmed)}.pXSMma_modalAction{min-width:72px}.pXSMma_modalError{color:var(--dsw-alias-state-error-primary);margin-top:8px;font-size:12px;line-height:18px}";
|
|
15904
15972
|
const tagId$3 = "@deepseek-ai/dsh-client-ui-conversation/HeroShell.module.css";
|
|
15905
15973
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$3) + "]") === null) {
|
|
15906
15974
|
const tag = document.createElement("style");
|
|
@@ -16106,7 +16174,8 @@ window.__ModuleLoader__.load({
|
|
|
16106
16174
|
session,
|
|
16107
16175
|
input: inputState
|
|
16108
16176
|
};
|
|
16109
|
-
const
|
|
16177
|
+
const storedChipTitle = pendingWorkspace?.title ?? (sessionId === void 0 ? void 0 : sessionWorkspace?.title ?? (workspaces.phase === "ready" || cwd === void 0 || cwd === "" ? void 0 : workspaceLabel(cwd)));
|
|
16178
|
+
const chipTitle = storedChipTitle === void 0 ? void 0 : workspaceDisplayTitle(storedChipTitle, t("workspace.defaultName"));
|
|
16110
16179
|
const heroWorkspaceRow = (0, react_jsx_runtime.jsxs)("div", {
|
|
16111
16180
|
className: ConversationRoot_module_css_default.heroWorkspaceRow,
|
|
16112
16181
|
children: [
|
|
@@ -16177,12 +16246,15 @@ window.__ModuleLoader__.load({
|
|
|
16177
16246
|
ref: seatResizeRef,
|
|
16178
16247
|
className: ConversationRoot_module_css_default.composerSeat,
|
|
16179
16248
|
"data-composer-seat": "",
|
|
16249
|
+
"data-conversation-region": "composer",
|
|
16180
16250
|
children: composer
|
|
16181
16251
|
});
|
|
16182
16252
|
return (0, react_jsx_runtime.jsxs)("div", {
|
|
16183
16253
|
ref: setBody,
|
|
16184
16254
|
className: clsx(ConversationRoot_module_css_default.body, props.variant === "embedded" && ConversationRoot_module_css_default.embeddedBody),
|
|
16185
16255
|
"data-conversation-content": "",
|
|
16256
|
+
"data-conversation-session": sessionId,
|
|
16257
|
+
"data-conversation-region": "chat",
|
|
16186
16258
|
"data-content-phase": phase,
|
|
16187
16259
|
children: [(0, react_jsx_runtime.jsxs)("div", {
|
|
16188
16260
|
className: ConversationRoot_module_css_default.scrollBody,
|
|
@@ -16218,6 +16290,7 @@ window.__ModuleLoader__.load({
|
|
|
16218
16290
|
const blank = session === void 0 || conversation === void 0 || session.blank && conversationPhase(session, conversation) === "blank";
|
|
16219
16291
|
return (0, react_jsx_runtime.jsxs)("header", {
|
|
16220
16292
|
className: clsx(ConversationRoot_module_css_default.header, blank && ConversationRoot_module_css_default.headerBlank, sessionId === void 0 && ConversationRoot_module_css_default.headerSessionless),
|
|
16293
|
+
"data-window-drag": true,
|
|
16221
16294
|
children: [(0, react_jsx_runtime.jsx)("div", {
|
|
16222
16295
|
className: ConversationRoot_module_css_default.headerLeading,
|
|
16223
16296
|
"data-conversation-header-leading": "",
|
|
@@ -16552,6 +16625,7 @@ window.__ModuleLoader__.load({
|
|
|
16552
16625
|
}
|
|
16553
16626
|
return false;
|
|
16554
16627
|
}, 4), editor.registerCommand(cn$1, (event) => {
|
|
16628
|
+
if (event !== null && (event.altKey || event.getModifierState("AltGraph") || event.ctrlKey && event.metaKey || event.shiftKey && (event.ctrlKey || event.metaKey))) return true;
|
|
16555
16629
|
if (event?.shiftKey === true) return false;
|
|
16556
16630
|
if (event !== null && isComposingEvent(event, recentlyComposing)) return true;
|
|
16557
16631
|
if (handlers.arbitrate("enter", false) !== "pass") {
|
|
@@ -16769,7 +16843,7 @@ window.__ModuleLoader__.load({
|
|
|
16769
16843
|
}
|
|
16770
16844
|
//#endregion
|
|
16771
16845
|
//#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-conversation/src/client/skeleton/ContextMeter.module.css.mjs
|
|
16772
|
-
const css$2 = ".JObwrW_root{flex:none;display:inline-flex}.JObwrW_trigger{color:var(--dsw-alias-label-tertiary);font-family:inherit;font-size:var(--dsh-content-font-size-secondary,13px);font-variant-numeric:tabular-nums;line-height:calc(20px + var(--dsh-content-font-delta-secondary,0px));white-space:nowrap;cursor:pointer;background:0 0;border:none;
|
|
16846
|
+
const css$2 = ".JObwrW_root{flex:none;display:inline-flex}.JObwrW_trigger{border-radius:var(--dsw-radius-sm);color:var(--dsw-alias-label-tertiary);font-family:inherit;font-size:var(--dsh-content-font-size-secondary,13px);font-variant-numeric:tabular-nums;line-height:calc(20px + var(--dsh-content-font-delta-secondary,0px));white-space:nowrap;cursor:pointer;background:0 0;border:none;flex:none;align-items:center;gap:6px;padding:1px 8px;display:inline-flex}.JObwrW_trigger:hover,.JObwrW_trigger[aria-expanded=true]{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-secondary)}.JObwrW_track{fill:none;stroke:var(--dsw-alias-border-l3);stroke-width:2px}.JObwrW_fill{fill:none;stroke:var(--dsw-alias-label-tertiary);stroke-width:2px;stroke-linecap:round}.JObwrW_panel{z-index:1100;box-sizing:border-box;border-radius:var(--dsw-radius-lg);background:var(--dsw-specific-menu);width:min(264px,100vw - 24px);backdrop-filter:var(--dsw-menu-backdrop-filter);--dsw-elevation-stroke-color:var(--dsw-alias-border-l1);box-shadow:var(--dsw-elevation-prominent);color:var(--dsw-alias-label-secondary);cursor:default;border:0;padding:12px;font-size:12px;line-height:20px;position:fixed}.JObwrW_header{align-items:center;gap:6px;display:flex}.JObwrW_figures{font-variant-numeric:tabular-nums;color:var(--dsw-alias-label-primary);margin-left:auto;font-weight:500}.JObwrW_percent{color:var(--dsw-alias-label-primary);font-weight:500}.JObwrW_headline{color:var(--dsw-alias-label-tertiary)}.JObwrW_headline:empty{display:none}.JObwrW_bar{corner-shape:round;background:var(--dsw-alias-interactive-bg-hover);border-radius:999px;gap:1px;height:4px;margin:10px 0 12px;display:flex;overflow:hidden}.JObwrW_segment{background:var(--meter-tint,var(--dsw-alias-label-tertiary));border-radius:1px;flex:none;min-width:2px;height:100%}.JObwrW_swatch{background:var(--meter-tint);vertical-align:baseline;border-radius:2px;width:8px;height:8px;margin-right:6px;display:inline-block}.JObwrW_colorSystem{--meter-tint:var(--dsw-static-neutral-bluish-400)}.JObwrW_colorTools{--meter-tint:#a78bfa}.JObwrW_colorMessages{--meter-tint:var(--dsw-static-blue-450)}.JObwrW_rows{margin:6px 0 0}.JObwrW_row{justify-content:space-between;align-items:center;gap:12px;padding:2px 0;display:flex}.JObwrW_row dt{color:var(--dsw-alias-label-secondary)}.JObwrW_row dd{font-variant-numeric:tabular-nums;color:var(--dsw-alias-label-primary);margin:0}";
|
|
16773
16847
|
const tagId$2 = "@deepseek-ai/dsh-client-ui-conversation/ContextMeter.module.css";
|
|
16774
16848
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$2) + "]") === null) {
|
|
16775
16849
|
const tag = document.createElement("style");
|
|
@@ -17018,7 +17092,7 @@ window.__ModuleLoader__.load({
|
|
|
17018
17092
|
}
|
|
17019
17093
|
//#endregion
|
|
17020
17094
|
//#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-conversation/src/client/skeleton/InputBar.module.css.mjs
|
|
17021
|
-
const css$1 = ".uV2eYG_root{padding:0 var(--dsh-composer-side-clearance) 4px;flex-direction:column;align-items:center;display:flex}.uV2eYG_dock{justify-content:center;align-items:center;gap:12px;max-width:100%;padding-top:4px;display:flex}.uV2eYG_hero .uV2eYG_dock:empty{display:none}.uV2eYG_hero{padding:0 var(--dsh-composer-side-clearance)}.uV2eYG_notice{width:100%;max-width:var(--dsh-composer-card-max-width);background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-secondary);
|
|
17095
|
+
const css$1 = ".uV2eYG_root{padding:0 var(--dsh-composer-side-clearance) 4px;flex-direction:column;align-items:center;display:flex}.uV2eYG_dock{justify-content:center;align-items:center;gap:12px;max-width:100%;padding-top:4px;display:flex}.uV2eYG_hero .uV2eYG_dock:empty{display:none}.uV2eYG_hero{padding:0 var(--dsh-composer-side-clearance)}.uV2eYG_notice{width:100%;max-width:var(--dsh-composer-card-max-width);border-radius:var(--dsw-radius-md);background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-secondary);margin-bottom:6px;padding:4px 8px;font-size:12px;line-height:18px}.uV2eYG_card{box-sizing:border-box;width:100%;max-width:var(--dsh-composer-card-max-width);--dsw-elevation-stroke-color:var(--dsw-alias-border-l2);border-radius:var(--dsw-radius-panel);background:var(--dsw-specific-input-major);box-shadow:var(--dsw-elevation-soft);font-size:var(--dsh-content-font-size,14px);line-height:calc(24px + var(--dsh-content-font-delta,0px));--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);border:0;flex-direction:column;gap:12px;padding-top:8px;display:flex;position:relative}.uV2eYG_cardWorkspaceTrigger{--dsw-elevation-stroke-color:transparent;cursor:pointer}.uV2eYG_cardWorkspaceTrigger:after{content:\"\";box-sizing:border-box;border-radius:var(--dsw-radius-panel);color:var(--dsw-alias-border-l4);pointer-events:none;border:1px dashed;transition:color .1s;position:absolute;inset:0}.uV2eYG_cardWorkspaceTrigger :disabled{pointer-events:none}.uV2eYG_cardWorkspaceTrigger:hover:after{color:var(--dsw-alias-state-business-primary)}.uV2eYG_accessory{align-items:center;gap:8px;padding:10px 12px 0;display:flex}.uV2eYG_overlayAnchor{height:0;position:absolute;inset:0 0 auto}.uV2eYG_scroll{max-height:var(--dsh-composer-text-max-height);margin-right:4px;overflow-y:auto}.uV2eYG_scroll::-webkit-scrollbar-track{margin-top:8px}.uV2eYG_grow{position:relative}.uV2eYG_pending{corner-shape:round;background:var(--dsw-alias-state-business-primary);border-radius:50%;width:8px;height:8px;animation:1s ease-in-out infinite alternate uV2eYG_input-pending}@keyframes uV2eYG_input-pending{0%{opacity:.35}to{opacity:1}}.uV2eYG_input{box-sizing:border-box;min-height:36px;font-family:var(--dsw-font-family);font-size:inherit;line-height:inherit;white-space:pre-wrap;word-break:break-word;overflow-wrap:anywhere;color:var(--dsw-alias-label-primary);caret-color:var(--dsw-alias-state-business-primary);outline:none;padding:4px 8px 0 14px}.uV2eYG_input p{margin:0}.uV2eYG_input p:last-child:after{content:var(--dsh-composer-hint);color:var(--dsw-alias-label-caption)}.uV2eYG_input[data-composer-composing] p:last-child:after{content:none}.uV2eYG_input[data-composer-composing]+.uV2eYG_placeholder{visibility:hidden}.uV2eYG_placeholder{color:var(--dsw-alias-label-caption);white-space:nowrap;text-overflow:ellipsis;pointer-events:none;user-select:none;position:absolute;inset:4px 8px auto 14px;overflow:hidden}.uV2eYG_inputDisabled{color:var(--dsw-alias-label-tertiary);cursor:not-allowed}.uV2eYG_input[aria-haspopup=menu]{cursor:pointer}.uV2eYG_hero .uV2eYG_input{min-height:52px}.uV2eYG_hero .uV2eYG_placeholder{white-space:normal;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box}.uV2eYG_row{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;min-width:0;padding:2px 8px 6px;display:flex;container-type:inline-size}.uV2eYG_row[data-model-compact]{--dsh-composer-model-text-display:none;--dsh-composer-model-icon-display:block}.uV2eYG_tools,.uV2eYG_modes,.uV2eYG_trailing{align-items:center;min-width:0;display:flex}.uV2eYG_tools,.uV2eYG_modes{gap:12px}.uV2eYG_trailing{flex:none;gap:12px;margin-left:auto}@container (width<=560px){.uV2eYG_tools,.uV2eYG_modes,.uV2eYG_trailing{gap:8px}}.uV2eYG_add{corner-shape:round;background:var(--dsw-specific-selector);width:28px;height:28px;color:var(--dsw-alias-label-primary);cursor:pointer;border:none;border-radius:999px;flex:none;place-items:center;display:grid}.uV2eYG_add:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover-solid)}.uV2eYG_add:disabled{opacity:.5;cursor:default}.uV2eYG_select{border-radius:var(--dsw-radius-sm);max-width:220px;height:28px;color:var(--dsw-alias-label-secondary);white-space:nowrap;cursor:pointer;appearance:none;background-color:#0000;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12' fill='none'%3E%3Cpath d='M3 4.5L6 7.5L9 4.5' stroke='%2381858C' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\");background-position:right 4px center;background-repeat:no-repeat;background-size:12px 12px;border:none;outline:none;padding:0 20px 0 8px;font-size:13px;font-weight:500;line-height:20px}.uV2eYG_select:hover:not(:disabled){background-color:var(--dsw-alias-interactive-bg-hover)}.uV2eYG_select:disabled{opacity:.5;cursor:default}.uV2eYG_primary{corner-shape:round;background:var(--dsw-alias-button-info-fill);color:#fff;cursor:pointer;border:none;border-radius:999px;flex:none;place-items:center;width:34px;height:34px;transition:background-color .1s;display:grid;transform:translateY(-2px)}.uV2eYG_primary:hover:not(:disabled){background:var(--dsw-alias-button-info-hover)}.uV2eYG_primary:disabled{opacity:.4;cursor:default}.uV2eYG_retry{border-radius:var(--dsw-radius-sm);color:inherit;cursor:pointer;background:0 0;border:1px solid;margin-left:8px;padding:1px 8px;font-size:12px}.uV2eYG_standardControls{align-items:center;gap:12px;min-width:0;display:flex}.uV2eYG_tools[hidden],.uV2eYG_standardControls[hidden]{display:none}.uV2eYG_trailingActive{flex:1;margin-left:0}.uV2eYG_activity{flex:none;align-items:center;display:flex}.uV2eYG_activity:empty{display:none}.uV2eYG_activityExpanded{flex:1;min-width:0}";
|
|
17022
17096
|
const tagId$1 = "@deepseek-ai/dsh-client-ui-conversation/InputBar.module.css";
|
|
17023
17097
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$1) + "]") === null) {
|
|
17024
17098
|
const tag = document.createElement("style");
|
|
@@ -17072,10 +17146,11 @@ window.__ModuleLoader__.load({
|
|
|
17072
17146
|
* The no-session state renders the SAME div inert as the Workspace-picker
|
|
17073
17147
|
* trigger instead of a parallel tree.
|
|
17074
17148
|
*/
|
|
17075
|
-
const InputBar = (0, react.memo)(function InputBar({ useSession, useInput, inputActions, keyboard, addFiles, removeAttachment, resolveDraftAttachments, retryFileUpload, toggleCommandMenu, stop, t, renderSlot, useBusyEnter, useFileUploads, useNotices, useLexicon, useMenuLauncher, useProjection, sessionId, variant, disabled: inert = false, blocked, workspacePickerOpen = false, onRequestWorkspace, placeholder, accessory }) {
|
|
17149
|
+
const InputBar = (0, react.memo)(function InputBar({ useSession, useInput, inputActions, keyboard, addFiles, removeAttachment, resolveDraftAttachments, retryFileUpload, toggleCommandMenu, stop, t, renderSlot, useBusyEnter, useFileUploads, useNotices, useLexicon, useMenuLauncher, useStopShortcut, useProjection, sessionId, variant, disabled: inert = false, blocked, workspacePickerOpen = false, onRequestWorkspace, placeholder, accessory }) {
|
|
17076
17150
|
const input = useInput((s) => s);
|
|
17077
17151
|
const notice = useNotices((s) => s);
|
|
17078
17152
|
const busyEnter = useBusyEnter((s) => s);
|
|
17153
|
+
const stopKeys = useStopShortcut((keys) => keys);
|
|
17079
17154
|
const commandMenuOpen = useMenuLauncher((source) => source === "command");
|
|
17080
17155
|
const [activity, setActivity] = (0, react.useState)(false);
|
|
17081
17156
|
(0, react.useEffect)(() => {
|
|
@@ -17388,6 +17463,7 @@ window.__ModuleLoader__.load({
|
|
|
17388
17463
|
}),
|
|
17389
17464
|
interruptible && (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
|
|
17390
17465
|
label: t("input.stop"),
|
|
17466
|
+
shortcutKeys: stopKeys,
|
|
17391
17467
|
side: "top",
|
|
17392
17468
|
delayMs: 500,
|
|
17393
17469
|
disabled: stop === void 0,
|
|
@@ -17415,7 +17491,8 @@ window.__ModuleLoader__.load({
|
|
|
17415
17491
|
})
|
|
17416
17492
|
}),
|
|
17417
17493
|
(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
|
|
17418
|
-
label: primaryLabel,
|
|
17494
|
+
label: primaryStops ? t("input.stop") : primaryLabel,
|
|
17495
|
+
shortcutKeys: primaryStops ? stopKeys : void 0,
|
|
17419
17496
|
side: "top",
|
|
17420
17497
|
delayMs: 500,
|
|
17421
17498
|
disabled: primaryDisabled,
|
|
@@ -17468,7 +17545,7 @@ window.__ModuleLoader__.load({
|
|
|
17468
17545
|
});
|
|
17469
17546
|
//#endregion
|
|
17470
17547
|
//#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-conversation/src/client/skeleton/TodoPanel.module.css.mjs
|
|
17471
|
-
const css = ".lXshSW_root{box-sizing:border-box;width:calc(100% - var(--dsh-composer-side-clearance) - var(--dsh-composer-side-clearance) - var(--dsh-composer-dock-inset) - var(--dsh-composer-dock-inset) - var(--dsh-composer-dock-inset) - var(--dsh-composer-dock-inset));max-width:calc(var(--dsh-composer-card-max-width) - var(--dsh-composer-dock-inset) - var(--dsh-composer-dock-inset) - var(--dsh-composer-dock-inset) - var(--dsh-composer-dock-inset));--dsw-elevation-stroke-color:var(--dsw-alias-border-l1);background:var(--dsw-specific-menu);backdrop-filter:var(--dsw-menu-backdrop-filter);box-shadow:var(--dsw-elevation-panel);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);border:0;
|
|
17548
|
+
const css = ".lXshSW_root{box-sizing:border-box;width:calc(100% - var(--dsh-composer-side-clearance) - var(--dsh-composer-side-clearance) - var(--dsh-composer-dock-inset) - var(--dsh-composer-dock-inset) - var(--dsh-composer-dock-inset) - var(--dsh-composer-dock-inset));max-width:calc(var(--dsh-composer-card-max-width) - var(--dsh-composer-dock-inset) - var(--dsh-composer-dock-inset) - var(--dsh-composer-dock-inset) - var(--dsh-composer-dock-inset));--dsw-elevation-stroke-color:var(--dsw-alias-border-l1);border-radius:var(--dsw-radius-lg);background:var(--dsw-specific-menu);backdrop-filter:var(--dsw-menu-backdrop-filter);box-shadow:var(--dsw-elevation-panel);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);border:0;flex:none;margin:0 auto;overflow:hidden}.lXshSW_body{flex-direction:column;gap:8px;padding:6px 12px;display:flex}.lXshSW_header{text-align:left;cursor:pointer;background:0 0;border:none;align-items:center;gap:10px;width:100%;padding:0;display:flex}.lXshSW_lead{color:var(--dsw-alias-label-tertiary);flex:none;place-items:center;display:grid}.lXshSW_title{color:var(--dsw-alias-label-primary);flex:none;font-size:13px;font-weight:500;line-height:24px}.lXshSW_progress{min-width:0;color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;flex:auto;font-size:13px;font-weight:400;line-height:20px;overflow:hidden}.lXshSW_chevron{color:var(--dsw-alias-label-tertiary);flex:none;place-items:center;display:grid}.lXshSW_list{flex-direction:column;gap:8px;max-height:180px;margin:0;padding:0;list-style:none;display:flex;overflow-y:auto}.lXshSW_item{min-width:0;color:var(--dsw-alias-label-secondary);align-items:center;gap:10px;font-size:13px;line-height:20px;display:flex}.lXshSW_glyph{flex:none;place-items:center;width:16px;height:16px;display:grid}.lXshSW_content{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}";
|
|
17472
17549
|
const tagId = "@deepseek-ai/dsh-client-ui-conversation/TodoPanel.module.css";
|
|
17473
17550
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
|
|
17474
17551
|
const tag = document.createElement("style");
|
|
@@ -17604,6 +17681,132 @@ window.__ModuleLoader__.load({
|
|
|
17604
17681
|
}
|
|
17605
17682
|
};
|
|
17606
17683
|
//#endregion
|
|
17684
|
+
//#region lib/types/client/stop-sequence.js
|
|
17685
|
+
/** One short-lived first press, cleared before an accepted cancellation runs. */
|
|
17686
|
+
var StopSequence = class {
|
|
17687
|
+
intervalMs;
|
|
17688
|
+
release;
|
|
17689
|
+
first;
|
|
17690
|
+
timer;
|
|
17691
|
+
/**
|
|
17692
|
+
* @param intervalMs - validated maximum time between independent presses.
|
|
17693
|
+
* @param release - releases observations retained by the pending first press.
|
|
17694
|
+
*/
|
|
17695
|
+
constructor(intervalMs, release) {
|
|
17696
|
+
this.intervalMs = intervalMs;
|
|
17697
|
+
this.release = release;
|
|
17698
|
+
}
|
|
17699
|
+
/** Clear the first press and its expiry timer. */
|
|
17700
|
+
reset() {
|
|
17701
|
+
this.first = void 0;
|
|
17702
|
+
clearTimeout(this.timer);
|
|
17703
|
+
this.timer = void 0;
|
|
17704
|
+
this.release();
|
|
17705
|
+
}
|
|
17706
|
+
/**
|
|
17707
|
+
* Accept one eligible, non-repeated Escape against freshly resolved current state.
|
|
17708
|
+
* @param target - live turn and actual focused input region.
|
|
17709
|
+
* @returns whether this press requested cancellation.
|
|
17710
|
+
*/
|
|
17711
|
+
press(target) {
|
|
17712
|
+
const first = this.first;
|
|
17713
|
+
this.reset();
|
|
17714
|
+
if (first !== void 0 && performance.now() <= first.deadline && first.target.sessionId === target.sessionId && first.target.turn === target.turn && first.target.generation === target.generation && first.target.region === target.region) {
|
|
17715
|
+
target.cancel();
|
|
17716
|
+
return true;
|
|
17717
|
+
}
|
|
17718
|
+
this.first = {
|
|
17719
|
+
target,
|
|
17720
|
+
deadline: performance.now() + this.intervalMs
|
|
17721
|
+
};
|
|
17722
|
+
this.timer = setTimeout(() => {
|
|
17723
|
+
this.reset();
|
|
17724
|
+
}, this.intervalMs + 1);
|
|
17725
|
+
return false;
|
|
17726
|
+
}
|
|
17727
|
+
};
|
|
17728
|
+
//#endregion
|
|
17729
|
+
//#region lib/types/client/stop-shortcut.js
|
|
17730
|
+
/**
|
|
17731
|
+
* Subscribe fixed input to the same Session cancellation used by the stop button.
|
|
17732
|
+
* @param shortcuts - window keyboard arbitration and validated sequence interval.
|
|
17733
|
+
* @param sessions - live Session identities and lifecycle sources.
|
|
17734
|
+
* @param openTurn - stable current-turn source for a live Session binding.
|
|
17735
|
+
* @param uiSession - current pending-interaction status.
|
|
17736
|
+
* @param cancel - scoped stop operation that preserves Queue and reports failures.
|
|
17737
|
+
* @returns disposer releasing the input subscription, pending watches and expiry timer.
|
|
17738
|
+
*/
|
|
17739
|
+
function installStopShortcut(shortcuts, sessions, openTurn, uiSession, cancel) {
|
|
17740
|
+
let unwatch = () => {};
|
|
17741
|
+
const sequence = new StopSequence(shortcuts.stopSequenceMs, () => {
|
|
17742
|
+
unwatch();
|
|
17743
|
+
unwatch = () => {};
|
|
17744
|
+
});
|
|
17745
|
+
const reset = () => {
|
|
17746
|
+
sequence.reset();
|
|
17747
|
+
};
|
|
17748
|
+
const off = shortcuts.observeFixedInput((input) => {
|
|
17749
|
+
if (input.type === "reset") {
|
|
17750
|
+
reset();
|
|
17751
|
+
return;
|
|
17752
|
+
}
|
|
17753
|
+
const { gesture, context } = input;
|
|
17754
|
+
if (gesture.code !== "Escape" || gesture.repeat || gesture.composing || gesture.defaultPrevented || gesture.control || gesture.alt || gesture.shift || gesture.meta || context.modal !== null || context.region === "terminal" || context.target === null) {
|
|
17755
|
+
reset();
|
|
17756
|
+
return;
|
|
17757
|
+
}
|
|
17758
|
+
const target = context.target;
|
|
17759
|
+
const occurrence = target.closest("[data-conversation-session]");
|
|
17760
|
+
const region = target.closest("[data-conversation-region]");
|
|
17761
|
+
if (occurrence === null || region === null || !occurrence.contains(region) || target.closest("[data-approval-key], iframe, .xterm, [inert]") !== null) {
|
|
17762
|
+
reset();
|
|
17763
|
+
return;
|
|
17764
|
+
}
|
|
17765
|
+
const sessionId = occurrence.dataset.conversationSession;
|
|
17766
|
+
const binding = sessions.binding(sessionId);
|
|
17767
|
+
if (binding === void 0) {
|
|
17768
|
+
reset();
|
|
17769
|
+
return;
|
|
17770
|
+
}
|
|
17771
|
+
const turnSource = openTurn(binding);
|
|
17772
|
+
const currentTurn = () => {
|
|
17773
|
+
const session = binding.session.getSnapshot();
|
|
17774
|
+
if (!session.running || session.removed || session.subagent !== null && session.subagent.address.mode !== "continuable" || uiSession.sessionStatus.getSnapshot().get(sessionId)?.pendingInteraction !== void 0) return void 0;
|
|
17775
|
+
return turnSource.getSnapshot();
|
|
17776
|
+
};
|
|
17777
|
+
const turn = currentTurn();
|
|
17778
|
+
if (turn === void 0) {
|
|
17779
|
+
reset();
|
|
17780
|
+
return;
|
|
17781
|
+
}
|
|
17782
|
+
input.consume();
|
|
17783
|
+
if (sequence.press({
|
|
17784
|
+
sessionId,
|
|
17785
|
+
turn,
|
|
17786
|
+
generation: binding,
|
|
17787
|
+
region,
|
|
17788
|
+
cancel: () => {
|
|
17789
|
+
cancel(sessionId);
|
|
17790
|
+
}
|
|
17791
|
+
})) return;
|
|
17792
|
+
const changed = () => {
|
|
17793
|
+
if (sessions.binding(sessionId) !== binding || currentTurn() !== turn) reset();
|
|
17794
|
+
};
|
|
17795
|
+
const disposers = [
|
|
17796
|
+
turnSource.subscribe(changed),
|
|
17797
|
+
binding.session.subscribe(changed),
|
|
17798
|
+
uiSession.sessionStatus.subscribe(changed)
|
|
17799
|
+
];
|
|
17800
|
+
unwatch = () => {
|
|
17801
|
+
for (const dispose of disposers) dispose();
|
|
17802
|
+
};
|
|
17803
|
+
});
|
|
17804
|
+
return () => {
|
|
17805
|
+
off();
|
|
17806
|
+
reset();
|
|
17807
|
+
};
|
|
17808
|
+
}
|
|
17809
|
+
//#endregion
|
|
17607
17810
|
//#region lib/types/client/apply.js
|
|
17608
17811
|
/** Services required by the Conversation plugin. */
|
|
17609
17812
|
const inject = [
|
|
@@ -17739,6 +17942,93 @@ window.__ModuleLoader__.load({
|
|
|
17739
17942
|
disposeViews();
|
|
17740
17943
|
};
|
|
17741
17944
|
}, "ui-conversation: View selection");
|
|
17945
|
+
const stop = (sessionId) => {
|
|
17946
|
+
scopedConversation(sessions, sessionId).cancel().catch((_error) => {});
|
|
17947
|
+
};
|
|
17948
|
+
const stopShortcut = (0, _deepseek_ai_dsh_client_store.createSnapshotStore)([]);
|
|
17949
|
+
ctx.inject(["shortcuts"], (scope) => {
|
|
17950
|
+
const fixedInputs = [
|
|
17951
|
+
{
|
|
17952
|
+
id: "fixed.send",
|
|
17953
|
+
label: () => t("input.send"),
|
|
17954
|
+
keys: ["Enter"],
|
|
17955
|
+
bindings: [{
|
|
17956
|
+
code: "Enter",
|
|
17957
|
+
modifiers: []
|
|
17958
|
+
}],
|
|
17959
|
+
group: "input"
|
|
17960
|
+
},
|
|
17961
|
+
{
|
|
17962
|
+
id: "fixed.newline",
|
|
17963
|
+
label: () => t("shortcut.newline"),
|
|
17964
|
+
keys: scope.shortcuts.describeBinding({
|
|
17965
|
+
code: "Enter",
|
|
17966
|
+
modifiers: ["shift"]
|
|
17967
|
+
}).keys,
|
|
17968
|
+
bindings: [{
|
|
17969
|
+
code: "Enter",
|
|
17970
|
+
modifiers: ["shift"]
|
|
17971
|
+
}],
|
|
17972
|
+
group: "input"
|
|
17973
|
+
},
|
|
17974
|
+
{
|
|
17975
|
+
id: "fixed.complementary",
|
|
17976
|
+
label: () => t("shortcut.complementary"),
|
|
17977
|
+
keys: scope.shortcuts.describeBinding({
|
|
17978
|
+
code: "Enter",
|
|
17979
|
+
modifiers: ["primary"]
|
|
17980
|
+
}).keys,
|
|
17981
|
+
bindings: [{
|
|
17982
|
+
code: "Enter",
|
|
17983
|
+
modifiers: ["control"]
|
|
17984
|
+
}, {
|
|
17985
|
+
code: "Enter",
|
|
17986
|
+
modifiers: ["meta"]
|
|
17987
|
+
}],
|
|
17988
|
+
group: "input"
|
|
17989
|
+
},
|
|
17990
|
+
{
|
|
17991
|
+
id: "fixed.slash",
|
|
17992
|
+
label: () => t("shortcut.slash"),
|
|
17993
|
+
keys: ["/"],
|
|
17994
|
+
bindings: [{
|
|
17995
|
+
code: "Slash",
|
|
17996
|
+
modifiers: []
|
|
17997
|
+
}],
|
|
17998
|
+
group: "input"
|
|
17999
|
+
},
|
|
18000
|
+
{
|
|
18001
|
+
id: "fixed.mention",
|
|
18002
|
+
label: () => t("shortcut.mention"),
|
|
18003
|
+
keys: ["@"],
|
|
18004
|
+
bindings: [{
|
|
18005
|
+
code: "Digit2",
|
|
18006
|
+
modifiers: ["shift"]
|
|
18007
|
+
}],
|
|
18008
|
+
group: "input"
|
|
18009
|
+
}
|
|
18010
|
+
];
|
|
18011
|
+
for (const command of fixedInputs) scope.effect(() => scope.shortcuts.registerFixed(command), `ui-conversation: ${command.id}`);
|
|
18012
|
+
scope.effect(() => installStopShortcut(scope.shortcuts, sessions, (binding) => uiConversation.binding(binding).openTurn, ctx.uiSession, stop), "ui-conversation: fixed stop input");
|
|
18013
|
+
scope.effect(() => {
|
|
18014
|
+
const command = {
|
|
18015
|
+
id: "response.stop",
|
|
18016
|
+
label: () => t("input.stop"),
|
|
18017
|
+
keys: ["Esc", "Esc"],
|
|
18018
|
+
bindings: [{
|
|
18019
|
+
code: "Escape",
|
|
18020
|
+
modifiers: []
|
|
18021
|
+
}],
|
|
18022
|
+
group: "input"
|
|
18023
|
+
};
|
|
18024
|
+
const dispose = scope.shortcuts.registerFixed(command);
|
|
18025
|
+
stopShortcut.set(command.keys);
|
|
18026
|
+
return () => {
|
|
18027
|
+
stopShortcut.set([]);
|
|
18028
|
+
dispose();
|
|
18029
|
+
};
|
|
18030
|
+
}, "ui-conversation: fixed stop reference");
|
|
18031
|
+
});
|
|
17742
18032
|
const inputHub = new InputHub(ctx, t);
|
|
17743
18033
|
const composerBlocks = new ComposerBlockRegistry();
|
|
17744
18034
|
ctx.inject(["commandUi"], (scope) => {
|
|
@@ -17974,6 +18264,7 @@ window.__ModuleLoader__.load({
|
|
|
17974
18264
|
toggleCommandMenu: void 0,
|
|
17975
18265
|
stop: void 0,
|
|
17976
18266
|
hooks: {
|
|
18267
|
+
stopShortcut,
|
|
17977
18268
|
busyEnter: submissionPolicy.busyEnter,
|
|
17978
18269
|
fileUploads: ABSENT_FILE_UPLOADS,
|
|
17979
18270
|
notices: ABSENT_NOTICES,
|
|
@@ -18051,9 +18342,10 @@ window.__ModuleLoader__.load({
|
|
|
18051
18342
|
});
|
|
18052
18343
|
},
|
|
18053
18344
|
stop: () => {
|
|
18054
|
-
|
|
18345
|
+
stop(sessionId);
|
|
18055
18346
|
},
|
|
18056
18347
|
hooks: {
|
|
18348
|
+
stopShortcut,
|
|
18057
18349
|
busyEnter: submissionPolicy.busyEnter,
|
|
18058
18350
|
fileUploads: conversation.fileUploads,
|
|
18059
18351
|
notices: shell.notices,
|
|
@@ -461,6 +461,8 @@ export interface ComposerBarInjected {
|
|
|
461
461
|
toggleCommandMenu: ((selection: EditSelection) => void) | undefined;
|
|
462
462
|
stop: (() => void) | undefined;
|
|
463
463
|
hooks: {
|
|
464
|
+
/** Readable sequence while the fixed Stop command is registered. */
|
|
465
|
+
stopShortcut: ObservableSnapshot<readonly string[]>;
|
|
464
466
|
/**
|
|
465
467
|
* Live busy-state submission preference: the delivery mode plain Enter
|
|
466
468
|
* and the primary Send button use while the addressed agent is busy.
|
|
@@ -52,6 +52,11 @@ export declare class ConversationNodeAssembler implements ConversationViewSnapsh
|
|
|
52
52
|
* @param groupDefinitions - optional registered grouping rules, independent of presentation modes.
|
|
53
53
|
*/
|
|
54
54
|
constructor(eventDefinitions: ConversationEventDefinitions, viewDefinitions: ConversationViewDefinitions, groupDefinitions?: ConversationGroupDefinitions);
|
|
55
|
+
/**
|
|
56
|
+
* Read the current open turn without activating a View.
|
|
57
|
+
* @returns the latest turn number when its start is loaded and it remains open, otherwise undefined.
|
|
58
|
+
*/
|
|
59
|
+
openTurn(): number | undefined;
|
|
55
60
|
/**
|
|
56
61
|
* Replace the complete loaded window after open, resync, or gap repair.
|
|
57
62
|
* @param entries - complete contiguous window.
|
|
@@ -14,6 +14,11 @@ import { ConversationGroupRegistry } from './group-registry.ts';
|
|
|
14
14
|
/** Observable faces published for one Session's Conversation assembly. */
|
|
15
15
|
export interface ConversationBinding {
|
|
16
16
|
readonly snapshot: ObservableSnapshot<ConversationSnapshot>;
|
|
17
|
+
/**
|
|
18
|
+
* Identity-stable source of the latest turn number, undefined unless its start is loaded and it remains open.
|
|
19
|
+
* Turn changes publish synchronously, including without an active View.
|
|
20
|
+
*/
|
|
21
|
+
readonly openTurn: ObservableSnapshot<number | undefined>;
|
|
17
22
|
/**
|
|
18
23
|
* Add one selected target to the Session's monotonic active set.
|
|
19
24
|
* @param target - registered or subsequently registered Conversation target.
|
|
@@ -48,6 +53,7 @@ export declare class UiConversation extends Service {
|
|
|
48
53
|
* Resolve the Conversation binding for one Controller binding or Session id.
|
|
49
54
|
* @param source - Session binding or identity.
|
|
50
55
|
* @returns stable Conversation binding.
|
|
56
|
+
* @throws if the Session is unknown or its binding is no longer current.
|
|
51
57
|
*/
|
|
52
58
|
binding(source: SessionBinding | SessionId): ConversationBinding;
|
|
53
59
|
/**
|
|
@@ -26,7 +26,7 @@ export interface ComposerKeymapHandlers {
|
|
|
26
26
|
dismissPopup(): void;
|
|
27
27
|
/** Whether Enter may submit right now (locked/busy states refuse). */
|
|
28
28
|
canSubmit(): boolean;
|
|
29
|
-
/**
|
|
29
|
+
/** Plain Enter submits; exactly Ctrl+Enter or Cmd+Enter selects accelerated delivery. */
|
|
30
30
|
submit(accelerated: boolean): void;
|
|
31
31
|
/**
|
|
32
32
|
* Pasted files with directory metadata supplied by the clipboard entry API.
|
|
@@ -3,6 +3,10 @@
|
|
|
3
3
|
export declare const NS = "conversation";
|
|
4
4
|
/** Simplified Chinese dictionary (the key-set source of truth). */
|
|
5
5
|
export declare const zh: {
|
|
6
|
+
'shortcut.newline': string;
|
|
7
|
+
'shortcut.complementary': string;
|
|
8
|
+
'shortcut.slash': string;
|
|
9
|
+
'shortcut.mention': string;
|
|
6
10
|
'hint.plan': string;
|
|
7
11
|
'hint.goal': string;
|
|
8
12
|
'hint.goal.active': string;
|
|
@@ -83,6 +87,7 @@ export declare const zh: {
|
|
|
83
87
|
'tool.title.createSchedule': string;
|
|
84
88
|
'tool.title.listSchedules': string;
|
|
85
89
|
'tool.title.deleteSchedule': string;
|
|
90
|
+
'tool.title.updateSchedule': string;
|
|
86
91
|
'detail.state': string;
|
|
87
92
|
'detail.todo.completed': string;
|
|
88
93
|
'detail.todo.in_progress': string;
|
|
@@ -121,6 +126,17 @@ export declare const zh: {
|
|
|
121
126
|
'detail.schedule.empty': string;
|
|
122
127
|
'detail.schedule.deleted': string;
|
|
123
128
|
'detail.schedule.count': string;
|
|
129
|
+
'detail.schedule.daily': string;
|
|
130
|
+
'detail.schedule.weekly': string;
|
|
131
|
+
'detail.schedule.cron': string;
|
|
132
|
+
'detail.weekday.1': string;
|
|
133
|
+
'detail.weekday.2': string;
|
|
134
|
+
'detail.weekday.3': string;
|
|
135
|
+
'detail.weekday.4': string;
|
|
136
|
+
'detail.weekday.5': string;
|
|
137
|
+
'detail.weekday.6': string;
|
|
138
|
+
'detail.weekday.7': string;
|
|
139
|
+
'detail.weekday.join': string;
|
|
124
140
|
'tool.title.inspectProviders': string;
|
|
125
141
|
'tool.title.queryRuntime': string;
|
|
126
142
|
'tool.title.inspectPlugins': string;
|
|
@@ -355,6 +371,10 @@ export declare const zh: {
|
|
|
355
371
|
export type ConversationKey = keyof typeof zh;
|
|
356
372
|
/** English dictionary, checked complete against the zh key set. */
|
|
357
373
|
export declare const en: {
|
|
374
|
+
'shortcut.newline': string;
|
|
375
|
+
'shortcut.complementary': string;
|
|
376
|
+
'shortcut.slash': string;
|
|
377
|
+
'shortcut.mention': string;
|
|
358
378
|
'hint.plan': string;
|
|
359
379
|
'hint.goal': string;
|
|
360
380
|
'hint.goal.active': string;
|
|
@@ -435,6 +455,7 @@ export declare const en: {
|
|
|
435
455
|
'tool.title.createSchedule': string;
|
|
436
456
|
'tool.title.listSchedules': string;
|
|
437
457
|
'tool.title.deleteSchedule': string;
|
|
458
|
+
'tool.title.updateSchedule': string;
|
|
438
459
|
'detail.state': string;
|
|
439
460
|
'detail.todo.completed': string;
|
|
440
461
|
'detail.todo.in_progress': string;
|
|
@@ -473,6 +494,17 @@ export declare const en: {
|
|
|
473
494
|
'detail.schedule.empty': string;
|
|
474
495
|
'detail.schedule.deleted': string;
|
|
475
496
|
'detail.schedule.count': string;
|
|
497
|
+
'detail.schedule.daily': string;
|
|
498
|
+
'detail.schedule.weekly': string;
|
|
499
|
+
'detail.schedule.cron': string;
|
|
500
|
+
'detail.weekday.1': string;
|
|
501
|
+
'detail.weekday.2': string;
|
|
502
|
+
'detail.weekday.3': string;
|
|
503
|
+
'detail.weekday.4': string;
|
|
504
|
+
'detail.weekday.5': string;
|
|
505
|
+
'detail.weekday.6': string;
|
|
506
|
+
'detail.weekday.7': string;
|
|
507
|
+
'detail.weekday.join': string;
|
|
476
508
|
'tool.title.inspectProviders': string;
|
|
477
509
|
'tool.title.queryRuntime': string;
|
|
478
510
|
'tool.title.inspectPlugins': string;
|
|
@@ -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, toggleCommandMenu, stop, t, renderSlot, useBusyEnter, 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, t, renderSlot, useBusyEnter, useFileUploads, useNotices, useLexicon, useMenuLauncher, useStopShortcut, useProjection, sessionId, variant, disabled: inert, blocked, workspacePickerOpen, onRequestWorkspace, placeholder, accessory, }: InputBarProps) => import("react").JSX.Element>;
|
|
18
18
|
//# sourceMappingURL=InputBar.d.ts.map
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/** Two independent Escape presses addressed to one Conversation occurrence and live turn. */
|
|
2
|
+
import type { SessionId } from '@deepseek-ai/dsh-session/types';
|
|
3
|
+
/** Freshly resolved cancellation target; occurrence and region preserve focus ownership. */
|
|
4
|
+
export interface StopTarget {
|
|
5
|
+
readonly sessionId: SessionId;
|
|
6
|
+
readonly turn: number;
|
|
7
|
+
/** Materialized Session binding identity; replacement invalidates an earlier press. */
|
|
8
|
+
readonly generation: object;
|
|
9
|
+
readonly region: Element;
|
|
10
|
+
readonly cancel: () => void;
|
|
11
|
+
}
|
|
12
|
+
/** One short-lived first press, cleared before an accepted cancellation runs. */
|
|
13
|
+
export declare class StopSequence {
|
|
14
|
+
private readonly intervalMs;
|
|
15
|
+
private readonly release;
|
|
16
|
+
private first;
|
|
17
|
+
private timer;
|
|
18
|
+
/**
|
|
19
|
+
* @param intervalMs - validated maximum time between independent presses.
|
|
20
|
+
* @param release - releases observations retained by the pending first press.
|
|
21
|
+
*/
|
|
22
|
+
constructor(intervalMs: number, release: () => void);
|
|
23
|
+
/** Clear the first press and its expiry timer. */
|
|
24
|
+
reset(): void;
|
|
25
|
+
/**
|
|
26
|
+
* Accept one eligible, non-repeated Escape against freshly resolved current state.
|
|
27
|
+
* @param target - live turn and actual focused input region.
|
|
28
|
+
* @returns whether this press requested cancellation.
|
|
29
|
+
*/
|
|
30
|
+
press(target: StopTarget): boolean;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=stop-sequence.d.ts.map
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** Fixed Escape routing into the current Conversation turn's scoped cancellation. */
|
|
2
|
+
import type { ISessions, SessionBinding } from '@deepseek-ai/dsh-api-session-controller/client';
|
|
3
|
+
import type { Shortcuts } from '@deepseek-ai/dsh-client-shortcuts/client';
|
|
4
|
+
import type { UiSession } from '@deepseek-ai/dsh-client-ui-session/client';
|
|
5
|
+
import type { SessionId } from '@deepseek-ai/dsh-session/types';
|
|
6
|
+
import type { ObservableSnapshot } from '@deepseek-ai/dsh-client-store';
|
|
7
|
+
/**
|
|
8
|
+
* Subscribe fixed input to the same Session cancellation used by the stop button.
|
|
9
|
+
* @param shortcuts - window keyboard arbitration and validated sequence interval.
|
|
10
|
+
* @param sessions - live Session identities and lifecycle sources.
|
|
11
|
+
* @param openTurn - stable current-turn source for a live Session binding.
|
|
12
|
+
* @param uiSession - current pending-interaction status.
|
|
13
|
+
* @param cancel - scoped stop operation that preserves Queue and reports failures.
|
|
14
|
+
* @returns disposer releasing the input subscription, pending watches and expiry timer.
|
|
15
|
+
*/
|
|
16
|
+
export declare function installStopShortcut(shortcuts: Shortcuts, sessions: ISessions, openTurn: (binding: SessionBinding) => ObservableSnapshot<number | undefined>, uiSession: UiSession, cancel: (sessionId: SessionId) => void): () => void;
|
|
17
|
+
//# sourceMappingURL=stop-shortcut.d.ts.map
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { ViewTab } from './contract/views.ts';
|
|
2
2
|
/** Fallback View selected when no stored preference resolves to a registered View. */
|
|
3
3
|
export declare const DEFAULT_VIEW_ID = "chat";
|
|
4
|
-
/**
|
|
5
|
-
export declare const
|
|
4
|
+
/** Registered identity of the trajectory View. */
|
|
5
|
+
export declare const TRAJECTORY_VIEW_ID = "trajectory";
|
|
6
6
|
/**
|
|
7
7
|
* Resolve a preferred registered View, then Chat, without choosing another View.
|
|
8
8
|
* @param tabs - currently registered Views.
|
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.7-rc.
|
|
4
|
+
"version": "0.1.7-rc.2",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
@@ -61,37 +61,38 @@
|
|
|
61
61
|
"@lexical/plain-text": "^0.49.0",
|
|
62
62
|
"@lexical/history": "^0.49.0",
|
|
63
63
|
"@deepseek-ai/cordis": "~4.0.4",
|
|
64
|
-
"@deepseek-ai/dsh-api-remotes": "0.1.7-rc.
|
|
65
|
-
"@deepseek-ai/dsh-api-session-controller": "0.1.7-rc.
|
|
66
|
-
"@deepseek-ai/dsh-api-workspace-controller": "0.1.7-rc.
|
|
67
|
-
"@deepseek-ai/dsh-attachment": "0.1.7-rc.
|
|
68
|
-
"@deepseek-ai/dsh-
|
|
69
|
-
"@deepseek-ai/dsh-
|
|
70
|
-
"@deepseek-ai/dsh-client-file-upload": "0.1.7-rc.
|
|
71
|
-
"@deepseek-ai/dsh-client-
|
|
72
|
-
"@deepseek-ai/dsh-client-
|
|
73
|
-
"@deepseek-ai/dsh-client-ui-
|
|
74
|
-
"@deepseek-ai/dsh-client-ui-
|
|
75
|
-
"@deepseek-ai/dsh-client-
|
|
76
|
-
"@deepseek-ai/dsh-client-ui-
|
|
77
|
-
"@deepseek-ai/dsh-client-ui-
|
|
78
|
-
"@deepseek-ai/dsh-client-ui-
|
|
79
|
-
"@deepseek-ai/dsh-client-ui-
|
|
80
|
-
"@deepseek-ai/dsh-commands": "0.1.7-rc.
|
|
81
|
-
"@deepseek-ai/dsh-goal": "0.1.7-rc.
|
|
82
|
-
"@deepseek-ai/dsh-llm": "0.1.7-rc.
|
|
83
|
-
"@deepseek-ai/dsh-llm
|
|
84
|
-
"@deepseek-ai/dsh-plan-mode": "0.1.7-rc.
|
|
85
|
-
"@deepseek-ai/dsh-
|
|
86
|
-
"@deepseek-ai/dsh-
|
|
87
|
-
"@deepseek-ai/dsh-token-meter": "0.1.7-rc.
|
|
88
|
-
"@deepseek-ai/dsh-
|
|
89
|
-
"@deepseek-ai/dsh-
|
|
90
|
-
"@deepseek-ai/dsh-
|
|
91
|
-
"@deepseek-ai/dsh-
|
|
92
|
-
"@deepseek-ai/dsh-
|
|
93
|
-
"@deepseek-ai/dsh-
|
|
94
|
-
"@deepseek-ai/dsh-
|
|
64
|
+
"@deepseek-ai/dsh-api-remotes": "0.1.7-rc.2",
|
|
65
|
+
"@deepseek-ai/dsh-api-session-controller": "0.1.7-rc.2",
|
|
66
|
+
"@deepseek-ai/dsh-api-workspace-controller": "0.1.7-rc.2",
|
|
67
|
+
"@deepseek-ai/dsh-attachment": "0.1.7-rc.2",
|
|
68
|
+
"@deepseek-ai/dsh-brand": "0.1.7-rc.2",
|
|
69
|
+
"@deepseek-ai/dsh-client-locale": "0.1.7-rc.2",
|
|
70
|
+
"@deepseek-ai/dsh-client-file-upload": "0.1.7-rc.2",
|
|
71
|
+
"@deepseek-ai/dsh-client-store": "0.1.7-rc.2",
|
|
72
|
+
"@deepseek-ai/dsh-client-test-runtime": "0.1.7-rc.2",
|
|
73
|
+
"@deepseek-ai/dsh-client-ui-layout": "0.1.7-rc.2",
|
|
74
|
+
"@deepseek-ai/dsh-client-ui-primitives": "0.1.7-rc.2",
|
|
75
|
+
"@deepseek-ai/dsh-client-ui-renderer": "0.1.7-rc.2",
|
|
76
|
+
"@deepseek-ai/dsh-client-ui-session": "0.1.7-rc.2",
|
|
77
|
+
"@deepseek-ai/dsh-client-ui-settings": "0.1.7-rc.2",
|
|
78
|
+
"@deepseek-ai/dsh-client-ui-workspace": "0.1.7-rc.2",
|
|
79
|
+
"@deepseek-ai/dsh-client-ui-slots": "0.1.7-rc.2",
|
|
80
|
+
"@deepseek-ai/dsh-commands": "0.1.7-rc.2",
|
|
81
|
+
"@deepseek-ai/dsh-goal": "0.1.7-rc.2",
|
|
82
|
+
"@deepseek-ai/dsh-llm-retry": "0.1.7-rc.2",
|
|
83
|
+
"@deepseek-ai/dsh-llm": "0.1.7-rc.2",
|
|
84
|
+
"@deepseek-ai/dsh-plan-mode": "0.1.7-rc.2",
|
|
85
|
+
"@deepseek-ai/dsh-session": "0.1.7-rc.2",
|
|
86
|
+
"@deepseek-ai/dsh-util-values": "0.1.7-rc.2",
|
|
87
|
+
"@deepseek-ai/dsh-token-meter": "0.1.7-rc.2",
|
|
88
|
+
"@deepseek-ai/dsh-tool-todo": "0.1.7-rc.2",
|
|
89
|
+
"@deepseek-ai/dsh-util-crypto": "0.1.7-rc.2",
|
|
90
|
+
"@deepseek-ai/dsh-workspace": "0.1.7-rc.2",
|
|
91
|
+
"@deepseek-ai/dsh-file-reference": "0.1.7-rc.2",
|
|
92
|
+
"@deepseek-ai/dsh-util-workspace-path": "0.1.7-rc.2",
|
|
93
|
+
"@deepseek-ai/dsh-agent": "0.1.7-rc.2",
|
|
94
|
+
"@deepseek-ai/dsh-settings": "0.1.7-rc.2",
|
|
95
|
+
"@deepseek-ai/dsh-client-shortcuts": "0.1.7-rc.2"
|
|
95
96
|
},
|
|
96
97
|
"files": [
|
|
97
98
|
"lib/index.js",
|