@deepseek-ai/dsh-client-ui-message-feedback 0.1.6-alpha.1 → 0.1.7-alpha.1

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 CHANGED
@@ -2,5 +2,5 @@
2
2
  # side as of the last confirmed-consistent state. Both languages carry equal authority;
3
3
  # after editing either side, bring the other along and re-record with:
4
4
  # pnpm run verify-translation-pairing --write packages/client/ui-message-feedback/README.md
5
- README.md: b37278e8d115a2ad61bb17ef8d884b0d888cd6a7
6
- README.zh.md: cd233061640f5e52ea9ca54ffe973bff3b957197
5
+ README.md: b6c6f227ebbeb3d6862d10658b1b125517b25581
6
+ README.zh.md: a294c73c87e8e2da8139fe965e70d9eaf34096a6
package/README.md CHANGED
@@ -25,7 +25,7 @@ This package is the Web GUI's feedback surface: the Like/Dislike pair in the fin
25
25
  <a id="use-this-package"></a>
26
26
  ## Use this package
27
27
 
28
- Mount this plugin alongside `ui-conversation` and `ui-commands`; the Like/Dislike pair then appears in the action row of each turn's closing assistant message, between copy and branch, and the Feedback row of the composer menu opens the dialog. A recorded rating shows the filled glyph and stays visible without hover. Like and Dislike both open the dialog: seven category chips and a detail box are optional, and Submit records the selected judgment with whatever was filled in before the toast thanks the user; the conversation log travels with every feedback event. Clicking the recorded rating retracts it without opening the dialog. A bare `/feedback`, picked from the menu or typed and sent without text, opens the same dialog for the Session; `/feedback <text>` keeps the Host command path and its acknowledgement row.
28
+ Mount this plugin alongside `ui-conversation` and `ui-commands`; the Like/Dislike pair then appears in the action row of each turn's closing assistant message, between copy and branch, and Feedback in the composer menu opens the same dialog. Mounting `session-log-export` also adds Feedback to the Session Header's more-actions menu. A recorded rating shows the filled glyph and stays visible without hover. Like and Dislike both open the dialog: seven category chips and a detail box are optional, and Submit records the selected judgment with whatever was filled in before the toast thanks the user; the conversation log travels with every feedback event. Clicking the recorded rating retracts it without opening the dialog. A bare `/feedback`, picked from the menu or typed and sent without text, opens the same dialog for the Session; `/feedback <text>` keeps the Host command path and its acknowledgement row.
29
29
 
30
30
  ### Failures
31
31
 
@@ -39,7 +39,7 @@ A rating or list-load failure shows inline in the row; a submission failure show
39
39
  <details>
40
40
  <summary>Implementation internals — click to expand</summary>
41
41
 
42
- The package contributes the `feedback` entry (order 10) of `conversation.chat.assistant-actions`, declared by ui-conversation and rendered inside the finalized assistant message's IconActions row, and the `feedback-dialog` entry (order 2) of `conversation.input.overlay`, which renders the Modal and Toast primitives through body portals and centers the toast over the composer card it mounts inside. The `/feedback` decoration is an `action` registered through `ctx.commandUi.decorate`, so a menu pick or a bare Enter consumes the trigger token and opens the dialog while an argued line still reaches the Host command.
42
+ The package contributes the `feedback` entry (order 10) of `conversation.chat.assistant-actions`, declared by ui-conversation and rendered inside the finalized assistant message's IconActions row, and the `feedback-dialog` entry (order 2) of `conversation.input.overlay`, which renders the Modal and Toast primitives through body portals and centers the toast over the composer card it mounts inside. The `feedbackUi.openSession(sessionId)` Client service opens that same Session-scoped dialog without recording feedback; the Header menu and command decoration both use it. The `/feedback` decoration is an `action` registered through `ctx.commandUi.decorate`, so a menu pick or a bare Enter consumes the trigger token and opens the dialog while an argued line still reaches the Host command.
43
43
 
