@deepseek-ai/dsh-client-ui-tool 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 CHANGED
@@ -1,6 +1,49 @@
1
- # Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
2
- # side as of the last confirmed-consistent state. Both languages carry equal authority;
3
- # after editing either side, bring the other along and re-record with:
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-tool/README.md
5
- README.md: b4a529fbcb1ed33976d71baf043e625fcca4c89c
6
- README.zh.md: 406dc884f3529af79d675e6fbe1586e7485c3780
5
+ /:
6
+ en: d5ef8fa5a5ebfbc2
7
+ zh: 9870b3f207a248cc
8
+ /deepseek-ai-dsh-client-ui-tool:
9
+ en: 03bfcfbf7f1cea76
10
+ zh: 142abbf07affee63
11
+ /deepseek-ai-dsh-client-ui-tool/summary:
12
+ en: e7ef510d1764f9b2
13
+ zh: 236bc66607211f0f
14
+ /deepseek-ai-dsh-client-ui-tool/table-of-contents:
15
+ en: d152484eb41ac6b4
16
+ zh: 09388d293f9be9cb
17
+ /deepseek-ai-dsh-client-ui-tool/use-this-package:
18
+ en: be2bc859e0d64fe5
19
+ zh: d51a35fb36675dd3
20
+ /deepseek-ai-dsh-client-ui-tool/use-this-package/registering-a-business-tool-view:
21
+ en: 5332d87e76037f07
22
+ zh: db5d06e7e46b8429
23
+ /deepseek-ai-dsh-client-ui-tool/use-this-package/built-in-views:
24
+ en: 4b69e36952574494
25
+ zh: 1f9842b40931adb6
26
+ /deepseek-ai-dsh-client-ui-tool/understand-the-implementation:
27
+ en: 00bc7b0c84edc603
28
+ zh: 1cfcf5b435248a91
29
+ /deepseek-ai-dsh-client-ui-tool/understand-the-implementation/rendering-contract:
30
+ en: 2959b10b01e08a7b
31
+ zh: 7084ca22650cbb5b
32
+ /deepseek-ai-dsh-client-ui-tool/understand-the-implementation/cards:
33
+ en: 401a0118de2dba33
34
+ zh: 9efe590dd485c336
35
+ /deepseek-ai-dsh-client-ui-tool/further-exploration:
36
+ en: 886059e6bd594ebf
37
+ zh: 94cfe8d0a789f413
38
+ /deepseek-ai-dsh-client-ui-tool/model-experience:
39
+ en: 1e5e72dd269855d5
40
+ zh: 81a4756d460e3af9
41
+ /deepseek-ai-dsh-client-ui-tool/model-experience/kv-cache-effect:
42
+ en: ca75c51c89c2c9b0
43
+ zh: de54f3467ef3b9be
44
+ /deepseek-ai-dsh-client-ui-tool/known-limitations-and-deferred-work:
45
+ en: 7475317a656f1d11
46
+ zh: 787f10cc0f2c586e
47
+ /deepseek-ai-dsh-client-ui-tool/known-limitations-and-deferred-work/dev-note:
48
+ en: 0fdeab2e4db0261f
49
+ zh: 156d2b2952cf112e
package/README.md CHANGED
@@ -25,7 +25,7 @@ English | [中文](README.zh.md)
25
25
  <a id="use-this-package"></a>
26
26
  ## Use this package
27
27
 
28
- Tool calls appear in the conversation as cards: a root call tree with its nested subcalls, each atomic call rendered by its owning view. Every lifecycle state retains the tool's ordinary business glyph; failure and interruption remain explicit through the frozen call/result state, accessible status text, and failure summary. Users can open files or inspect calls through the Host callbacks.
28
+ Tool calls appear in the conversation as cards: a root call tree with its nested subcalls, each atomic call rendered by its owning view. Every lifecycle state retains the tool's ordinary business glyph; failure and interruption remain explicit through the frozen call/result state, accessible status text, and failure summary. Users can open files or inspect calls through the Host callbacks. A collapsed `web_fetch` row links its http(s) URL, which opens in a new browser tab.
29
29
 
30
30
  Shared Tool rows and Bash rows retain error and warning colors for failed and stopped summaries, including on hover. Hover darkens only summaries without those states.
31
31
 
@@ -120,6 +120,7 @@ These limits define the dispatch depth and the view ownership; they are current
120
120
 
121
121
  - **The Host excludes `run_code` from PTC mode program bindings** — production events produce one dispatch level; the recursive Runtime/UI contract supports nesting.
122
122
  - **First-party Tool views are colocated here** — they can move to their owning business packages independently through the keyed slot.
123
+ - **Web tool links always open a new tab** — the collapsed `web_fetch` URL and the expanded web card links ignore the `ui-chat` link-opening setting because Tool views receive no external-link callback.
123
124
  - **Tool copy reuses the `ui-conversation` locale namespace** — tool titles, row chrome, and Cordis-free primitive labels use that dictionary; presenter models retain locale keys or data rather than rendered wording.
124
125
 
125
126
  <a id="dev-note"></a>
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
- 工具调用在对话中显示为卡片:一个根调用树带其嵌套子调用,每个原子调用由所属视图渲染。所有生命周期状态都保留工具的普通业务图标;失败与中断仍通过冻结调用/结果状态、无障碍状态文本和失败摘要明确表达。用户可通过宿主回调打开文件或检查调用。
28
+ 工具调用在对话中显示为卡片:一个根调用树带其嵌套子调用,每个原子调用由所属视图渲染。所有生命周期状态都保留工具的普通业务图标;失败与中断仍通过冻结调用/结果状态、无障碍状态文本和失败摘要明确表达。用户可通过宿主回调打开文件或检查调用。折叠的 `web_fetch` 行把其 http(s) URL 显示为链接,在新浏览器标签页中打开。
29
29
 
30
30
  共享工具行和 Bash 行的失败、停止摘要在悬停时仍保留错误色和警告色;只有不处于这两种状态的摘要会在悬停时加深。
31
31
 
