@deepseek-ai/dsh-client-ui-workspace 0.2.1-alpha.1 → 0.2.1-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.i18n.yaml +8 -8
- package/README.md +6 -6
- package/README.zh.md +6 -6
- package/lib/client.js +52 -20
- package/lib/types/client/contract/slots.d.ts +11 -5
- package/lib/types/client/locales.d.ts +4 -0
- package/lib/types/client/navigation.d.ts +6 -3
- package/lib/types/client/session-actions/RowActionToast.d.ts +3 -7
- package/package.json +26 -26
package/README.i18n.yaml
CHANGED
|
@@ -27,20 +27,20 @@
|
|
|
27
27
|
en: 9eab3bfbaf98c987
|
|
28
28
|
zh: 54e7e141dae5c9e8
|
|
29
29
|
/deepseek-ai-dsh-client-ui-workspace/use-this-package/managing-sessions:
|
|
30
|
-
en:
|
|
31
|
-
zh:
|
|
30
|
+
en: cafc87e8e0ac4058
|
|
31
|
+
zh: 4c35bc5bfa24ba6c
|
|
32
32
|
/deepseek-ai-dsh-client-ui-workspace/use-this-package/pending-interactions:
|
|
33
33
|
en: 9fb88260380bf093
|
|
34
34
|
zh: 3bace2b96ecd4a82
|
|
35
35
|
/deepseek-ai-dsh-client-ui-workspace/use-this-package/active-schedule-markers:
|
|
36
|
-
en:
|
|
37
|
-
zh:
|
|
36
|
+
en: 04956ad6ba31cc86
|
|
37
|
+
zh: 0e5fb72cfa932d25
|
|
38
38
|
/deepseek-ai-dsh-client-ui-workspace/understand-the-implementation:
|
|
39
|
-
en:
|
|
40
|
-
zh:
|
|
39
|
+
en: 721d5a49fe231191
|
|
40
|
+
zh: 3ef1dd720219e00e
|
|
41
41
|
/deepseek-ai-dsh-client-ui-workspace/understand-the-implementation/the-directory-flow-hole:
|
|
42
|
-
en:
|
|
43
|
-
zh:
|
|
42
|
+
en: 868904dbfb5713f8
|
|
43
|
+
zh: 225906bfef7398bf
|
|
44
44
|
/deepseek-ai-dsh-client-ui-workspace/understand-the-implementation/session-row-actions:
|
|
45
45
|
en: a3b80d0e844d2929
|
|
46
46
|
zh: 85fe5dfb2968b491
|
package/README.md
CHANGED
|
@@ -51,13 +51,13 @@ Collapsed search is one header action beside the view and add actions: activatin
|
|
|
51
51
|
|
|
52
52
|
### Managing sessions
|
|
53
53
|
|
|
54
|
-
The Session row's Rename action opens a dialog prefilled with the row's display title; confirming an unchanged title is deliberately allowed — it pins the current automatic title against regeneration. Double-clicking a title also opens Rename; for an unarchived Session, the preceding clicks open its conversation. Rename uses a temporary `workspaceOperation` reference and awaits its initial history opening. The row's Fork action
|
|
54
|
+
The Session row's Rename action opens a dialog prefilled with the row's display title; confirming an unchanged title is deliberately allowed — it pins the current automatic title against regeneration. Double-clicking a title also opens Rename; for an unarchived Session, the preceding clicks open its conversation. Rename uses a temporary `workspaceOperation` reference and awaits its initial history opening. The row's Fork action reads ordinary cold history normally. When the Host reports that source migration is required, an app-wide Toast offers to open that Session; the action only navigates and does not retry fork. A successful fork uses the source's last completed turn and increments the inherited persisted title through Session Controller without retaining the child, opening its history, or changing selection. Workspace Delete opens a confirmation that states the retention boundary; success removes the group while its Sessions remain under Ungrouped. Pin, Rename, Fork, and Archive are themselves entries of the `sidebar.workspaces.session.menu.item` list (pin and archive also of `sidebar.workspaces.session.row.action`), so a client plugin's action takes whatever position its `order` gives it.
|
|
55
55
|
|
|
56
56
|
Archive commits without a confirmation dialog for a quiet Session and retains the Session's account position. A Session with running work is the one case that asks first: the Host refuses the plain archive and names that work, and the sidebar opens a stop-and-archive dialog listing it by family — the turn in progress, running subagents, background jobs, scheduled reminders, each with its labels — with the restore path stated; confirming asks the Host to stop the work the way the stop button does and archives once the archive set is durable, while the stops settle in the background, and cancelling leaves the Session running and visible. View options control visibility through one explicit three-way choice: Hide archived (the default) hides archived Sessions, All conversations (show archived) includes them, and Archived only hides ordinary Sessions and drops Workspaces without an archived Session; in tree grouping, children of a dropped Workspace nest under the nearest shown ancestor. Visible archived rows are grayed and carry an accessible explanation that they cannot be opened until restored; Rename, Fork, and Unarchive remain available. A successful archive shows a notice with an undo action and — while archived rows are hidden — a "filter archived sessions" action that switches the filter to All conversations (show archived); a stop-and-archive shows the same notice under its own wording, and undo restores the Session without resuming the stopped work. Unarchive removes the archive mark without restoring a pin or changing the saved position. An empty list shows a centered glyph-over-text placeholder; the Archived-only view names its own emptiness (No archived sessions yet) and adds a View other sessions text action that switches the filter back to Hide archived.
|
|
57
57
|
|
|
58
58
|
Session update times use the tertiary label color, including on archived rows. A Session title wider than its row is clipped with an ellipsis at rest. Hovering the row scrolls the title to its far edge — the incremented title of a fork, for example — and reveals it without the ellipsis; leaving the row returns the title to its start.
|
|
59
59
|
|
|
60
|
-
The keyboard reference exposes New Session, Search sessions, Add workspace, Rename session, Fork session, and Archive session. Desktop defaults use the platform's primary modifier, with Mod+K for search; Windows and macOS Web use the [shortcut service’s platform defaults](../shortcuts/README.md); Linux Web leaves these commands unbound until configured. Button tooltips and Session row menus display the effective bindings. Clicking a menu item targets that row; pressing its shortcut targets the main Session. Desktop and Windows/macOS Web rename use Mod+Alt+G, leaving Mod+Shift+R to browser reload. Rename requires a nonblank main Conversation with no modal obscuring it; a retained Session behind another main panel is unavailable. Other Windows and macOS Desktop bindings also execute from terminal input and modal dialogs; other environments follow the command's region and modal restrictions. Search and rename requests belong to this package; input drafts remain in the browser. The directory picker rejects another open while selection or Workspace adoption is pending. Fork captures the
|
|
60
|
+
The keyboard reference exposes New Session, Search sessions, Add workspace, Rename session, Fork session, and Archive session. Desktop defaults use the platform's primary modifier, with Mod+K for search; Windows and macOS Web use the [shortcut service’s platform defaults](../shortcuts/README.md); Linux Web leaves these commands unbound until configured. Button tooltips and Session row menus display the effective bindings. Clicking a menu item targets that row; pressing its shortcut targets the main Session. Desktop and Windows/macOS Web rename use Mod+Alt+G, leaving Mod+Shift+R to browser reload. Rename requires a nonblank main Conversation with no modal obscuring it; a retained Session behind another main panel is unavailable. Other Windows and macOS Desktop bindings also execute from terminal input and modal dialogs; other environments follow the command's region and modal restrictions. Search and rename requests belong to this package; input drafts remain in the browser. The directory picker rejects another open while selection or Workspace adoption is pending. Fork captures the retained main-view Session, for which navigation has requested history opening, and keeps automatic migration. It uses the row action's Host operation to select its last completed turn, without loading older Client history. Missing or blank Sessions are unavailable; the Host rejects a source with no completed turn. A rejected shortcut fork preserves the current selection, displays a localized notification, and can be retried; unexpected failures also retain diagnostic logging.
|
|
61
61
|
|
|
62
62
|
### Pending interactions
|
|
63
63
|
|
|
@@ -69,11 +69,11 @@ Grouped and flat Session rows show a clock mark when the Session has active sche
|
|
|
69
69
|
|
|
70
70
|
-----
|
|
71
71
|
|
|
72
|
-
`ctx.uiWorkspace.openSession(target)` synchronously replaces the owned `mainView` reference and returns the main area to Conversation without waiting for `reference.ready`, so history loading renders inside the selected Session view. The target may be a known Session id or a durable direct-parent subagent address; an explicit address does not require a preloaded parent catalog. `openWorkspace(id, beforeOpen?)` opens
|
|
72
|
+
`ctx.uiWorkspace.openSession(target)` synchronously replaces the owned `mainView` reference and returns the main area to Conversation without waiting for `reference.ready`, so history loading renders inside the selected Session view. The target may be a known Session id or a durable direct-parent subagent address; an explicit address does not require a preloaded parent catalog. `openWorkspace(id, beforeOpen?)` opens a Workspace blank only if no later navigation has superseded the request; an explicit New Session creates a fresh Session. `forkSession(id)` creates the child without navigating or superseding a pending navigation. The optional synchronous preparation callback runs after the target is retained and only for a current Workspace request, so superseded requests do not move composer drafts. Navigation or owner disposal suppresses the late UI commit, not the underlying Session creation. Startup restoration retains its main reference without changing the selected panel or cancelling a later navigation. Archiving the main Session releases its reference and clears the main selection. Selection failure leaves a global panel visible. Session rows read `usePanelInfo` to suppress their selected appearance while a global panel is active; search and directory-picker focus alone do not leave that panel.
|
|
73
73
|
|
|
74
74
|
Navigation and startup restoration obtain the selected Session's projections from its `follow`; neither issues a separate projection refresh for that Session or its parent.
|
|
75
75
|
|
|
76
|
-
|
|
76
|
+
Workspace reopening and explicit draft preparation try to acquire the first eligible blank in catalog order; startup restoration tries the saved blank. If that writer is held, navigation creates a new Session without trying other blanks. Other acquisition failures abort the request: an explicit New Session or hero Workspace pick shows the failure as a transient notice quoting the Host's code and message (for example a preset that fails to mount) or, for a failure that is not a Host refusal, that failure's own message; a request a later navigation or owner disposal superseded raises no notice, and startup restoration reports only to the console. Released blanks retain their slash-command state when reused. Later navigation cancels a pending startup selection.
|
|
77
77
|
|
|
78
78
|
Once both Workspace and Session startup baselines are ready, an empty installation calls `workspaces.initializeDefault` and creates or reuses its blank Session. The composer becomes editable when that Session is selected; no message is submitted automatically. Later navigation or owner disposal prevents startup from selecting its result. Ineligible first use leaves the folder picker available without an error. Default Workspace creation failure shows a transient notice directing the user to Choose workspace, and is not retried until the next startup. Session creation failures use the ordinary restoration error handling. The registered Workspace remains available if Session creation or later submission fails.
|
|
79
79
|
|
|
@@ -89,11 +89,11 @@ The package is one composition: both target slots are declared by other plugins,
|
|
|
89
89
|
|
|
90
90
|
The browser entry also declares two root-scoped `list` child seats on each Session row: `sidebar.session.row.leading`, rendered only while that row's primary status is idle and left blank on an archived row, and `sidebar.session.row.hover`, mounted only while that row's hover card is open. Both take the row's Session identity and nothing else, so an occupant reads its own data by that id; a Session-scoped seat would force a Session binding, which would activate and retain every listed Session.
|
|
91
91
|
|
|
92
|
-
Client callers can pass `prompt` and `clearPreviousDraft` in the second argument to `uiWorkspace.startSession`. A prompt is plain text; structured drafts are handled internally during restoration and Workspace transfer. Without clearing, existing text or attachments are preserved; explicit clearing replaces only the target Session's text and inline references, leaving attachments intact. Option values are captured before asynchronous creation and applied to the exact retained binding before navigation commits. Superseded navigation does not write content; a submission-blocked input refuses preparation and keeps the previous selection. Calls without options
|
|
92
|
+
Client callers can pass `prompt` and `clearPreviousDraft` in the second argument to `uiWorkspace.startSession`. A prompt is plain text; structured drafts are handled internally during restoration and Workspace transfer. Without clearing, existing text or attachments are preserved; explicit clearing replaces only the target Session's text and inline references, leaving attachments intact. Option values are captured before asynchronous creation and applied to the exact retained binding before navigation commits. Superseded navigation does not write content; a submission-blocked input refuses preparation and keeps the previous selection. Calls without options create a fresh Session using the current Agent preset definition. Workspace reconnection and explicit draft preparation may reuse an existing blank Session. The [draft initialization decision](../../../.agents/notes/implemented/architecture/2026-09-30-structured-draft-initialization.md) describes the input owner's data flow.
|
|
93
93
|
|
|
94
94
|
### The directory-flow hole
|
|
95
95
|
|
|
96
|
-
Each registration declares a **directory-flow child hole** (`single` kind: `conversation.hero.workspace.directoryFlow` / `sidebar.workspaces.directoryFlow`) that the composed picker package's client half fills with its picking interaction — the `-native` backend's renderless OS-chooser driver, an in-app browsing dialog under a `-browse` composition. The flat **Add workspace...** action renders only while the surface's hole is occupied; an empty hole means the composition has no picking affordance. This package owns the trigger and the adoption: the occupant reports one picked path per open through the hole's owner conversation (`open`/`busy`/`onPicked`/`onCancel`/`onError`), and the owner adopts it through the object layer, selecting the committed Workspace only after its list projection has refreshed.
|
|
96
|
+
Each registration declares a **directory-flow child hole** (`single` kind: `conversation.hero.workspace.directoryFlow` / `sidebar.workspaces.directoryFlow`) that the composed picker package's client half fills with its picking interaction — the `-native` backend's renderless OS-chooser driver, an in-app browsing dialog under a `-browse` composition. The flat **Add workspace...** action renders only while the surface's hole is occupied; an empty hole means the composition has no picking affordance. The sidebar Add workspace action preserves an existing blank Session and its draft. This package owns the trigger and the adoption: the occupant reports one picked path per open through the hole's owner conversation (`open`/`busy`/`onPicked`/`onCancel`/`onError`), and the owner adopts it through the object layer, selecting the committed Workspace only after its list projection has refreshed.
|
|
97
97
|
|
|
98
98
|
### Session row actions
|
|
99
99
|
|
package/README.zh.md
CHANGED
|
@@ -51,13 +51,13 @@ kind: "package-reference"
|
|
|
51
51
|
|
|
52
52
|
### 管理会话
|
|
53
53
|
|
|
54
|
-
Session 行内的 Rename 操作打开一个以该行显示标题预填的对话框;确认未修改的标题是有意允许的——这正是把当前自动标题钉住、不再被重新生成覆盖的手势。双击标题也会打开 Rename;对于未归档 Session,先发生的点击会打开其对话。Rename 使用临时 `workspaceOperation` reference,并等待首次历史打开。行内 Fork
|
|
54
|
+
Session 行内的 Rename 操作打开一个以该行显示标题预填的对话框;确认未修改的标题是有意允许的——这正是把当前自动标题钉住、不再被重新生成覆盖的手势。双击标题也会打开 Rename;对于未归档 Session,先发生的点击会打开其对话。Rename 使用临时 `workspaceOperation` reference,并等待首次历史打开。行内 Fork 正常读取普通冷历史。Host 报告源会话需要迁移时,应用级 Toast 提供打开该会话的操作;该操作仅导航,不重试 fork。成功的 fork 在源会话最后一个已完成轮次处创建分支,通过 Session Controller 递增继承的持久化标题,不 retain 子会话、不打开其历史,也不改变选择。Workspace 行内的 Delete 操作会打开确认框,说明保留边界;成功后该分组被移除,其 Session 则留在 Ungrouped 下。Pin、Rename、Fork、Archive 本身就是 `sidebar.workspaces.session.menu.item` 列表的条目(pin 与 archive 同时也是 `sidebar.workspaces.session.row.action` 的条目),因此客户端插件的 action 由其 `order` 决定落在哪个位置。
|
|
55
55
|
|
|
56
56
|
对静止的 Session,Archive 不经确认对话框直接提交,并保留 Session 的记账位置。仍有工作在跑的 Session 是唯一会先询问的情形:Host 拒绝普通归档并列出这些工作,侧栏随即打开"停止并归档"对话框,按族列出——进行中的回合、运行中的子代理、后台任务、定时提醒,各带名称——并写明恢复路径;确认后请 Host 按停止按钮同样的方式停止这些工作,归档集合持久化后即完成归档,停止在后台收敛;取消则让 Session 继续运行并保持可见。视图选项以一组显式三选一控制显隐:隐藏已归档(默认项)隐藏已归档 Session,全部对话(显示已归档)将其纳入列表,仅显示已归档则隐藏普通 Session,并丢弃没有归档 Session 的 Workspace;树形分组下,被丢弃 Workspace 的子级挂到最近一个仍显示的祖先下。可见的归档行置灰,并提供无障碍说明,告知取消归档后才能打开;Rename、Fork 与取消归档仍然可用。归档成功后的提示提供"撤销"动作,并在归档行仍被隐藏时附带"筛选已归档会话"动作,后者直接把筛选切到全部对话(显示已归档);停止并归档显示同样的提示但措辞不同,撤销只恢复 Session,不会让被停止的工作继续。取消归档移除归档标记,但不恢复置顶,也不改变保存的位置。列表为空时显示居中的"图标在上、文字在下"占位;仅显示已归档视图用自己的文案(暂无已归档会话),并附"查看其他会话"文字按钮,点击把筛选切回隐藏已归档。
|
|
57
57
|
|
|
58
58
|
会话更新时间使用 tertiary 文本色,包括已归档行。标题宽于所在行时,静止状态以省略号裁切。把指针停在行上,标题会滚动到远端——例如 fork 递增后的标题——并在揭示时不显示省略号;指针离开后标题回到开头。
|
|
59
59
|
|
|
60
|
-
快捷键速查提供新建会话、搜索会话、添加工作区、重命名会话、分叉会话和归档会话。桌面默认使用平台的主修饰键,搜索为 Mod+K;Windows 和 macOS Web 使用[快捷键服务的平台默认值](../shortcuts/README.zh.md);Linux Web 在用户配置前不绑定这些命令。按钮提示和会话行菜单显示当前有效绑定。点击菜单项操作该行,按快捷键操作主会话。Desktop 和 Windows/macOS Web 的重命名均使用 Mod+Alt+G,将 Mod+Shift+R 留给浏览器刷新。重命名要求主区域正在显示非空会话,且没有模态对话框遮挡;切换到其他主面板后,后台保留的会话不可作为重命名目标。其他 Windows 和 macOS Desktop
|
|
60
|
+
快捷键速查提供新建会话、搜索会话、添加工作区、重命名会话、分叉会话和归档会话。桌面默认使用平台的主修饰键,搜索为 Mod+K;Windows 和 macOS Web 使用[快捷键服务的平台默认值](../shortcuts/README.zh.md);Linux Web 在用户配置前不绑定这些命令。按钮提示和会话行菜单显示当前有效绑定。点击菜单项操作该行,按快捷键操作主会话。Desktop 和 Windows/macOS Web 的重命名均使用 Mod+Alt+G,将 Mod+Shift+R 留给浏览器刷新。重命名要求主区域正在显示非空会话,且没有模态对话框遮挡;切换到其他主面板后,后台保留的会话不可作为重命名目标。其他 Windows 和 macOS Desktop 绑定也可从终端输入区域和模态对话框中执行;其他环境遵循命令的区域和模态限制。搜索和重命名的打开请求归本包管理,输入草稿保留在浏览器中。目录选择或工作区接纳尚未结束时,目录选择器拒绝重复打开。分叉捕获主视图已持有并发起历史打开的会话,保留自动迁移;它使用与行菜单相同的 Host 操作选择最近已完成轮次,不读取更早的 Client 历史。没有会话或会话为空时不可用;没有已完成轮次的源会话由 Host 拒绝。快捷键分叉被拒绝时保留当前选择、显示本地化提示,并允许重试;非预期失败还会保留诊断日志。
|
|
61
61
|
|
|
62
62
|
### 待处理交互
|
|
63
63
|
|
|
@@ -69,11 +69,11 @@ Session 行渲染运行时的实时 `pendingInteraction` 分类:审批显示**
|
|
|
69
69
|
|
|
70
70
|
-----
|
|
71
71
|
|
|
72
|
-
`ctx.uiWorkspace.openSession(target)` 会同步替换其拥有的 `mainView` reference,并让主区域返回 Conversation,而不等待 `reference.ready`,因此历史加载会显示在已经选中的 Session 视图内。目标可以是已知 Session id,也可以是持久的直接父子 subagent 地址;显式地址不要求预先加载 parent catalog。`openWorkspace(id, beforeOpen?)`
|
|
72
|
+
`ctx.uiWorkspace.openSession(target)` 会同步替换其拥有的 `mainView` reference,并让主区域返回 Conversation,而不等待 `reference.ready`,因此历史加载会显示在已经选中的 Session 视图内。目标可以是已知 Session id,也可以是持久的直接父子 subagent 地址;显式地址不要求预先加载 parent catalog。`openWorkspace(id, beforeOpen?)` 仅在请求未被后续导航替代时打开工作区空白 Session;显式新会话操作会创建新的 Session。`forkSession(id)` 创建子会话,不导航,也不替代尚未完成的导航。可选的同步准备回调在目标被 retain 后执行,并且仅对仍有效的 Workspace 请求执行,因此过期请求不会搬移 composer 草稿。后续导航或 owner 释放会阻止晚到的 UI 提交,但不取消底层 Session 创建。启动恢复会 retain 主 reference,不改变已选面板,也不取消后续导航。归档主 Session 会释放其 reference 并清除主选择。选择失败时保留当前全局面板。Session 行读取 `usePanelInfo`,在全局面板活跃时不显示 Session 选中样式;仅把焦点移到搜索框或目录选择器不会离开该面板。
|
|
73
73
|
|
|
74
74
|
导航和启动恢复通过所选 Session 的 `follow` 获取投影,不会另行刷新该 Session 或其父会话的投影。
|
|
75
75
|
|
|
76
|
-
|
|
76
|
+
重新打开工作区和显式准备草稿尝试获取列表中第一个符合条件的空白会话;启动恢复尝试已保存的空白会话。若该写锁被占用,导航直接新建 Session,不再尝试其他空白会话。其他获取错误会中止请求:显式新建会话或在 hero 中选择工作区时,失败以短暂提示展示,引用 Host 的错误码和消息(例如 preset 挂载失败),非 Host 拒绝的失败则显示其自身消息;已被后续导航或 owner 销毁取代的请求不弹提示,启动恢复仍只报告到控制台。已释放的空白会话被复用时保留 slash 命令状态。后续导航会取消尚未完成的启动选择。
|
|
77
77
|
|
|
78
78
|
Workspace 和 Session 的启动基线均就绪后,空安装环境调用 `workspaces.initializeDefault`,创建或复用其空白 Session。选中该 Session 后输入框才可编辑,不会自动提交消息。后续导航或所属上下文销毁会阻止启动流程选中其结果。不符合首次使用条件时仍可选择文件夹,不显示错误。默认工作区创建失败时显示短暂提示,引导用户通过“选择工作区”选择文件夹,直到下次启动才重试。Session 创建失败沿用普通的恢复错误处理。登记成功的工作区在 Session 创建或后续提交失败时仍然保留。
|
|
79
79
|
|
|
@@ -89,11 +89,11 @@ Workspace 和 Session 的启动基线均就绪后,空安装环境调用 `works
|
|
|
89
89
|
|
|
90
90
|
浏览器入口还为每个 Session 行声明两个 root 作用域的 `list` 子 slot:`sidebar.session.row.leading` 仅在该行主状态为 idle 时渲染、归档行留空,`sidebar.session.row.hover` 仅在该行的悬浮卡片打开时挂载。两者只接收行的 Session 身份,占用方据此读取自己的数据;Session 作用域的 slot 会强制建立 Session 绑定,从而激活并保留列表中每个 Session。
|
|
91
91
|
|
|
92
|
-
客户端调用方可以在 `uiWorkspace.startSession` 的第二参数中传入 `prompt` 与 `clearPreviousDraft`。提示词仅接受普通文字;结构化草稿由内部恢复和工作区携带流程处理。不清空时保留已有文字或附件;显式清空只替换目标 Session 的文字和内联引用,不删除附件。在异步创建前捕获选项值,在导航提交前应用到准确保留的 binding
|
|
92
|
+
客户端调用方可以在 `uiWorkspace.startSession` 的第二参数中传入 `prompt` 与 `clearPreviousDraft`。提示词仅接受普通文字;结构化草稿由内部恢复和工作区携带流程处理。不清空时保留已有文字或附件;显式清空只替换目标 Session 的文字和内联引用,不删除附件。在异步创建前捕获选项值,在导航提交前应用到准确保留的 binding。已被后续操作取代的导航不写内容;输入处于提交阻塞状态时拒绝准备并保留原选择。不传选项时按当前 Agent 预设定义创建新的 Session。工作区重连和显式草稿准备仍可复用已有空 Session。[草稿初始化决策](../../../.agents/notes/implemented/architecture/2026-09-30-structured-draft-initialization.zh.md)说明输入 owner 的数据流。
|
|
93
93
|
|
|
94
94
|
### 目录流子 slot
|
|
95
95
|
|
|
96
|
-
每个注册各自声明一个**目录流子 slot**(`single` kind:`conversation.hero.workspace.directoryFlow`/`sidebar.workspaces.directoryFlow`),由组合的选择器包 client half 填入其选取交互——`-native` 后端的无渲染 OS 选择器驱动,`-browse` 组合下则是应用内浏览对话框。平铺显示的**添加工作区…** 操作仅在当前界面的 slot 被占用时渲染;slot
|
|
96
|
+
每个注册各自声明一个**目录流子 slot**(`single` kind:`conversation.hero.workspace.directoryFlow`/`sidebar.workspaces.directoryFlow`),由组合的选择器包 client half 填入其选取交互——`-native` 后端的无渲染 OS 选择器驱动,`-browse` 组合下则是应用内浏览对话框。平铺显示的**添加工作区…** 操作仅在当前界面的 slot 被占用时渲染;slot 为空意味着该组合没有目录选择能力。侧栏的添加工作区操作保留已有空白 Session 及其草稿。本包持有触发与接纳:占用方通过 slot 的属主交互约定(`open`/`busy`/`onPicked`/`onCancel`/`onError`)每次打开上报一个所选路径,owner 通过对象层接纳它,并等待 Workspace 列表投影刷新后才选中已提交的 Workspace。
|
|
97
97
|
|
|
98
98
|
### Session 行 action
|
|
99
99
|
|
package/lib/client.js
CHANGED
|
@@ -1410,9 +1410,13 @@ window.__ModuleLoader__.load({
|
|
|
1410
1410
|
};
|
|
1411
1411
|
}, "ui-workspace: Workspace navigation policy");
|
|
1412
1412
|
}
|
|
1413
|
-
|
|
1413
|
+
connectWorkspace(workspaceId) {
|
|
1414
|
+
return this.connectBlank(workspaceId, true);
|
|
1415
|
+
}
|
|
1416
|
+
async connectBlank(workspaceId, reuse) {
|
|
1414
1417
|
const workspace = this.workspaces.list.getSnapshot().items.find((item) => item.workspaceId === workspaceId);
|
|
1415
1418
|
if (workspace === void 0) throw new Error(`uiWorkspace.connectWorkspace: unknown workspace ${workspaceId}`);
|
|
1419
|
+
if (!reuse) return this.sessions.create({ workspaceId });
|
|
1416
1420
|
const inflight = this.connecting.get(workspaceId);
|
|
1417
1421
|
if (inflight !== void 0) return inflight;
|
|
1418
1422
|
const attempt = this.reuseOrCreateBlank(workspace).finally(() => {
|
|
@@ -1445,11 +1449,14 @@ window.__ModuleLoader__.load({
|
|
|
1445
1449
|
openSession(target) {
|
|
1446
1450
|
this.replaceMain(target, this.lifetime.signal, "reveal");
|
|
1447
1451
|
}
|
|
1448
|
-
|
|
1452
|
+
openWorkspace(workspaceId, beforeOpen) {
|
|
1453
|
+
return this.openWorkspaceSession(workspaceId, beforeOpen, true);
|
|
1454
|
+
}
|
|
1455
|
+
async openWorkspaceSession(workspaceId, beforeOpen, reuse) {
|
|
1449
1456
|
const navigation = AbortSignal.any([this.ctx.layout.beginNavigation(), this.lifetime.signal]);
|
|
1450
1457
|
let sessionId;
|
|
1451
1458
|
try {
|
|
1452
|
-
sessionId = await this.
|
|
1459
|
+
sessionId = await this.connectBlank(workspaceId, reuse);
|
|
1453
1460
|
} catch (error) {
|
|
1454
1461
|
if (!navigation.aborted) this.notify({
|
|
1455
1462
|
kind: "createFailed",
|
|
@@ -1460,11 +1467,12 @@ window.__ModuleLoader__.load({
|
|
|
1460
1467
|
if (navigation.aborted) return;
|
|
1461
1468
|
this.replaceMain(sessionId, navigation, "reveal", beforeOpen);
|
|
1462
1469
|
}
|
|
1463
|
-
async forkSession(sessionId, onCreated) {
|
|
1470
|
+
async forkSession(sessionId, onCreated, options) {
|
|
1464
1471
|
return this.sessions.fork({
|
|
1465
1472
|
sessionId,
|
|
1466
1473
|
increaseTitle: true,
|
|
1467
|
-
...onCreated === void 0 ? {} : { onCreated }
|
|
1474
|
+
...onCreated === void 0 ? {} : { onCreated },
|
|
1475
|
+
...options?.allowMigration === void 0 ? {} : { allowMigration: options.allowMigration }
|
|
1468
1476
|
});
|
|
1469
1477
|
}
|
|
1470
1478
|
startSession(workspaceId, options) {
|
|
@@ -1487,11 +1495,11 @@ window.__ModuleLoader__.load({
|
|
|
1487
1495
|
this.clearMain();
|
|
1488
1496
|
return;
|
|
1489
1497
|
}
|
|
1490
|
-
this.openWorkspace(target, initializeDraft ? (id) => {
|
|
1498
|
+
(draftOptions === void 0 ? this.openWorkspaceSession(target, void 0, false) : this.openWorkspace(target, initializeDraft ? (id) => {
|
|
1491
1499
|
const binding = this.sessions.binding(id);
|
|
1492
1500
|
if (binding === void 0) this.draftPreparationFailed();
|
|
1493
1501
|
this.prepareDraft(binding, draftOptions);
|
|
1494
|
-
} : void 0).catch((reason) => {
|
|
1502
|
+
} : void 0)).catch((reason) => {
|
|
1495
1503
|
console.warn("new session failed:", reason);
|
|
1496
1504
|
});
|
|
1497
1505
|
}
|
|
@@ -3869,7 +3877,7 @@ window.__ModuleLoader__.load({
|
|
|
3869
3877
|
side: "right",
|
|
3870
3878
|
onPick: (workspaceId) => {
|
|
3871
3879
|
closeAddWorkspace();
|
|
3872
|
-
startSession(workspaceId);
|
|
3880
|
+
startSession(workspaceId, { clearPreviousDraft: false });
|
|
3873
3881
|
},
|
|
3874
3882
|
onClose: () => {
|
|
3875
3883
|
closeAddWorkspace();
|
|
@@ -4443,23 +4451,31 @@ window.__ModuleLoader__.load({
|
|
|
4443
4451
|
*/
|
|
4444
4452
|
/**
|
|
4445
4453
|
* Hold for the notices that take longer to read than a one-line warning: the
|
|
4446
|
-
*
|
|
4447
|
-
* creation, which quotes the Host's reason.
|
|
4454
|
+
* archive and fork recovery actions, and a refused Session creation quoting the Host's reason.
|
|
4448
4455
|
*/
|
|
4449
4456
|
const LONG_TOAST_HOLD_MS = 6e3;
|
|
4450
4457
|
/**
|
|
4451
|
-
* Render
|
|
4452
|
-
*
|
|
4453
|
-
* are hidden — on a 6 s hold, a refused Session creation with the Host's
|
|
4454
|
-
* reason on the same hold, or a plain warning for a failed pin, an archived
|
|
4455
|
-
* row that was clicked, or default Workspace creation.
|
|
4456
|
-
* @param props - the notice hook, the shared viewing store, the notice dismissal, the two archived-notice actions, and the locale seat.
|
|
4458
|
+
* Render an operation notice, retaining recovery actions for six seconds.
|
|
4459
|
+
* @param props - notice and viewing sources, dismissal and recovery callbacks, and localized copy.
|
|
4457
4460
|
* @returns the notice on display, or null.
|
|
4458
4461
|
*/
|
|
4459
|
-
function RowActionToast({ useToast, useStore, dismissToast, undoArchive, showArchived, t }) {
|
|
4462
|
+
function RowActionToast({ useToast, useStore, dismissToast, undoArchive, showArchived, openForkSource, t }) {
|
|
4460
4463
|
const toast = useToast((current) => current);
|
|
4461
4464
|
const archivedRowsVisible = useStore((state) => (state.archivedFilter ?? "default") !== "default");
|
|
4462
4465
|
if (toast === null) return null;
|
|
4466
|
+
if (toast.kind === "forkRequiresOpen") return (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Toast, {
|
|
4467
|
+
text: t("toast.forkRequiresOpen"),
|
|
4468
|
+
icon: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconWarningOutlineRegular, {}),
|
|
4469
|
+
holdMs: LONG_TOAST_HOLD_MS,
|
|
4470
|
+
actions: [{
|
|
4471
|
+
label: t("toast.openForkSource"),
|
|
4472
|
+
onClick: () => {
|
|
4473
|
+
dismissToast();
|
|
4474
|
+
openForkSource(toast.sessionId);
|
|
4475
|
+
}
|
|
4476
|
+
}],
|
|
4477
|
+
onDone: dismissToast
|
|
4478
|
+
}, `toast-${String(toast.seq)}`);
|
|
4463
4479
|
if (toast.kind === "archived" || toast.kind === "stoppedAndArchived") {
|
|
4464
4480
|
const { sessionId } = toast;
|
|
4465
4481
|
return (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Toast, {
|
|
@@ -4598,6 +4614,8 @@ window.__ModuleLoader__.load({
|
|
|
4598
4614
|
"toast.pinFailed": "置顶失败,请稍后重试",
|
|
4599
4615
|
"toast.unpinFailed": "取消置顶失败,请稍后重试",
|
|
4600
4616
|
"toast.createFailed": "新建会话失败:{message}",
|
|
4617
|
+
"toast.forkRequiresOpen": "请先打开原会话完成迁移,再创建分支",
|
|
4618
|
+
"toast.openForkSource": "打开原会话",
|
|
4601
4619
|
"sessions.count.one": "{n} 个会话",
|
|
4602
4620
|
"sessions.count.other": "{n} 个会话",
|
|
4603
4621
|
"actions.workspace.aria": "工作区“{name}”的操作",
|
|
@@ -4715,6 +4733,8 @@ window.__ModuleLoader__.load({
|
|
|
4715
4733
|
"toast.pinFailed": "Pin failed. Try again later.",
|
|
4716
4734
|
"toast.unpinFailed": "Unpin failed. Try again later.",
|
|
4717
4735
|
"toast.createFailed": "New session failed: {message}",
|
|
4736
|
+
"toast.forkRequiresOpen": "Open the original session to complete migration before creating a branch.",
|
|
4737
|
+
"toast.openForkSource": "Open original session",
|
|
4718
4738
|
"sessions.count.one": "{n} session",
|
|
4719
4739
|
"sessions.count.other": "{n} sessions",
|
|
4720
4740
|
"actions.workspace.aria": "Workspace actions for {name}",
|
|
@@ -4892,7 +4912,12 @@ window.__ModuleLoader__.load({
|
|
|
4892
4912
|
parent_session_id: sessionId,
|
|
4893
4913
|
click_position: "sidebar"
|
|
4894
4914
|
});
|
|
4895
|
-
}).catch(() => {
|
|
4915
|
+
}, { allowMigration: false }).catch((error) => {
|
|
4916
|
+
if (error instanceof Error && error.name === "SessionForkError" && error.rpcError.code === "session/migration-required") notify({
|
|
4917
|
+
kind: "forkRequiresOpen",
|
|
4918
|
+
sessionId
|
|
4919
|
+
});
|
|
4920
|
+
});
|
|
4896
4921
|
} });
|
|
4897
4922
|
const renameInjected = () => ({ requestSessionRename });
|
|
4898
4923
|
const renameDialogInjected = () => ({
|
|
@@ -4908,11 +4933,18 @@ window.__ModuleLoader__.load({
|
|
|
4908
4933
|
undoArchive: unarchiveSession,
|
|
4909
4934
|
showArchived: () => {
|
|
4910
4935
|
viewInstance.actions.setArchivedFilter("show");
|
|
4936
|
+
},
|
|
4937
|
+
openForkSource: (sessionId) => {
|
|
4938
|
+
if (workspaces.list.getSnapshot().archivedSessionIds.includes(sessionId)) {
|
|
4939
|
+
notify({ kind: "archivedNotOpenable" });
|
|
4940
|
+
return;
|
|
4941
|
+
}
|
|
4942
|
+
openSession(sessionId);
|
|
4911
4943
|
}
|
|
4912
4944
|
});
|
|
4913
4945
|
const browserInjected = () => ({
|
|
4914
|
-
startSession: (workspaceId) => {
|
|
4915
|
-
uiWorkspace.startSession(workspaceId);
|
|
4946
|
+
startSession: (workspaceId, options) => {
|
|
4947
|
+
uiWorkspace.startSession(workspaceId, options);
|
|
4916
4948
|
},
|
|
4917
4949
|
open: openSession,
|
|
4918
4950
|
searchSessions,
|
|
@@ -45,6 +45,7 @@ import type { SessionActivity, WorkspaceId, WorkspaceView } from '@deepseek-ai/d
|
|
|
45
45
|
import type { SessionId } from '@deepseek-ai/dsh-session/types';
|
|
46
46
|
import type { ShortcutCatalogEntry } from '@deepseek-ai/dsh-client-shortcuts/client';
|
|
47
47
|
import type { WorkspaceShortcutState } from '../shortcuts.ts';
|
|
48
|
+
import type { StartSessionOptions } from '../navigation.ts';
|
|
48
49
|
import type { createWorkspaceViewStore } from '../stores.ts';
|
|
49
50
|
/**
|
|
50
51
|
* Owner share of the directory-flow holes: the complete conversation between
|
|
@@ -236,11 +237,11 @@ export type WorkspaceBrowserInjected = {
|
|
|
236
237
|
/** Dismiss the shortcut's fork-failure notification. */
|
|
237
238
|
dismissForkError: () => void;
|
|
238
239
|
/**
|
|
239
|
-
*
|
|
240
|
-
*
|
|
241
|
-
*
|
|
240
|
+
* Create a fresh Session, or preserve a reusable blank with explicit draft options.
|
|
241
|
+
* Without an explicit Workspace, inherit the current Session Workspace,
|
|
242
|
+
* then the recent Workspace, or clear into the New Session view.
|
|
242
243
|
*/
|
|
243
|
-
startSession: (workspaceId?: WorkspaceId) => void;
|
|
244
|
+
startSession: (workspaceId?: WorkspaceId, options?: StartSessionOptions) => void;
|
|
244
245
|
/** Open a real Session. */
|
|
245
246
|
open: (sessionId: SessionId) => void;
|
|
246
247
|
/**
|
|
@@ -294,6 +295,9 @@ export type RowToast = {
|
|
|
294
295
|
kind: 'archivedNotOpenable';
|
|
295
296
|
} | {
|
|
296
297
|
kind: 'defaultWorkspaceFailed';
|
|
298
|
+
} | {
|
|
299
|
+
kind: 'forkRequiresOpen';
|
|
300
|
+
sessionId: SessionId;
|
|
297
301
|
}
|
|
298
302
|
/**
|
|
299
303
|
* An explicit New Session request that failed. `message` is untranslated:
|
|
@@ -406,7 +410,7 @@ export interface SessionRenameDialogInjected {
|
|
|
406
410
|
/** Rename a Session (explicit user title; resolves on host acceptance). */
|
|
407
411
|
renameSession: (sessionId: SessionId, title: string) => Promise<void>;
|
|
408
412
|
}
|
|
409
|
-
/** Row toast share: the notice
|
|
413
|
+
/** Row toast share: the notice, dismissal, archive recovery, and explicit source-history opening. */
|
|
410
414
|
export interface RowToastInjected {
|
|
411
415
|
hooks: {
|
|
412
416
|
/** The notice on display, or none. */
|
|
@@ -418,6 +422,8 @@ export interface RowToastInjected {
|
|
|
418
422
|
undoArchive: (sessionId: SessionId) => void;
|
|
419
423
|
/** Switch the archived filter to "show" so the archived row is back in view. */
|
|
420
424
|
showArchived: () => void;
|
|
425
|
+
/** Open the fork source without retrying the fork. */
|
|
426
|
+
openForkSource: (sessionId: SessionId) => void;
|
|
421
427
|
}
|
|
422
428
|
/** Props of the rename dialog entry in `shell.overlay`. */
|
|
423
429
|
export type SessionRenameDialogProps = PropsRuntime<'shell.overlay'> & PropsLocale<'workspace'> & Omit<SessionRenameDialogInjected, 'hooks'> & PropsHooks<SessionRenameDialogInjected['hooks']>;
|
|
@@ -88,6 +88,8 @@ export declare const zh: {
|
|
|
88
88
|
'toast.pinFailed': string;
|
|
89
89
|
'toast.unpinFailed': string;
|
|
90
90
|
'toast.createFailed': string;
|
|
91
|
+
'toast.forkRequiresOpen': string;
|
|
92
|
+
'toast.openForkSource': string;
|
|
91
93
|
'sessions.count.one': string;
|
|
92
94
|
'sessions.count.other': string;
|
|
93
95
|
'actions.workspace.aria': string;
|
|
@@ -207,6 +209,8 @@ export declare const en: {
|
|
|
207
209
|
'toast.pinFailed': string;
|
|
208
210
|
'toast.unpinFailed': string;
|
|
209
211
|
'toast.createFailed': string;
|
|
212
|
+
'toast.forkRequiresOpen': string;
|
|
213
|
+
'toast.openForkSource': string;
|
|
210
214
|
'sessions.count.one': string;
|
|
211
215
|
'sessions.count.other': string;
|
|
212
216
|
'actions.workspace.aria': string;
|
|
@@ -30,9 +30,10 @@ export interface UiWorkspace {
|
|
|
30
30
|
* Fork a Session without changing the current selection.
|
|
31
31
|
* @param sessionId - source Session.
|
|
32
32
|
* @param onCreated - observer before the optional child-title update.
|
|
33
|
+
* @param options - optional permission to start source migration; omission preserves the Host default.
|
|
33
34
|
* @returns the child SessionId after creation and inherited-title increment.
|
|
34
35
|
*/
|
|
35
|
-
forkSession(sessionId: SessionId, onCreated?: (childId: SessionId) => void): Promise<SessionId>;
|
|
36
|
+
forkSession(sessionId: SessionId, onCreated?: (childId: SessionId) => void, options?: Pick<Parameters<ISessions['fork']>[0], 'allowMigration'>): Promise<SessionId>;
|
|
36
37
|
/**
|
|
37
38
|
* Resolve the reusable or newly created blank Session for a Workspace.
|
|
38
39
|
* @param workspaceId - target Workspace.
|
|
@@ -40,7 +41,7 @@ export interface UiWorkspace {
|
|
|
40
41
|
*/
|
|
41
42
|
connectWorkspace(workspaceId: WorkspaceId): Promise<SessionId>;
|
|
42
43
|
/**
|
|
43
|
-
*
|
|
44
|
+
* Create a fresh Session, or reuse a blank when preparing an explicit draft. A creation the Host
|
|
44
45
|
* refuses is shown through the Workspace notice and leaves the selection as it was.
|
|
45
46
|
* @param workspaceId - explicit target; absent inherits the current or most recent Workspace.
|
|
46
47
|
* @param options - initial content; existing text or attachments are preserved unless clearPreviousDraft is true.
|
|
@@ -126,11 +127,13 @@ declare class UiWorkspaceService extends Service implements UiWorkspace {
|
|
|
126
127
|
*/
|
|
127
128
|
constructor(ctx: Context, directoryPicker: ClientRemote['directoryPicker'], workspaces: IWorkspaces, sessions: ISessions, view: Pick<WorkspaceViewStoreActions, 'pinSessionOrder'>, notify: (toast: RowToast) => void);
|
|
128
129
|
connectWorkspace(workspaceId: WorkspaceId): Promise<SessionId>;
|
|
130
|
+
private connectBlank;
|
|
129
131
|
private reuseOrCreateBlank;
|
|
130
132
|
private reuseBlank;
|
|
131
133
|
openSession(target: SessionTarget): void;
|
|
132
134
|
openWorkspace(workspaceId: WorkspaceId, beforeOpen?: (sessionId: SessionId) => void): Promise<void>;
|
|
133
|
-
|
|
135
|
+
private openWorkspaceSession;
|
|
136
|
+
forkSession(sessionId: SessionId, onCreated?: (childId: SessionId) => void, options?: Pick<Parameters<ISessions['fork']>[0], 'allowMigration'>): Promise<SessionId>;
|
|
134
137
|
startSession(workspaceId?: WorkspaceId, options?: StartSessionOptions): void;
|
|
135
138
|
private prepareDraft;
|
|
136
139
|
private draftPreparationFailed;
|
|
@@ -1,12 +1,8 @@
|
|
|
1
1
|
import type { RowToastProps } from '../contract/slots.ts';
|
|
2
2
|
/**
|
|
3
|
-
* Render
|
|
4
|
-
*
|
|
5
|
-
* are hidden — on a 6 s hold, a refused Session creation with the Host's
|
|
6
|
-
* reason on the same hold, or a plain warning for a failed pin, an archived
|
|
7
|
-
* row that was clicked, or default Workspace creation.
|
|
8
|
-
* @param props - the notice hook, the shared viewing store, the notice dismissal, the two archived-notice actions, and the locale seat.
|
|
3
|
+
* Render an operation notice, retaining recovery actions for six seconds.
|
|
4
|
+
* @param props - notice and viewing sources, dismissal and recovery callbacks, and localized copy.
|
|
9
5
|
* @returns the notice on display, or null.
|
|
10
6
|
*/
|
|
11
|
-
export declare function RowActionToast({ useToast, useStore, dismissToast, undoArchive, showArchived, t }: RowToastProps): import("react").JSX.Element | null;
|
|
7
|
+
export declare function RowActionToast({ useToast, useStore, dismissToast, undoArchive, showArchived, openForkSource, t }: RowToastProps): import("react").JSX.Element | null;
|
|
12
8
|
//# sourceMappingURL=RowActionToast.d.ts.map
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deepseek-ai/dsh-client-ui-workspace",
|
|
3
3
|
"description": "Workspace picker plugin: one WorkspacePicker registered into the sidebar and empty-state workspace slots",
|
|
4
|
-
"version": "0.2.1-alpha.
|
|
4
|
+
"version": "0.2.1-alpha.2",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
@@ -48,34 +48,34 @@
|
|
|
48
48
|
"@deepseek-ai/cordis": "~4.0.5-alpha.1"
|
|
49
49
|
},
|
|
50
50
|
"devDependencies": {
|
|
51
|
+
"@deepseek-ai/cordis": "~4.0.5-alpha.1",
|
|
52
|
+
"@deepseek-ai/dsh-api-remotes": "0.2.1-alpha.2",
|
|
53
|
+
"@deepseek-ai/dsh-agent": "0.2.1-alpha.2",
|
|
54
|
+
"@deepseek-ai/dsh-api-session-controller": "0.2.1-alpha.2",
|
|
55
|
+
"@deepseek-ai/dsh-api-workspace-controller": "0.2.1-alpha.2",
|
|
56
|
+
"@deepseek-ai/dsh-client-connection": "0.2.1-alpha.2",
|
|
57
|
+
"@deepseek-ai/dsh-client-locale": "0.2.1-alpha.2",
|
|
58
|
+
"@deepseek-ai/dsh-client-store": "0.2.1-alpha.2",
|
|
59
|
+
"@deepseek-ai/dsh-client-test-runtime": "0.2.1-alpha.2",
|
|
60
|
+
"@deepseek-ai/dsh-client-ui-conversation": "0.2.1-alpha.2",
|
|
61
|
+
"@deepseek-ai/dsh-client-ui-layout": "0.2.1-alpha.2",
|
|
62
|
+
"@deepseek-ai/dsh-client-ui-primitives": "0.2.1-alpha.2",
|
|
63
|
+
"@deepseek-ai/dsh-client-ui-renderer": "0.2.1-alpha.2",
|
|
64
|
+
"@deepseek-ai/dsh-client-ui-session": "0.2.1-alpha.2",
|
|
65
|
+
"@deepseek-ai/dsh-client-ui-sidebar": "0.2.1-alpha.2",
|
|
66
|
+
"@deepseek-ai/dsh-client-ui-slots": "0.2.1-alpha.2",
|
|
67
|
+
"@deepseek-ai/dsh-jobs": "0.2.1-alpha.2",
|
|
68
|
+
"@deepseek-ai/dsh-schedule": "0.2.1-alpha.2",
|
|
69
|
+
"@deepseek-ai/dsh-session": "0.2.1-alpha.2",
|
|
70
|
+
"@deepseek-ai/dsh-subagent": "0.2.1-alpha.2",
|
|
71
|
+
"@deepseek-ai/dsh-typert-protocol": "0.2.1-alpha.2",
|
|
72
|
+
"@deepseek-ai/dsh-util-values": "0.2.1-alpha.2",
|
|
73
|
+
"@deepseek-ai/dsh-util-workspace-path": "0.2.1-alpha.2",
|
|
51
74
|
"@types/react": "~18.3.1",
|
|
52
75
|
"clsx": "^2.0.0",
|
|
53
76
|
"react": "^18.2.0",
|
|
54
|
-
"@deepseek-ai/dsh-
|
|
55
|
-
"@deepseek-ai/
|
|
56
|
-
"@deepseek-ai/dsh-agent": "0.2.1-alpha.1",
|
|
57
|
-
"@deepseek-ai/dsh-api-workspace-controller": "0.2.1-alpha.1",
|
|
58
|
-
"@deepseek-ai/dsh-api-session-controller": "0.2.1-alpha.1",
|
|
59
|
-
"@deepseek-ai/dsh-client-connection": "0.2.1-alpha.1",
|
|
60
|
-
"@deepseek-ai/dsh-client-locale": "0.2.1-alpha.1",
|
|
61
|
-
"@deepseek-ai/dsh-client-store": "0.2.1-alpha.1",
|
|
62
|
-
"@deepseek-ai/dsh-client-test-runtime": "0.2.1-alpha.1",
|
|
63
|
-
"@deepseek-ai/dsh-client-ui-layout": "0.2.1-alpha.1",
|
|
64
|
-
"@deepseek-ai/dsh-client-ui-conversation": "0.2.1-alpha.1",
|
|
65
|
-
"@deepseek-ai/dsh-client-ui-primitives": "0.2.1-alpha.1",
|
|
66
|
-
"@deepseek-ai/dsh-client-ui-renderer": "0.2.1-alpha.1",
|
|
67
|
-
"@deepseek-ai/dsh-client-ui-session": "0.2.1-alpha.1",
|
|
68
|
-
"@deepseek-ai/dsh-client-ui-sidebar": "0.2.1-alpha.1",
|
|
69
|
-
"@deepseek-ai/dsh-client-ui-slots": "0.2.1-alpha.1",
|
|
70
|
-
"@deepseek-ai/dsh-jobs": "0.2.1-alpha.1",
|
|
71
|
-
"@deepseek-ai/dsh-session": "0.2.1-alpha.1",
|
|
72
|
-
"@deepseek-ai/dsh-subagent": "0.2.1-alpha.1",
|
|
73
|
-
"@deepseek-ai/dsh-typert-protocol": "0.2.1-alpha.1",
|
|
74
|
-
"@deepseek-ai/dsh-util-values": "0.2.1-alpha.1",
|
|
75
|
-
"@deepseek-ai/dsh-schedule": "0.2.1-alpha.1",
|
|
76
|
-
"@deepseek-ai/dsh-util-workspace-path": "0.2.1-alpha.1",
|
|
77
|
-
"@deepseek-ai/dsh-client-product-analytics": "0.2.1-alpha.1",
|
|
78
|
-
"@deepseek-ai/dsh-client-shortcuts": "0.2.1-alpha.1"
|
|
77
|
+
"@deepseek-ai/dsh-client-shortcuts": "0.2.1-alpha.2",
|
|
78
|
+
"@deepseek-ai/dsh-client-product-analytics": "0.2.1-alpha.2"
|
|
79
79
|
},
|
|
80
80
|
"files": [
|
|
81
81
|
"lib/index.js",
|