@deepseek-ai/dsh-client-ui-trajectory 0.1.2-alpha.5 → 0.1.3-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 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-trajectory/README.md
5
- README.md: d947787c123fca77dc7978456f4cfdc4e99951bf
6
- README.zh.md: 3b281c6c1e90108d66f050e07a3b08208ed8c802
5
+ README.md: 3f4509c4bcd282e2bc06ca3c00de5308783501b8
6
+ README.zh.md: 75d00e677109c7fa60563d6fc60bac47a13ee006
package/README.md CHANGED
@@ -9,7 +9,7 @@ English | [中文](README.zh.md)
9
9
 
10
10
  ## Summary
11
11
 
12
- `dsh-client-ui-trajectory` is the Trajectory view of the dsh web client: it renders a turn-aware event ledger with selectable User, Assistant, Tool, and nested Subtool records, plus an interactive timing overview. Thick rules mark Turn boundaries, compact inline markers identify Steps, and selecting a record opens a local inspector for token usage, duration, Input, Output, Timing, and durable images from user, assistant, or tool content. The view is a pure consumer: it registers target-specific Event Definitions, a Trajectory view builder, and one tab in the conversation's `conversation.view` slot ring, and provides no service and declares no Context merge. Its typed `trajectory` locale namespace owns every product-authored ledger, timeline, inspector, tooltip, and accessibility phrase; event content, tool names, identifiers, and provider diagnostics remain verbatim data. Long ledgers open at the current tail, page older history on demand, and mount only the visible row window.
12
+ `dsh-client-ui-trajectory` is the Trajectory view of the dsh web client: it renders a turn-aware event ledger with selectable User, Assistant, Tool, and nested Subtool records, plus an interactive timing overview. Thick rules mark Turn boundaries, compact inline markers identify Steps, and selecting a record opens a local inspector for token usage, duration, Input, Output, Timing, durable images, and file-attachment summaries from user, assistant, or tool content. The view is a pure consumer: it registers target-specific Event Definitions, a Trajectory view builder, and one tab in the conversation's `conversation.view` slot ring, and provides no service and declares no Context merge. Its typed `trajectory` locale namespace owns every product-authored ledger, timeline, inspector, tooltip, and accessibility phrase; event content, tool names, identifiers, and provider diagnostics remain verbatim data. Long ledgers open at the current tail, page older history on demand, and mount only the visible row window.
13
13
 
14
14
  ## Table of Contents
15
15
 
@@ -29,7 +29,7 @@ Open the Trajectory tab in the conversation's view ring to inspect agent activit
29
29
 
30
30
  ### Inspecting records
31
31
 
32
- Selection, timeline navigation, folding, and search cover the React-visible window. Request numbers and cumulative usage cover the complete resident snapshot. Selecting a record opens a local inspector for token usage, duration, Input, Output, Timing, and durable images. Image URLs use the Conversation-owned per-session cache, so Chat and Trajectory share one authorized read per attachment. A record without text labels its row with the image count. A standalone compaction request appears chronologically in its own `Between turns` section, while a numbered compaction remains inside its owning turn.
32
+ Selection, timeline navigation, folding, and search cover the React-visible window. Request numbers and cumulative usage cover the complete resident snapshot. Selecting a record opens a local inspector for token usage, duration, Input, Output, Timing, and durable images. Image URLs use the Conversation-owned per-session cache, so Chat and Trajectory share one authorized read per attachment. A user record shows the generic-file count beside its text, while a record without text shows its image and file counts. A standalone compaction request appears chronologically in its own `Between turns` section, while a numbered compaction remains inside its owning turn.
33
33
 
34
34
  ### The timing overview
35
35
 
@@ -47,7 +47,7 @@ The view is a pure projection: Trajectory-owned Definitions assemble business re
47
47
 
48
48
  ### Virtual rows
49
49
 