44
44
  Per Session, one `MessageFeedbackController` backs every message control and one `FeedbackDialogController` owns the dialog draft, the submission, and the toast sequence. The message controller reads `messageFeedback.list` once, deferred to the first hover or focus rather than fired on mount, and serializes mutations so each carries the version last observed; a `version-conflict` reply carries the authoritative item and reconciles the view without refetching. Before either rating action proceeds, the row checks the committed item: the matching rating calls `retract`, which rechecks the rating in the serialized queue and becomes a no-op after a concurrent change, while any other state opens the dialog with the requested rating. The dialog controller submits by target: a message target puts that rating with the dialog's note and category through the message controller, and the Session target records through `ctx.remote.sessionFeedback`. Success closes the draft and raises the acknowledgement toast; a late success from a superseded draft raises that toast without closing the new draft; a failure keeps the draft open and raises a longer-lived warning toast.
45
45
 
@@ -90,4 +90,4 @@ None.
90
90
 
91
91
  </details>
92
92
 
93
- **Runtime invariant:** No companion is published. The plugin owns two slot registrations, one command decoration, and one per-session controller-pair map, all released by the plugin fiber's effect disposers. The lifecycle spec proves the registrations are withdrawn and every controller pair is dropped when the owning fiber is disposed, so no second authority exists to check at runtime.
93
+ **Runtime invariant:** No companion is published. The plugin owns two slot registrations, one command decoration, the `feedbackUi` service, and one per-session controller-pair map, all released with the owning plugin fiber. The lifecycle spec verifies that the registrations and service are withdrawn and every controller pair is dropped when the fiber is disposed, so no second authority exists to check at runtime.
package/README.zh.md CHANGED
@@ -25,7 +25,7 @@ kind: "package-reference"
25
25
  <a id="use-this-package"></a>
26
26
  ## 使用本包
27
27
 
28
- 与 `ui-conversation`、`ui-commands` 一起挂载本插件;Like/Dislike 对随即出现在每个轮次收尾助手消息的动作行中,位于复制与分支之间,输入框菜单里的「反馈」行则打开弹窗。已记录的评分显示实心图标,不需要悬停也一直可见。点赞和点踩都会打开弹窗:七个分类标签和一个详情框都可不填;提交后才会记录带所填内容的对应评分并弹出感谢 toast,对话日志随每个反馈事件一起投递。再次点击已记录的评分会直接撤回,不打开弹窗。不带文本的 `/feedback`,无论是从菜单选中还是直接输入后发送,都会为 Session 打开同一个弹窗;`/feedback <text>` 仍走宿主命令路径并显示确认行。
28
+ 与 `ui-conversation`、`ui-commands` 一起挂载本插件;Like/Dislike 对随即出现在每个轮次收尾助手消息的动作行中,位于复制与分支之间,输入框菜单里的「反馈」会打开同一个弹窗。挂载 `session-log-export` 后,会话标题栏的更多操作菜单也会增加「反馈」。已记录的评分显示实心图标,不需要悬停也一直可见。点赞和点踩都会打开弹窗:七个分类标签和一个详情框都可不填;提交后才会记录带所填内容的对应评分并弹出感谢 toast,对话日志随每个反馈事件一起投递。再次点击已记录的评分会直接撤回,不打开弹窗。不带文本的 `/feedback`,无论是从菜单选中还是直接输入后发送,都会为 Session 打开同一个弹窗;`/feedback <text>` 仍走宿主命令路径并显示确认行。
29
29
 
30
30
  ### 失败
31
31
 
@@ -39,7 +39,7 @@ kind: "package-reference"
39
39
  <details>
40
40
  <summary>实现细节——点击展开</summary>
41
41
 
