@deepseek-ai/dsh-client-ui-skill 0.1.7-alpha.1 → 0.1.7-rc.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-skill/README.md
5
- README.md: fdd8cb7fddb54cf73d897bb278086428d0e41214
6
- README.zh.md: 2090711d5f91bf1efba2f8e19d8d361f9ffb99d9
5
+ README.md: 0234ce8fb6c2737ea242ac5590e471c3e4c91834
6
+ README.zh.md: 5b039ec1c5bea818e6396f4896c05b8175beb08a
package/README.md CHANGED
@@ -33,6 +33,8 @@ Ordinary-session candidates come from the `skills/list` Remote; the host serves
33
33
 
34
34
  ### The skill tool row
35
35
 
36
+ The `preparing` stage shows only the skill icon and title, with no requested skill name or expansion. The `start` and `result` stages use the recorded arguments and output described below; preparation does not consult the installed catalog.
37
+
36
38
  A collapsed row renders the skill glyph, `Skill` title, and requested skill name on the same secondary font-size axis, line height, row height, and glyph scaling as ordinary Tool rows. Every lifecycle state retains the ordinary skill glyph; running calls carry the transcript shimmer, while failures replace the name with the first error line and interruptions retain their explicit status text. A settled row expands into a bounded `Instructions` card containing the exact durable tool output, with the standard trajectory `Inspect` affordance when available; this expanded card keeps its own typography. The row derives its name, lifecycle, and body only from the frozen call/result slice supplied by ui-tool, never from the current catalog, so replay stays stable when installed skills or their descriptions change.
37
39
 
38
40
  Hovering over `/name` highlights the entire reference. Clicking a known skill opens its provider-supplied `SKILL.md` path in the right Sidebar while keeping the token editable. An uncached click shares the per-Session catalog fetch and opens when it completes, retaining the clicked Session address. Preset changes, connection resets, and plugin disposal cancel pending previews; a later click fetches the current catalog again. Skills without a file path remain invocable but have no file preview.
package/README.zh.md CHANGED
@@ -33,6 +33,8 @@ kind: "package-reference"
33
33
 
34
34
  ### skill 工具行
35
35
 
36
+ `preparing` 阶段只显示技能图标与标题,不显示请求加载的技能名称,也不能展开。`start` 和 `result` 阶段使用下述记录参数与输出;准备阶段不查询已安装目录。
37
+
36
38
  收起的行显示 skill 图标、`Skill` 标题与请求加载的 skill 名称,并与普通工具行使用相同的 secondary 字号轴、行高、行高度和图标缩放。所有生命周期状态都保留普通 skill 图标;运行中的调用带有 transcript(文本记录)的扫光效果,失败时以错误首行替换名称,中断则保留明确状态文本。已结算的行展开为一个尺寸受限的 `Instructions` 卡片,其中原样呈现持久化的工具输出;可用时还会提供标准轨迹的 `Inspect` 入口,展开卡片保留自身排版。该行的名称、生命周期与正文只派生自 ui-tool 提供的冻结调用/结果切片,绝不读取当前目录,因此即使已安装的 skill 或其描述发生变化,回放仍保持稳定。
37
39
 
38
40
  鼠标移入 `/name` 时,背景覆盖整个引用。点击已知 skill 会在右侧栏打开提供方给出的 `SKILL.md` 路径,同时保留文本的可编辑性。缓存未就绪时,点击复用该 Session 的目录请求,在完成后按点击时的 Session 地址打开预览。切换预设、重置连接和插件释放会取消待处理的预览;后续点击重新获取当前目录。没有文件路径的 skill 仍可调用,但没有文件预览。