50
- Long ledgers initially derive React data from 50 target Nodes ending at the mount-time tail. Later Nodes extend that anchored window without evicting its prefix, and the existing load control reveals earlier resident Nodes before requesting another Session page. Virtualization mounts only the visible row window plus a small overscan; request-only separators share the next measurable virtual item, while semantic row keys and ARIA indexes survive prepends. Content-only stream frames preserve virtual row keys and heights, reuse measurements, and do not issue repeated tail-scroll writes. Completed replies retain assembled blocks, timing, and usage in Trajectory target State, while the shared Session window keeps the raw Events.
50
+ Long ledgers initially derive React data from 50 target Nodes ending at the mount-time tail. Later Nodes extend that anchored window without evicting its prefix, and the existing load control reveals earlier resident Nodes before requesting another Session page. Virtualization mounts only the visible row window plus a small overscan; request-only separators share the next measurable virtual item, while semantic row keys and ARIA indexes survive prepends. The virtualizer owns bottom following for structural appends; non-virtual ledgers use a direct tail-position write. Content-only stream frames preserve virtual row keys and heights, reuse measurements, and do not issue repeated tail-scroll writes. Completed replies retain assembled blocks, timing, and usage in Trajectory target State, while the shared Session window keeps the raw Events.
51
51
 
52
52
  ### Layout
53
53
 
package/README.zh.md CHANGED
@@ -9,7 +9,7 @@ kind: "package-reference"
9
9
 
10
10
  ## 概述
11
11
 
12
- `dsh-client-ui-trajectory` 是 dsh Web 客户端的 Trajectory 视图:它渲染按轮次组织的事件记录表,其中可选择用户、助手、工具与嵌套子工具记录,并带交互式时间概览。较粗的分割线标示轮次边界,紧凑的行内标记标识步骤;选择记录会打开局部检查器,查看 token 用量、耗时、输入、输出、计时,以及用户、助手或工具内容中的持久图片。该视图是纯消费方:它注册 target 专属 Event Definition、Trajectory view builder 以及对话 `conversation.view` slot 环中的一个视图标签页,不提供 service,也不声明 Context 合并。带类型的 `trajectory` locale namespace 拥有所有产品编写的 ledger、timeline、inspector、tooltip 与无障碍文案;事件内容、工具名称、标识符与 provider 诊断保持原始数据。长记录表打开时定位于当前尾部、按需加载更早历史,并且只挂载可见行窗口。
12
+ `dsh-client-ui-trajectory` 是 dsh Web 客户端的 Trajectory 视图:它渲染按轮次组织的事件记录表,其中可选择用户、助手、工具与嵌套子工具记录,并带交互式时间概览。较粗的分割线标示轮次边界,紧凑的行内标记标识步骤;选择记录会打开局部检查器,查看 token 用量、耗时、输入、输出、计时,以及用户、助手或工具内容中的持久图片与文件附件摘要。该视图是纯消费方:它注册 target 专属 Event Definition、Trajectory view builder 以及对话 `conversation.view` slot 环中的一个视图标签页,不提供 service,也不声明 Context 合并。带类型的 `trajectory` locale namespace 拥有所有产品编写的 ledger、timeline、inspector、tooltip 与无障碍文案;事件内容、工具名称、标识符与 provider 诊断保持原始数据。长记录表打开时定位于当前尾部、按需加载更早历史,并且只挂载可见行窗口。
13
13
 
14
14
  ## 目录
15
15
 
@@ -29,7 +29,7 @@ kind: "package-reference"
29
29
 
30
30
  ### 检查记录
31
31
 
