@matamt-dbg/dsh-studio 0.2.0 → 0.2.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.md CHANGED
@@ -54,7 +54,7 @@ Restart the web GUI, then open **DSH Studio** from the sidebar.
54
54
 
55
55
  ![Preset list](https://raw.githubusercontent.com/matamt-dbg/dsh-studio/main/docs/images/en/preset-list.png)
56
56
 
57
- - **Presets** — a read-only *Studio Master* with every available tool, a built-in *Optimized* preset (22 everyday tools), and your own presets. Edit, copy, delete, apply to DSH, or unapply.
57
+ - **Presets** — a read-only *Studio Master* with every available tool, a locked built-in *Optimized* preset (22 everyday tools) to copy from, and your own presets. Edit, copy, delete, apply to DSH, or unapply.
58
58
  - **Prompts & tools** — edit persona and additional instructions, pick tools (or whole built-in tool sets), and rewrite the descriptions the model sees for each tool and parameter.
59
59
  - **Prompt preview** — see the exact system prompt and tool schemas a preset produces, without starting an agent.
60
60
  - **Execution settings** — override plugin configuration for one preset only.
@@ -68,7 +68,7 @@ Restart the web GUI, then open **DSH Studio** from the sidebar.
68
68
 
69
69
  ## Quick start
70
70
 
71
- 1. Open **DSH Studio** and select **Edit** (or **Create copy**) on *Optimized*.
71
+ 1. Open **DSH Studio** and select **Create copy** on *Optimized* (the built-in itself is locked).
72
72
  2. Adjust instructions, tools, execution settings and subagent roles, then **Save preset**.
73
73
  3. In **Preset list**, select **Apply to DSH**.
74
74
  4. Start a new session and choose your preset in DSH's preset picker.
package/client.js CHANGED
@@ -1451,7 +1451,7 @@ function PresetList({ locale, api, revision, onEdit, onCopy }) {
1451
1451
  item.template && !item.readOnly && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Badge, { tone: "info", children: t("\uAE30\uBCF8 \uC81C\uACF5", "Built-in", "\u5185\u7F6E") }),
1452
1452
  /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Badge, { tone: tone[item.status], children: status(item) })
1453
1453
  ] }),
1454
- item.template ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "studio-card-text", children: t("Studio\uAC00 \uAD8C\uC7A5\uD558\uB294 \uAE30\uBCF8 \uAD6C\uC131\uC785\uB2C8\uB2E4. \uD3B8\uC9D1\uD558\uAC70\uB098 \uBCF5\uC0AC\uD574 \uC4F8 \uC218 \uC788\uC2B5\uB2C8\uB2E4.", "Studio optimized default preset", "Studio \u63A8\u8350\u7684\u9ED8\u8BA4\u914D\u7F6E\uFF0C\u53EF\u7F16\u8F91\u6216\u590D\u5236") }) : item.description && !item.readOnly && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "studio-card-text", children: item.description }),
1454
+ item.template ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "studio-card-text", children: t("Studio\uAC00 \uAD8C\uC7A5\uD558\uB294 \uCF54\uB529 \uC5D0\uC774\uC804\uD2B8\uC6A9 \uAE30\uBCF8 \uAD6C\uC131\uC785\uB2C8\uB2E4. \uACE0\uCE58\uB824\uBA74 \uBCF5\uC0AC\uD574\uC11C \uC4F0\uC138\uC694.", "Studio optimized default for coding agents. Create a copy to customize it.", "Studio \u63A8\u8350\u7684\u7F16\u7801\u4EE3\u7406\u9ED8\u8BA4\u914D\u7F6E\u3002\u5982\u9700\u4FEE\u6539\uFF0C\u8BF7\u521B\u5EFA\u526F\u672C") }) : item.description && !item.readOnly && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "studio-card-text", children: item.description }),
1455
1455
  /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("p", { className: "studio-card-meta", children: [
1456
1456
  t("\uB3C4\uAD6C", "Tools", "\u5DE5\u5177"),
1457
1457
  " ",
@@ -1462,7 +1462,7 @@ function PresetList({ locale, api, revision, onEdit, onCopy }) {
1462
1462
  Array.isArray(item.agents) ? item.agents.length : 0
1463
1463
  ] }),
1464
1464
  item.readOnly ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "studio-card-meta studio-card-note", children: t("DSH\uC5D0 \uC124\uCE58\uB41C \uBAA8\uB4E0 \uB3C4\uAD6C\uB97C \uB2F4\uC740 \uAE30\uC900 \uD504\uB9AC\uC14B\uC785\uB2C8\uB2E4. \uD3B8\uC9D1\uD558\uAC70\uB098 \uC0AD\uC81C\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.", "Reference preset with every installed DSH tool. It cannot be edited or deleted.", "\u5305\u542B\u6240\u6709\u5DF2\u5B89\u88C5 DSH \u5DE5\u5177\u7684\u57FA\u51C6\u9884\u8BBE\uFF0C\u65E0\u6CD5\u7F16\u8F91\u6216\u5220\u9664") }) : /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "studio-card-footer", children: [
1465
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Button, { small: true, disabled: busy || item.readOnly || !onEdit, onClick: () => onEdit?.(item), children: t("\uD3B8\uC9D1", "Edit", "\u7F16\u8F91") }),
1465
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Button, { small: true, disabled: busy || item.readOnly || item.template || !onEdit, title: item.template ? t("\uAE30\uBCF8 \uC81C\uACF5 \uD504\uB9AC\uC14B\uC740 \uD3B8\uC9D1\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uBCF5\uC0AC\uD574\uC11C \uACE0\uCCD0 \uC4F0\uC138\uC694.", "Built-in presets cannot be edited. Create a copy to customize it.", "\u5185\u7F6E\u9884\u8BBE\u65E0\u6CD5\u7F16\u8F91\uFF0C\u8BF7\u521B\u5EFA\u526F\u672C\u540E\u4FEE\u6539") : void 0, onClick: () => onEdit?.(item), children: t("\uD3B8\uC9D1", "Edit", "\u7F16\u8F91") }),
1466
1466
  /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Button, { small: true, disabled: busy || !onCopy, onClick: () => onCopy?.(item), children: t("\uBCF5\uC0AC", "Create copy", "\u521B\u5EFA\u526F\u672C") }),
1467
1467
  /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Button, { small: true, disabled: busy || !api || item.readOnly || item.nonDeletable, title: item.nonDeletable ? t("\uAE30\uBCF8 \uC81C\uACF5 \uD504\uB9AC\uC14B\uC740 \uC0AD\uC81C\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.", "Built-in presets cannot be deleted.", "\u5185\u7F6E\u9884\u8BBE\u65E0\u6CD5\u5220\u9664") : void 0, onClick: () => {
1468
1468
  setDeleting(item);
package/index.js CHANGED
@@ -937,6 +937,7 @@ var PresetStore = class {
937
937
  return this.serial(async () => {
938
938
  const value = JSON.parse(payload);
939
939
  if (!value || typeof value.name !== "string" || !value.name.trim() || value.name.length > 120 || typeof value.description !== "string") throw new Error("Invalid preset name or description");
940
+ if (value.id === OPTIMIZED_PRESET_ID) throw new Error("Optimized is a locked built-in preset; create a copy to customize it");
940
941
  const old = value.id ? this.find(value.id) : void 0;
941
942
  const row = {
942
943
  ...old,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@matamt-dbg/dsh-studio",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "DSH Studio: build, edit and apply DeepSeek Harness agent presets — tools, prompts, Configs and role-based subagents — from the web GUI.",
5
5
  "keywords": [
6
6
  "deepseek-harness",