@@ -120,6 +120,7 @@ terminal model 使用浏览器安全入口 `@deepseek-ai/dsh-spill-policy/notice
120
120
 
121
121
  - **Host 不把 `run_code` 暴露为 PTC mode 程序 binding**:生产事件只产生一层分发;递归的运行时/UI 约定支持嵌套。
122
122
  - **第一方工具视图集中在本包**:它们可以通过 keyed slot 独立迁移到各自所属的业务包。
123
+ - **Web 工具链接总是打开新标签页**:折叠的 `web_fetch` URL 与展开的 web 卡片链接不遵循 `ui-chat` 的链接打开方式设置,因为工具视图没有外部链接回调。
123
124
  - **工具文案复用 `ui-conversation` locale namespace**:工具标题、行 chrome 与无 Cordis 的 primitive label 使用该字典;展示转换器模型保留 locale key 或数据,而不是已渲染文案。
124
125
 
125
126
  <a id="dev-note"></a>
package/lib/client.js CHANGED
@@ -115,6 +115,7 @@ window.__ModuleLoader__.load({
115
115
  schedule_create: "tool.title.createSchedule",
116
116
  schedule_list: "tool.title.listSchedules",
117
117
  schedule_delete: "tool.title.deleteSchedule",
118
+ schedule_update: "tool.title.updateSchedule",
118
119
  cordis_inspect_list: "tool.title.inspectProviders",
119
120
  cordis_inspect_query: "tool.title.queryRuntime",
120
121
  cordis_inspect_self: "tool.title.inspectPlugins",
@@ -1030,6 +1031,22 @@ window.__ModuleLoader__.load({
1030
1031
  truncated: meta.truncated
1031
1032
  };
1032
1033
  }
1034
+ /**
1035
+ * Read the openable URL of a web_fetch call from its arguments.
1036
+ * @param block - running or settled Tool block.
1037
+ * @returns the http(s) URL, or undefined for another tool, protocol, or unparsable argument.
1038
+ */
1039
+ function webFetchHref(block) {
1040
+ const call = parsedToolCall(block);
1041
+ if (call?.name !== "web_fetch" || typeof call.args.url !== "string") return void 0;
1042
+ const { url } = call.args;
1043
+ try {
1044
+ const { protocol } = new URL(url);
1045
+ return protocol === "http:" || protocol === "https:" ? url : void 0;
1046
+ } catch {
1047
+ return;
1048
+ }
1049
+ }
1033
1050
  //#endregion
1034
1051
  //#region lib/types/client/tool/models/auto-review-denial.js
1035
1052
  /**
@@ -1177,7 +1194,7 @@ window.__ModuleLoader__.load({
1177
1194
  }
1178
1195
  //#endregion
1179
1196
  //#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-tool/src/client/tool/components/AskQuestionCard.module.css.mjs
1180
- const css$4 = ".fsXYAq_card{border:.5px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);border-radius:12px;flex-direction:column;gap:16px;max-height:360px;margin:4px 0 4px 4px;padding:16px 20px;display:flex;overflow-y:auto}.fsXYAq_item{flex-direction:column;gap:2px;min-width:0;display:flex}.fsXYAq_question,.fsXYAq_answer{white-space:pre-wrap;overflow-wrap:anywhere;font-size:var(--dsh-content-font-size,14px);line-height:calc(24px + var(--dsh-content-font-delta,0px));margin:0}.fsXYAq_question{color:var(--dsw-alias-label-tertiary)}.fsXYAq_answer{color:var(--dsw-alias-label-primary)}.fsXYAq_answerLine{display:block}.fsXYAq_skipped{color:var(--dsw-alias-label-tertiary)}.fsXYAq_verdict{color:var(--dsw-alias-label-primary);font-size:var(--dsh-content-font-size,14px);line-height:calc(24px + var(--dsh-content-font-delta,0px));margin:0}.fsXYAq_questionList{flex-direction:column;gap:8px;margin:0;padding-left:20px;display:flex}.fsXYAq_unansweredQuestion{color:var(--dsw-alias-label-tertiary);white-space:pre-wrap;overflow-wrap:anywhere;font-size:var(--dsh-content-font-size,14px);line-height:calc(24px + var(--dsh-content-font-delta,0px))}";
1197
+ const css$4 = ".fsXYAq_card{border:.5px solid var(--dsw-alias-border-l1);border-radius:var(--dsw-radius-lg);background:var(--dsw-alias-bg-base);flex-direction:column;gap:16px;max-height:360px;margin:4px 0 4px 4px;padding:16px 20px;display:flex;overflow-y:auto}.fsXYAq_item{flex-direction:column;gap:2px;min-width:0;display:flex}.fsXYAq_question,.fsXYAq_answer{white-space:pre-wrap;overflow-wrap:anywhere;font-size:var(--dsh-content-font-size,14px);line-height:calc(24px + var(--dsh-content-font-delta,0px));margin:0}.fsXYAq_question{color:var(--dsw-alias-label-tertiary)}.fsXYAq_answer{color:var(--dsw-alias-label-primary)}.fsXYAq_answerLine{display:block}.fsXYAq_skipped{color:var(--dsw-alias-label-tertiary)}.fsXYAq_verdict{color:var(--dsw-alias-label-primary);font-size:var(--dsh-content-font-size,14px);line-height:calc(24px + var(--dsh-content-font-delta,0px));margin:0}.fsXYAq_questionList{flex-direction:column;gap:8px;margin:0;padding-left:20px;display:flex}.fsXYAq_unansweredQuestion{color:var(--dsw-alias-label-tertiary);white-space:pre-wrap;overflow-wrap:anywhere;font-size:var(--dsh-content-font-size,14px);line-height:calc(24px + var(--dsh-content-font-delta,0px))}";
1181
1198
  const tagId$4 = "@deepseek-ai/dsh-client-ui-tool/AskQuestionCard.module.css";
1182
1199
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$4) + "]") === null) {
1183
1200
  const tag = document.createElement("style");
@@ -1240,7 +1257,7 @@ window.__ModuleLoader__.load({
1240
1257
  }
1241
1258
  //#endregion
1242
1259
  //#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-tool/src/client/tool/components/ToolDetails.module.css.mjs
1243
- const css$3 = ".DXqwVW_root{border:.5px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-markdown-code-block);color:var(--dsw-alias-label-secondary);font:var(--dsw-font-xs-13);border-radius:12px;margin:4px 0 4px 4px;overflow:hidden}.DXqwVW_list{max-height:320px;margin:0;padding:0;list-style:none;overflow-y:auto}.DXqwVW_item,.DXqwVW_empty{margin:0;padding:10px 14px}.DXqwVW_item+.DXqwVW_item{border-top:.5px solid var(--dsw-alias-border-l2)}.DXqwVW_root[data-inspect]:not([data-caption])>.DXqwVW_list>.DXqwVW_item,.DXqwVW_root[data-inspect]:not([data-caption]) .DXqwVW_empty,.DXqwVW_root[data-inspect] .DXqwVW_caption{padding-inline-end:88px}.DXqwVW_caption{color:var(--dsw-alias-label-caption);padding:10px 14px 6px;font-size:12px}.DXqwVW_heading{flex-wrap:wrap;align-items:baseline;gap:8px;display:flex}.DXqwVW_text{white-space:pre-wrap;overflow-wrap:anywhere;flex:1;min-width:0}.DXqwVW_status{flex:none;justify-content:center;align-self:flex-start;align-items:center;width:14px;height:18px;font-size:16px;line-height:18px;display:inline-flex}.DXqwVW_pending{box-sizing:border-box;border:1px solid var(--dsw-alias-label-tertiary);border-radius:2px;width:10px;height:10px}.DXqwVW_heading:has(.DXqwVW_statusText) .DXqwVW_text{flex-basis:12em}.DXqwVW_statusText{color:var(--dsw-alias-label-caption);white-space:nowrap;margin-inline-start:auto;font-size:12px}.DXqwVW_previous,.DXqwVW_unchanged{color:var(--dsw-alias-label-tertiary)}.DXqwVW_item[data-change=added] .DXqwVW_status{color:var(--dsw-alias-state-success-primary)}.DXqwVW_item[data-change=removed] .DXqwVW_status{color:var(--dsw-alias-state-error-primary)}.DXqwVW_item[data-change=removed] .DXqwVW_text{color:var(--dsw-alias-label-tertiary);text-decoration:line-through}.DXqwVW_unchanged{border-top:.5px solid var(--dsw-alias-border-l2)}.DXqwVW_unchanged summary{cursor:pointer;align-items:center;gap:6px;padding:9px 14px;list-style:none;display:flex}.DXqwVW_unchanged summary::-webkit-details-marker{display:none}.DXqwVW_unchanged[open] summary svg{transform:rotate(90deg)}.DXqwVW_fields{margin:0}.DXqwVW_heading+.DXqwVW_fields{margin-top:6px}.DXqwVW_field{grid-template-columns:5.5em minmax(0,1fr);gap:12px;display:grid}.DXqwVW_field+.DXqwVW_field{margin-top:4px}.DXqwVW_field dt{color:var(--dsw-alias-label-caption)}.DXqwVW_field dd{white-space:pre-wrap;overflow-wrap:anywhere;margin:0}.DXqwVW_badge{color:var(--dsw-alias-label-caption);flex:none;align-items:center;gap:5px;font-size:12px;display:inline-flex}.DXqwVW_badge:before{content:\"\";corner-shape:round;background:currentColor;border-radius:50%;width:5px;height:5px}.DXqwVW_badge[data-tone=info]{color:var(--dsw-alias-state-business-primary)}.DXqwVW_badge[data-tone=success]{color:var(--dsw-alias-state-success-primary)}.DXqwVW_badge[data-tone=warning]{color:var(--dsw-alias-state-warn-primary)}.DXqwVW_badge[data-tone=error]{color:var(--dsw-alias-state-error-primary)}.DXqwVW_subtitle{color:var(--dsw-alias-label-tertiary);overflow-wrap:anywhere;margin-top:3px;font-size:12px}.DXqwVW_description{color:var(--dsw-alias-label-caption);white-space:pre-wrap;overflow-wrap:anywhere;margin:6px 0}.DXqwVW_lines{white-space:pre-wrap;overflow-wrap:anywhere;margin:6px 0 0;padding-inline-start:18px}.DXqwVW_lines li+li{margin-top:4px}.DXqwVW_group{border-top:.5px solid var(--dsw-alias-border-l2);margin-top:8px}.DXqwVW_group>summary{color:var(--dsw-alias-label-caption);cursor:pointer;overflow-wrap:anywhere;align-items:center;gap:6px;padding:8px 0 0;list-style:none;display:flex}.DXqwVW_group>summary::-webkit-details-marker{display:none}.DXqwVW_group[open]>summary svg{transform:rotate(90deg)}.DXqwVW_group>summary svg{flex:none}.DXqwVW_group .DXqwVW_list{max-height:none;overflow:visible}.DXqwVW_group .DXqwVW_item{padding:9px 0 2px 20px}.DXqwVW_prose,.DXqwVW_code{max-width:100%;font-size:13px}.DXqwVW_prose{margin-top:8px}.DXqwVW_root .DXqwVW_item>.DXqwVW_code{max-height:240px;margin:8px 0 0;overflow:auto}.DXqwVW_root .DXqwVW_item:has(>.DXqwVW_code:only-child){padding:0}.DXqwVW_root .DXqwVW_item>.DXqwVW_code:only-child{margin:0}.DXqwVW_root .DXqwVW_group .DXqwVW_item:has(>.DXqwVW_code:only-child){padding:4px 0 0 20px}.DXqwVW_path{min-width:0;color:inherit;font:inherit;text-align:start;overflow-wrap:anywhere;cursor:pointer;background:0 0;border:none;flex:1;padding:0}.DXqwVW_path:hover{text-decoration:underline}.DXqwVW_path:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:3px}";
1260
+ const css$3 = ".DXqwVW_root{border:.5px solid var(--dsw-alias-border-l1);border-radius:var(--dsw-radius-lg);background:var(--dsw-alias-markdown-code-block);color:var(--dsw-alias-label-secondary);font:var(--dsw-font-xs-13);margin:4px 0 4px 4px;overflow:hidden}.DXqwVW_list{max-height:320px;margin:0;padding:0;list-style:none;overflow-y:auto}.DXqwVW_item,.DXqwVW_empty{margin:0;padding:10px 14px}.DXqwVW_item+.DXqwVW_item{border-top:.5px solid var(--dsw-alias-border-l2)}.DXqwVW_root[data-inspect]:not([data-caption])>.DXqwVW_list>.DXqwVW_item,.DXqwVW_root[data-inspect]:not([data-caption]) .DXqwVW_empty,.DXqwVW_root[data-inspect] .DXqwVW_caption{padding-inline-end:88px}.DXqwVW_caption{color:var(--dsw-alias-label-caption);padding:10px 14px 6px;font-size:12px}.DXqwVW_heading{flex-wrap:wrap;align-items:baseline;gap:8px;display:flex}.DXqwVW_text{white-space:pre-wrap;overflow-wrap:anywhere;flex:1;min-width:0}.DXqwVW_status{flex:none;justify-content:center;align-self:flex-start;align-items:center;width:14px;height:18px;font-size:16px;line-height:18px;display:inline-flex}.DXqwVW_pending{box-sizing:border-box;border:1px solid var(--dsw-alias-label-tertiary);border-radius:2px;width:10px;height:10px}.DXqwVW_heading:has(.DXqwVW_statusText) .DXqwVW_text{flex-basis:12em}.DXqwVW_statusText{color:var(--dsw-alias-label-caption);white-space:nowrap;margin-inline-start:auto;font-size:12px}.DXqwVW_previous,.DXqwVW_unchanged{color:var(--dsw-alias-label-tertiary)}.DXqwVW_item[data-change=added] .DXqwVW_status{color:var(--dsw-alias-state-success-primary)}.DXqwVW_item[data-change=removed] .DXqwVW_status{color:var(--dsw-alias-state-error-primary)}.DXqwVW_item[data-change=removed] .DXqwVW_text{color:var(--dsw-alias-label-tertiary);text-decoration:line-through}.DXqwVW_unchanged{border-top:.5px solid var(--dsw-alias-border-l2)}.DXqwVW_unchanged summary{cursor:pointer;align-items:center;gap:6px;padding:9px 14px;list-style:none;display:flex}.DXqwVW_unchanged summary::-webkit-details-marker{display:none}.DXqwVW_unchanged[open] summary svg{transform:rotate(90deg)}.DXqwVW_fields{margin:0}.DXqwVW_heading+.DXqwVW_fields{margin-top:6px}.DXqwVW_field{grid-template-columns:5.5em minmax(0,1fr);gap:12px;display:grid}.DXqwVW_field+.DXqwVW_field{margin-top:4px}.DXqwVW_field dt{color:var(--dsw-alias-label-caption)}.DXqwVW_field dd{white-space:pre-wrap;overflow-wrap:anywhere;margin:0}.DXqwVW_badge{color:var(--dsw-alias-label-caption);flex:none;align-items:center;gap:5px;font-size:12px;display:inline-flex}.DXqwVW_badge:before{content:\"\";corner-shape:round;background:currentColor;border-radius:50%;width:5px;height:5px}.DXqwVW_badge[data-tone=info]{color:var(--dsw-alias-state-business-primary)}.DXqwVW_badge[data-tone=success]{color:var(--dsw-alias-state-success-primary)}.DXqwVW_badge[data-tone=warning]{color:var(--dsw-alias-state-warn-primary)}.DXqwVW_badge[data-tone=error]{color:var(--dsw-alias-state-error-primary)}.DXqwVW_subtitle{color:var(--dsw-alias-label-tertiary);overflow-wrap:anywhere;margin-top:3px;font-size:12px}.DXqwVW_description{color:var(--dsw-alias-label-caption);white-space:pre-wrap;overflow-wrap:anywhere;margin:6px 0}.DXqwVW_lines{white-space:pre-wrap;overflow-wrap:anywhere;margin:6px 0 0;padding-inline-start:18px}.DXqwVW_lines li+li{margin-top:4px}.DXqwVW_group{border-top:.5px solid var(--dsw-alias-border-l2);margin-top:8px}.DXqwVW_group>summary{color:var(--dsw-alias-label-caption);cursor:pointer;overflow-wrap:anywhere;align-items:center;gap:6px;padding:8px 0 0;list-style:none;display:flex}.DXqwVW_group>summary::-webkit-details-marker{display:none}.DXqwVW_group[open]>summary svg{transform:rotate(90deg)}.DXqwVW_group>summary svg{flex:none}.DXqwVW_group .DXqwVW_list{max-height:none;overflow:visible}.DXqwVW_group .DXqwVW_item{padding:9px 0 2px 20px}.DXqwVW_prose,.DXqwVW_code{max-width:100%;font-size:13px}.DXqwVW_prose{margin-top:8px}.DXqwVW_root .DXqwVW_item>.DXqwVW_code{max-height:240px;margin:8px 0 0;overflow:auto}.DXqwVW_root .DXqwVW_item:has(>.DXqwVW_code:only-child){padding:0}.DXqwVW_root .DXqwVW_item>.DXqwVW_code:only-child{margin:0}.DXqwVW_root .DXqwVW_group .DXqwVW_item:has(>.DXqwVW_code:only-child){padding:4px 0 0 20px}.DXqwVW_path{min-width:0;color:inherit;font:inherit;text-align:start;overflow-wrap:anywhere;cursor:pointer;background:0 0;border:none;flex:1;padding:0}.DXqwVW_path:hover{text-decoration:underline}.DXqwVW_path:focus-visible{outline:var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-offset:3px}";
1244
1261
  const tagId$3 = "@deepseek-ai/dsh-client-ui-tool/ToolDetails.module.css";
1245
1262
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$3) + "]") === null) {
1246
1263
  const tag = document.createElement("style");
@@ -1414,7 +1431,7 @@ window.__ModuleLoader__.load({
1414
1431
  }
1415
1432
  //#endregion
1416
1433
  //#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-tool/src/client/tool/components/ToolRow.module.css.mjs
1417
- const css$2 = ".o3BgMG_root{flex-direction:column;display:flex}.o3BgMG_leading{flex-shrink:0}.o3BgMG_root[data-tool^=cordis_] .o3BgMG_leading,.o3BgMG_root[data-tool^=cordis_] .o3BgMG_title{color:var(--dsw-alias-state-business-primary)}.o3BgMG_root[data-tool^=cordis_] .o3BgMG_title{font-weight:500}.o3BgMG_root[data-tool^=cordis_] .o3BgMG_sep{background:var(--dsw-alias-state-business-primary)}.o3BgMG_chevron{color:var(--dsw-alias-label-secondary)}.o3BgMG_title{font-weight:400;transition:color .1s}.o3BgMG_sep{background:var(--dsw-alias-label-caption);border-radius:1px;flex:none;width:2px;height:2px;margin:0 8px}.o3BgMG_summary{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:var(--dsh-content-font-size-secondary,13px);line-height:calc(24px + var(--dsh-content-font-delta,0px));color:var(--dsw-alias-label-tertiary);flex:auto;transition:color .1s;overflow:hidden}.o3BgMG_summarySuffix{white-space:nowrap;font-size:var(--dsh-content-font-size-secondary,13px);line-height:calc(24px + var(--dsh-content-font-delta,0px));color:var(--dsw-alias-label-tertiary);flex:none;margin-left:4px;transition:color .1s}.o3BgMG_row:hover .o3BgMG_title,.o3BgMG_row:hover .o3BgMG_summary:not(.o3BgMG_errorSummary):not(.o3BgMG_stoppedSummary),.o3BgMG_row:hover .o3BgMG_summarySuffix{color:var(--dsw-alias-label-primary)}.o3BgMG_diffStat{font-family:var(--ds-font-family-code);font-size:calc(var(--dsh-content-font-size-secondary,13px) - 2px);color:var(--dsw-alias-label-caption);margin-left:10px;transform:translateY(.5px)}.o3BgMG_fileLink{text-overflow:ellipsis;white-space:nowrap;min-width:0;font:inherit;text-align:left;font-size:var(--dsh-content-font-size-secondary,13px);line-height:calc(24px + var(--dsh-content-font-delta,0px));color:var(--dsw-alias-label-secondary);text-decoration:underline dotted;text-decoration-color:var(--dsw-alias-label-tertiary);text-underline-offset:3px;cursor:pointer;background:0 0;border:none;flex:0 auto;margin:0;padding:0;text-decoration-thickness:1px;transition:color .1s;overflow:hidden}.o3BgMG_row:hover .o3BgMG_fileLink,.o3BgMG_fileLink:hover{color:var(--dsw-alias-label-primary);text-decoration-color:currentColor}.o3BgMG_errorSummary{color:var(--dsw-alias-state-error-primary)}.o3BgMG_stoppedSummary{color:var(--dsw-alias-state-warn-label)}.o3BgMG_bodyWrap{flex-direction:column;display:flex}.o3BgMG_inspectButton{border:.5px solid var(--dsw-alias-border-l3);corner-shape:round;background:var(--dsw-alias-bg-base);color:var(--dsw-alias-label-secondary);cursor:pointer;opacity:0;border-radius:999px;align-self:flex-start;align-items:center;gap:4px;margin:4px 0 2px 4px;padding:2px 8px;font-size:11px;line-height:16px;transition:opacity .1s;display:inline-flex}.o3BgMG_root:hover .o3BgMG_inspectButton,.o3BgMG_inspectButton:focus-visible{opacity:1}.o3BgMG_detailsBodyWrap{position:relative}.o3BgMG_detailsBodyWrap .o3BgMG_inspectButton{margin:0;position:absolute;top:12px;right:12px}.o3BgMG_inspectButton:hover{background:var(--dsw-alias-interactive-bg-hover-solid);color:var(--dsw-alias-label-primary)}.o3BgMG_bodyScroll{max-height:260px;overflow-y:auto}.o3BgMG_ioCard{border:.5px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-markdown-code-block);font:var(--dsw-font-markdown-code-block-small);border-radius:12px;flex-direction:column;margin:4px 0 4px 4px;display:flex}.o3BgMG_ioSection{grid-template-columns:max-content 1fr;align-items:baseline;column-gap:14px;max-height:150px;padding:12px 16px;display:grid;overflow-y:auto}.o3BgMG_ioSection::-webkit-scrollbar-thumb{background-clip:padding-box;border:2px solid #0000;border-radius:6px}.o3BgMG_ioSection::-webkit-scrollbar-track{margin:6px 0}.o3BgMG_ioLabel{color:var(--dsw-alias-label-caption);align-self:start;position:sticky;top:0}.o3BgMG_ioDivider{background:var(--dsw-alias-border-l2);flex:none;height:.5px}.o3BgMG_ioText{white-space:pre-wrap;word-break:break-word;min-width:0;color:var(--dsw-alias-label-secondary)}.o3BgMG_ioText[data-error]{color:var(--dsw-alias-state-error-primary)}.o3BgMG_codeBody,.o3BgMG_terminalBody,.o3BgMG_diffBody,.o3BgMG_readBody,.o3BgMG_imageBody,.o3BgMG_searchBody,.o3BgMG_webBody{margin:4px 0 4px 4px}.o3BgMG_searchRecovery{white-space:pre-wrap;overflow-wrap:anywhere;font:var(--dsw-font-xs-13);color:var(--dsw-alias-label-tertiary);margin:4px 0 4px 4px}.o3BgMG_imageLabel{overflow-wrap:anywhere;font:var(--dsw-font-sm-13);color:var(--dsw-alias-label-secondary);margin-bottom:4px}.o3BgMG_imageMeta{white-space:pre-wrap;overflow-wrap:anywhere;font:var(--dsw-font-xs-13);color:var(--dsw-alias-label-tertiary)}.o3BgMG_terminalBody{--dsl-terminal-font:var(--dsw-font-markdown-code-block-small);--dsl-terminal-line-height:18px;--dsl-terminal-output-max-height:224px;border:.5px solid var(--dsw-alias-border-l1)}.o3BgMG_visuallyHidden{clip:rect(0 0 0 0);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}";
1434
+ const css$2 = ".o3BgMG_root{flex-direction:column;display:flex}.o3BgMG_leading{flex-shrink:0}.o3BgMG_root[data-tool^=cordis_] .o3BgMG_leading,.o3BgMG_root[data-tool^=cordis_] .o3BgMG_title{color:var(--dsw-alias-state-business-primary)}.o3BgMG_root[data-tool^=cordis_] .o3BgMG_title{font-weight:500}.o3BgMG_root[data-tool^=cordis_] .o3BgMG_sep{background:var(--dsw-alias-state-business-primary)}.o3BgMG_chevron{color:var(--dsw-alias-label-secondary)}.o3BgMG_title{font-weight:400;transition:color .1s}.o3BgMG_sep{background:var(--dsw-alias-label-caption);border-radius:1px;flex:none;width:2px;height:2px;margin:0 8px}.o3BgMG_summary{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:var(--dsh-content-font-size-secondary,13px);line-height:calc(24px + var(--dsh-content-font-delta,0px));color:var(--dsw-alias-label-tertiary);flex:auto;transition:color .1s;overflow:hidden}.o3BgMG_summarySuffix{white-space:nowrap;font-size:var(--dsh-content-font-size-secondary,13px);line-height:calc(24px + var(--dsh-content-font-delta,0px));color:var(--dsw-alias-label-tertiary);flex:none;margin-left:4px;transition:color .1s}.o3BgMG_row:hover .o3BgMG_title,.o3BgMG_row:hover .o3BgMG_summary:not(.o3BgMG_errorSummary):not(.o3BgMG_stoppedSummary),.o3BgMG_row:hover .o3BgMG_summarySuffix{color:var(--dsw-alias-label-primary)}.o3BgMG_diffStat{font-family:var(--ds-font-family-code);font-size:calc(var(--dsh-content-font-size-secondary,13px) - 2px);color:var(--dsw-alias-label-caption);margin-left:10px;transform:translateY(.5px)}.o3BgMG_fileLink{text-overflow:ellipsis;white-space:nowrap;min-width:0;font:inherit;text-align:left;font-size:var(--dsh-content-font-size-secondary,13px);line-height:calc(24px + var(--dsh-content-font-delta,0px));color:var(--dsw-alias-label-secondary);text-decoration:underline dotted;text-decoration-color:var(--dsw-alias-label-tertiary);text-underline-offset:3px;cursor:pointer;background:0 0;border:none;flex:0 auto;margin:0;padding:0;text-decoration-thickness:1px;transition:color .1s;overflow:hidden}.o3BgMG_row:hover .o3BgMG_fileLink,.o3BgMG_fileLink:hover{color:var(--dsw-alias-label-primary);text-decoration-color:currentColor}.o3BgMG_errorSummary{color:var(--dsw-alias-state-error-primary)}.o3BgMG_stoppedSummary{color:var(--dsw-alias-state-warn-label)}.o3BgMG_bodyWrap{flex-direction:column;display:flex}.o3BgMG_inspectButton{border:.5px solid var(--dsw-alias-border-l3);corner-shape:round;background:var(--dsw-alias-bg-base);color:var(--dsw-alias-label-secondary);cursor:pointer;opacity:0;border-radius:999px;align-self:flex-start;align-items:center;gap:4px;margin:4px 0 2px 4px;padding:2px 8px;font-size:11px;line-height:16px;transition:opacity .1s;display:inline-flex}.o3BgMG_root:hover .o3BgMG_inspectButton,.o3BgMG_inspectButton:focus-visible{opacity:1}.o3BgMG_detailsBodyWrap{position:relative}.o3BgMG_detailsBodyWrap .o3BgMG_inspectButton{margin:0;position:absolute;top:12px;right:12px}.o3BgMG_inspectButton:hover{background:var(--dsw-alias-interactive-bg-hover-solid);color:var(--dsw-alias-label-primary)}.o3BgMG_bodyScroll{max-height:260px;overflow-y:auto}.o3BgMG_ioCard{border:.5px solid var(--dsw-alias-border-l1);border-radius:var(--dsw-radius-lg);background:var(--dsw-alias-markdown-code-block);font:var(--dsw-font-markdown-code-block-small);flex-direction:column;margin:4px 0 4px 4px;display:flex}.o3BgMG_ioSection{grid-template-columns:max-content 1fr;align-items:baseline;column-gap:14px;max-height:150px;padding:12px 16px;display:grid;overflow-y:auto}.o3BgMG_ioSection::-webkit-scrollbar-thumb{border-radius:var(--dsw-radius-sm);background-clip:padding-box;border:2px solid #0000}.o3BgMG_ioSection::-webkit-scrollbar-track{margin:6px 0}.o3BgMG_ioLabel{color:var(--dsw-alias-label-caption);align-self:start;position:sticky;top:0}.o3BgMG_ioDivider{background:var(--dsw-alias-border-l2);flex:none;height:.5px}.o3BgMG_ioText{white-space:pre-wrap;word-break:break-word;min-width:0;color:var(--dsw-alias-label-secondary)}.o3BgMG_ioText[data-error]{color:var(--dsw-alias-state-error-primary)}.o3BgMG_codeBody,.o3BgMG_terminalBody,.o3BgMG_diffBody,.o3BgMG_readBody,.o3BgMG_imageBody,.o3BgMG_searchBody,.o3BgMG_webBody{margin:4px 0 4px 4px}.o3BgMG_searchRecovery{white-space:pre-wrap;overflow-wrap:anywhere;font:var(--dsw-font-xs-13);color:var(--dsw-alias-label-tertiary);margin:4px 0 4px 4px}.o3BgMG_imageLabel{overflow-wrap:anywhere;font:var(--dsw-font-sm-13);color:var(--dsw-alias-label-secondary);margin-bottom:4px}.o3BgMG_imageMeta{white-space:pre-wrap;overflow-wrap:anywhere;font:var(--dsw-font-xs-13);color:var(--dsw-alias-label-tertiary)}.o3BgMG_terminalBody{--dsl-terminal-font:var(--dsw-font-markdown-code-block-small);--dsl-terminal-line-height:18px;--dsl-terminal-output-max-height:224px;border:.5px solid var(--dsw-alias-border-l1)}.o3BgMG_visuallyHidden{clip:rect(0 0 0 0);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}";
1418
1435
  const tagId$2 = "@deepseek-ai/dsh-client-ui-tool/ToolRow.module.css";
1419
1436
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$2) + "]") === null) {
1420
1437
  const tag = document.createElement("style");
@@ -1459,6 +1476,10 @@ window.__ModuleLoader__.load({
1459
1476
  };
1460
1477
  //#endregion
1461
1478
  //#region lib/types/client/tool/components/ToolRow.js
1479
+ /** Keep a summary link click from toggling the row; the browser still follows the link. */
1480
+ function stopLinkClick(event) {
1481
+ event.stopPropagation();
1482
+ }
1462
1483
  /** Visually hidden run-state label for color-only running and settlement cues. */
1463
1484
  function stateStatus$1(state, t) {
1464
1485
  switch (state) {
@@ -1475,7 +1496,7 @@ window.__ModuleLoader__.load({
1475
1496
  * @param props - tool state, summary, output, and navigation callbacks.
1476
1497
  * @returns the tool disclosure.
1477
1498
  */
1478
- const ToolRow = (0, react.memo)(function ToolRow({ t, variant, toolName, icon, title, summary, summarySuffix, bodyRaw, output, askQuestion, errorSummary, terminal, diff, read, image, renderSlot, loadImage, search, web, details, state, filePath, filePathLine, onOpenFile, inspect, useDisclosure }) {
1499
+ const ToolRow = (0, react.memo)(function ToolRow({ t, variant, toolName, icon, title, summary, summarySuffix, bodyRaw, output, askQuestion, errorSummary, terminal, diff, read, image, renderSlot, loadImage, search, web, details, state, filePath, filePathLine, onOpenFile, href, inspect, useDisclosure }) {
1479
1500
  const { expanded, toggle: toggleExpand } = useDisclosure();
1480
1501
  const terminalLabels = (0, react.useMemo)(() => terminalBlockLabels(t), [t]);
1481
1502
  const diffLabels = (0, react.useMemo)(() => diffBlockLabels(t), [t]);
@@ -1522,7 +1543,8 @@ window.__ModuleLoader__.load({
1522
1543
  onOpenFile,
1523
1544
  settledWithCue
1524
1545
  ]);
1525
- const fileLinkKeyDown = (0, react.useCallback)((event) => {
1546
+ const linkHref = settledWithCue ? void 0 : href;
1547
+ const summaryLinkKeyDown = (0, react.useCallback)((event) => {
1526
1548
  if (event.key === "Enter" || event.key === " ") event.stopPropagation();
1527
1549
  }, []);
1528
1550
  const cardBody = variant === "code" ? null : bodyText;
@@ -1535,7 +1557,18 @@ window.__ModuleLoader__.load({
1535
1557
  type: "button",
1536
1558
  className: ToolRow_module_css_default.fileLink,
1537
1559
  onClick: openFile,
1538
- onKeyDown: fileLinkKeyDown,
1560
+ onKeyDown: summaryLinkKeyDown,
1561
+ children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.TextShimmer, {
1562
+ active: running,
1563
+ children: summaryText
1564
+ })
1565
+ }) : linkHref !== void 0 ? (0, react_jsx_runtime.jsx)("a", {
1566
+ className: ToolRow_module_css_default.fileLink,
1567
+ href: linkHref,
1568
+ target: "_blank",
1569
+ rel: "noopener noreferrer",
1570
+ onClick: stopLinkClick,
1571
+ onKeyDown: summaryLinkKeyDown,
1539
1572
  children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.TextShimmer, {
1540
1573
  active: running,
1541
1574
  children: summaryText
@@ -1554,7 +1587,8 @@ window.__ModuleLoader__.load({
1554
1587
  })
1555
1588
  ] }), [
1556
1589
  diffStat,
1557
- fileLinkKeyDown,
1590
+ summaryLinkKeyDown,
1591
+ linkHref,
1558
1592
  openFile,
1559
1593
  running,
1560
1594
  state,
@@ -1756,7 +1790,7 @@ window.__ModuleLoader__.load({
1756
1790
  }
1757
1791
  //#endregion
1758
1792
  //#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-tool/src/client/tool/ToolCallTree.module.css.mjs
1759
- const css$1 = ".ztWv_q_callRow{border-radius:6px}.ztWv_q_subCalls{border-left:.5px solid var(--dsw-alias-border-l2);flex-direction:column;gap:4px;margin:4px 0 2px 22px;padding-left:8px;display:flex}";
1793
+ const css$1 = ".ztWv_q_callRow{border-radius:var(--dsw-radius-sm)}.ztWv_q_subCalls{border-left:.5px solid var(--dsw-alias-border-l2);flex-direction:column;gap:4px;margin:4px 0 2px 22px;padding-left:8px;display:flex}";
1760
1794
  const tagId$1 = "@deepseek-ai/dsh-client-ui-tool/ToolCallTree.module.css";
1761
1795
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$1) + "]") === null) {
1762
1796
  const tag = document.createElement("style");
@@ -2098,7 +2132,7 @@ window.__ModuleLoader__.load({
2098
2132
  }
2099
2133
  //#endregion
2100
2134
  //#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-tool/src/client/tool/toolviews/bash-sample.module.css.mjs
2101
- const css = ".CY-8Ka_card{flex-direction:column;display:flex}.CY-8Ka_terminal{--dsl-terminal-font:var(--dsw-font-markdown-code-block-small);--dsl-terminal-line-height:18px;--dsl-terminal-output-max-height:224px;border:.5px solid var(--dsw-alias-border-l1);margin:4px 0 4px 4px}.CY-8Ka_ioCard{border:.5px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-markdown-code-block);font:var(--dsw-font-markdown-code-block-small);border-radius:12px;flex-direction:column;margin:4px 0 4px 4px;display:flex}.CY-8Ka_ioSection{grid-template-columns:max-content 1fr;align-items:baseline;column-gap:14px;max-height:150px;padding:12px 16px;display:grid;overflow-y:auto}.CY-8Ka_ioSection::-webkit-scrollbar-thumb{background-clip:padding-box;border:2px solid #0000;border-radius:6px}.CY-8Ka_ioSection::-webkit-scrollbar-track{margin:6px 0}.CY-8Ka_ioLabel{color:var(--dsw-alias-label-caption);align-self:start;position:sticky;top:0}.CY-8Ka_ioDivider{background:var(--dsw-alias-border-l2);flex:none;height:.5px}.CY-8Ka_ioText{white-space:pre-wrap;word-break:break-word;min-width:0;color:var(--dsw-alias-label-secondary)}.CY-8Ka_ioText[data-error]{color:var(--dsw-alias-state-error-primary)}.CY-8Ka_root[data-expandable]{cursor:pointer}.CY-8Ka_root{height:calc(24px + var(--dsh-content-font-delta,0px));align-items:center;min-width:0;display:flex}.CY-8Ka_leading{width:calc(16px + var(--dsh-content-font-delta,0px));height:calc(16px + var(--dsh-content-font-delta,0px));color:var(--dsw-alias-label-tertiary);flex:none;justify-content:center;align-items:center;margin-right:6px;display:inline-flex;position:relative}.CY-8Ka_leading svg:not([data-state]){width:calc(14px + var(--dsh-content-font-delta,0px));height:calc(14px + var(--dsh-content-font-delta,0px))}.CY-8Ka_chevron{color:var(--dsw-alias-label-secondary)}.CY-8Ka_iconIdle{opacity:1;transition:opacity .1s;display:inline-flex}.CY-8Ka_chevronHover{opacity:0;margin:auto;transition:opacity .1s;position:absolute;inset:0}.CY-8Ka_root:hover .CY-8Ka_iconIdle{opacity:0}.CY-8Ka_root:hover .CY-8Ka_chevronHover{opacity:1}.CY-8Ka_title{font-size:var(--dsh-content-font-size-secondary,13px);line-height:calc(24px + var(--dsh-content-font-delta,0px));color:var(--dsw-alias-label-secondary);flex:none;transition:color .1s}.CY-8Ka_sep{background:var(--dsw-alias-label-caption);border-radius:1px;flex:none;width:2px;height:2px;margin:0 8px}.CY-8Ka_summary{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:var(--dsh-content-font-size-secondary,13px);line-height:calc(24px + var(--dsh-content-font-delta,0px));color:var(--dsw-alias-label-tertiary);flex:auto;transition:color .1s;overflow:hidden}.CY-8Ka_root:hover .CY-8Ka_title,.CY-8Ka_root:hover .CY-8Ka_summary:not(.CY-8Ka_errorSummary):not(.CY-8Ka_stoppedSummary){color:var(--dsw-alias-label-primary)}.CY-8Ka_errorSummary{color:var(--dsw-alias-state-error-primary)}.CY-8Ka_stoppedSummary{color:var(--dsw-alias-state-warn-label)}.CY-8Ka_bodyWrap{flex-direction:column;display:flex}.CY-8Ka_inspectButton{border:.5px solid var(--dsw-alias-border-l4);corner-shape:round;background:var(--dsw-alias-bg-base);color:var(--dsw-alias-label-secondary);cursor:pointer;opacity:0;border-radius:999px;align-self:flex-start;align-items:center;gap:4px;margin:4px 0 2px 4px;padding:2px 8px;font-size:11px;line-height:16px;transition:opacity .1s;display:inline-flex}.CY-8Ka_card:hover .CY-8Ka_inspectButton,.CY-8Ka_inspectButton:focus-visible{opacity:1}.CY-8Ka_inspectButton:hover{background:var(--dsw-alias-interactive-bg-hover-solid);color:var(--dsw-alias-label-primary)}.CY-8Ka_visuallyHidden{clip:rect(0 0 0 0);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}";
2135
+ const css = ".CY-8Ka_card{flex-direction:column;display:flex}.CY-8Ka_terminal{--dsl-terminal-font:var(--dsw-font-markdown-code-block-small);--dsl-terminal-line-height:18px;--dsl-terminal-output-max-height:224px;border:.5px solid var(--dsw-alias-border-l1);margin:4px 0 4px 4px}.CY-8Ka_ioCard{border:.5px solid var(--dsw-alias-border-l1);border-radius:var(--dsw-radius-lg);background:var(--dsw-alias-markdown-code-block);font:var(--dsw-font-markdown-code-block-small);flex-direction:column;margin:4px 0 4px 4px;display:flex}.CY-8Ka_ioSection{grid-template-columns:max-content 1fr;align-items:baseline;column-gap:14px;max-height:150px;padding:12px 16px;display:grid;overflow-y:auto}.CY-8Ka_ioSection::-webkit-scrollbar-thumb{border-radius:var(--dsw-radius-sm);background-clip:padding-box;border:2px solid #0000}.CY-8Ka_ioSection::-webkit-scrollbar-track{margin:6px 0}.CY-8Ka_ioLabel{color:var(--dsw-alias-label-caption);align-self:start;position:sticky;top:0}.CY-8Ka_ioDivider{background:var(--dsw-alias-border-l2);flex:none;height:.5px}.CY-8Ka_ioText{white-space:pre-wrap;word-break:break-word;min-width:0;color:var(--dsw-alias-label-secondary)}.CY-8Ka_ioText[data-error]{color:var(--dsw-alias-state-error-primary)}.CY-8Ka_root[data-expandable]{cursor:pointer}.CY-8Ka_root{height:calc(24px + var(--dsh-content-font-delta,0px));align-items:center;min-width:0;display:flex}.CY-8Ka_leading{width:calc(16px + var(--dsh-content-font-delta,0px));height:calc(16px + var(--dsh-content-font-delta,0px));color:var(--dsw-alias-label-tertiary);flex:none;justify-content:center;align-items:center;margin-right:6px;display:inline-flex;position:relative}.CY-8Ka_leading svg:not([data-state]){width:calc(14px + var(--dsh-content-font-delta,0px));height:calc(14px + var(--dsh-content-font-delta,0px))}.CY-8Ka_chevron{color:var(--dsw-alias-label-secondary)}.CY-8Ka_iconIdle{opacity:1;transition:opacity .1s;display:inline-flex}.CY-8Ka_chevronHover{opacity:0;margin:auto;transition:opacity .1s;position:absolute;inset:0}.CY-8Ka_root:hover .CY-8Ka_iconIdle{opacity:0}.CY-8Ka_root:hover .CY-8Ka_chevronHover{opacity:1}.CY-8Ka_title{font-size:var(--dsh-content-font-size-secondary,13px);line-height:calc(24px + var(--dsh-content-font-delta,0px));color:var(--dsw-alias-label-secondary);flex:none;transition:color .1s}.CY-8Ka_sep{background:var(--dsw-alias-label-caption);border-radius:1px;flex:none;width:2px;height:2px;margin:0 8px}.CY-8Ka_summary{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:var(--dsh-content-font-size-secondary,13px);line-height:calc(24px + var(--dsh-content-font-delta,0px));color:var(--dsw-alias-label-tertiary);flex:auto;transition:color .1s;overflow:hidden}.CY-8Ka_root:hover .CY-8Ka_title,.CY-8Ka_root:hover .CY-8Ka_summary:not(.CY-8Ka_errorSummary):not(.CY-8Ka_stoppedSummary){color:var(--dsw-alias-label-primary)}.CY-8Ka_errorSummary{color:var(--dsw-alias-state-error-primary)}.CY-8Ka_stoppedSummary{color:var(--dsw-alias-state-warn-label)}.CY-8Ka_bodyWrap{flex-direction:column;display:flex}.CY-8Ka_inspectButton{border:.5px solid var(--dsw-alias-border-l4);corner-shape:round;background:var(--dsw-alias-bg-base);color:var(--dsw-alias-label-secondary);cursor:pointer;opacity:0;border-radius:999px;align-self:flex-start;align-items:center;gap:4px;margin:4px 0 2px 4px;padding:2px 8px;font-size:11px;line-height:16px;transition:opacity .1s;display:inline-flex}.CY-8Ka_card:hover .CY-8Ka_inspectButton,.CY-8Ka_inspectButton:focus-visible{opacity:1}.CY-8Ka_inspectButton:hover{background:var(--dsw-alias-interactive-bg-hover-solid);color:var(--dsw-alias-label-primary)}.CY-8Ka_visuallyHidden{clip:rect(0 0 0 0);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}";
2102
2136
  const tagId = "@deepseek-ai/dsh-client-ui-tool/bash-sample.module.css";
2103
2137
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
2104
2138
  const tag = document.createElement("style");
@@ -3548,14 +3582,40 @@ window.__ModuleLoader__.load({
3548
3582
  fields
3549
3583
  }] };
3550
3584
  }
3585
+ /** ISO-weekday keys, Monday first: a stored weekly rule names days 1 through 7. */
3586
+ const WEEKDAY_KEYS = [
3587
+ "detail.weekday.1",
3588
+ "detail.weekday.2",
3589
+ "detail.weekday.3",
3590
+ "detail.weekday.4",
3591
+ "detail.weekday.5",
3592
+ "detail.weekday.6",
3593
+ "detail.weekday.7"
3594
+ ];
3551
3595
  function interval(seconds, t) {
3552
3596
  if (seconds % 86400 === 0) return t("detail.days", { count: seconds / 86400 });
3553
3597
  if (seconds % 3600 === 0) return t("detail.hours", { count: seconds / 3600 });
3554
3598
  if (seconds % 60 === 0) return t("detail.minutes", { count: seconds / 60 });
3555
3599
  return t("detail.seconds", { count: seconds });
3556
3600
  }
3601
+ /** A stored wall clock without its zero seconds, the figure the schedule surfaces state. */
3602
+ function shortTime(time) {
3603
+ return time.replace(/:00\.000$/, "").replace(/\.000$/, "");
3604
+ }
3605
+ /** Localized weekday list of a stored weekly rule, or undefined when the set is empty or out of range. */
3606
+ function weekdayText(days, t) {
3607
+ if (!Array.isArray(days) || days.length === 0) return void 0;
3608
+ const labels = [];
3609
+ for (const day of days) {
3610
+ if (typeof day !== "number" || !Number.isInteger(day)) return void 0;
3611
+ const key = WEEKDAY_KEYS[day - 1];
3612
+ if (key === void 0) return void 0;
3613
+ labels.push(t(key));
3614
+ }
3615
+ return labels.join(t("detail.weekday.join"));
3616
+ }
3557
3617
  function scheduleItem(value, t, locale) {
3558
- if (!detailRecord(value) || !nonempty(value.id) || !nonempty(value.prompt) || typeof value.scheduledAt !== "string" || value.deliveryMode !== "session-local" || value.state !== "scheduled" && value.state !== "overdue") return null;
3618
+ if (!detailRecord(value) || !nonempty(value.id) || !nonempty(value.prompt) || typeof value.scheduledAt !== "string" || value.deliveryMode !== "host" && value.deliveryMode !== "session-local" || value.state !== "scheduled" && value.state !== "overdue") return null;
3559
3619
  const date = new Date(value.scheduledAt);
3560
3620
  if (!Number.isFinite(date.getTime()) || date.toISOString() !== value.scheduledAt) return null;
3561
3621
  let frequency;
@@ -3571,11 +3631,35 @@ window.__ModuleLoader__.load({
3571
3631
  if (!count(value.everySeconds) || value.everySeconds === 0) return null;
3572
3632
  frequency = t("detail.schedule.every", { interval: interval(value.everySeconds, t) });
3573
3633
  break;
3634
+ case "daily":
3635
+ if (!nonempty(value.time) || !nonempty(value.timeZone)) return null;
3636
+ frequency = t("detail.schedule.daily", {
3637
+ time: shortTime(value.time),
3638
+ zone: value.timeZone
3639
+ });
3640
+ break;
3641
+ case "weekly": {
3642
+ const days = weekdayText(value.weekdays, t);
3643
+ if (!nonempty(value.time) || !nonempty(value.timeZone) || days === void 0) return null;
3644
+ frequency = t("detail.schedule.weekly", {
3645
+ days,
3646
+ time: shortTime(value.time),
3647
+ zone: value.timeZone
3648
+ });
3649
+ break;
3650
+ }
3651
+ case "cron":
3652
+ if (!nonempty(value.expression) || !nonempty(value.timeZone)) return null;
3653
+ frequency = t("detail.schedule.cron", {
3654
+ expression: value.expression,
3655
+ zone: value.timeZone
3656
+ });
3657
+ break;
3574
3658
  default: return null;
3575
3659
  }
3576
3660
  const dateText = formatDate(date, locale, value.scheduledAt);
3577
3661
  return {
3578
- title: value.prompt,
3662
+ title: nonempty(value.title) ? value.title : value.prompt,
3579
3663
  fields: [
3580
3664
  {
3581
3665
  label: t("detail.schedule.when"),
@@ -3613,7 +3697,8 @@ window.__ModuleLoader__.load({
3613
3697
  case "create_goal":
3614
3698
  case "get_goal":
3615
3699
  case "update_goal": return goalDetail(value, t);
3616
- case "schedule_create": {
3700
+ case "schedule_create":
3701
+ case "schedule_update": {
3617
3702
  const item = scheduleItem(value, t, locale);
3618
3703
  return item === null ? null : { items: [item] };
3619
3704
  }
@@ -3739,6 +3824,11 @@ window.__ModuleLoader__.load({
3739
3824
  key: "schedule_delete",
3740
3825
  locale: CONVERSATION_NS
3741
3826
  }, DetailsRow);
3827
+ yield ctx.slots.register({
3828
+ name: "tool.call.toolview",
3829
+ key: "schedule_update",
3830
+ locale: CONVERSATION_NS
3831
+ }, DetailsRow);
3742
3832
  yield ctx.slots.register({
3743
3833
  name: "tool.call.toolview",
3744
3834
  key: "cordis_inspect_list",
@@ -4180,6 +4270,7 @@ window.__ModuleLoader__.load({
4180
4270
  output: model.output,
4181
4271
  errorSummary: model.errorSummary,
4182
4272
  web,
4273
+ href: webFetchHref(block),
4183
4274
  state: model.state,
4184
4275
  inspect
4185
4276
  });
@@ -70,6 +70,8 @@ export interface ToolRowProps {
70
70
  filePathLine?: number | undefined;
71
71
  /** Open the path (already cwd-resolved), landing on `filePathLine` when given. */
72
72
  onOpenFile?: ((path: string, options?: OpenFileOptions) => void) | undefined;
73
+ /** Safe http(s) URL from tool args; when set, the summary renders as a link that opens it in a new tab. */
74
+ href?: string | undefined;
73
75
  /**
74
76
  * Jump to this call in the trajectory view: a hover-revealed Inspect pill
75
77
  * over the expanded body. Absent = no affordance.
@@ -82,5 +84,5 @@ export interface ToolRowProps {
82
84
  * @param props - tool state, summary, output, and navigation callbacks.
83
85
  * @returns the tool disclosure.
84
86
  */
85
- export declare const ToolRow: import("react").MemoExoticComponent<({ t, variant, toolName, icon, title, summary, summarySuffix, bodyRaw, output, askQuestion, errorSummary, terminal, diff, read, image, renderSlot, loadImage, search, web, details, state, filePath, filePathLine, onOpenFile, inspect, useDisclosure, }: ToolRowProps) => import("react").JSX.Element>;
87
+ export declare const ToolRow: import("react").MemoExoticComponent<({ t, variant, toolName, icon, title, summary, summarySuffix, bodyRaw, output, askQuestion, errorSummary, terminal, diff, read, image, renderSlot, loadImage, search, web, details, state, filePath, filePathLine, onOpenFile, href, inspect, useDisclosure, }: ToolRowProps) => import("react").JSX.Element>;
86
88
  //# sourceMappingURL=ToolRow.d.ts.map
@@ -10,5 +10,11 @@ export type WebCardModelProps = DistributiveOmit<WebBlockProps, 'labels' | 'clas
10
10
  * @returns web-card props, or null for the generic path.
11
11
  */
12
12
  export declare function webCardModel(block: ToolCallBlock): WebCardModelProps | null;
13
+ /**
14
+ * Read the openable URL of a web_fetch call from its arguments.
15
+ * @param block - running or settled Tool block.
16
+ * @returns the http(s) URL, or undefined for another tool, protocol, or unparsable argument.
17
+ */
18
+ export declare function webFetchHref(block: ToolCallBlock): string | undefined;
13
19
  export {};
14
20
  //# sourceMappingURL=web-card-model.d.ts.map
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@deepseek-ai/dsh-client-ui-tool",
3
3
  "description": "Client Tool call-tree renderer and keyed per-tool presentation slot",
4
- "version": "0.1.7-rc.1",
4
+ "version": "0.1.7-rc.2",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -46,32 +46,32 @@
46
46
  "react": "^18.2.0",
47
47
  "react-dom": "^18.2.0",
48
48
  "clsx": "^2.0.0",
49
- "@deepseek-ai/dsh-llm": "0.1.7-rc.1",
50
- "@deepseek-ai/dsh-agent": "0.1.7-rc.1",
51
- "@deepseek-ai/dsh-spill-policy": "0.1.7-rc.1",
52
- "@deepseek-ai/dsh-system-prompt": "0.1.7-rc.1",
53
- "@deepseek-ai/dsh-tools": "0.1.7-rc.1",
54
- "@deepseek-ai/dsh-session": "0.1.7-rc.1",
55
- "@deepseek-ai/dsh-tool-terminal": "0.1.7-rc.1",
56
- "@deepseek-ai/dsh-spill": "0.1.7-rc.1",
49
+ "@deepseek-ai/dsh-spill-policy": "0.1.7-rc.2",
50
+ "@deepseek-ai/dsh-agent": "0.1.7-rc.2",
51
+ "@deepseek-ai/dsh-llm": "0.1.7-rc.2",
52
+ "@deepseek-ai/dsh-session": "0.1.7-rc.2",
53
+ "@deepseek-ai/dsh-system-prompt": "0.1.7-rc.2",
54
+ "@deepseek-ai/dsh-tools": "0.1.7-rc.2",
55
+ "@deepseek-ai/dsh-tool-jobs": "0.1.7-rc.2",
56
+ "@deepseek-ai/dsh-tool-session-query": "0.1.7-rc.2",
57
+ "@deepseek-ai/dsh-tool-terminal": "0.1.7-rc.2",
58
+ "@deepseek-ai/dsh-spill": "0.1.7-rc.2",
57
59
  "@deepseek-ai/cordis": "~4.0.4",
58
- "@deepseek-ai/dsh-api-remotes": "0.1.7-rc.1",
59
- "@deepseek-ai/dsh-client-connection": "0.1.7-rc.1",
60
- "@deepseek-ai/dsh-client-locale": "0.1.7-rc.1",
61
- "@deepseek-ai/dsh-client-test-runtime": "0.1.7-rc.1",
62
- "@deepseek-ai/dsh-client-ui-primitives": "0.1.7-rc.1",
63
- "@deepseek-ai/dsh-client-ui-slots": "0.1.7-rc.1",
64
- "@deepseek-ai/dsh-api-workspace-controller": "0.1.7-rc.1",
65
- "@deepseek-ai/dsh-tool-jobs": "0.1.7-rc.1",
66
- "@deepseek-ai/dsh-tool-session-query": "0.1.7-rc.1",
67
- "@deepseek-ai/dsh-client-ui-conversation": "0.1.7-rc.1",
68
- "@deepseek-ai/dsh-client-ui-renderer": "0.1.7-rc.1",
69
- "@deepseek-ai/dsh-client-ui-session": "0.1.7-rc.1",
70
- "@deepseek-ai/dsh-attachment": "0.1.7-rc.1",
71
- "@deepseek-ai/dsh-ptc-runtime": "0.1.7-rc.1",
72
- "@deepseek-ai/dsh-util-workspace-path": "0.1.7-rc.1",
73
- "@deepseek-ai/dsh-client-ui-chat": "0.1.7-rc.1",
74
- "@deepseek-ai/dsh-token-meter": "0.1.7-rc.1"
60
+ "@deepseek-ai/dsh-api-remotes": "0.1.7-rc.2",
61
+ "@deepseek-ai/dsh-client-connection": "0.1.7-rc.2",
62
+ "@deepseek-ai/dsh-client-locale": "0.1.7-rc.2",
63
+ "@deepseek-ai/dsh-client-test-runtime": "0.1.7-rc.2",
64
+ "@deepseek-ai/dsh-client-ui-primitives": "0.1.7-rc.2",
65
+ "@deepseek-ai/dsh-client-ui-slots": "0.1.7-rc.2",
66
+ "@deepseek-ai/dsh-api-workspace-controller": "0.1.7-rc.2",
67
+ "@deepseek-ai/dsh-client-ui-chat": "0.1.7-rc.2",
68
+ "@deepseek-ai/dsh-client-ui-renderer": "0.1.7-rc.2",
69
+ "@deepseek-ai/dsh-client-ui-session": "0.1.7-rc.2",
70
+ "@deepseek-ai/dsh-util-workspace-path": "0.1.7-rc.2",
71
+ "@deepseek-ai/dsh-attachment": "0.1.7-rc.2",
72
+ "@deepseek-ai/dsh-ptc-runtime": "0.1.7-rc.2",
73
+ "@deepseek-ai/dsh-client-ui-conversation": "0.1.7-rc.2",
74
+ "@deepseek-ai/dsh-token-meter": "0.1.7-rc.2"
75
75
  },
76
76
  "files": [
77
77
  "lib/index.js",