package/lib/client.js CHANGED
@@ -66,7 +66,7 @@ window.__ModuleLoader__.load({
66
66
  }
67
67
  //#endregion
68
68
  //#region \0dsh-css:/home/runner/work/deepseek-harness/deepseek-harness/packages/client/ui-skill/src/client/SkillRow.module.css.mjs
69
- const css = ".iWrAna_card{flex-direction:column;display:flex}.iWrAna_row{height:calc(24px + var(--dsh-content-font-delta,0px));align-items:center;min-width:0;display:flex;position:relative;overflow:hidden}.iWrAna_row[data-expandable]{cursor:pointer}.iWrAna_card[data-state=running] .iWrAna_row:after{content:\"\";background:linear-gradient(90deg, transparent 0%, color-mix(in srgb, var(--dsw-alias-bg-base) 60%, transparent) 55%, transparent 100%);pointer-events:none;width:300px;animation:2.6s ease-out infinite iWrAna_dsh-skill-row-sweep;position:absolute;inset:0 auto 0 0}@keyframes iWrAna_dsh-skill-row-sweep{0%{left:-300px}90%,to{left:100%}}.iWrAna_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}.iWrAna_leading svg{width:calc(14px + var(--dsh-content-font-delta,0px));height:calc(14px + var(--dsh-content-font-delta,0px))}.iWrAna_chevron{color:var(--dsw-alias-label-secondary)}.iWrAna_iconIdle{opacity:1;transition:opacity .1s;display:inline-flex}.iWrAna_chevronHover{opacity:0;margin:auto;transition:opacity .1s;position:absolute;inset:0}.iWrAna_row:hover .iWrAna_iconIdle{opacity:0}.iWrAna_row:hover .iWrAna_chevronHover{opacity:1}.iWrAna_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}.iWrAna_separator{background:var(--dsw-alias-label-caption);border-radius:1px;flex:none;width:2px;height:2px;margin:0 8px}.iWrAna_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;overflow:hidden}.iWrAna_errorSummary{color:var(--dsw-alias-state-error-primary)}.iWrAna_stoppedSummary{color:var(--dsw-alias-state-warn-label)}.iWrAna_bodyWrap{flex-direction:column;display:flex}.iWrAna_instructionsCard{border:.5px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-markdown-code-block);border-radius:12px;flex-direction:column;max-height:260px;margin:4px 0 4px 4px;display:flex;overflow:hidden}.iWrAna_instructionsHeader{border-bottom:.5px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-markdown-code-block-banner);color:var(--dsw-alias-label-caption);text-transform:uppercase;letter-spacing:.04em;flex:none;padding:8px 12px;font-size:11px;font-weight:500;line-height:16px}.iWrAna_instructions{white-space:pre-wrap;overflow-wrap:anywhere;min-height:0;font:var(--dsw-font-markdown-code-block-small);color:var(--dsw-alias-label-secondary);margin:0;padding:10px 12px 12px;overflow:auto}.iWrAna_instructions[data-error]{color:var(--dsw-alias-state-error-primary)}.iWrAna_instructions::-webkit-scrollbar-thumb{background-clip:padding-box;border:2px solid #0000;border-radius:6px}.iWrAna_instructions::-webkit-scrollbar-track{margin:6px 0}.iWrAna_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}.iWrAna_card:hover .iWrAna_inspectButton,.iWrAna_inspectButton:focus-visible{opacity:1}.iWrAna_inspectButton:hover{background:var(--dsw-alias-interactive-bg-hover-solid);color:var(--dsw-alias-label-primary)}.iWrAna_visuallyHidden{clip:rect(0 0 0 0);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}@media (prefers-reduced-motion:reduce){.iWrAna_card[data-state=running] .iWrAna_row:after{animation:none;display:none}.iWrAna_iconIdle,.iWrAna_chevronHover,.iWrAna_inspectButton{transition:none}}";
69
+ const css = ".iWrAna_card{flex-direction:column;display:flex}.iWrAna_row{height:calc(24px + var(--dsh-content-font-delta,0px));align-items:center;min-width:0;display:flex;position:relative;overflow:hidden}.iWrAna_row[data-expandable]{cursor:pointer}.iWrAna_card[data-state=running] .iWrAna_row:after,.iWrAna_card[data-state=preparing] .iWrAna_row:after{content:\"\";background:linear-gradient(90deg, transparent 0%, color-mix(in srgb, var(--dsw-alias-bg-base) 60%, transparent) 55%, transparent 100%);pointer-events:none;width:300px;animation:2.6s ease-out infinite iWrAna_dsh-skill-row-sweep;position:absolute;inset:0 auto 0 0}@keyframes iWrAna_dsh-skill-row-sweep{0%{left:-300px}90%,to{left:100%}}.iWrAna_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}.iWrAna_leading svg{width:calc(14px + var(--dsh-content-font-delta,0px));height:calc(14px + var(--dsh-content-font-delta,0px))}.iWrAna_chevron{color:var(--dsw-alias-label-secondary)}.iWrAna_iconIdle{opacity:1;transition:opacity .1s;display:inline-flex}.iWrAna_chevronHover{opacity:0;margin:auto;transition:opacity .1s;position:absolute;inset:0}.iWrAna_row:hover .iWrAna_iconIdle{opacity:0}.iWrAna_row:hover .iWrAna_chevronHover{opacity:1}.iWrAna_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}.iWrAna_separator{background:var(--dsw-alias-label-caption);border-radius:1px;flex:none;width:2px;height:2px;margin:0 8px}.iWrAna_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;overflow:hidden}.iWrAna_errorSummary{color:var(--dsw-alias-state-error-primary)}.iWrAna_stoppedSummary{color:var(--dsw-alias-state-warn-label)}.iWrAna_bodyWrap{flex-direction:column;display:flex}.iWrAna_instructionsCard{border:.5px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-markdown-code-block);border-radius:12px;flex-direction:column;max-height:260px;margin:4px 0 4px 4px;display:flex;overflow:hidden}.iWrAna_instructionsHeader{border-bottom:.5px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-markdown-code-block-banner);color:var(--dsw-alias-label-caption);text-transform:uppercase;letter-spacing:.04em;flex:none;padding:8px 12px;font-size:11px;font-weight:500;line-height:16px}.iWrAna_instructions{white-space:pre-wrap;overflow-wrap:anywhere;min-height:0;font:var(--dsw-font-markdown-code-block-small);color:var(--dsw-alias-label-secondary);margin:0;padding:10px 12px 12px;overflow:auto}.iWrAna_instructions[data-error]{color:var(--dsw-alias-state-error-primary)}.iWrAna_instructions::-webkit-scrollbar-thumb{background-clip:padding-box;border:2px solid #0000;border-radius:6px}.iWrAna_instructions::-webkit-scrollbar-track{margin:6px 0}.iWrAna_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}.iWrAna_card:hover .iWrAna_inspectButton,.iWrAna_inspectButton:focus-visible{opacity:1}.iWrAna_inspectButton:hover{background:var(--dsw-alias-interactive-bg-hover-solid);color:var(--dsw-alias-label-primary)}.iWrAna_visuallyHidden{clip:rect(0 0 0 0);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}@media (prefers-reduced-motion:reduce){.iWrAna_card[data-state=running] .iWrAna_row:after{animation:none;display:none}.iWrAna_iconIdle,.iWrAna_chevronHover,.iWrAna_inspectButton{transition:none}}";
70
70
  const tagId = "@deepseek-ai/dsh-client-ui-skill/SkillRow.module.css";
71
71
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
72
72
  const tag = document.createElement("style");
@@ -158,7 +158,32 @@ window.__ModuleLoader__.load({
158
158
  * @param props - keyed toolview payload plus the skill locale seat.
159
159
  * @returns the dedicated skill row.
160
160
  */
161
- function SkillRow({ block, inspect, t }) {
161
+ function SkillRow(props) {
162
+ if (props.phase === "preparing") return (0, react_jsx_runtime.jsx)("div", {
163
+ className: SkillRow_module_css_default.card,
164
+ "data-tool": "skill",
165
+ "data-state": "preparing",
166
+ children: (0, react_jsx_runtime.jsxs)("div", {
167
+ className: SkillRow_module_css_default.row,
168
+ children: [
169
+ (0, react_jsx_runtime.jsx)("span", {
170
+ className: SkillRow_module_css_default.leading,
171
+ children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconSkillOutlineRegular, { size: 14 })
172
+ }),
173
+ (0, react_jsx_runtime.jsx)("span", {
174
+ className: SkillRow_module_css_default.visuallyHidden,
175
+ children: props.t("row.preparing")
176
+ }),
177
+ (0, react_jsx_runtime.jsx)("span", {
178
+ className: SkillRow_module_css_default.title,
179
+ children: props.t("row.title")
180
+ })
181
+ ]
182
+ })
183
+ });
184
+ return (0, react_jsx_runtime.jsx)(StartedSkillRow, { ...props });
185
+ }
186
+ function StartedSkillRow({ block, inspect, t }) {
162
187
  const model = skillRowModel(block);
163
188
  const [expanded, setExpanded] = (0, react.useState)(false);
164
189
  const expandable = model.output !== null;
@@ -242,6 +267,7 @@ window.__ModuleLoader__.load({
242
267
  const zh = {
243
268
  "row.title": "加载技能",
244
269
  "row.running": "正在加载 skill",
270
+ "row.preparing": "准备加载技能",
245
271
  "row.failed": "skill 加载失败",
246
272
  "row.stopped": "skill 加载已中止",
247
273
  "row.instructions": "说明",
@@ -252,6 +278,7 @@ window.__ModuleLoader__.load({
252
278
  const en = {
253
279
  "row.title": "Skill",
254
280
  "row.running": "Loading skill",
281
+ "row.preparing": "Preparing to load a skill",
255
282
  "row.failed": "Skill load failed",
256
283
  "row.stopped": "Skill load stopped",
257
284
  "row.instructions": "Instructions",
@@ -6,6 +6,6 @@ type SkillRowProps = ToolCallViewProps & PropsLocale<'skill'>;
6
6
  * @param props - keyed toolview payload plus the skill locale seat.
7
7
  * @returns the dedicated skill row.
8
8
  */
9
- export declare function SkillRow({ block, inspect, t }: SkillRowProps): import("react").JSX.Element;
9
+ export declare function SkillRow(props: SkillRowProps): import("react").JSX.Element;
10
10
  export {};
11
11
  //# sourceMappingURL=SkillRow.d.ts.map
@@ -5,6 +5,7 @@ export declare const NS = "skill";
5
5
  export declare const zh: {
6
6
  'row.title': string;
7
7
  'row.running': string;
8
+ 'row.preparing': string;
8
9
  'row.failed': string;
9
10
  'row.stopped': string;
10
11
  'row.instructions': string;
@@ -17,6 +18,7 @@ export type SkillKey = keyof typeof zh;
17
18
  export declare const en: {
18
19
  'row.title': string;
19
20
  'row.running': string;
21
+ 'row.preparing': string;
20
22
  'row.failed': string;
21
23
  'row.stopped': string;
22
24
  'row.instructions': string;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@deepseek-ai/dsh-client-ui-skill",
3
3
  "description": "Web skill references and the dedicated skill tool row",
4
- "version": "0.1.7-alpha.1",
4
+ "version": "0.1.7-rc.1",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -41,27 +41,27 @@
41
41
  },
42
42
  "license": "MIT",
43
43
  "peerDependencies": {
44
- "@deepseek-ai/cordis": "^4.0.3"
44
+ "@deepseek-ai/cordis": "~4.0.4"
45
45
  },
46
46
  "devDependencies": {
47
47
  "@testing-library/react": "^16.1.0",
48
48
  "@types/react": "~18.3.1",
49
49
  "react": "^18.2.0",
50
50
  "react-dom": "^18.2.0",
51
- "@deepseek-ai/dsh-api-remotes": "^0.1.7-alpha.1",
52
- "@deepseek-ai/dsh-api-session-controller": "^0.1.7-alpha.1",
53
- "@deepseek-ai/dsh-client-connection": "^0.1.7-alpha.1",
54
- "@deepseek-ai/dsh-client-locale": "^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-client-ui-tool": "^0.1.7-alpha.1",
59
- "@deepseek-ai/dsh-session": "^0.1.7-alpha.1",
60
- "@deepseek-ai/dsh-client-test-runtime": "^0.1.7-alpha.1",
61
- "@deepseek-ai/cordis": "^4.0.3",
62
- "@deepseek-ai/dsh-util-workspace-path": "^0.1.7-alpha.1",
63
- "@deepseek-ai/dsh-client-ui-input-trigger": "^0.1.7-alpha.1",
64
- "@deepseek-ai/dsh-client-ui-sidebar-right": "^0.1.7-alpha.1"
51
+ "@deepseek-ai/dsh-api-session-controller": "0.1.7-rc.1",
52
+ "@deepseek-ai/dsh-client-connection": "0.1.7-rc.1",
53
+ "@deepseek-ai/dsh-api-remotes": "0.1.7-rc.1",
54
+ "@deepseek-ai/dsh-client-locale": "0.1.7-rc.1",
55
+ "@deepseek-ai/dsh-client-test-runtime": "0.1.7-rc.1",
56
+ "@deepseek-ai/dsh-client-ui-primitives": "0.1.7-rc.1",
57
+ "@deepseek-ai/dsh-client-ui-input-trigger": "0.1.7-rc.1",
58
+ "@deepseek-ai/dsh-client-ui-renderer": "0.1.7-rc.1",
59
+ "@deepseek-ai/dsh-client-ui-slots": "0.1.7-rc.1",
60
+ "@deepseek-ai/dsh-client-ui-tool": "0.1.7-rc.1",
61
+ "@deepseek-ai/dsh-session": "0.1.7-rc.1",
62
+ "@deepseek-ai/cordis": "~4.0.4",
63
+ "@deepseek-ai/dsh-client-ui-sidebar-right": "0.1.7-rc.1",
64
+ "@deepseek-ai/dsh-util-workspace-path": "0.1.7-rc.1"
65
65
  },
66
66
  "files": [
67
67
  "lib/index.js",