32
- 选择、时间线导航、折叠与搜索只覆盖 React 可见窗口。请求编号与累计用量覆盖完整的驻留 snapshot。选择记录会打开局部检查器,查看 token 用量、耗时、输入、输出、计时与持久图片。图片 URL 使用 Conversation 拥有的逐会话缓存,因此 Chat 与 Trajectory 对每个附件共享一次已授权读取。没有文本的记录会用图片数量标记其行。独立运行的压缩请求会按时间顺序显示在自己的 `Between turns` 区段中,而带编号的压缩仍位于其所属轮次内。
32
+ 选择、时间线导航、折叠与搜索只覆盖 React 可见窗口。请求编号与累计用量覆盖完整的驻留 snapshot。选择记录会打开局部检查器,查看 token 用量、耗时、输入、输出、计时与持久图片。图片 URL 使用 Conversation 拥有的逐会话缓存,因此 Chat 与 Trajectory 对每个附件共享一次已授权读取。用户记录会在文本旁显示通用文件数量;记录没有文本时,则显示图片与文件数量。独立运行的压缩请求会按时间顺序显示在自己的 `Between turns` 区段中,而带编号的压缩仍位于其所属轮次内。
33
33
 
34
34
  ### 时间概览
35
35
 
@@ -47,7 +47,7 @@ kind: "package-reference"
47
47
 
48
48
  ### 虚拟行
49
49
 
50
- 长记录表最初只从挂载时尾部结束的 50 个 target Node 派生 React 数据。后续 Node 会扩展这个固定起点的窗口而不会逐出其前缀;现有加载控件会先显露更早的驻留 Node,再请求下一个 Session 页面。虚拟化只挂载可见行窗口加少量缓冲;仅含请求的分隔行并入下一个具备可测高度的虚拟项,语义行键与 ARIA 索引在向前补页后保持不变。仅含内容更新的流式帧会保持虚拟行的键与高度、复用测量结果,并且不会重复写入末尾滚动位置。已完成的回复会在 Trajectory target State 中保留组装后的 blocks、计时与用量,共享 Session 窗口则保留原始 Event。
50
+ 长记录表最初只从挂载时尾部结束的 50 个 target Node 派生 React 数据。后续 Node 会扩展这个固定起点的窗口而不会逐出其前缀;现有加载控件会先显露更早的驻留 Node,再请求下一个 Session 页面。虚拟化只挂载可见行窗口加少量缓冲;仅含请求的分隔行并入下一个具备可测高度的虚拟项,语义行键与 ARIA 索引在向前补页后保持不变。虚拟化器负责结构性追加后的底部跟随;非虚拟记录表会直接写入末尾位置。仅含内容更新的流式帧会保持虚拟行的键与高度、复用测量结果,并且不会重复写入末尾滚动位置。已完成的回复会在 Trajectory target State 中保留组装后的 blocks、计时与用量,共享 Session 窗口则保留原始 Event。
51
51
 
52
52
  ### 布局
53
53
 