42
- 本包贡献 `conversation.chat.assistant-actions` 的 `feedback` 条目(order 10),由 ui-conversation 声明并渲染在已定稿助手消息的 IconActions 行内;同时贡献 `conversation.input.overlay` 的 `feedback-dialog` 条目(order 2),它通过 body portal 渲染 Modal 与 Toast 基元,并让 toast 以其所在的输入框卡片为中心。`/feedback` 装饰是经 `ctx.commandUi.decorate` 注册的 `action`,因此菜单选中或不带参数的回车会消费触发 token 并打开弹窗,而带参数的命令行仍到达宿主命令。
42
+ 本包贡献 `conversation.chat.assistant-actions` 的 `feedback` 条目(order 10),由 ui-conversation 声明并渲染在已定稿助手消息的 IconActions 行内;同时贡献 `conversation.input.overlay` 的 `feedback-dialog` 条目(order 2),它通过 body portal 渲染 Modal 与 Toast 基元,并让 toast 以其所在的输入框卡片为中心。`feedbackUi.openSession(sessionId)` Client 服务打开同一个 Session 级弹窗,不记录反馈;标题栏菜单和命令装饰共用此方法。`/feedback` 装饰是经 `ctx.commandUi.decorate` 注册的 `action`,因此菜单选中或不带参数的回车会消费触发 token 并打开弹窗,而带参数的命令行仍到达宿主命令。
43
43
 
44
44
  每个 Session 有一个 `MessageFeedbackController` 支撑所有消息控件,以及一个 `FeedbackDialogController` 拥有弹窗草稿、提交与 toast 序号。消息控制器只读取一次 `messageFeedback.list`,且延迟到首次 hover 或 focus 才发起,而非挂载时触发;变更串行执行,每次都携带最后观察到的版本,`version-conflict` 响应带回权威条目,据此对账视图而不重新拉取。任一评分操作执行前,该行都会检查已提交条目:评分相同则调用 `retract`,它会在串行队列内重新检查评分并在并发变更后变为无操作;其他状态则携带所选评分打开弹窗。弹窗控制器按目标提交:消息目标通过消息控制器 put 一条带弹窗备注与分类的对应评分,Session 目标通过 `ctx.remote.sessionFeedback` 记录。成功会关闭草稿并弹出确认 toast;被替换的旧草稿迟到的成功只弹确认 toast、不关闭新草稿;失败会保留弹窗并弹出停留时间更长的警告 toast。
45
45
 
@@ -90,4 +90,4 @@ kind: "package-reference"
90
90
 
91
91
  </details>
92
92
 
