dsh-plugin-tool-management 0.20.2 → 0.20.3
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/CHANGELOG.md +23 -1
- package/docs/update.md +2 -1
- package/lib/client.js +108 -43
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -10,6 +10,28 @@
|
|
|
10
10
|
|
|
11
11
|
---
|
|
12
12
|
|
|
13
|
+
## [0.20.3] - 2026-10-17
|
|
14
|
+
|
|
15
|
+
界面与官方对齐一批:焦点环、圆角、等宽字体改用官方 token;修好 MCP 连接失败时状态灯不红、新建记忆弹窗误关丢内容。
|
|
16
|
+
|
|
17
|
+
### 新增
|
|
18
|
+
|
|
19
|
+
- **场景编辑器里「新建记忆」误关不丢内容**:30 秒内重开能填回。
|
|
20
|
+
|
|
21
|
+
### 修复
|
|
22
|
+
|
|
23
|
+
- **MCP 连接失败时状态灯是灰的**,与「未加载」分不出来。
|
|
24
|
+
- **焦点环会盖掉宿主「不要轮廓」的设定**(#18)。
|
|
25
|
+
|
|
26
|
+
### 变更
|
|
27
|
+
|
|
28
|
+
- **焦点环改用官方的色与宽**,鼠标点击不出环、键盘才出。
|
|
29
|
+
- **MCP 状态灯加载中改黄色**。
|
|
30
|
+
- **分组头计数只留数字**,不再带「个服务 / 项」这类量词。
|
|
31
|
+
- **圆角与等宽字体改用官方 token**。
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
13
35
|
## [0.20.2] - 2026-10-16
|
|
14
36
|
|
|
15
37
|
界面降噪一批:行尾动作收进 ⋯、没在用的分组默认折叠、会话整行可点勾选;修好折叠卡片要点两次才展开与 npm 包带上演示视频。
|
|
@@ -83,7 +105,7 @@
|
|
|
83
105
|
|
|
84
106
|
---
|
|
85
107
|
|
|
86
|
-
## [0.20.0] -2026-10-12
|
|
108
|
+
## [0.20.0] - 2026-10-12
|
|
87
109
|
|
|
88
110
|
修好技能回收站「目录」块的批量永久删除;记忆回收站与其它回收站统一。回收站每条可点开「详情」只读预览内容,另有一批界面打磨;`scene_manager_save` 补齐模型工具表方案 / 快捷提示词 / MCP 备注三处绑定,`prompt_manager_apply` 可取消应用。
|
|
89
111
|
|
package/docs/update.md
CHANGED
|
@@ -4,9 +4,10 @@
|
|
|
4
4
|
|
|
5
5
|
| 版本 | 发布 | 主题 |
|
|
6
6
|
| ------------------------------------------- | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
7
|
+
| [0.20.3](../CHANGELOG.md#0203---2026-10-17) | 2026-10-17 | 界面与官方对齐一批(焦点环、圆角、等宽字体);修好 MCP 连接失败状态灯不红、新建记忆弹窗误关丢内容、焦点环盖掉宿主「不要轮廓」设定(#18) |
|
|
7
8
|
| [0.20.2](../CHANGELOG.md#0202---2026-10-16) | 2026-10-16 | 界面降噪一批:行尾动作收进 ⋯、没在用的分组默认折叠、会话整行可点勾选;修好折叠卡片要点两次才展开与 npm 包带上演示视频 |
|
|
8
9
|
| [0.20.1](../CHANGELOG.md#0201---2026-10-16) | 2026-10-16 | 修好技能状态文件出错时全线停用等三处;新增五个域的删除 / 回收站工具;MCP 支持粘贴补丁片段导入;创建技能可带附件;弹窗误关不再丢内容;一批排版与文案收短 |
|
|
9
|
-
| [0.20.0](../CHANGELOG.md#0200---2026-10-
|
|
10
|
+
| [0.20.0](../CHANGELOG.md#0200---2026-10-12) | 2026-10-12 | 回收站每条能点开「详情」只读预览删除的内容 + MCP 导出可选目录并支持预览;修好下拉菜单悬停无高亮、横幅按钮只有下半截能点、浅色下场景编辑器四组没分块、容器边框深浅不一、技能来源「永久删除」后下一轮又回来;界面打磨一批(令牌弹窗、批量键上移页头、人设改称子智能体) |
|
|
10
11
|
| [0.19.1](../CHANGELOG.md#0191---2026-10-10) | 2026-10-10 | 提示词预设补上「取消应用」(回到开始应用之前的状态,那时没有文件就连文件一起删掉),删除保护与回收站一并修好;回收站新增保留期自动清理与批量永久删除 |
|
|
11
12
|
| [0.19.0](../CHANGELOG.md#0190---2026-10-07) | 2026-10-07 | 子智能体人设可标「允许追问」+ 修好自 0.15.0 起不可用的 `subagent_manager_run` + 子代理不再把自己当成主代理 + 人设表单「高级选项」重排(模型来源与模型只从目录里选)与模型框变窄修好 + 注入框架不再点名被工具限制砍掉的工具 + 「工具限制」候选修好并分「插件工具 / 官方工具 / 其他工具」三段 |
|
|
12
13
|
| [0.18.5](../CHANGELOG.md#0185---2026-10-05) | 2026-10-05 | 会话导出分三档累进(仅正文 → 正文 + 工具 → 正文 + 工具 + 思考,工具结果有上限并明说截断)+ 导出弹窗放大到 720×760、字段压成三行把位置还给会话列表 + 导入会话可以从已登记工作区里挑 / 浏览文件夹 + 修好归档列表每行「恢复」必弹「操作失败」(其实已经恢复了)与导出的正文里混着思考 |
|
package/lib/client.js
CHANGED
|
@@ -46,13 +46,13 @@ window.__ModuleLoader__.load({
|
|
|
46
46
|
}))
|
|
47
47
|
}
|
|
48
48
|
const CSS =
|
|
49
|
-
':root{--dsm-warn:#d49245;--dsm-warn-bg:rgba(212,146,69,.12);--dsm-radius-s:4px;--dsm-radius-m:8px;--dsm-radius-l:12px}' +
|
|
49
|
+
':root{--dsm-warn:#d49245;--dsm-warn-bg:rgba(212,146,69,.12);--dsm-radius-s:var(--dsw-radius-xs,4px);--dsm-radius-m:var(--dsw-radius-sm,8px);--dsm-radius-l:var(--dsw-radius-md,12px)}' +
|
|
50
50
|
'.dsm-stat-row{display:flex;min-width:0;align-items:center;gap:8px}' +
|
|
51
51
|
'.dsm-version{color:var(--dsw-alias-label-tertiary);font-size:11px;font-weight:400;letter-spacing:.3px;line-height:1}' +
|
|
52
52
|
'.dsm-row-hint{grid-column:1/-1;margin:-4px 0 8px;color:var(--dsm-warn);font-size:12px;line-height:16px}' +
|
|
53
53
|
'.dsm-tools{display:flex;flex-direction:column;gap:8px}' +
|
|
54
54
|
'.dsm-tool{padding:8px 12px;border:1px solid var(--dsw-alias-border-l2);border-radius:var(--dsm-radius-m);background:var(--dsw-alias-bg-layer-1)}' +
|
|
55
|
-
'.dsm-tool-name{font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:12px;font-weight:400;word-break:break-all}' +
|
|
55
|
+
'.dsm-tool-name{font-family:var(--ds-font-family-code,ui-monospace,SFMono-Regular,Consolas,monospace);font-size:12px;font-weight:400;word-break:break-all}' +
|
|
56
56
|
'.dsm-tool-name-row{display:flex;align-items:center;gap:8px}' +
|
|
57
57
|
// 标签紧跟工具名(原来是 space-between,标签被推到中间、与名字隔着一大片空白);
|
|
58
58
|
// 开关单独用 margin-left:auto 顶到最右,标签不再受它的位置影响。
|
|
@@ -61,7 +61,7 @@ window.__ModuleLoader__.load({
|
|
|
61
61
|
'.dsm-tool-desc{min-width:0;flex:1;margin-top:4px;color:var(--dsw-alias-label-secondary);font-size:12px;line-height:17px}' +
|
|
62
62
|
'.dsm-tool-params{display:flex;flex-direction:column;gap:4px;margin-top:8px;padding-top:8px;border-top:1px dashed var(--dsw-alias-border-l2)}' +
|
|
63
63
|
'.dsm-tool-param{display:flex;gap:8px;font-size:12px;align-items:baseline}' +
|
|
64
|
-
'.dsm-tool-param-key{font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-weight:400;min-width:80px;word-break:break-all}' +
|
|
64
|
+
'.dsm-tool-param-key{font-family:var(--ds-font-family-code,ui-monospace,SFMono-Regular,Consolas,monospace);font-weight:400;min-width:80px;word-break:break-all}' +
|
|
65
65
|
'.dsm-tool-param-type{color:var(--dsw-alias-label-tertiary);min-width:56px}' +
|
|
66
66
|
'.dsm-tool-param-desc{flex:1;color:var(--dsw-alias-label-secondary);word-break:break-all}' +
|
|
67
67
|
'.dsm-modal textarea.dsm-control.dsm-textarea-sm{min-height:88px}' +
|
|
@@ -77,7 +77,7 @@ window.__ModuleLoader__.load({
|
|
|
77
77
|
在右,组内间距 8px 与行间隙一致。 */
|
|
78
78
|
'.dsm-detail-title-acts{display:flex;align-items:center;gap:8px}' +
|
|
79
79
|
`
|
|
80
|
-
.dsm-pick-list{display:flex;max-height:240px;flex-direction:column;overflow:auto;border:1px solid var(--dsw-alias-border-l2);border-radius:var(--dsm-radius-m);padding:4px}.dsm-tab{padding:8px 14px;border:0;background:transparent;color:var(--dsw-alias-label-secondary);font:inherit;font-size:13px;cursor:pointer;border-bottom:2px solid transparent;margin-bottom:-1px}.dsm-tab-active{color:var(--dsw-alias-label-primary);border-bottom-color:var(--dsw-alias-state-success-primary)}.dsm-section{box-sizing:border-box;display:flex;width:100%;max-width:820px;min-width:0;margin:0 auto;padding:4px 0 24px;container-type:inline-size;flex-direction:column;gap:12px;color:var(--dsw-alias-label-primary);font-family:inherit}.dsm-head{display:flex;flex-direction:column;align-items:stretch;gap:16px}.dsm-feedback-links{display:flex;flex-direction:column;align-items:flex-end;gap:4px}.dsm-title{margin:0;font-size:18px;line-height:26px;font-weight:600;letter-spacing:-.2px;white-space:nowrap}.dsm-feedback-link{display:inline-flex;min-height:30px;align-items:center;gap:4px;padding:0 8px;border:1px solid var(--dsw-alias-border-l2);border-radius:var(--dsm-radius-m);background:transparent;color:var(--dsw-alias-label-secondary);font:inherit;font-size:12px;font-weight:400;line-height:18px;text-decoration:none;white-space:nowrap}.dsm-feedback-link:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.dsm-feedback-link:focus-visible{outline:
|
|
80
|
+
.dsm-pick-list{display:flex;max-height:240px;flex-direction:column;overflow:auto;border:1px solid var(--dsw-alias-border-l2);border-radius:var(--dsm-radius-m);padding:4px}.dsm-tab{padding:8px 14px;border:0;background:transparent;color:var(--dsw-alias-label-secondary);font:inherit;font-size:13px;cursor:pointer;border-bottom:2px solid transparent;margin-bottom:-1px}.dsm-tab-active{color:var(--dsw-alias-label-primary);border-bottom-color:var(--dsw-alias-state-success-primary)}.dsm-section{box-sizing:border-box;display:flex;width:100%;max-width:820px;min-width:0;margin:0 auto;padding:4px 0 24px;container-type:inline-size;flex-direction:column;gap:12px;color:var(--dsw-alias-label-primary);font-family:inherit}.dsm-head{display:flex;flex-direction:column;align-items:stretch;gap:16px}.dsm-feedback-links{display:flex;flex-direction:column;align-items:flex-end;gap:4px}.dsm-title{margin:0;font-size:18px;line-height:26px;font-weight:600;letter-spacing:-.2px;white-space:nowrap}.dsm-feedback-link{display:inline-flex;min-height:30px;align-items:center;gap:4px;padding:0 8px;border:1px solid var(--dsw-alias-border-l2);border-radius:var(--dsm-radius-m);background:transparent;color:var(--dsw-alias-label-secondary);font:inherit;font-size:12px;font-weight:400;line-height:18px;text-decoration:none;white-space:nowrap}.dsm-feedback-link:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.dsm-feedback-link:focus-visible{outline-style:solid;outline-color:var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-width:var(--dsw-focus-ring-width,2px);outline-offset:2px}.dsm-feedback-link svg{flex:none}.dsm-desc{margin:12px 0 0;display:-webkit-box;overflow:hidden;color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:22px;-webkit-box-orient:vertical;-webkit-line-clamp:2}.dsm-actions{display:flex;flex-wrap:wrap;gap:8px;margin-left:0;flex:none}
|
|
81
81
|
/* 页头动作行:内边距收 2px。批量按钮要按「取消全选」定宽(见 .dsm-btn-bulk),
|
|
82
82
|
收这一点正好把定宽多出来的宽度抵掉,整行仍在一行内。 */
|
|
83
83
|
.dsm-actions .dsm-btn{padding:0 12px}
|
|
@@ -162,7 +162,12 @@ button.dsm-qty:disabled{cursor:default}
|
|
|
162
162
|
铁律:**同一行 / 同一组按钮必须同高** —— 行里有实心或常规动作就整行 30px(弹窗脚、
|
|
163
163
|
页头动作条),整行都是行内小动作才整行 24px(列表行、回收站行、分段组)。
|
|
164
164
|
(CSS 注释里别写反引号:这段整体在 JS 模板字符串里,反引号会把字符串截断。) */
|
|
165
|
-
.dsm-btn{box-sizing:border-box;display:inline-flex;min-height:30px;align-items:center;justify-content:center;padding:0 12px;border:1px solid transparent;border-radius:var(--dsm-radius-m);background:var(--dsw-alias-button-primary-fill);color:var(--dsw-alias-label-primary-foreground);font:inherit;font-size:13px;font-weight:600;white-space:nowrap;cursor:pointer}.dsm-btn:hover:not(:disabled){opacity:.9}.dsm-btn:disabled{opacity:.48;cursor:default}.dsm-btn-secondary{border-color:var(--dsw-alias-border-l2);background:transparent;color:var(--dsw-alias-label-primary)}.dsm-btn-quiet{border-color:var(--dsw-alias-border-l2);background:transparent;color:var(--dsw-alias-label-primary);min-height:24px;padding:0 8px;font-size:12px;font-weight:400}.dsm-btn-danger{border-color:transparent;background:var(--dsw-alias-state-error-primary);color:#fff}.dsm-btn-lock{background:transparent;color:var(--dsm-warn)}
|
|
165
|
+
.dsm-btn{box-sizing:border-box;display:inline-flex;min-height:30px;align-items:center;justify-content:center;padding:0 12px;border:1px solid transparent;border-radius:var(--dsm-radius-m);background:var(--dsw-alias-button-primary-fill);color:var(--dsw-alias-label-primary-foreground);font:inherit;font-size:13px;font-weight:600;white-space:nowrap;cursor:pointer}.dsm-btn:hover:not(:disabled){opacity:.9}.dsm-btn:disabled{opacity:.48;cursor:default}.dsm-btn-secondary{border-color:var(--dsw-alias-border-l2);background:transparent;color:var(--dsw-alias-label-primary)}.dsm-btn-quiet{border-color:var(--dsw-alias-border-l2);background:transparent;color:var(--dsw-alias-label-primary);min-height:24px;padding:0 8px;font-size:12px;font-weight:400}.dsm-btn-danger{border-color:transparent;background:var(--dsw-alias-state-error-primary);color:#fff}.dsm-btn-lock{background:transparent;color:var(--dsm-warn)}/* 焦点环**分三项写、不写 outline 简写**(PR #18 指出的问题,2026-10-17 实测确认):
|
|
166
|
+
宿主 focus.css 只声明 outline-color / outline-width、刻意不声明 outline-style,
|
|
167
|
+
好让「控件自己设了 outline:none 就真的不画」。outline:2px solid <色> 这种简写会把
|
|
168
|
+
outline-style 一起重置成 solid,等于替宿主"重新打开"那些本该没有环的控件。
|
|
169
|
+
三项分开写就只覆盖颜色与宽度,style 仍由宿主与控件自己定。 */
|
|
170
|
+
.dsm-btn:focus-visible,.dsm-source-head:focus-visible,.dsm-switch:focus-visible,.dsm-file-remove:focus-visible,.dsm-dropzone:focus-visible{outline-style:solid;outline-color:var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-width:var(--dsw-focus-ring-width,2px);outline-offset:2px}
|
|
166
171
|
/* 列表工具条的一行:搜索占满剩余、筛选下拉定宽靠右。
|
|
167
172
|
下拉宽度 210 → 150(用户 2026-10-12:「全部级别缩短,当前太长了,多的内容交给输入框」;
|
|
168
173
|
技能「全部来源」、记忆「全部场景」、会话保留期同一条口径)。触发器内的文本本来就带
|
|
@@ -193,7 +198,7 @@ button.dsm-qty:disabled{cursor:default}
|
|
|
193
198
|
.dsm-source-body .dsm-source{border:0;border-radius:0;border-bottom:1px solid var(--dsw-alias-border-l1)}
|
|
194
199
|
.dsm-source-body .dsm-source:last-child{border-bottom:0}
|
|
195
200
|
.dsm-note{overflow:hidden;margin-top:4px;color:var(--dsw-alias-label-secondary);font-size:12px;line-height:17px;text-overflow:ellipsis;white-space:nowrap}.dsm-tags{display:flex;align-items:center;gap:4px;flex-wrap:wrap}.dsm-tag{display:inline-flex;min-height:20px;align-items:center;padding:0 8px;border:1px solid var(--dsw-alias-border-l3);border-radius:var(--dsm-radius-s);color:var(--dsw-alias-label-secondary);font-size:12px;white-space:nowrap}.dsm-tag-on{border-color:var(--dsw-alias-state-success-primary);color:var(--dsw-alias-state-success-primary)}.dsm-tag-off{border-color:var(--dsw-alias-state-error-primary);color:var(--dsw-alias-state-error-primary)}.dsm-tag-warn{border-color:var(--dsm-warn);color:var(--dsm-warn)}
|
|
196
|
-
.dsm-switch{position:relative;width:32px;height:18px;flex:none;padding:0;border:0;border-radius:99px;background:var(--dsw-alias-border-l3);cursor:pointer}.dsm-switch:after{position:absolute;top:3px;left:3px;width:12px;height:12px;border-radius:50%;background:#fff;content:"";transition:transform 160ms ease}.dsm-switch-on{background:var(--dsw-alias-state-success-primary)}.dsm-switch-on:after{transform:translateX(14px)}.dsm-switch:disabled{opacity:.45;cursor:default}.dsm-trash-count{margin-left:auto;padding:4px 8px;border-radius:99px;background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-secondary);font-size:11px;font-variant-numeric:tabular-nums}.dsm-empty{padding:24px 12px;color:var(--dsw-alias-label-tertiary);font-size:12px;text-align:center}.dsm-feedback{padding:8px 12px;border:1px solid var(--dsw-alias-border-l2);border-radius:var(--dsm-radius-m);color:var(--dsw-alias-label-secondary);font-size:12px}.dsm-undo{display:flex;align-items:center;gap:8px}.dsm-undo-text{min-width:0;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.dsm-undo-close{padding:0;border:0;background:transparent;font:inherit;font-size:13px;cursor:pointer;width:24px;height:24px;color:var(--dsw-alias-label-secondary)}.dsm-undo-close:focus-visible{outline:
|
|
201
|
+
.dsm-switch{position:relative;width:32px;height:18px;flex:none;padding:0;border:0;border-radius:99px;background:var(--dsw-alias-border-l3);cursor:pointer}.dsm-switch:after{position:absolute;top:3px;left:3px;width:12px;height:12px;border-radius:50%;background:#fff;content:"";transition:transform 160ms ease}.dsm-switch-on{background:var(--dsw-alias-state-success-primary)}.dsm-switch-on:after{transform:translateX(14px)}.dsm-switch:disabled{opacity:.45;cursor:default}.dsm-trash-count{margin-left:auto;padding:4px 8px;border-radius:99px;background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-secondary);font-size:11px;font-variant-numeric:tabular-nums}.dsm-empty{padding:24px 12px;color:var(--dsw-alias-label-tertiary);font-size:12px;text-align:center}.dsm-feedback{padding:8px 12px;border:1px solid var(--dsw-alias-border-l2);border-radius:var(--dsm-radius-m);color:var(--dsw-alias-label-secondary);font-size:12px}.dsm-undo{display:flex;align-items:center;gap:8px}.dsm-undo-text{min-width:0;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.dsm-undo-close{padding:0;border:0;background:transparent;font:inherit;font-size:13px;cursor:pointer;width:24px;height:24px;color:var(--dsw-alias-label-secondary)}.dsm-undo-close:focus-visible{outline-style:solid;outline-color:var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-width:var(--dsw-focus-ring-width,2px);outline-offset:2px}.dsm-undo.dsm-warning{background:var(--dsm-warn-bg)}.dsm-undo.dsm-warning .dsm-undo-text{font-weight:400}.dsm-undo.dsm-warning .dsm-undo-close{color:var(--dsm-warn)}.dsm-warning{border-color:var(--dsm-warn);color:var(--dsm-warn)}.dsm-error{border-color:var(--dsw-alias-state-error-primary);color:var(--dsw-alias-state-error-primary)}
|
|
197
202
|
.dsm-mask{position:fixed;z-index:1100;inset:0;display:flex;align-items:center;justify-content:center;padding:24px;background:rgba(0,0,0,.62)}.dsm-modal{box-sizing:border-box;display:flex;width:min(560px,100%)!important;max-height:min(760px,calc(100vh - 48px));min-width:0;flex-direction:column;gap:16px;padding:20px;overflow:auto;border:1px solid var(--dsw-alias-border-l2);border-radius:var(--dsm-radius-l);background:var(--dsw-alias-bg-layer-2);box-shadow:var(--dsw-shadow-lv3)}.dsm-modal-sm{width:min(480px,100%)!important}.dsm-modal-lg,.dsm-modal-wide{width:min(720px,100%)!important}.dsm-modal-list{width:min(560px,100%)!important;height:min(640px,calc(100vh - 48px))!important;max-height:none!important;overflow:hidden}.dsm-modal-list.dsm-modal-editor{width:min(720px,100%)!important}.dsm-modal-body{display:flex;min-height:0;flex-direction:column;gap:8px}.dsm-modal-list .dsm-modal-body{flex:1;overflow:auto;overscroll-behavior:contain}.dsm-modal-head{display:flex;align-items:flex-start;gap:12px}
|
|
198
203
|
/* 头部这一层包住「标题行 + 令牌提示」:提示挂在头部里面(而不是 head 与 body 之间)是为了
|
|
199
204
|
让 body 的子节点位置稳定 —— 位置一变 React 会把 body 整棵重挂(输入框失焦、下拉归零)。 */
|
|
@@ -204,7 +209,7 @@ button.dsm-qty:disabled{cursor:default}
|
|
|
204
209
|
/* 条目清单必须自己声明字号:裸 ul/li 会从宿主那里继承 16px 近白正文(兼容页「工具能用 ≠
|
|
205
210
|
模型知道」三条),比同页的说明文字大两号。口径照 .dsm-help-list。 */
|
|
206
211
|
.dsm-upload-requirements ul{display:flex;margin:4px 0 0;padding-left:16px;flex-direction:column;gap:4px;color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:17px}
|
|
207
|
-
.dsm-upload-req{margin-top:8px;color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:17px}.dsm-detail-section{gap:8px}.dsm-detail-path,.dsm-code{font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:11px}.dsm-detail-path{padding:8px 8px;border-radius:var(--dsm-radius-m);background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-secondary);word-break:break-all}
|
|
212
|
+
.dsm-upload-req{margin-top:8px;color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:17px}.dsm-detail-section{gap:8px}.dsm-detail-path,.dsm-code{font-family:var(--ds-font-family-code,ui-monospace,SFMono-Regular,Consolas,monospace);font-size:11px}.dsm-detail-path{padding:8px 8px;border-radius:var(--dsm-radius-m);background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-secondary);word-break:break-all}
|
|
208
213
|
/* 技能详情的「路径 + 编辑器查看」同一行(用户 2026-10-12):路径条 flex:1 吃掉剩余宽度,
|
|
209
214
|
按钮 flex:none 固定不动。按钮那颗 .dsm-btn 自带 white-space:nowrap,长路径自己折行。 */
|
|
210
215
|
.dsm-detail-path-row{display:flex;min-width:0;align-items:center;gap:8px}
|
|
@@ -240,11 +245,11 @@ button.dsm-qty:disabled{cursor:default}
|
|
|
240
245
|
(.dsm-trash-group 正是),超出的条目会被**直接裁掉** —— 看不见、也滚不到,表现就是
|
|
241
246
|
「没有滚动条 + 内容缺一截」。列表项的尺寸一律由内容决定,滚动只交给 body 这一层。 */
|
|
242
247
|
.dsm-modal-list .dsm-modal-body>*{flex:none}
|
|
243
|
-
.dsm-fm{display:flex;flex-direction:column;overflow:hidden;border:1px solid var(--dsw-alias-border-l2);border-radius:var(--dsm-radius-m);background:var(--dsw-alias-bg-layer-1)}.dsm-fm-row{display:grid;grid-template-columns:minmax(96px,150px) minmax(0,1fr);gap:8px;padding:8px 12px;border-bottom:1px solid var(--dsw-alias-border-l1);font-size:12px;line-height:18px}.dsm-fm-row:last-child{border-bottom:0}.dsm-fm-key{color:var(--dsw-alias-label-secondary);word-break:break-word}.dsm-fm-raw{margin-left:4px;color:var(--dsw-alias-label-tertiary);font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:11px}.dsm-fm-val{min-width:0;color:var(--dsw-alias-label-primary);word-break:break-word;white-space:pre-wrap}
|
|
248
|
+
.dsm-fm{display:flex;flex-direction:column;overflow:hidden;border:1px solid var(--dsw-alias-border-l2);border-radius:var(--dsm-radius-m);background:var(--dsw-alias-bg-layer-1)}.dsm-fm-row{display:grid;grid-template-columns:minmax(96px,150px) minmax(0,1fr);gap:8px;padding:8px 12px;border-bottom:1px solid var(--dsw-alias-border-l1);font-size:12px;line-height:18px}.dsm-fm-row:last-child{border-bottom:0}.dsm-fm-key{color:var(--dsw-alias-label-secondary);word-break:break-word}.dsm-fm-raw{margin-left:4px;color:var(--dsw-alias-label-tertiary);font-family:var(--ds-font-family-code,ui-monospace,SFMono-Regular,Consolas,monospace);font-size:11px}.dsm-fm-val{min-width:0;color:var(--dsw-alias-label-primary);word-break:break-word;white-space:pre-wrap}
|
|
244
249
|
@container(max-width:780px){
|
|
245
250
|
.dsm-path{display:none}
|
|
246
251
|
}@container(max-width:520px){.dsm-head{flex-direction:column}.dsm-actions{width:100%;margin-left:0}.dsm-actions .dsm-btn{flex:1}.dsm-filters{flex-direction:column}.dsm-source-filter{width:100%}}
|
|
247
|
-
.dsm-hist-group-head{gap:8px}.dsm-hist-group-extra{display:flex;align-items:center;gap:8px;flex:none;margin-left:4px}.dsm-hist-group-extra .dsm-tag{flex:none}.dsm-hist-dir-missing{flex:none;padding:1px 6px;border:1px solid var(--dsw-alias-state-error-primary);border-radius:var(--dsm-radius-s);color:var(--dsw-alias-state-error-primary);font-size:12px;line-height:16px;white-space:nowrap;cursor:default;user-select:none}.dsm-hist-register-path{margin-top:-4px;color:var(--dsw-alias-label-tertiary);font-family:var(--
|
|
252
|
+
.dsm-hist-group-head{gap:8px}.dsm-hist-group-extra{display:flex;align-items:center;gap:8px;flex:none;margin-left:4px}.dsm-hist-group-extra .dsm-tag{flex:none}.dsm-hist-dir-missing{flex:none;padding:1px 6px;border:1px solid var(--dsw-alias-state-error-primary);border-radius:var(--dsm-radius-s);color:var(--dsw-alias-state-error-primary);font-size:12px;line-height:16px;white-space:nowrap;cursor:default;user-select:none}.dsm-hist-register-path{margin-top:-4px;color:var(--dsw-alias-label-tertiary);font-family:var(--ds-font-family-code,monospace);font-size:11px;word-break:break-all}/* (.dsm-hist-batch / .dsm-hist-batch-actions 已随批量动作移进列表工具条删除;
|
|
248
253
|
.dsm-hist-batch-count 仍用于导出弹窗里的「已选 N 项」计数。) */
|
|
249
254
|
.dsm-hist-batch-count{color:var(--dsw-alias-label-secondary);font-size:12px;font-variant-numeric:tabular-nums;white-space:nowrap}.dsm-dir-row{display:flex;gap:8px}.dsm-dir-row .dsm-control{flex:1}.dsm-dir-list{display:flex;max-height:220px;flex-direction:column;overflow:auto;border:1px solid var(--dsw-alias-border-l2);border-radius:var(--dsm-radius-m);background:var(--dsw-alias-bg-layer-1)}.dsm-dir-item{display:flex;width:100%;align-items:center;padding:8px 12px;border:0;border-bottom:1px solid var(--dsw-alias-border-l1);background:transparent;color:var(--dsw-alias-label-primary);font:inherit;font-size:12px;text-align:left;cursor:pointer}.dsm-dir-item:last-child{border-bottom:0}.dsm-dir-item:hover{background:var(--dsw-alias-interactive-bg-hover)}.dsm-dir-item::before{content:"📁";margin-right:8px;font-size:12px}
|
|
250
255
|
.dsm-rule-shadowed .dsm-note{color:var(--dsw-alias-state-error-primary)}.dsm-rule-off .dsm-note{color:var(--dsw-alias-label-tertiary)}.dsm-rule-shadow-hint{margin-top:4px;color:var(--dsw-alias-state-error-primary);font-size:12px;line-height:17px}.dsm-rule-invalid{border-color:var(--dsw-alias-state-error-primary)!important}.dsm-rule-hint{color:var(--dsw-alias-state-error-primary);font-size:12px;line-height:17px}/* (.dsm-rule-budget 与 .dsm-budget-bar / -fill / -over-text 都已随记忆页预算条的两次搬家
|
|
@@ -306,7 +311,7 @@ button.dsm-qty:disabled{cursor:default}
|
|
|
306
311
|
.dsm-scene-tile-mode{border-color:var(--dsw-alias-state-success-primary)}
|
|
307
312
|
.dsm-scene-tile-head{display:flex;min-width:0;align-items:center;gap:8px;padding:12px 12px 0}
|
|
308
313
|
.dsm-scene-tile-name{overflow:hidden;font-size:13px;font-weight:600;text-overflow:ellipsis;white-space:nowrap}
|
|
309
|
-
.dsm-scene-tile-key{flex:none;color:var(--dsw-alias-label-tertiary);font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:11px}
|
|
314
|
+
.dsm-scene-tile-key{flex:none;color:var(--dsw-alias-label-tertiary);font-family:var(--ds-font-family-code,ui-monospace,SFMono-Regular,Consolas,monospace);font-size:11px}
|
|
310
315
|
.dsm-scene-tile-head .dsm-tag{flex:none}
|
|
311
316
|
.dsm-scene-tile-switch{margin-left:auto;flex:none}
|
|
312
317
|
/* 描述行是卡片的最后一行(2026-10-16 删掉底部那条 编辑/删除 band,动作进卡头 ⋯),
|
|
@@ -425,7 +430,7 @@ button.dsm-qty:disabled{cursor:default}
|
|
|
425
430
|
.dsm-compat-mod-row:last-child{border-bottom:0}
|
|
426
431
|
.dsm-compat-mod-list.dsm-compat-cards .dsm-compat-mod-row{display:grid;min-height:0;grid-template-columns:minmax(0,1fr) max-content;gap:4px 10px;padding:8px 12px}
|
|
427
432
|
.dsm-compat-mod-self{grid-column:1/-1}
|
|
428
|
-
.dsm-compat-mod{min-width:0;font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:11px;line-height:17px;word-break:break-word}
|
|
433
|
+
.dsm-compat-mod{min-width:0;font-family:var(--ds-font-family-code,ui-monospace,SFMono-Regular,Consolas,monospace);font-size:11px;line-height:17px;word-break:break-word}
|
|
429
434
|
.dsm-compat-pill{display:inline-flex;min-height:20px;flex:none;align-items:center;padding:0 8px;border:1px solid var(--dsw-alias-border-l3);border-radius:99px;color:var(--dsw-alias-label-secondary);font-size:12px;white-space:nowrap}
|
|
430
435
|
.dsm-compat-pill-ok{border-color:var(--dsw-alias-state-success-primary);color:var(--dsw-alias-state-success-primary)}
|
|
431
436
|
.dsm-compat-pill-warn{border-color:var(--dsm-warn);color:var(--dsm-warn)}
|
|
@@ -444,7 +449,7 @@ button.dsm-qty:disabled{cursor:default}
|
|
|
444
449
|
.dsm-inject-domains{display:flex;flex-wrap:wrap;gap:6px}
|
|
445
450
|
.dsm-inject-chip{box-sizing:border-box;display:inline-flex;flex:1 1 0;min-width:max-content;min-height:32px;align-items:center;justify-content:center;gap:6px;padding:0 10px;border:1px solid var(--dsw-alias-border-l2);border-radius:var(--dsm-radius-m);background:transparent;color:var(--dsw-alias-label-tertiary);font:inherit;font-size:12px;line-height:18px;white-space:nowrap;cursor:pointer}
|
|
446
451
|
.dsm-inject-chip:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}
|
|
447
|
-
.dsm-inject-chip:focus-visible{outline:
|
|
452
|
+
.dsm-inject-chip:focus-visible{outline-style:solid;outline-color:var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-width:var(--dsw-focus-ring-width,2px);outline-offset:2px}
|
|
448
453
|
.dsm-inject-chip-dot{flex:none;width:6px;height:6px;border-radius:50%;background:currentColor;opacity:.4}
|
|
449
454
|
.dsm-inject-chip-name{flex:none}
|
|
450
455
|
/* 开:成功色描边 + 主字色 + 实心点。底色不动 —— 六块都涂色会把「注入内容」这一块压得
|
|
@@ -481,14 +486,14 @@ button.dsm-qty:disabled{cursor:default}
|
|
|
481
486
|
.dsm-tooltable-tool{display:grid;grid-template-columns:15px 186px 48px minmax(0,1fr);align-items:center;gap:0 8px;padding:4px 4px;border-radius:var(--dsm-radius-s);color:var(--dsw-alias-label-secondary);font-size:12px;line-height:18px;cursor:pointer}
|
|
482
487
|
.dsm-tooltable-tool:hover{background:var(--dsw-alias-interactive-bg-hover)}
|
|
483
488
|
.dsm-tooltable-tool input[type=checkbox]{width:14px;height:14px;margin:0;cursor:pointer;accent-color:var(--dsw-alias-state-success-primary)}
|
|
484
|
-
.dsm-tooltable-name{overflow:hidden;color:var(--dsw-alias-label-primary);font-family:ui-monospace,SFMono-Regular,Consolas,monospace;text-overflow:ellipsis;white-space:nowrap}
|
|
489
|
+
.dsm-tooltable-name{overflow:hidden;color:var(--dsw-alias-label-primary);font-family:var(--ds-font-family-code,ui-monospace,SFMono-Regular,Consolas,monospace);text-overflow:ellipsis;white-space:nowrap}
|
|
485
490
|
.dsm-tooltable-tok{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;white-space:nowrap}
|
|
486
491
|
.dsm-tooltable-about{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
487
492
|
/* 注入实况(只读):与「注入」设置同屏。行 = 域 + 体积 + 状态胶囊,点域名展开正文。 */
|
|
488
493
|
.dsm-inject-live-actions{display:flex;flex:none;align-items:center;gap:4px;margin-left:auto}
|
|
489
494
|
.dsm-inject-live-toggle{padding:0;border:0;background:transparent;color:inherit;font:inherit;cursor:pointer}
|
|
490
495
|
.dsm-inject-live-toggle:hover{text-decoration:underline}
|
|
491
|
-
.dsm-inject-live-toggle:focus-visible{outline:
|
|
496
|
+
.dsm-inject-live-toggle:focus-visible{outline-style:solid;outline-color:var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-width:var(--dsw-focus-ring-width,2px);outline-offset:2px}
|
|
492
497
|
/* 没有正文可展开的行:用一个看不见的同字符占位,把展开箭头那一格宽度留出来,
|
|
493
498
|
这样所有行的域名左缘才会在同一条竖线上(用户 2026-09-17 指出参差不齐)。
|
|
494
499
|
占位与文字放在**同一个** flex 子项里(.dsm-inject-live-static),否则 name 格的
|
|
@@ -511,7 +516,7 @@ button.dsm-qty:disabled{cursor:default}
|
|
|
511
516
|
.dsm-compat-pill-bad{border-color:var(--dsw-alias-state-error-primary);color:var(--dsw-alias-state-error-primary)}
|
|
512
517
|
.dsm-compat-name{min-width:0;flex:1;font-size:12px;font-weight:400;word-break:break-word}
|
|
513
518
|
.dsm-compat-label{margin-right:4px;color:var(--dsw-alias-label-tertiary);font-size:12px;white-space:nowrap}
|
|
514
|
-
.dsm-compat-code{font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:11px}
|
|
519
|
+
.dsm-compat-code{font-family:var(--ds-font-family-code,ui-monospace,SFMono-Regular,Consolas,monospace);font-size:11px}
|
|
515
520
|
.dsm-compat-list{margin:0;padding-left:16px}.dsm-compat-list li+li{margin-top:4px}
|
|
516
521
|
@container(max-width:640px){.dsm-compat-grid{grid-template-columns:1fr}}
|
|
517
522
|
html,body{scrollbar-gutter:stable}.dsm-settings-scroll-host{overflow-y:scroll!important;scrollbar-gutter:stable}.dsm-tabs-shell{position:sticky;top:0;z-index:6;display:flex;min-width:0;align-items:center;gap:4px;margin-bottom:0;padding-top:2px;background:var(--dsw-alias-bg-layer-2)}.dsm-tabs{display:grid;min-width:0;flex:1;grid-template-columns:repeat(auto-fit,minmax(64px,1fr));gap:0;overflow:hidden;margin-bottom:0;border-bottom:1px solid var(--dsw-alias-border-l1)}.dsm-tab{box-sizing:border-box;width:100%;min-width:0;padding-right:4px;padding-left:4px;overflow:hidden;font-size:12px;text-overflow:ellipsis;white-space:nowrap}.dsm-feedback-link{width:30px;height:30px;box-sizing:border-box;padding:0;justify-content:center}.dsm-feedback-link svg{width:16px;height:16px}@container(max-width:620px){.dsm-tab{padding-right:4px;padding-left:4px;font-size:12px}}
|
|
@@ -581,7 +586,7 @@ html,body{scrollbar-gutter:stable}.dsm-settings-scroll-host{overflow-y:scroll!im
|
|
|
581
586
|
.dsm-token-banner-go{pointer-events:auto;-webkit-app-region:no-drag;app-region:no-drag;flex:none;align-self:center;padding:4px 12px;border:1px solid var(--dsw-alias-border-l2);border-radius:var(--dsm-radius-s);background:transparent;color:var(--dsw-alias-label-primary);font:inherit;font-size:13px;line-height:20px;cursor:pointer;white-space:nowrap}
|
|
582
587
|
.dsm-token-banner-go:hover{background:rgba(255,255,255,.08)}
|
|
583
588
|
.dsm-token-banner-go:active{background:rgba(255,255,255,.14)}
|
|
584
|
-
.dsm-token-banner-go:focus-visible{outline:
|
|
589
|
+
.dsm-token-banner-go:focus-visible{outline-style:solid;outline-color:var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-width:var(--dsw-focus-ring-width,2px);outline-offset:2px}
|
|
585
590
|
|
|
586
591
|
/* 全局轻提示(斜杠命令的执行反馈)。位置在右下角:对话页的输入框居底居中,顶部那条又是
|
|
587
592
|
令牌横幅,两处都会被挡。z-index 比横幅低一档 —— 令牌没过时那句解释比"改成功了"更要紧。 */
|
|
@@ -601,7 +606,7 @@ html,body{scrollbar-gutter:stable}.dsm-settings-scroll-host{overflow-y:scroll!im
|
|
|
601
606
|
.dsm-imp-row input[type=checkbox]:disabled{cursor:not-allowed}
|
|
602
607
|
.dsm-imp-main{display:flex;min-width:0;flex-direction:column;gap:4px}
|
|
603
608
|
.dsm-imp-name{display:flex;align-items:center;flex-wrap:wrap;gap:4px;color:var(--dsw-alias-label-primary);font-size:13px;font-weight:600}
|
|
604
|
-
.dsm-imp-endpoint{color:var(--dsw-alias-label-secondary);font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:11px;line-height:16px;word-break:break-all}
|
|
609
|
+
.dsm-imp-endpoint{color:var(--dsw-alias-label-secondary);font-family:var(--ds-font-family-code,ui-monospace,SFMono-Regular,Consolas,monospace);font-size:11px;line-height:16px;word-break:break-all}
|
|
605
610
|
.dsm-imp-sub,.dsm-imp-note{color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:16px}
|
|
606
611
|
.dsm-imp-err{color:var(--dsw-alias-state-error-primary);font-size:12px;line-height:16px}
|
|
607
612
|
.dsm-imp-meta{display:flex;flex-direction:column;align-items:flex-end;gap:4px}
|
|
@@ -617,12 +622,22 @@ html,body{scrollbar-gutter:stable}.dsm-settings-scroll-host{overflow-y:scroll!im
|
|
|
617
622
|
.dsm-dot{display:inline-block;flex:none;width:8px;height:8px;border-radius:50%;background:var(--dsw-alias-border-l3)}
|
|
618
623
|
.dsm-dot-ok{background:var(--dsw-alias-state-success-primary)}
|
|
619
624
|
.dsm-dot-warn{background:var(--dsm-warn)}
|
|
625
|
+
/* idle / bad 两条此前**根本没写**(2026-10-17 查出来):StatusDot 的 tone 有
|
|
626
|
+
ok / idle / bad / warn / busy 五档,CSS 只给了 ok / warn / busy 三条,idle 与 bad
|
|
627
|
+
全靠 .dsm-dot 的默认灰底顶着 —— idle 恰好就该是灰,所以一直没露馅;而 bad
|
|
628
|
+
(MCP 加载失败,41-mcp.js 的 liveStatus)本该是红的,实际也是灰的,
|
|
629
|
+
那颗灯因此在「连不上」和「没加载过」之间完全分不出来。两条都显式写出来,不再吃默认值。 */
|
|
630
|
+
.dsm-dot-idle{background:var(--dsw-alias-border-l3)}
|
|
631
|
+
.dsm-dot-bad{background:var(--dsw-alias-state-error-primary)}
|
|
620
632
|
/* 启动进行中的呼吸点(2026-10-15 用户要求加回:服务启动要数秒,原来只有一个静态灰点,
|
|
621
633
|
"正在启动"只能靠 title 说出来。2026-10-12 曾以"闪动的点只有体检用"为由删过一次,
|
|
622
634
|
这次是 MCP 启动相位自己要 —— 全页只有 phase 非 active 时用它,不会到处闪)。
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
635
|
+
配色改黄(用户 2026-10-17):加载中既没连上也不是故障,取官方 warn 档
|
|
636
|
+
(--dsw-alias-state-warn-primary = amber-500 #f59e0b,随主题走)—— 与跑起来之后的
|
|
637
|
+
常亮绿、失败的红三者一眼可分。2026-10-15 曾改绿,那次要的是"别用橙",
|
|
638
|
+
但绿与常亮态同色、只能靠节律分辨,用户这次明确要黄。
|
|
639
|
+
tone='busy' 全仓只有 MCP 的状态灯在用(41-mcp.js 的两处 liveStatus),别处不受影响。 */
|
|
640
|
+
.dsm-dot-busy{background:var(--dsw-alias-state-warn-primary);animation:dsm-dot-pulse 1.1s ease-in-out infinite}
|
|
626
641
|
/* 呼吸的最低亮度从 .3 提到 .65,且改成**长一圈**而不是缩一点(用户 2026-10-15:灯在闪,
|
|
627
642
|
可颜色看着不绿,分不清是不是启动中)。6px 的点压到三成透明度就只剩一层灰;"变亮 + 长大"
|
|
628
643
|
与跑起来那颗常亮的绿一眼可分。 */
|
|
@@ -637,7 +652,7 @@ html,body{scrollbar-gutter:stable}.dsm-settings-scroll-host{overflow-y:scroll!im
|
|
|
637
652
|
.dsm-audit-head{grid-template-columns:92px minmax(0,1fr)}
|
|
638
653
|
.dsm-audit-row{display:grid;grid-template-columns:92px minmax(0,1fr);align-items:baseline;gap:8px;padding:4px 0;border-bottom:1px solid var(--dsw-alias-border-l1);font-size:12px}
|
|
639
654
|
.dsm-audit-row:last-child{border-bottom:0}
|
|
640
|
-
.dsm-audit-time{color:var(--dsw-alias-label-tertiary);font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:11px;font-variant-numeric:tabular-nums;white-space:nowrap}
|
|
655
|
+
.dsm-audit-time{color:var(--dsw-alias-label-tertiary);font-family:var(--ds-font-family-code,ui-monospace,SFMono-Regular,Consolas,monospace);font-size:11px;font-variant-numeric:tabular-nums;white-space:nowrap}
|
|
641
656
|
.dsm-audit-main{display:flex;align-items:baseline;flex-wrap:wrap;gap:4px 8px;min-width:0}
|
|
642
657
|
.dsm-audit-item{color:var(--dsw-alias-label-secondary)}
|
|
643
658
|
.dsm-audit-target{color:var(--dsw-alias-label-primary);font-weight:400}
|
|
@@ -693,7 +708,7 @@ html,body{scrollbar-gutter:stable}.dsm-settings-scroll-host{overflow-y:scroll!im
|
|
|
693
708
|
.dsm-pick input[type=checkbox]{flex:none;width:15px;height:15px;margin:0;cursor:pointer}
|
|
694
709
|
.dsm-tooltable-ghead input[type=checkbox]{flex:none;width:15px;height:15px;margin:0;cursor:pointer}
|
|
695
710
|
.dsm-imp-row input[type=checkbox]{width:14px;height:14px;margin:0;cursor:pointer}
|
|
696
|
-
.dsm-select-menu button:focus-visible{outline:
|
|
711
|
+
.dsm-select-menu button:focus-visible{outline-style:solid;outline-color:var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-width:var(--dsw-focus-ring-width,2px); outline-offset: 1px;}
|
|
697
712
|
.dsm-btn-lock:hover:not(:disabled){background: var(--dsw-alias-interactive-bg-hover);}
|
|
698
713
|
.dsm-btn-quiet:hover:not(:disabled){background: var(--dsw-alias-interactive-bg-hover); color: var(--dsw-alias-label-primary);}
|
|
699
714
|
/* quiet + danger 必须**自己把描边写回来**:单类的 .dsm-btn-danger(实心红底那颗)在
|
|
@@ -711,7 +726,19 @@ html,body{scrollbar-gutter:stable}.dsm-settings-scroll-host{overflow-y:scroll!im
|
|
|
711
726
|
.dsm-select-trigger > span{min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;}
|
|
712
727
|
.dsm-select-trigger::after{content:""; flex: none; box-sizing: border-box; width: 7px; height: 7px; margin-top: -3px; border-right: 1.5px solid var(--dsw-alias-label-tertiary); border-bottom: 1.5px solid var(--dsw-alias-label-tertiary); transform: rotate(45deg);}
|
|
713
728
|
.dsm-select-trigger:empty::before{color: var(--dsw-alias-label-dimmed);}
|
|
714
|
-
|
|
729
|
+
/* 输入框的焦点态照官方口径(2026-10-17):**不画环,只把描边染成主色**(官方 settings-models
|
|
730
|
+
的 .input:focus 就一句 border-color + outline:none,不加深、不发光晕)。
|
|
731
|
+
**描边色不能写 --dsw-focus-ring-color**:宿主在鼠标交互时把那个变量改写成 transparent
|
|
732
|
+
(html[data-input-modality=pointer] body :focus-visible:not(:read-write)),只放过输入框这类
|
|
733
|
+
:read-write 元素 —— 而下拉触发器是 <button>,不在豁免里,照抄就会「点一下边框整圈消失」。
|
|
734
|
+
所以这里直接取它缺省的那个业务蓝:深浅两套主题下与官方环同色,且不随交互方式变。
|
|
735
|
+
非法输入框排除在外:描边被 .dsm-rule-invalid 用 !important 钉成红色,染不上色,
|
|
736
|
+
留着宿主默认的环反而看得见焦点。 */
|
|
737
|
+
.dsm-control:not(.dsm-rule-invalid):focus-visible,.dsm-select-trigger:focus-visible{outline:none;border-color:var(--dsw-alias-state-business-primary)}
|
|
738
|
+
/* 搜索框比普通输入框多一圈 18% 主色的光环(官方 settings-plugin-inventory 的搜索框写法,
|
|
739
|
+
截图比过色值:1px 描边 + 2px 淡蓝光晕,18% 混白正好落在官方那张图的 (221,230,250))。
|
|
740
|
+
只给搜索框,别的输入框不加。 */
|
|
741
|
+
.dsm-search:focus-visible{border-color:var(--dsw-alias-state-business-primary);box-shadow:0 0 0 2px color-mix(in srgb, var(--dsw-alias-state-business-primary) 18%, transparent)}
|
|
715
742
|
.dsm-select-trigger:disabled{color: var(--dsw-alias-label-tertiary); cursor: default;}
|
|
716
743
|
.dsm-control[aria-invalid= true ]{border-color: var(--dsw-alias-state-error-primary);}
|
|
717
744
|
/* 这一条**不能再写 background**:它与第 99 行的 .dsm-option:hover 特异性打平
|
|
@@ -737,7 +764,7 @@ html,body{scrollbar-gutter:stable}.dsm-settings-scroll-host{overflow-y:scroll!im
|
|
|
737
764
|
.dsm-btn.dsm-btn-icon > svg{width: 14px; height: 14px; flex: none;}
|
|
738
765
|
.dsm-btn.dsm-btn-icon.dsm-btn-lock{border: 0; background: transparent; color: var(--dsw-alias-label-tertiary);}
|
|
739
766
|
.dsm-btn.dsm-btn-icon.dsm-btn-lock:hover:not(:disabled){color: var(--dsw-alias-state-error-primary); background: var(--dsw-alias-interactive-bg-hover-danger);}
|
|
740
|
-
.dsm-btn.dsm-btn-icon:focus-visible{outline:
|
|
767
|
+
.dsm-btn.dsm-btn-icon:focus-visible{outline-style:solid;outline-color:var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-width:var(--dsw-focus-ring-width,2px); outline-offset: 1px;}
|
|
741
768
|
.dsm-preset-row > [role= switch ]{margin-right: 4px;}
|
|
742
769
|
/* ⚠️ 不写 overscroll-behavior:contain(2026-10-12 与场景编辑器组体同批修):代码块是
|
|
743
770
|
overflow:auto,内容不到 340px 时它不是「没在滚」而是「滚不动」——contain 会把滚轮链
|
|
@@ -854,7 +881,7 @@ html,body{scrollbar-gutter:stable}.dsm-settings-scroll-host{overflow-y:scroll!im
|
|
|
854
881
|
/* 头部右上角 X 图标钮(§4.3):替换「关闭」文字钮,aria-label 仍取「关闭」文案。 */
|
|
855
882
|
.dsm-modal-close{flex:none;display:inline-flex;width:30px;height:30px;align-items:center;justify-content:center;padding:0;border:0;border-radius:var(--dsm-radius-m);background:transparent;color:var(--dsw-alias-label-secondary);cursor:pointer}
|
|
856
883
|
.dsm-modal-close:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}
|
|
857
|
-
.dsm-modal-close:focus-visible{outline:
|
|
884
|
+
.dsm-modal-close:focus-visible{outline-style:solid;outline-color:var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-width:var(--dsw-focus-ring-width,2px);outline-offset:1px}
|
|
858
885
|
/* footer 规范(§4.3):右对齐 [取消][主操作](.dsm-modal-actions 已是 flex-end)。
|
|
859
886
|
(.dsm-modal-danger-left「危险操作钮靠左」已随场景编辑页那颗「删除场景」一起删除 ——
|
|
860
887
|
它此前是这颗键唯一的落点,用户 2026-10-12 裁定编辑页不再承担删除。) */
|
|
@@ -868,7 +895,7 @@ html,body{scrollbar-gutter:stable}.dsm-settings-scroll-host{overflow-y:scroll!im
|
|
|
868
895
|
行本体带 role=checkbox + aria-checked,Space/Enter 切换;框是纯视觉(aria-hidden)。 */
|
|
869
896
|
.dsm-rowselect{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:var(--dsm-radius-s);color:var(--dsw-alias-label-primary);cursor:pointer}
|
|
870
897
|
.dsm-rowselect:hover,.dsm-rowselect-on{background:var(--dsw-alias-interactive-bg-hover)}
|
|
871
|
-
.dsm-rowselect:focus-visible{outline:
|
|
898
|
+
.dsm-rowselect:focus-visible{outline-style:solid;outline-color:var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-width:var(--dsw-focus-ring-width,2px);outline-offset:1px}
|
|
872
899
|
.dsm-rowselect-disabled{cursor:default;opacity:.5}
|
|
873
900
|
.dsm-rowselect-disabled:hover{background:transparent}
|
|
874
901
|
.dsm-rowselect-box{display:inline-flex;flex:none;width:14px;height:14px;align-items:center;justify-content:center;border:1px solid var(--dsw-alias-border-l2);border-radius:var(--dsm-radius-s);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary-foreground)}
|
|
@@ -1068,7 +1095,7 @@ html,body{scrollbar-gutter:stable}.dsm-settings-scroll-host{overflow-y:scroll!im
|
|
|
1068
1095
|
.dsm-listrow-meta-desc{min-width:0;overflow:hidden;text-overflow:ellipsis}
|
|
1069
1096
|
.dsm-listrow-meta-info{flex:none;color:var(--dsw-alias-label-tertiary)}
|
|
1070
1097
|
/* 技术值(路径 / id)排印(§2.3):与普通文案在字形上区分,不靠颜色。 */
|
|
1071
|
-
.dsm-listrow-meta .dsm-mono{font-family:ui-monospace,SFMono-Regular,Consolas,monospace}
|
|
1098
|
+
.dsm-listrow-meta .dsm-mono{font-family:var(--ds-font-family-code,ui-monospace,SFMono-Regular,Consolas,monospace)}
|
|
1072
1099
|
.dsm-listrow-side{display:flex;flex:none;align-items:center;gap:8px}
|
|
1073
1100
|
.dsm-listrow-actions{display:flex;flex:none;align-items:center;justify-content:flex-end;gap:4px}
|
|
1074
1101
|
/* 行2 之下的追加内容(体检结果 / ⚠ 提示 / 被覆盖说明)原本按表格网格留白,
|
|
@@ -4196,7 +4223,7 @@ button.dsm-rowselect-box:disabled{cursor:default;opacity:.45}
|
|
|
4196
4223
|
"confirm.custom.remove.desc": "移除后该目录的技能不再列出(文件不受影响):{name}",
|
|
4197
4224
|
"result.custom.added": "已添加自定义目录:{path}", "result.custom.removed": "已移除自定义目录:{name}",
|
|
4198
4225
|
"status.enabled": "已启用", "status.disabled": "未启用", "status.invalid": "诊断异常", "status.shadowed": "被覆盖", "status.shadowed.hint": "同名技能「{name}」正在生效;点「启用这个」可改用当前来源的版本", "status.shadowed.inert": "同名技能「{name}」已停用,被它挡住的本来源版本同样不会生效 —— 两份都不生效;启用其中一份即可", "status.preferred": "同名首选", "status.notDeletable": "不可删除", "status.notDeletable.hint": "删除只对插件可管理的来源开放(DSH 技能 / 导入技能 / 项目级 .dsh/skills);外部 Agent 与自定义目录只读,里面的技能不能删", "status.manageable": "可管理", "status.project": "项目级", "status.rank": "优先级 {rank}", "status.source.on": "已启用", "status.source.off": "未启用", "status.bundle": "目录技能", "status.single": "单文件",
|
|
4199
|
-
"summary.total.one": "技能", "summary.total.other": "技能", "summary.issues.one": "诊断", "summary.issues.other": "诊断", "summary.sources.one": "来源", "summary.sources.other": "来源", "
|
|
4226
|
+
"summary.total.one": "技能", "summary.total.other": "技能", "summary.issues.one": "诊断", "summary.issues.other": "诊断", "summary.sources.one": "来源", "summary.sources.other": "来源", "table.skill": "技能名称与描述",
|
|
4200
4227
|
"filter.source": "来源", "filter.all": "全部来源", "filter.option": "{name}({count})", "search": "搜索", "search.placeholder": "搜索技能名称或描述", "search.clear": "清除搜索",
|
|
4201
4228
|
// 列表四态(REDESIGN §12.2,切片四)共用的一组词:加载 / 加载失败 / 重试 / 无结果 / 清除筛选。
|
|
4202
4229
|
"list.loading": "加载中…", "list.error": "加载失败", "list.retry": "重试", "list.noMatch": "没有匹配的条目", "list.clearFilter": "清除筛选",
|
|
@@ -4920,7 +4947,7 @@ button.dsm-rowselect-box:disabled{cursor:default;opacity:.45}
|
|
|
4920
4947
|
"result.custom.removed": "Custom folder removed: {name}",
|
|
4921
4948
|
"result.opened": "Opened with the system default app: {path}",
|
|
4922
4949
|
"status.enabled": "Enabled", "status.disabled": "Disabled", "status.invalid": "Needs attention", "status.shadowed": "Shadowed", "status.shadowed.hint": "The copy “{name}” is the active one; click “Use this one” to switch to this source instead", "status.shadowed.inert": "The copy “{name}” is disabled, so this source's version is blocked without taking effect either — nothing is active; enable one of the two to fix it", "status.preferred": "Manually chosen", "status.notDeletable": "Cannot delete", "status.notDeletable.hint": "Deleting is available for plugin-managed sources (DSH skills / Imported skills / project .dsh/skills); external agent and custom directories are read-only", "status.manageable": "Manageable", "status.project": "Project scoped", "status.rank": "Rank {rank}", "status.source.on": "Enabled", "status.source.off": "Off", "status.bundle": "Bundle", "status.single": "Single file",
|
|
4923
|
-
"summary.total.one": "Skills", "summary.total.other": "Skills", "summary.issues.one": "Issues", "summary.issues.other": "Issues", "summary.sources.one": "Sources", "summary.sources.other": "Sources", "
|
|
4950
|
+
"summary.total.one": "Skills", "summary.total.other": "Skills", "summary.issues.one": "Issues", "summary.issues.other": "Issues", "summary.sources.one": "Sources", "summary.sources.other": "Sources", "table.skill": "Skill name and description",
|
|
4924
4951
|
"filter.source": "Source", "filter.all": "All sources", "filter.option": "{name} ({count})", "search": "Search", "search.placeholder": "Search skill names or descriptions", "search.clear": "Clear search",
|
|
4925
4952
|
// Shared wording for the four list states (REDESIGN §12.2, slice 4): loading / load failed / retry / no match / clear filters.
|
|
4926
4953
|
"list.loading": "Loading…", "list.error": "Failed to load", "list.retry": "Retry", "list.noMatch": "No matching items", "list.clearFilter": "Clear filters",
|
|
@@ -6662,7 +6689,9 @@ button.dsm-rowselect-box:disabled{cursor:default;opacity:.45}
|
|
|
6662
6689
|
React.createElement('div', { className: 'dsm-source-head' },
|
|
6663
6690
|
React.createElement('button', { type: 'button', className: 'dsm-source-head-main', 'aria-expanded': open, onClick: flip },
|
|
6664
6691
|
React.createElement('span', { className: 'dsm-source-title', title: group.title }, group.title),
|
|
6665
|
-
|
|
6692
|
+
// 分组头只留数字(用户 2026-10-17):量词("个服务")在每一组的标题里已经说过
|
|
6693
|
+
// 一遍,再挂在数字后面只是重复;同一个数字在三页里一个样,扫起来才对得齐。
|
|
6694
|
+
React.createElement('span', { className: 'dsm-count' }, String(groupRows.length)),
|
|
6666
6695
|
group.path ? React.createElement('span', { className: 'dsm-path', title: group.path }, group.path) : null)),
|
|
6667
6696
|
open ? React.createElement('div', { className: 'dsm-source-body' },
|
|
6668
6697
|
// 表头已随两行制拆除(REDESIGN §3.4 没有表头行;列对齐改由行内两行承担),
|
|
@@ -7356,7 +7385,7 @@ button.dsm-rowselect-box:disabled{cursor:default;opacity:.45}
|
|
|
7356
7385
|
React.createElement('div', { className: 'dsm-source-head' },
|
|
7357
7386
|
React.createElement('button', { type: 'button', className: 'dsm-source-head-main', 'aria-expanded': open, onClick: function () { toggleGroup(key, baseOpen) } },
|
|
7358
7387
|
React.createElement('span', { className: 'dsm-source-title', title: label }, label),
|
|
7359
|
-
React.createElement('span', { className: 'dsm-count' },
|
|
7388
|
+
React.createElement('span', { className: 'dsm-count' }, String(count))),
|
|
7360
7389
|
actions ? React.createElement('div', { className: 'dsm-source-actions' }, actions) : null),
|
|
7361
7390
|
open ? React.createElement('div', { className: 'dsm-source-body' }, bodyNode) : null)
|
|
7362
7391
|
}
|
|
@@ -9325,7 +9354,7 @@ function enabledMemoryCount(rules) {
|
|
|
9325
9354
|
return React.createElement('section', { key: g.id, className: split ? 'dsm-trash-split-pane' : 'dsm-trash-pane-group' },
|
|
9326
9355
|
g.title ? React.createElement('div', { className: 'dsm-trash-pane-group-head' },
|
|
9327
9356
|
React.createElement('span', { className: 'dsm-trash-pane-group-title', title: g.note }, g.title),
|
|
9328
|
-
React.createElement('span', { className: 'dsm-count' },
|
|
9357
|
+
React.createElement('span', { className: 'dsm-count' }, String(list.length))) : null,
|
|
9329
9358
|
d.error ? React.createElement('div', { className: 'dsm-feedback dsm-error', role: 'alert' }, d.error) : null,
|
|
9330
9359
|
list.length ? bulkRow(g) : null,
|
|
9331
9360
|
d.loading
|
|
@@ -9407,7 +9436,7 @@ function enabledMemoryCount(rules) {
|
|
|
9407
9436
|
key: 'trash-modal',
|
|
9408
9437
|
title: React.createElement('span', { className: 'dsm-modal-title-row' },
|
|
9409
9438
|
props.title || t('trash.title'),
|
|
9410
|
-
totalReady ? React.createElement('span', { className: 'dsm-count' },
|
|
9439
|
+
totalReady ? React.createElement('span', { className: 'dsm-count' }, String(totalCount)) : null),
|
|
9411
9440
|
closeLabel: t('btn.close'),
|
|
9412
9441
|
list: true,
|
|
9413
9442
|
className: 'dsm-modal-list dsm-modal-trash' + (split ? ' dsm-modal-trash-split' : ''),
|
|
@@ -9625,7 +9654,7 @@ function enabledMemoryCount(rules) {
|
|
|
9625
9654
|
},
|
|
9626
9655
|
h(CaretIcon, { key: 'caret', open: open, className: 'dsm-pick-caret' }),
|
|
9627
9656
|
h('span', { className: 'dsm-pick-group-name', title: g.name }, g.name),
|
|
9628
|
-
h('span', { className: 'dsm-pick-group-count' },
|
|
9657
|
+
h('span', { className: 'dsm-pick-group-count' }, String(g.rows.length))) : null,
|
|
9629
9658
|
open ? g.rows.map(function (it) {
|
|
9630
9659
|
return pickRow({ key: it.key, checked: picked.indexOf(it.key) >= 0, name: it.name, desc: it.desc, descTitle: it.descTitle || it.desc, onChange: function () { toggle(it.key) } })
|
|
9631
9660
|
}) : null)
|
|
@@ -10559,7 +10588,7 @@ function enabledMemoryCount(rules) {
|
|
|
10559
10588
|
var baseOpen = openFlag === undefined ? bulkTargets(root.key).some(function (x) { return x.on }) : !!openFlag;
|
|
10560
10589
|
var open = baseOpen || !!dq;
|
|
10561
10590
|
var rootCount = root.count == null ? root.skills.length : root.count;
|
|
10562
|
-
var section = h("section", { key: root.key, className: "dsm-source" }, h("div", { className: "dsm-source-head dsm-source-head-pin" }, h("button", { type: "button", className: "dsm-source-head-main", "aria-expanded": open, onClick: function () { setExpanded(Object.assign({}, expanded, { [root.key]: !baseOpen })); } }, h("span", { className: "dsm-source-title", title: displayName }, displayName), h("span", { className: "dsm-count" },
|
|
10591
|
+
var section = h("section", { key: root.key, className: "dsm-source" }, h("div", { className: "dsm-source-head dsm-source-head-pin" }, h("button", { type: "button", className: "dsm-source-head-main", "aria-expanded": open, onClick: function () { setExpanded(Object.assign({}, expanded, { [root.key]: !baseOpen })); } }, h("span", { className: "dsm-source-title", title: displayName }, displayName), h("span", { className: "dsm-count" }, String(rootCount)), h("span", { className: "dsm-tag " + (root.scope === "project" ? "dsm-tag-on" : root.defaultSource === true ? "" : root.enabled ? "dsm-tag-on" : "") }, root.scope === "project" ? t("status.project") : root.defaultSource === true ? t("status.manageable") : t(root.enabled ? "status.source.on" : "status.source.off")), root.scope === "project" ? h("span", { className: "dsm-tag" }, t("status.rank", { rank: root.rank })) : null, h("span", { className: "dsm-path", title: root.path }, root.path)), (function () {
|
|
10563
10592
|
// 目录级「全选 / 取消全选」(用户裁定 2026-09-17):只作用于**这个目录下当前
|
|
10564
10593
|
// 可见且可切换**的技能 —— 与页头那颗同一套目标集逻辑(bulkTargets 传 rootKey),
|
|
10565
10594
|
// 同名技能只算生效的那一个(被覆盖的副本跳过)。
|
|
@@ -11303,7 +11332,7 @@ function enabledMemoryCount(rules) {
|
|
|
11303
11332
|
React.createElement(RowCheck, { checked: allChecked, label: t('hist.selectGroup', { title: g.title }), onChange: function () { toggleGroup(g.key, groupIds) } }),
|
|
11304
11333
|
React.createElement('button', { type: 'button', className: 'dsm-source-head-main', 'aria-expanded': open, onClick: function () { toggleGroupCollapse(g.key, baseOpen) } },
|
|
11305
11334
|
React.createElement('span', { className: 'dsm-source-title dsm-hist-group-title', title: g.title }, g.title),
|
|
11306
|
-
React.createElement('span', { className: 'dsm-count' },
|
|
11335
|
+
React.createElement('span', { className: 'dsm-count' }, String(g.items.length))),
|
|
11307
11336
|
// 目录已被删除(dirMissing)时:既不给「重新登记」入口,也不再并列「已移除」标签 ——
|
|
11308
11337
|
// 只留一枚醒目告警,明确告诉用户这个工作区的磁盘文件夹已经不存在了
|
|
11309
11338
|
// (用户 2026-10-12:「如果工作区已经被删除应该不能恢复……要怎么及时知道这个工作区
|
|
@@ -11475,7 +11504,7 @@ function enabledMemoryCount(rules) {
|
|
|
11475
11504
|
React.createElement('button', { type: 'button', className: 'dsm-pick-group-head', 'aria-expanded': open ? 'true' : 'false', onClick: function () { toggleGroupCollapse(key, open) } },
|
|
11476
11505
|
React.createElement(CaretIcon, { open: open, className: 'dsm-pick-caret' }),
|
|
11477
11506
|
React.createElement('span', { className: 'dsm-pick-group-name', title: g.cwd || t('hist.ungrouped') }, g.cwd || t('hist.ungrouped')),
|
|
11478
|
-
React.createElement('span', { className: 'dsm-pick-group-count' },
|
|
11507
|
+
React.createElement('span', { className: 'dsm-pick-group-count' }, String(g.rows.length))),
|
|
11479
11508
|
open ? g.rows.map(function (it) {
|
|
11480
11509
|
// 导出列表整行可点勾选(REDESIGN §5.1,切片五):RowSelect 本尊,
|
|
11481
11510
|
// 目录走 desc 槽(缺目录的带 ⚠),归档态标签走 meta 槽。
|
|
@@ -11626,6 +11655,16 @@ function enabledMemoryCount(rules) {
|
|
|
11626
11655
|
var sceneForm = sfs[0], setSceneForm = sfs[1]
|
|
11627
11656
|
// 切走这一页 → 场景编辑器关窗时那份暂存作废(见 42-shared-ui.js 的 useFormDraftScope)。
|
|
11628
11657
|
useFormDraftScope('scene:')
|
|
11658
|
+
// 「新建记忆」子弹窗误关后的暂存槽(用户 2026-10-17:编辑器里那颗「创建」点开写完,
|
|
11659
|
+
// 手一滑点到背板就全没了,而记忆页 / 技能页都有 30 秒兜底)。
|
|
11660
|
+
// key 跟着**这次编辑的是哪个场景**走(`modal.draftKey` 就是 `scene:create` /
|
|
11661
|
+
// `scene:edit:<名字>`):固定一个槽会让「在 A 里关掉、到 B 里点创建」取回 A 的草稿。
|
|
11662
|
+
// 新建 / 编辑**两个槽分开** —— takeFormDraft 是取回即销账,共用一个槽的话,
|
|
11663
|
+
// 先误关一条编辑中的、再去点「创建」,那份就会被当成"不是新建"而白白丢掉。
|
|
11664
|
+
// 前缀仍是 `scene:`,切走这一页照旧整组作废。
|
|
11665
|
+
function memNewDraftKey(editing) {
|
|
11666
|
+
return String((modal && modal.draftKey) || 'scene:create') + (editing ? ':memedit' : ':memnew')
|
|
11667
|
+
}
|
|
11629
11668
|
var pos = React.useState([])
|
|
11630
11669
|
var presetOptions = pos[0], setPresetOptions = pos[1]
|
|
11631
11670
|
// 当前**生效中**的提示词预设 id(`agentsmd-list` 里 active 的那份)。预览卡要用它把
|
|
@@ -12330,18 +12369,30 @@ function enabledMemoryCount(rules) {
|
|
|
12330
12369
|
}
|
|
12331
12370
|
function openMemoryCreate() {
|
|
12332
12371
|
if (!memoryCreateReady()) return
|
|
12372
|
+
// 30 秒内重开:把刚才误关掉的那份填回来(与记忆页 / 技能页同一套,见
|
|
12373
|
+
// 42-shared-ui.js 的 stashFormDraft)。只认"新建"那一槽。
|
|
12374
|
+
var draft = takeFormDraft(memNewDraftKey(false))
|
|
12333
12375
|
// `editing` = 这一窗改的是第几条草稿;null = 新建一条。
|
|
12334
|
-
setMemNew(
|
|
12376
|
+
setMemNew(draft
|
|
12377
|
+
? Object.assign({}, draft, { editing: null, error: null })
|
|
12378
|
+
: { editing: null, name: '', description: '', body: '', form: 'flat', files: [], error: null })
|
|
12335
12379
|
}
|
|
12336
12380
|
/** 改一条待创建的记忆:草稿回填进弹窗,保存时**替换**原来那条,而不是又添一条。 */
|
|
12337
12381
|
function openMemoryEdit(index) {
|
|
12338
12382
|
if (!modal || modal.type !== 'scene-editor') return
|
|
12339
12383
|
var m = (modal.pendingMems || [])[index]
|
|
12340
12384
|
if (!m) return
|
|
12341
|
-
|
|
12342
|
-
|
|
12343
|
-
|
|
12344
|
-
|
|
12385
|
+
// 同一份草稿被误关掉:30 秒内重开填回改了一半的内容。索引会随「删掉别的草稿」
|
|
12386
|
+
// 漂移,所以连**目标名**一起核对 —— 只认索引与名字都对得上的那一份,否则宁可
|
|
12387
|
+
// 从 `pendingMems` 重读,也不能把 A 改了一半的内容塞进 B 的弹窗里。
|
|
12388
|
+
var draft = takeFormDraft(memNewDraftKey(true))
|
|
12389
|
+
var restore = draft && draft.editing === index && draft.linkedName === m.name ? draft : null
|
|
12390
|
+
setMemNew(restore
|
|
12391
|
+
? Object.assign({}, restore, { editing: index, error: null })
|
|
12392
|
+
: {
|
|
12393
|
+
editing: index, name: m.name, description: m.description || '', body: m.body || '',
|
|
12394
|
+
form: m.form || 'flat', files: (m.files || []).slice(), error: null,
|
|
12395
|
+
})
|
|
12345
12396
|
}
|
|
12346
12397
|
/** 撤掉一条还没落盘的记忆草稿。 */
|
|
12347
12398
|
function dropPendingMemory(index) {
|
|
@@ -12513,7 +12564,21 @@ function enabledMemoryCount(rules) {
|
|
|
12513
12564
|
// 改草稿时标题与主按钮换成「编辑 / 保存」那一套(与记忆页同词条)——否则同一个弹窗
|
|
12514
12565
|
// 在"新建"和"改一条已存在的东西"两种语义下长得一模一样,用户分不清点下去会加一条还是改一条。
|
|
12515
12566
|
var editing = memNew.editing != null
|
|
12516
|
-
|
|
12567
|
+
// 关掉 ≠ 丢掉(与记忆页的 closeEditor 同一条口径):只有误关这条路进暂存 ——
|
|
12568
|
+
// 提交成功走 stageMemoryDraft,它不经过 onClose,所以不会存下一份已经用掉的草稿。
|
|
12569
|
+
// 编辑态额外记 `linkedName`:`editing` 是数组下标,期间删掉别的草稿就会漂移,
|
|
12570
|
+
// 取回时两个都对得上才认(见 openMemoryEdit)。
|
|
12571
|
+
var closeMemoryCreate = function () {
|
|
12572
|
+
var pending = (modal.pendingMems || [])[memNew.editing]
|
|
12573
|
+
stashFormDraft(memNewDraftKey(editing), {
|
|
12574
|
+
editing: editing ? memNew.editing : null,
|
|
12575
|
+
linkedName: editing && pending ? pending.name : null,
|
|
12576
|
+
name: memNew.name || '', description: memNew.description || '', body: memNew.body || '',
|
|
12577
|
+
form: memNew.form || 'flat', files: (memNew.files || []).slice(),
|
|
12578
|
+
})
|
|
12579
|
+
setMemNew(null)
|
|
12580
|
+
}
|
|
12581
|
+
return React.createElement(Modal, { key: 'memnew', className: 'dsm-modal-compact', title: editing ? t('memory.edit.title') : t('memory.create.title'), closeLabel: t('btn.close'), onClose: closeMemoryCreate },
|
|
12517
12582
|
React.createElement('div', { className: 'dsm-form' },
|
|
12518
12583
|
React.createElement('label', { className: 'dsm-field' },
|
|
12519
12584
|
React.createElement('span', { className: 'dsm-label' }, t('memory.field.group')),
|