package/lib/client.js CHANGED
@@ -216,6 +216,7 @@ window.__ModuleLoader__.load({
216
216
  "layout.compacted": "上下文已压缩",
217
217
  "layout.toolCallOnly": "仅工具调用",
218
218
  "layout.imageOnly": "图片 ×{count}",
219
+ "layout.fileAttachments": "文件 ×{count}",
219
220
  "layout.initialSystemPrompt": "初始系统提示词",
220
221
  "layout.systemPromptUpdated": "系统提示词已更新",
221
222
  "layout.toolsUpdated": "工具已更新",
@@ -393,6 +394,7 @@ window.__ModuleLoader__.load({
393
394
  "layout.compacted": "Context compacted",
394
395
  "layout.toolCallOnly": "Tool call only",
395
396
  "layout.imageOnly": "Images ×{count}",
397
+ "layout.fileAttachments": "Files ×{count}",
396
398
  "layout.initialSystemPrompt": "Initial System Prompt",
397
399
  "layout.systemPromptUpdated": "System Prompt Updated",
398
400
  "layout.toolsUpdated": "Tools Updated",
@@ -597,9 +599,6 @@ window.__ModuleLoader__.load({
597
599
  }
598
600
  //#endregion
599
601
  //#region lib/types/client/trajectory-assistant-definition.js
600
- function isChunkRunEvent(event) {
601
- return event.type === "chunkrow/text-chunks" || event.type === "chunkrow/reasoning-chunks" || event.type === "chunkrow/tool-call-chunks";
602
- }
603
602
  function initialState(turn, step, startSeq, startTime, started) {
604
603
  return {
605
604
  turn,
@@ -647,9 +646,7 @@ window.__ModuleLoader__.load({
647
646
  ...current?.reasoningTokens === void 0 && next.reasoningTokens === void 0 ? {} : { reasoningTokens: (current?.reasoningTokens ?? 0) + (next.reasoningTokens ?? 0) }
648
647
  };
649
648
  }
650
- function updateChunk(state, match) {
651
- if (match.event.type !== "assistant/chunk") return state;
652
- const chunk = match.event.data.chunk;
649
+ function updateChunk(state, chunk, seq, time) {
653
650
  if (chunk.type === "usage") return {
654
651
  ...state,
655
652
  sawChunk: true,
@@ -719,78 +716,21 @@ window.__ModuleLoader__.load({
719
716
  blocks,
720
717
  visibleBlocks,
721
718
  ...visibleBlocks > 0 && state.firstVisibleSeq === void 0 ? {
722
- firstVisibleSeq: match.event.seq,
723
- firstVisibleTime: match.event.time
719
+ firstVisibleSeq: seq,
720
+ firstVisibleTime: time
724
721
  } : {},
725
- ...isTokenDelta(chunk) && state.firstTokenTime === void 0 ? { firstTokenTime: match.event.time } : {}
722
+ ...isTokenDelta(chunk) && state.firstTokenTime === void 0 ? { firstTokenTime: time } : {}
726
723
  };
727
724
  }
728
- function chunkRunBoundaries(event, needsToken, needsVisible, visibleFromStart) {
729
- const fragments = event.type === "chunkrow/tool-call-chunks" ? event.data.args : event.data.texts;
730
- const nameStartsToken = event.type === "chunkrow/tool-call-chunks" && Object.hasOwn(event.data, "name");
731
- let firstTokenTime;
732
- let firstVisible;
733
- let time = event.time;
734
- for (let index = 0; index < fragments.length; index++) {
735
- const fragment = fragments[index];
736
- if (needsToken && firstTokenTime === void 0 && (nameStartsToken || fragment !== "")) firstTokenTime = time;
737
- if (needsVisible && firstVisible === void 0 && (visibleFromStart || event.type !== "chunkrow/tool-call-chunks" && fragment.trim() !== "")) firstVisible = {
738
- seq: event.seq + index,
739
- time
740
- };
741
- if ((!needsToken || firstTokenTime !== void 0) && (!needsVisible || firstVisible !== void 0)) break;
742
- time += event.data.dt[index] ?? 0;
743
- }
744
- return {
745
- firstTokenTime,
746
- firstVisible
747
- };
748
- }
749
- function updateChunkRun(state, event) {
750
- const blocks = [...state.blocks];
751
- const previous = blocks[event.data.index];
752
- const previousVisible = blockIsVisible(previous);
753
- let visibleFromStart = state.visibleBlocks - Number(previousVisible) > 0;
754
- if (event.type === "chunkrow/text-chunks") {
755
- const text = previous?.kind === "text" ? previous.text : "";
756
- visibleFromStart ||= text.trim() !== "";
757
- blocks[event.data.index] = {
758
- kind: "text",
759
- text: text + event.data.texts.join("")
760
- };
761
- } else if (event.type === "chunkrow/reasoning-chunks") {
762
- const text = previous?.kind === "reasoning" ? previous.text : "";
763
- visibleFromStart ||= text.trim() !== "";
764
- blocks[event.data.index] = {
765
- kind: "reasoning",
766
- text: text + event.data.texts.join("")
767
- };
768
- } else {
769
- const base = previous?.kind === "tool-call" ? previous : {
770
- kind: "tool-call",
771
- callId: "",
772
- name: "",
773
- argsRaw: ""
774
- };
775
- blocks[event.data.index] = {
776
- kind: "tool-call",
777
- callId: base.callId || String(event.data.id),
778
- name: Object.hasOwn(event.data, "name") ? event.data.name : base.name,
779
- argsRaw: base.argsRaw + event.data.args.join("")
780
- };
781
- }
782
- const boundaries = chunkRunBoundaries(event, state.firstTokenTime === void 0, state.firstVisibleSeq === void 0, visibleFromStart);
783
- const visibleBlocks = state.visibleBlocks - Number(previousVisible) + Number(blockIsVisible(blocks[event.data.index]));
725
+ function settleMessage(state, match, event) {
726
+ const blocks = toAssistantBlocks(event.data.message.content);
784
727
  return {
785
728
  ...state,
786
- sawChunk: true,
729
+ sawChunk: false,
787
730
  blocks,
788
- visibleBlocks,
789
- ...boundaries.firstVisible === void 0 ? {} : {
790
- firstVisibleSeq: boundaries.firstVisible.seq,
791
- firstVisibleTime: boundaries.firstVisible.time
792
- },
793
- ...boundaries.firstTokenTime === void 0 ? {} : { firstTokenTime: boundaries.firstTokenTime }
731
+ visibleBlocks: countVisibleBlocks(blocks),
732
+ final: match,
733
+ usage: event.data.usage
794
734
  };
795
735
  }
796
736
  function closedBoundary(context) {
@@ -802,25 +742,13 @@ window.__ModuleLoader__.load({
802
742
  function fallbackState$1(context) {
803
743
  let state;
804
744
  for (const match of context.matches) {
805
- if (isChunkRunEvent(match.event)) {
806
- state ??= initialState(match.event.data.turn, match.event.data.step, match.event.seq, match.event.time, false);
807
- state = updateChunkRun(state, match.event);
808
- continue;
809
- }
810
745
  const event = match.event;
811
- if (event.type === "assistant/chunk") {
746
+ if (event.type === "assistant/live-chunk") {
812
747
  state ??= initialState(event.data.turn, event.data.step, event.seq, event.time, false);
813
- state = updateChunk(state, match);
748
+ state = updateChunk(state, event.data.chunk, event.seq, event.time);
814
749
  } else if (event.type === "assistant/message") {
815
750
  state ??= initialState(event.data.turn, event.data.step, event.seq, event.time, false);
816
- const blocks = toAssistantBlocks(event.data.message.content);
817
- state = {
818
- ...state,
819
- blocks,
820
- visibleBlocks: countVisibleBlocks(blocks),
821
- final: match,
822
- usage: state.usage ?? event.data.usage
823
- };
751
+ state = settleMessage(state, match, event);
824
752
  } else if (event.type === "step/end" && state !== void 0) state = {
825
753
  ...state,
826
754
  stepEnd: match
@@ -901,11 +829,7 @@ window.__ModuleLoader__.load({
901
829
  id: `${event.data.turn}:${event.data.step}`,
902
830
  role: "start"
903
831
  };
904
- if (event.type === "assistant/chunk" || event.type === "assistant/message" || event.type === "llm/retry" || event.type === "step/end") return {
905
- id: `${event.data.turn}:${event.data.step}`,
906
- role: "update"
907
- };
908
- if (isChunkRunEvent(event)) return {
832
+ if (event.type === "assistant/live-chunk" || event.type === "assistant/message" || event.type === "llm/retry" || event.type === "step/end") return {
909
833
  id: `${event.data.turn}:${event.data.step}`,
910
834
  role: "update"
911
835
  };
@@ -916,18 +840,8 @@ window.__ModuleLoader__.load({
916
840
  return initialState(match.event.data.turn, match.event.data.step, match.event.seq, match.event.time, true);
917
841
  },
918
842
  update: (context, match) => {
919
- if (isChunkRunEvent(match.event)) return updateChunkRun(context.state, match.event);
920
- if (match.event.type === "assistant/chunk") return updateChunk(context.state, match);
921
- if (match.event.type === "assistant/message") {
922
- const blocks = toAssistantBlocks(match.event.data.message.content);
923
- return {
924
- ...context.state,
925
- blocks,
926
- visibleBlocks: countVisibleBlocks(blocks),
927
- final: match,
928
- usage: context.state.usage ?? match.event.data.usage
929
- };
930
- }
843
+ if (match.event.type === "assistant/live-chunk") return updateChunk(context.state, match.event.data.chunk, match.event.seq, match.event.time);
844
+ if (match.event.type === "assistant/message") return settleMessage(context.state, match, match.event);
931
845
  if (match.event.type === "step/end") return {
932
846
  ...context.state,
933
847
  stepEnd: match
@@ -950,8 +864,7 @@ window.__ModuleLoader__.load({
950
864
  },
951
865
  publication: (match) => {
952
866
  if (match.event.type === "step/start") return "none";
953
- if (isChunkRunEvent(match.event)) return "animation-frame";
954
- if (match.event.type !== "assistant/chunk") return "immediate";
867
+ if (match.event.type !== "assistant/live-chunk") return "immediate";
955
868
  const type = match.event.data.chunk.type;
956
869
  return type === "usage" || type === "finish" ? "none" : "animation-frame";
957
870
  },
@@ -5082,7 +4995,8 @@ window.__ModuleLoader__.load({
5082
4995
  anchorTo: "end",
5083
4996
  overscan: VIRTUAL_OVERSCAN_ROWS,
5084
4997
  scrollMargin: virtualScrollMargin,
5085
- scrollEndThreshold: BOTTOM_FOLLOW_THRESHOLD_PX
4998
+ scrollEndThreshold: BOTTOM_FOLLOW_THRESHOLD_PX,
4999
+ followOnAppend: "auto"
5086
5000
  });
5087
5001
  const virtualIndexByRecordId = (0, react.useMemo)(() => {
5088
5002
  const indexes = /* @__PURE__ */ new Map();
@@ -5339,8 +5253,7 @@ window.__ModuleLoader__.load({
5339
5253
  return;
5340
5254
  }
5341
5255
  if (!followsTableTail.current) return;
5342
- if (virtualizationEnabled) rowVirtualizer.scrollToEnd({ behavior: "auto" });
5343
- else pane.scrollTop = pane.scrollHeight;
5256
+ if (!virtualizationEnabled) pane.scrollTop = pane.scrollHeight;
5344
5257
  }, [
5345
5258
  historyLoading,
5346
5259
  historyStartSeq,
@@ -6859,8 +6772,9 @@ window.__ModuleLoader__.load({
6859
6772
  const preview = previewContent(node.content);
6860
6773
  const previewMarkdown = preview === "" ? void 0 : preview;
6861
6774
  const images = imageBlockCount(node.content);
6775
+ const files = fileBlockCount(node.content);
6862
6776
  return {
6863
- text: previewMarkdown === void 0 && images > 0 ? t("layout.imageOnly", { count: images }) : "",
6777
+ text: [previewMarkdown === void 0 && images > 0 ? t("layout.imageOnly", { count: images }) : void 0, files > 0 ? t("layout.fileAttachments", { count: files }) : void 0].filter((value) => value !== void 0).join(" · "),
6864
6778
  ...previewMarkdown === void 0 ? {} : { previewMarkdown },
6865
6779
  sourceSeq: node.seq,
6866
6780
  messageSource: node.source,
@@ -7431,6 +7345,9 @@ window.__ModuleLoader__.load({
7431
7345
  function imageBlockCount(content) {
7432
7346
  return content.filter((block) => block.type === "image").length;
7433
7347
  }
7348
+ function fileBlockCount(content) {
7349
+ return content.filter((block) => block.type === "file").length;
7350
+ }
7434
7351
  function stringifySourceValue(value) {
7435
7352
  return JSON.stringify(value, null, 2) || String(value);
7436
7353
  }
@@ -172,6 +172,7 @@ export declare const zh: {
172
172
  readonly 'layout.compacted': "上下文已压缩";
173
173
  readonly 'layout.toolCallOnly': "仅工具调用";
174
174
  readonly 'layout.imageOnly': "图片 ×{count}";
175
+ readonly 'layout.fileAttachments': "文件 ×{count}";
175
176
  readonly 'layout.initialSystemPrompt': "初始系统提示词";
176
177
  readonly 'layout.systemPromptUpdated': "系统提示词已更新";
177
178
  readonly 'layout.toolsUpdated': "工具已更新";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@deepseek-ai/dsh-client-ui-trajectory",
3
3
  "description": "Trajectory event ledger with an interactive timing overview: pure-consumer plugin registering into the conversation ViewMap (no service)",
4
- "version": "0.1.2-alpha.5",
4
+ "version": "0.1.3-alpha.2",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -50,23 +50,23 @@
50
50
  "@types/react-dom": "~18.3.0",
51
51
  "react": "^18.2.0",
52
52
  "react-dom": "^18.2.0",
53
- "@deepseek-ai/dsh-client-locale": "^0.1.2-alpha.5",
54
- "@deepseek-ai/dsh-client-test-runtime": "^0.1.2-alpha.5",
55
- "@deepseek-ai/dsh-client-ui-primitives": "^0.1.2-alpha.5",
56
- "@deepseek-ai/dsh-client-ui-conversation": "^0.1.2-alpha.5",
57
- "@deepseek-ai/dsh-client-ui-slots": "^0.1.2-alpha.5",
58
- "@deepseek-ai/dsh-agent": "^0.1.2-alpha.5",
59
- "@deepseek-ai/dsh-tools": "^0.1.2-alpha.5",
53
+ "@deepseek-ai/dsh-client-locale": "^0.1.3-alpha.2",
54
+ "@deepseek-ai/dsh-client-test-runtime": "^0.1.3-alpha.2",
55
+ "@deepseek-ai/dsh-agent": "^0.1.3-alpha.2",
56
+ "@deepseek-ai/dsh-client-ui-primitives": "^0.1.3-alpha.2",
57
+ "@deepseek-ai/dsh-client-ui-conversation": "^0.1.3-alpha.2",
58
+ "@deepseek-ai/dsh-client-ui-slots": "^0.1.3-alpha.2",
59
+ "@deepseek-ai/dsh-tools": "^0.1.3-alpha.2",
60
+ "@deepseek-ai/dsh-compaction": "^0.1.3-alpha.2",
60
61
  "@deepseek-ai/cordis": "^4.0.2",
61
- "@deepseek-ai/dsh-client-store": "^0.1.2-alpha.5",
62
- "@deepseek-ai/dsh-session": "^0.1.2-alpha.5",
63
- "@deepseek-ai/dsh-compaction": "^0.1.2-alpha.5",
64
- "@deepseek-ai/dsh-api-session-controller": "^0.1.2-alpha.5",
65
- "@deepseek-ai/dsh-client-ui-renderer": "^0.1.2-alpha.5",
66
- "@deepseek-ai/dsh-client-ui-session": "^0.1.2-alpha.5",
67
- "@deepseek-ai/dsh-llm": "^0.1.2-alpha.5",
68
- "@deepseek-ai/dsh-attachment": "^0.1.2-alpha.5",
69
- "@deepseek-ai/dsh-client-ui-chat": "^0.1.2-alpha.5"
62
+ "@deepseek-ai/dsh-client-ui-chat": "^0.1.3-alpha.2",
63
+ "@deepseek-ai/dsh-client-store": "^0.1.3-alpha.2",
64
+ "@deepseek-ai/dsh-session": "^0.1.3-alpha.2",
65
+ "@deepseek-ai/dsh-api-session-controller": "^0.1.3-alpha.2",
66
+ "@deepseek-ai/dsh-client-ui-renderer": "^0.1.3-alpha.2",
67
+ "@deepseek-ai/dsh-client-ui-session": "^0.1.3-alpha.2",
68
+ "@deepseek-ai/dsh-llm": "^0.1.3-alpha.2",
69
+ "@deepseek-ai/dsh-attachment": "^0.1.3-alpha.2"
70
70
  },
71
71
  "files": [
72
72
  "lib/index.js",