93
- **运行时不变式:** 不发布伴生入口。插件持有两个 slot 注册、一个命令装饰,以及一个按 Session 划分的控制器对 map;它们都由插件 fiber 的同一个 effect disposer 释放。生命周期规格测试证明,所属 fiber 释放时会撤销所有注册并丢弃所有控制器,因此不存在需要在运行时检查的第二权威来源。
93
+ **运行时不变式:** 不发布伴生入口。插件持有两个 slot 注册、一个命令装饰、`feedbackUi` 服务,以及一个按 Session 划分的控制器对 map;它们都随所属插件 fiber 释放。生命周期规格测试验证,fiber 释放时会撤销所有注册和服务并丢弃所有控制器,因此不存在需要在运行时检查的第二权威来源。
package/lib/client.js CHANGED
@@ -9,7 +9,7 @@ window.__ModuleLoader__.load({
9
9
  let _deepseek_ai_dsh_client_ui_primitives = require("@deepseek-ai/dsh-client-ui-primitives");
10
10
  let _deepseek_ai_dsh_client_store = require("@deepseek-ai/dsh-client-store");
11
11
  //#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-message-feedback/src/client/FeedbackDialog.module.css.mjs
12
- const css$1 = "._6_jNJa_dialog._6_jNJa_dialog{border-radius:18px;gap:38px;width:min(488px,100%)}._6_jNJa_categories{flex-wrap:wrap;gap:8px;margin-top:-14px;display:flex}._6_jNJa_chip{border:.5px solid var(--dsw-alias-border-l4);corner-shape:round;height:28px;color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;background:0 0;border-radius:14px;padding:0 12px;font-size:13px;line-height:18px;transition:background-color .12s,border-color .12s,color .12s}._6_jNJa_chip:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}._6_jNJa_chip:disabled{cursor:default;opacity:.4}._6_jNJa_chip:focus-visible{outline:2px solid var(--dsw-alias-button-primary-fill);outline-offset:2px}._6_jNJa_chipActive,._6_jNJa_chipActive:hover:not(:disabled){border-color:var(--dsw-alias-button-primary-fill);background:var(--dsw-alias-button-primary-fill);color:var(--dsw-alias-label-primary-foreground)}._6_jNJa_detail{box-sizing:border-box;border:.5px solid var(--dsw-alias-border-l4);background:var(--dsw-alias-bg-layer-1);width:100%;min-height:116px;max-height:280px;color:var(--dsw-alias-label-primary);font:inherit;field-sizing:content;resize:none;border-radius:16px;margin-top:18px;padding:12px 14px;font-size:14px;line-height:22px;transition:border-color .12s,box-shadow .12s;display:block}._6_jNJa_detail::placeholder{color:var(--dsw-alias-label-caption)}._6_jNJa_detail:focus{border-color:var(--dsw-alias-border-l3);box-shadow:0 0 0 1px var(--dsw-alias-border-l3);outline:none}._6_jNJa_submit{border-radius:18px;width:100%;height:44px;font-size:14px;font-weight:500}._6_jNJa_toastIcon{border:1.5px solid var(--dsw-alias-state-success-primary);corner-shape:round;width:18px;height:18px;color:var(--dsw-alias-state-success-primary);border-radius:50%;place-items:center;display:grid}@media (prefers-reduced-motion:reduce){._6_jNJa_chip,._6_jNJa_detail{transition:none}}";
12
+ const css$1 = "._6_jNJa_dialog._6_jNJa_dialog{border-radius:18px;gap:38px;width:min(488px,100%)}._6_jNJa_categories{flex-wrap:wrap;gap:8px;margin-top:-14px;display:flex}._6_jNJa_chip{border:.5px solid var(--dsw-alias-border-l4);corner-shape:round;height:28px;color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;background:0 0;border-radius:14px;padding:0 12px;font-size:13px;line-height:18px;transition:background-color .12s,border-color .12s,color .12s}._6_jNJa_chip:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}._6_jNJa_chip:disabled{cursor:default;opacity:.4}._6_jNJa_chip:focus-visible{outline:2px solid var(--dsw-alias-button-primary-fill);outline-offset:2px}._6_jNJa_chipActive,._6_jNJa_chipActive:hover:not(:disabled){border-color:var(--dsw-alias-button-primary-fill);background:var(--dsw-alias-button-primary-fill);color:var(--dsw-alias-label-primary-foreground)}._6_jNJa_detail{box-sizing:border-box;border:.5px solid var(--dsw-alias-border-l4);background:var(--dsw-alias-bg-layer-1);width:100%;min-height:116px;max-height:280px;color:var(--dsw-alias-label-primary);font:inherit;field-sizing:content;resize:none;border-radius:16px;margin-top:18px;padding:12px 14px;font-size:14px;line-height:22px;transition:border-color .12s,box-shadow .12s;display:block}._6_jNJa_detail::placeholder{color:var(--dsw-alias-label-caption)}._6_jNJa_detail:focus{border-color:var(--dsw-alias-border-l3);box-shadow:0 0 0 1px var(--dsw-alias-border-l3);outline:none}._6_jNJa_submit{border-radius:18px;width:100%;height:44px;font-size:14px;font-weight:500}@media (prefers-reduced-motion:reduce){._6_jNJa_chip,._6_jNJa_detail{transition:none}}";
13
13
  const tagId$1 = "@deepseek-ai/dsh-client-ui-message-feedback/FeedbackDialog.module.css";
14
14
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$1) + "]") === null) {
15
15
  const tag = document.createElement("style");
@@ -24,8 +24,7 @@ window.__ModuleLoader__.load({
24
24
  "chipActive": "_6_jNJa_chipActive",
25
25
  "detail": "_6_jNJa_detail",
26
26
  "dialog": "_6_jNJa_dialog",
27
- "submit": "_6_jNJa_submit",
28
- "toastIcon": "_6_jNJa_toastIcon"
27
+ "submit": "_6_jNJa_submit"
29
28
  };
30
29
  //#endregion
31
30
  //#region lib/types/client/FeedbackDialog.js
@@ -82,16 +81,13 @@ window.__ModuleLoader__.load({
82
81
  }),
83
82
  toast > 0 && failure === null && (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Toast, {
84
83
  text: t("toast.recorded"),
85
- icon: (0, react_jsx_runtime.jsx)("span", {
86
- className: FeedbackDialog_module_css_default.toastIcon,
87
- children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconCheckOutline16, { size: 12 })
88
- }),
84
+ tone: "success",
89
85
  anchor: card,
90
86
  onDone: onToastDone
91
87
  }, toast),
92
88
  failure !== null && (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Toast, {
93
89
  text: failure,
94
- icon: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconWarningOutline16, {}),
90
+ icon: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconWarningOutlineRegular, {}),
95
91
  anchor: card,
96
92
  holdMs: 6e3,
97
93
  onDone: onFailureDone
@@ -234,7 +230,7 @@ window.__ModuleLoader__.load({
234
230
  onFocus: seed,
235
231
  onPointerEnter: seed,
236
232
  onClick: onLike,
237
- children: rating === "positive" ? (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconLikeFill16, {}) : (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconLikeOutline16, {})
233
+ children: rating === "positive" ? (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconLikeFillRegular, {}) : (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconLikeOutlineRegular, {})
238
234
  })
239
235
  }),
240
236
  (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
@@ -250,7 +246,7 @@ window.__ModuleLoader__.load({
250
246
  onFocus: seed,
251
247
  onPointerEnter: seed,
252
248
  onClick: onDislike,
253
- children: rating === "negative" ? (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconDislikeFill16, {}) : (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconDislikeOutline16, {})
249
+ children: rating === "negative" ? (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconDislikeFillRegular, {}) : (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconDislikeOutlineRegular, {})
254
250
  })
255
251
  }),
256
252
  failure === null && loadFailed && (0, react_jsx_runtime.jsx)("span", {
@@ -771,7 +767,8 @@ window.__ModuleLoader__.load({
771
767
  * conversation.chat.assistant-actions strip, the feedback dialog and its
772
768
  * acknowledgement and failure toasts in conversation.input.overlay, and the `/feedback`
773
769
  * decoration that opens the dialog from the composer menu or a bare typed
774
- * command. One FeedbackSurface per Session backs every entry in that Session.
770
+ * command. The feedbackUi service opens the same dialog for other plugins.
771
+ * One FeedbackSurface per Session backs every entry in that Session.
775
772
  * @module @deepseek-ai/dsh-client-ui-message-feedback/client
776
773
  */
777
774
  /** Dictionary namespace owned by this plugin. */
@@ -786,7 +783,8 @@ window.__ModuleLoader__.load({
786
783
  ];
787
784
  /**
788
785
  * Client plugin body: the per-message feedback entry, the Session's dialog
789
- * entry, the `/feedback` decoration, and their per-session surfaces.
786
+ * entry, the `feedbackUi` service, the `/feedback` decoration, and their
787
+ * per-session surfaces.
790
788
  * @param ctx - client root context.
791
789
  */
792
790
  function apply(ctx) {
@@ -807,6 +805,10 @@ window.__ModuleLoader__.load({
807
805
  for (const surface of surfaces.values()) surface.dispose();
808
806
  surfaces.clear();
809
807
  }, "ui-message-feedback: per-session surfaces");
808
+ const feedbackUi = { openSession: (sessionId) => {
809
+ surfaceFor(sessionId).dialog.open({ kind: "session" });
810
+ } };
811
+ ctx.provide("feedbackUi", feedbackUi);
810
812
  ctx.on("connection/reset", () => {
811
813
  for (const { feedback } of surfaces.values()) if (feedback.getSnapshot().status !== "cold") feedback.resync();
812
814
  });
@@ -864,7 +866,7 @@ window.__ModuleLoader__.load({
864
866
  ui: {
865
867
  kind: "action",
866
868
  run: (session) => {
867
- surfaceFor(session.sessionId).dialog.open({ kind: "session" });
869
+ feedbackUi.openSession(session.sessionId);
868
870
  }
869
871
  }
870
872
  }), "ui-message-feedback: /feedback decoration");
@@ -3,19 +3,35 @@
3
3
  * conversation.chat.assistant-actions strip, the feedback dialog and its
4
4
  * acknowledgement and failure toasts in conversation.input.overlay, and the `/feedback`
5
5
  * decoration that opens the dialog from the composer menu or a bare typed
6
- * command. One FeedbackSurface per Session backs every entry in that Session.
6
+ * command. The feedbackUi service opens the same dialog for other plugins.
7
+ * One FeedbackSurface per Session backs every entry in that Session.
7
8
  * @module @deepseek-ai/dsh-client-ui-message-feedback/client
8
9
  */
9
10
  import type { Context as ClientContext } from '@deepseek-ai/cordis';
11
+ import type { SessionId } from '@deepseek-ai/dsh-session/types';
10
12
  export type { MessageFeedbackActionFailure, MessageFeedbackActionResult, MessageFeedbackStatus, MessageFeedbackView, } from './controller.ts';
11
13
  export type { FeedbackDialogState, FeedbackDialogTarget, FeedbackSubmit } from './dialog.ts';
12
14
  export type { FeedbackDialogInjected, FeedbackDialogProps, MessageFeedbackActionProps, MessageFeedbackInjected, } from './slots.ts';
13
15
  export type { MessageFeedbackKey } from './locales.ts';
16
+ /** Opens the existing Session feedback form without submitting feedback. */
17
+ export interface FeedbackUi {
18
+ /**
19
+ * Open the Session feedback draft without recording feedback.
20
+ * @param sessionId - Session whose feedback draft to open.
21
+ */
22
+ openSession(sessionId: SessionId): void;
23
+ }
24
+ declare module '@deepseek-ai/cordis' {
25
+ interface Context {
26
+ feedbackUi: FeedbackUi;
27
+ }
28
+ }
14
29
  /** Required services: the slot registry, the two Remote namespaces, and the copy. */
15
30
  export declare const inject: string[];
16
31
  /**
17
32
  * Client plugin body: the per-message feedback entry, the Session's dialog
18
- * entry, the `/feedback` decoration, and their per-session surfaces.
33
+ * entry, the `feedbackUi` service, the `/feedback` decoration, and their
34
+ * per-session surfaces.
19
35
  * @param ctx - client root context.
20
36
  */
21
37
  export declare function apply(ctx: ClientContext): void;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@deepseek-ai/dsh-client-ui-message-feedback",
3
3
  "description": "The Web feedback surface: per-message Like/Dislike in the assistant-message action strip and the feedback dialog behind both ratings and /feedback, backed by the messageFeedback and sessionFeedback Host Remotes",
4
- "version": "0.1.6-alpha.1",
4
+ "version": "0.1.7-alpha.1",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -39,7 +39,7 @@
39
39
  },
40
40
  "license": "MIT",
41
41
  "peerDependencies": {
42
- "@deepseek-ai/cordis": "^4.0.2"
42
+ "@deepseek-ai/cordis": "^4.0.3"
43
43
  },
44
44
  "devDependencies": {
45
45
  "@testing-library/react": "^16.1.0",
@@ -47,24 +47,24 @@
47
47
  "@types/react-dom": "~18.3.0",
48
48
  "react": "^18.2.0",
49
49
  "react-dom": "^18.2.0",
50
- "@deepseek-ai/dsh-api-remotes": "^0.1.6-alpha.1",
51
- "@deepseek-ai/dsh-client-connection": "^0.1.6-alpha.1",
52
- "@deepseek-ai/dsh-client-locale": "^0.1.6-alpha.1",
53
- "@deepseek-ai/dsh-client-test-runtime": "^0.1.6-alpha.1",
54
- "@deepseek-ai/dsh-client-ui-conversation": "^0.1.6-alpha.1",
55
- "@deepseek-ai/dsh-client-ui-primitives": "^0.1.6-alpha.1",
56
- "@deepseek-ai/dsh-client-ui-slots": "^0.1.6-alpha.1",
57
- "@deepseek-ai/dsh-client-ui-renderer": "^0.1.6-alpha.1",
58
- "@deepseek-ai/dsh-remote-mock": "^0.1.6-alpha.1",
59
- "@deepseek-ai/dsh-session": "^0.1.6-alpha.1",
60
- "@deepseek-ai/dsh-message-feedback": "^0.1.6-alpha.1",
61
- "@deepseek-ai/dsh-typert-protocol": "^0.1.6-alpha.1",
62
- "@deepseek-ai/cordis": "^4.0.2",
63
- "@deepseek-ai/dsh-client-ui-chat": "^0.1.6-alpha.1",
64
- "@deepseek-ai/dsh-client-ui-session": "^0.1.6-alpha.1",
65
- "@deepseek-ai/dsh-client-ui-commands": "^0.1.6-alpha.1",
66
- "@deepseek-ai/dsh-command-feedback": "^0.1.6-alpha.1",
67
- "@deepseek-ai/dsh-client-store": "^0.1.6-alpha.1"
50
+ "@deepseek-ai/dsh-api-remotes": "^0.1.7-alpha.1",
51
+ "@deepseek-ai/dsh-client-connection": "^0.1.7-alpha.1",
52
+ "@deepseek-ai/dsh-client-locale": "^0.1.7-alpha.1",
53
+ "@deepseek-ai/dsh-client-test-runtime": "^0.1.7-alpha.1",
54
+ "@deepseek-ai/dsh-client-ui-conversation": "^0.1.7-alpha.1",
55
+ "@deepseek-ai/dsh-client-ui-primitives": "^0.1.7-alpha.1",
56
+ "@deepseek-ai/dsh-client-ui-renderer": "^0.1.7-alpha.1",
57
+ "@deepseek-ai/dsh-client-ui-slots": "^0.1.7-alpha.1",
58
+ "@deepseek-ai/dsh-message-feedback": "^0.1.7-alpha.1",
59
+ "@deepseek-ai/dsh-remote-mock": "^0.1.7-alpha.1",
60
+ "@deepseek-ai/dsh-session": "^0.1.7-alpha.1",
61
+ "@deepseek-ai/dsh-typert-protocol": "^0.1.7-alpha.1",
62
+ "@deepseek-ai/cordis": "^4.0.3",
63
+ "@deepseek-ai/dsh-client-ui-chat": "^0.1.7-alpha.1",
64
+ "@deepseek-ai/dsh-client-ui-session": "^0.1.7-alpha.1",
65
+ "@deepseek-ai/dsh-client-ui-commands": "^0.1.7-alpha.1",
66
+ "@deepseek-ai/dsh-command-feedback": "^0.1.7-alpha.1",
67
+ "@deepseek-ai/dsh-client-store": "^0.1.7-alpha.1"
68
68
  },
69
69
  "files": [
70
70
  "lib/index.js",