dsh-custom-mode 1.13.0 → 2.0.0
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 +2 -2
- package/README.md +2 -2
- package/README.zh.md +3 -3
- package/client.js +256 -203
- package/composition.mjs +29 -0
- package/index.mjs +95 -8
- package/locales.mjs +163 -144
- package/package.json +2 -1
- package/postures.mjs +74 -0
- package/preset/postures/chat.en.md +7 -0
- package/preset/postures/chat.zh.md +7 -0
- package/preset/postures/write.en.md +7 -0
- package/preset/postures/write.zh.md +7 -0
package/locales.mjs
CHANGED
|
@@ -20,7 +20,14 @@ export const zh = {
|
|
|
20
20
|
|
|
21
21
|
// ── 助手管理 ──────────────────────────────────────────────────────────────
|
|
22
22
|
'assistant.heading': '助手',
|
|
23
|
-
'assistant.hint': '
|
|
23
|
+
'assistant.hint': '每个助手单独保存系统提示词、基础模式和插件开关。',
|
|
24
|
+
'posture.hint': '只用于新建,不改变当前助手。',
|
|
25
|
+
'posture.develop.label': '开发',
|
|
26
|
+
'posture.develop.note': '新建后:标准模式,工具按出厂。',
|
|
27
|
+
'posture.write.label': '写作',
|
|
28
|
+
'posture.write.note': '新建后:终端关闭,文件读写打开。',
|
|
29
|
+
'posture.chat.label': '聊天',
|
|
30
|
+
'posture.chat.note': '新建后:文件和终端关闭。',
|
|
24
31
|
'assistant.empty': '还没有助手,用下面的输入框新建一个。',
|
|
25
32
|
'assistant.loadingList': '正在读取助手列表…',
|
|
26
33
|
'assistant.newPlaceholder': '新助手的名字(例如:写作助手)',
|
|
@@ -29,39 +36,40 @@ export const zh = {
|
|
|
29
36
|
// 带上具体行数:只说「有问题」用户不知道有多严重,也不知道修完会怎样。
|
|
30
37
|
'assistant.brokenRows': '{count} 行在本机不可用',
|
|
31
38
|
// 悬停时给出的完整解释(Tag 的 title)。
|
|
32
|
-
'assistant.brokenHint': '
|
|
39
|
+
'assistant.brokenHint': '此模式在本机无法启动,不会出现在新会话菜单里。点「按本线修复」只关闭那些行。',
|
|
33
40
|
'assistant.switchHint': '切换助手保留各自的未保存草稿;列表中的「未保存」标记即为此。',
|
|
34
41
|
'btn.create': '新增助手',
|
|
42
|
+
'create.heading': '新建',
|
|
35
43
|
'btn.creating': '创建中…',
|
|
36
|
-
'btn.duplicate': '
|
|
44
|
+
'btn.duplicate': '复制',
|
|
37
45
|
'btn.moveUp': '上移',
|
|
38
46
|
'btn.moveDown': '下移',
|
|
39
|
-
'btn.import': '
|
|
40
|
-
'btn.export': '
|
|
41
|
-
'btn.reset': '
|
|
42
|
-
'btn.resetHint': '
|
|
43
|
-
'btn.delete': '
|
|
47
|
+
'btn.import': '导入',
|
|
48
|
+
'btn.export': '导出',
|
|
49
|
+
'btn.reset': '恢复出厂',
|
|
50
|
+
'btn.resetHint': '把编辑器换回此助手新建时保存的提示词。只改草稿,保存后才写入。',
|
|
51
|
+
'btn.delete': '删除',
|
|
44
52
|
'btn.cancel': '取消',
|
|
45
|
-
'msg.created': '
|
|
53
|
+
'msg.created': '已创建。刷新后,新会话的模式菜单里会出现它。',
|
|
46
54
|
'msg.duplicated': '已复制。两份配置彼此独立。',
|
|
47
55
|
'msg.deleted': '已删除。',
|
|
48
56
|
'msg.createFailed': '创建失败',
|
|
49
57
|
'msg.deleteFailed': '删除失败',
|
|
50
58
|
'msg.nameRequired': '请先给新助手起个名字。',
|
|
51
59
|
'msg.readOnlyHint': '仅管理本插件创建的助手;手写 preset 不计入,也不会被改写。',
|
|
52
|
-
'msg.reordered': '
|
|
60
|
+
'msg.reordered': '顺序已保存。新会话的模式菜单按此排列。',
|
|
53
61
|
'msg.reorderFailed': '调整顺序失败',
|
|
54
|
-
'msg.imported': '
|
|
62
|
+
'msg.imported': '已导入到编辑器。尚未保存。',
|
|
55
63
|
'msg.importFailed': '导入失败',
|
|
56
64
|
'api.badDirection': '未知的排序方向:{direction}',
|
|
57
|
-
'api.unknownAssistant': '找不到助手「{id}
|
|
65
|
+
'api.unknownAssistant': '找不到助手「{id}」。此页只管理本插件创建的助手。',
|
|
58
66
|
'api.alreadyFirst': '「{name}」已经在最前面。',
|
|
59
67
|
'api.alreadyLast': '「{name}」已经在最后面。',
|
|
60
|
-
'api.badVariableName': '
|
|
61
|
-
'api.unknownVariable': '{variable}
|
|
62
|
-
'mode.unavailable': '
|
|
63
|
-
'rows.unavailable': '
|
|
64
|
-
'mode.pendingRows': '基础模式已改为「{mode}
|
|
68
|
+
'api.badVariableName': '变量 {variable} 不合法。名字用小写字母、数字和下划线,且以字母开头。',
|
|
69
|
+
'api.unknownVariable': '{variable} 不能使用。可用:{known}。',
|
|
70
|
+
'mode.unavailable': '本机读不到出厂组成,基础模式暂不能切换。',
|
|
71
|
+
'rows.unavailable': '本机读不到出厂组成,插件开关暂不能改。磁盘上的现有设置仍然有效。',
|
|
72
|
+
'mode.pendingRows': '基础模式已改为「{mode}」。保存后,工具底换成这套官方预设。',
|
|
65
73
|
'aria.expand': '展开详情',
|
|
66
74
|
'aria.collapse': '收起详情',
|
|
67
75
|
'detail.id': '行 id',
|
|
@@ -78,18 +86,20 @@ export const zh = {
|
|
|
78
86
|
'btn.repair': '按本线修复',
|
|
79
87
|
'msg.repaired': '已修复',
|
|
80
88
|
'meta.version': '插件版本',
|
|
81
|
-
'meta.versionHint': '
|
|
82
|
-
'api.saved': '已保存({name}
|
|
83
|
-
'api.savedWithExclusiveRows': '已保存({name}
|
|
84
|
-
'api.created': '已创建「{name}
|
|
89
|
+
'meta.versionHint': '未钉版本时,可能装到较旧的发布。要换版本,按 README 钉版本重装,然后重启。',
|
|
90
|
+
'api.saved': '已保存({name},{mode})。新会话使用新配置,当前会话不变。',
|
|
91
|
+
'api.savedWithExclusiveRows': '已保存({name},{mode})。已关闭不能同时启用的行:{rows}。',
|
|
92
|
+
'api.created': '已创建「{name}」。刷新后,新会话的模式菜单里会出现它。',
|
|
85
93
|
'api.savedPrompt': '已保存系统提示词({name})。下一步模型调用即生效。',
|
|
86
|
-
'api.duplicated': '
|
|
87
|
-
'api.deleted': '已删除「{name}
|
|
88
|
-
'api.reordered': '
|
|
94
|
+
'api.duplicated': '已从「{from}」复制。两份互不影响。',
|
|
95
|
+
'api.deleted': '已删除「{name}」。正在使用它的会话不受影响。',
|
|
96
|
+
'api.reordered': '顺序已保存。新会话的模式菜单按此排列。',
|
|
89
97
|
'api.nameRequired': '请先给新助手起个名字。',
|
|
98
|
+
'api.postureUnknown': '没有这个起步:{posture}。',
|
|
99
|
+
'api.posturePromptMissing': '读不到「{posture}」的起步提示词。',
|
|
90
100
|
'api.nameTooLong': '名字太长了(上限 {max} 个字符)。',
|
|
91
101
|
'api.descriptionTooLong': '描述太长了(上限 {max} 个字符)。',
|
|
92
|
-
'api.promptEmpty': '
|
|
102
|
+
'api.promptEmpty': '不能保存空的系统提示词。',
|
|
93
103
|
'api.badMode': '未知的基础模式:{mode}',
|
|
94
104
|
'api.dirExists': '目录已存在,请换一个名字:{path}',
|
|
95
105
|
'api.compositionMissing': '找不到组成文件:{path}',
|
|
@@ -99,67 +109,67 @@ export const zh = {
|
|
|
99
109
|
'api.selfCheckFailed': '生成结果自检失败,已放弃写入:{detail}',
|
|
100
110
|
'api.internalError': '宿主内部错误:{detail}',
|
|
101
111
|
'api.bodyTooLarge': '请求体过大(上限 {max} 字节)',
|
|
102
|
-
'api.repairNotNeeded': '
|
|
103
|
-
'api.repaired': '
|
|
112
|
+
'api.repairNotNeeded': '没有需要修复的行。',
|
|
113
|
+
'api.repaired': '已关闭 {count} 个本机无法启动的行({ids})。',
|
|
104
114
|
'api.badAssistantId': '助手标识不合法:{id}(只能用 a-z、0-9 与连字符)',
|
|
105
115
|
'api.seedFailed': '复制模式模板失败:{detail}',
|
|
106
116
|
'api.metaWriteFailed': '写入 preset.yml 失败:{detail}',
|
|
107
117
|
'api.promptReadFailed': '读取提示词失败:{detail}',
|
|
108
|
-
'api.noRemoveApi': '
|
|
109
|
-
'api.noDirectory': '
|
|
118
|
+
'api.noRemoveApi': '当前版本无法删除助手。',
|
|
119
|
+
'api.noDirectory': '删除失败:磁盘上已没有这个目录。刷新后再试。',
|
|
110
120
|
'api.deleteFailed': '删除失败:{detail}',
|
|
111
121
|
'api.versionMissing': '找不到这个版本(历史可能已被上限裁剪)。',
|
|
112
122
|
'api.badJson': '请求体不是合法 JSON',
|
|
113
|
-
'api.savedPromptOnly': '
|
|
114
|
-
'api.baseCompositionUnavailable': '
|
|
115
|
-
'warn.approvalGateMissing': '
|
|
116
|
-
'warn.unresolvableRows': '
|
|
117
|
-
'warn.presetBroken': '
|
|
118
|
-
'warn.badPromptVariable': '
|
|
119
|
-
'warn.duplicateRowIds': '组成文件里有重复的行 id
|
|
120
|
-
'warn.predicateFailed': '
|
|
121
|
-
'warn.exclusiveRowsActive': '
|
|
122
|
-
'warn.baseCompositionUnavailable': '
|
|
123
|
-
'warn.personaOffWithPrompt': '
|
|
124
|
-
'warn.toolOff': '
|
|
125
|
-
'warn.noDescription': '
|
|
126
|
-
'warn.noName': '
|
|
123
|
+
'api.savedPromptOnly': '已保存系统提示词。基础模式和插件开关未改。',
|
|
124
|
+
'api.baseCompositionUnavailable': '读不到基础模式「{mode}」的出厂组成。开关未改。系统提示词可以单独保存。',
|
|
125
|
+
'warn.approvalGateMissing': '当前版本没有审批事件。会话内改写提示词不会请求确认。',
|
|
126
|
+
'warn.unresolvableRows': '有的行在本机无法启动,此模式不会出现在新会话菜单里。点「按本线修复」只关闭那些行。',
|
|
127
|
+
'warn.presetBroken': '此模式无法启动,不会出现在新会话菜单里。点「按本线修复」。原因见下一行。',
|
|
128
|
+
'warn.badPromptVariable': '提示词里有不可用的变量。改掉后再保存,否则此模式的请求会失败。',
|
|
129
|
+
'warn.duplicateRowIds': '组成文件里有重复的行 id。开关只作用于第一处。',
|
|
130
|
+
'warn.predicateFailed': '有一行的平台条件无法计算,已按关闭处理。',
|
|
131
|
+
'warn.exclusiveRowsActive': '两套终端不能同时打开,否则此模式无法启动。保存时会关掉其中一套。',
|
|
132
|
+
'warn.baseCompositionUnavailable': '读不到出厂组成。基础模式和插件开关暂不能改。系统提示词仍可保存。',
|
|
133
|
+
'warn.personaOffWithPrompt': '「身份」已关闭,这段提示词不会生效。',
|
|
134
|
+
'warn.toolOff': 'custom_prompt 已关闭。会话里不能改提示词,只能在此页改。',
|
|
135
|
+
'warn.noDescription': '没有描述时,模式菜单显示「暂无描述」。',
|
|
136
|
+
'warn.noName': '没有名字时,模式菜单显示目录 id。',
|
|
127
137
|
'history.label': '改动历史',
|
|
128
|
-
'history.pick': '
|
|
129
|
-
'history.load': '
|
|
130
|
-
'history.hint': '
|
|
131
|
-
'history.by.settings': '
|
|
132
|
-
'history.by.external': '
|
|
138
|
+
'history.pick': '选择版本…',
|
|
139
|
+
'history.load': '载入',
|
|
140
|
+
'history.hint': '载入只改草稿。保存后才写入。',
|
|
141
|
+
'history.by.settings': '此页保存',
|
|
142
|
+
'history.by.external': '外部改动',
|
|
133
143
|
'msg.loadFailed': '载入这一版失败',
|
|
134
144
|
'msg.importEmpty': '这个文件是空的。',
|
|
135
145
|
'msg.importTooLarge': '文件太大(上限 1MB)。',
|
|
136
146
|
'msg.exported': '已导出为文件。',
|
|
137
147
|
'msg.exportFailed': '导出失败',
|
|
138
|
-
'delete.title': '
|
|
139
|
-
'delete.description': '
|
|
140
|
-
'delete.acknowledge': '
|
|
141
|
-
'delete.confirm': '
|
|
148
|
+
'delete.title': '删除「{name}」?',
|
|
149
|
+
'delete.description': '将删除此助手的目录和系统提示词,不能撤销。正在使用它的会话不受影响。',
|
|
150
|
+
'delete.acknowledge': '我知道提示词会被删除',
|
|
151
|
+
'delete.confirm': '删除',
|
|
142
152
|
'delete.close': '关闭',
|
|
143
|
-
'delete.plainConfirm': '
|
|
153
|
+
'delete.plainConfirm': '删除「{name}」?不能撤销。',
|
|
144
154
|
|
|
145
|
-
'name.heading': '
|
|
146
|
-
'name.hint': '
|
|
155
|
+
'name.heading': '名称',
|
|
156
|
+
'name.hint': '显示在模式菜单里。内部标识不变。',
|
|
147
157
|
'name.placeholder': '自定义模式',
|
|
148
|
-
'name.descriptionPlaceholder': '
|
|
158
|
+
'name.descriptionPlaceholder': '描述,显示在模式菜单里,可留空',
|
|
149
159
|
|
|
150
160
|
'mode.heading': '基础模式',
|
|
151
|
-
'mode.hint': '
|
|
161
|
+
'mode.hint': '选一套官方预设作为工具底。提示词以本页为准。',
|
|
152
162
|
|
|
153
163
|
'rows.heading': '插件开关',
|
|
154
|
-
'rows.filterPlaceholder': '
|
|
155
|
-
'cap.heading': '
|
|
156
|
-
'cap.expand': '
|
|
157
|
-
'cap.collapse': '
|
|
158
|
-
'cap.hint': '
|
|
159
|
-
'rows.hint': '
|
|
164
|
+
'rows.filterPlaceholder': '按名称或 id 筛选',
|
|
165
|
+
'cap.heading': '插件开关',
|
|
166
|
+
'cap.expand': '显示插件开关',
|
|
167
|
+
'cap.collapse': '隐藏插件开关',
|
|
168
|
+
'cap.hint': '关闭的行,这个助手不会使用。',
|
|
169
|
+
'rows.hint': '关闭的行,这个助手不会使用。',
|
|
160
170
|
|
|
161
171
|
'prompt.heading': '系统提示词',
|
|
162
|
-
'prompt.hint': '
|
|
172
|
+
'prompt.hint': '保存后,下一步模型调用即生效。',
|
|
163
173
|
|
|
164
174
|
'status.enabled': '已启用',
|
|
165
175
|
'status.disabled': '已停用',
|
|
@@ -176,14 +186,14 @@ export const zh = {
|
|
|
176
186
|
'msg.unsaved': '有未保存的修改',
|
|
177
187
|
'msg.readFailed': '读取失败',
|
|
178
188
|
'msg.saveFailed': '保存失败',
|
|
179
|
-
'msg.saved': '
|
|
189
|
+
'msg.saved': '已保存。新会话使用新配置,当前会话不变。',
|
|
180
190
|
// 把「一句已翻译的话 + 一个底层细节」拼起来时,中间那个标点也必须**按语言**走 ——
|
|
181
191
|
// 硬编码全角冒号会让英文界面在出错那一刻出现中文标点(issue #7)。
|
|
182
192
|
'status.detail': '{message}:{detail}',
|
|
183
193
|
|
|
184
194
|
// ── row labels ────────────────────────────────────────────────────────────
|
|
185
195
|
'row.persona.label': '身份(系统提示词)',
|
|
186
|
-
'row.persona.note': '
|
|
196
|
+
'row.persona.note': '关闭后,此提示词不会生效。',
|
|
187
197
|
'row.custom-prompt-tool.label': 'custom_prompt 工具',
|
|
188
198
|
'row.custom-prompt-tool.note': '关掉后无法用对话改提示词(设置页仍可用)',
|
|
189
199
|
'row.agent-instructions.label': '项目指令 AGENTS.md',
|
|
@@ -195,7 +205,7 @@ export const zh = {
|
|
|
195
205
|
'row.tool-fs-search.label': '文件搜索(glob/grep)',
|
|
196
206
|
'row.tool-jobs.label': '后台任务',
|
|
197
207
|
'row.planning.label': '计划模式(分组)',
|
|
198
|
-
'row.planning.note': '
|
|
208
|
+
'row.planning.note': '关闭后,计划能力一并去掉。',
|
|
199
209
|
'row.plan-mode.label': '计划模式实现',
|
|
200
210
|
'row.compaction.label': '上下文压缩(分组)',
|
|
201
211
|
'row.compaction.note': '含 isolate realm',
|
|
@@ -203,7 +213,7 @@ export const zh = {
|
|
|
203
213
|
'row.command-compact.label': '/compact 命令',
|
|
204
214
|
'row.tool-result-pruner.label': '工具结果裁剪',
|
|
205
215
|
'row.delegation.label': '委派与工作流(分组)',
|
|
206
|
-
'row.delegation.note': '
|
|
216
|
+
'row.delegation.note': '关闭后,子代理和工作流一并去掉。',
|
|
207
217
|
'row.tool-subagent.label': '子代理(spawn)',
|
|
208
218
|
'row.tool-subagent-fork.label': '子代理(fork)',
|
|
209
219
|
'row.tool-subagent-control.label': '子代理控制',
|
|
@@ -213,7 +223,7 @@ export const zh = {
|
|
|
213
223
|
'row.tool-subagent-claude-code.label': 'Claude Code 子代理',
|
|
214
224
|
'row.tool-subagent-claude-code.note': '需要先安装对应 Bundle 才能用;出厂状态见「详情」',
|
|
215
225
|
'row.time-context.label': '时间上下文(模型看得到时间)',
|
|
216
|
-
'row.time-context.note': '
|
|
226
|
+
'row.time-context.note': '在部分步骤附上当前时间。',
|
|
217
227
|
'row.tool-schedule.label': '定时提醒工具',
|
|
218
228
|
'row.tool-schedule.note': '让 agent 创建/列出/修改/删除持久提醒;存储与投递由宿主的 schedule 服务负责',
|
|
219
229
|
'row.workflow-ptc.label': '工作流引擎',
|
|
@@ -228,7 +238,7 @@ export const zh = {
|
|
|
228
238
|
'row.tool-cordis.label': 'Cordis 运行时工具',
|
|
229
239
|
'row.tool-cordis.note': '可读写 harness 运行时',
|
|
230
240
|
'row.tool-plugin-manager.label': '插件管理(安装 / 启停)',
|
|
231
|
-
'row.tool-plugin-manager.note': '
|
|
241
|
+
'row.tool-plugin-manager.note': '供模型安装或开关插件。',
|
|
232
242
|
'row.tool-presentation.label': 'PTC 工具呈现',
|
|
233
243
|
'row.present.label': '交付文件(present)',
|
|
234
244
|
'row.command-goal.label': '目标命令',
|
|
@@ -250,15 +260,15 @@ export const zh = {
|
|
|
250
260
|
// 本仓此前把 cordis 写「Cordis 模式」,而同一份词典的 `base.all.note` 又写「创造模式」——
|
|
251
261
|
// 同一个模式在一页里有两个名字。英文侧四个名字此前都缺官方的 " mode" 后缀。
|
|
252
262
|
'base.standard.label': '标准模式',
|
|
253
|
-
'base.standard.note': '
|
|
263
|
+
'base.standard.note': '出厂的完整工具集。',
|
|
254
264
|
'base.ptc.label': 'PTC 模式',
|
|
255
|
-
'base.ptc.note': '
|
|
265
|
+
'base.ptc.note': '标准模式,另开 PTC 工具呈现。',
|
|
256
266
|
'base.minimal.label': '极简模式',
|
|
257
|
-
'base.minimal.note': '只有 Shell
|
|
267
|
+
'base.minimal.note': '只有 Shell 与终端。提示词仍以本页为准。',
|
|
258
268
|
'base.cordis.label': '创造模式',
|
|
259
|
-
'base.cordis.note': '
|
|
269
|
+
'base.cordis.note': '标准模式,另开 Cordis 运行时工具。',
|
|
260
270
|
'base.all.label': '全部出厂行',
|
|
261
|
-
'base.all.note': '
|
|
271
|
+
'base.all.note': '四套官方预设的行合在一处,均可开关。',
|
|
262
272
|
}
|
|
263
273
|
|
|
264
274
|
/** English dictionary; the parity test keeps its key set equal to {@link zh}. */
|
|
@@ -267,47 +277,54 @@ export const en = {
|
|
|
267
277
|
|
|
268
278
|
// ── assistant management ──────────────────────────────────────────────────
|
|
269
279
|
'assistant.heading': 'Assistants',
|
|
270
|
-
'assistant.hint':
|
|
271
|
-
|
|
280
|
+
'assistant.hint': 'Each assistant keeps its own system prompt, base mode and plugin switches.',
|
|
281
|
+
'posture.hint': 'Applies only to the assistant you are about to create.',
|
|
282
|
+
'posture.develop.label': 'Coding',
|
|
283
|
+
'posture.develop.note': 'After create: Standard, tools as shipped.',
|
|
284
|
+
'posture.write.label': 'Writing',
|
|
285
|
+
'posture.write.note': 'After create: terminal off, file access on.',
|
|
286
|
+
'posture.chat.label': 'Chat',
|
|
287
|
+
'posture.chat.note': 'After create: files and terminal off.',
|
|
272
288
|
'assistant.empty': 'No assistants yet — create one with the field below.',
|
|
273
289
|
'assistant.loadingList': 'Loading assistants…',
|
|
274
290
|
'assistant.newPlaceholder': 'Name of the new assistant (e.g. Writing assistant)',
|
|
275
291
|
'assistant.copyName': '{name} (copy)',
|
|
276
292
|
'assistant.broken': 'Will not start here',
|
|
277
293
|
'assistant.brokenRows': '{count} row(s) unusable here',
|
|
278
|
-
'assistant.brokenHint': '
|
|
294
|
+
'assistant.brokenHint': 'This mode cannot start here, so it will not appear for a new session. Fix for this line turns off only those rows.',
|
|
279
295
|
'assistant.switchHint': 'Switching assistants keeps each draft; the "Unsaved" marker in the list is exactly that.',
|
|
280
296
|
'btn.create': 'New assistant',
|
|
297
|
+
'create.heading': 'New assistant',
|
|
281
298
|
'btn.creating': 'Creating…',
|
|
282
299
|
'btn.duplicate': 'Duplicate',
|
|
283
300
|
'btn.moveUp': 'Move up',
|
|
284
301
|
'btn.moveDown': 'Move down',
|
|
285
|
-
'btn.import': 'Import
|
|
286
|
-
'btn.export': 'Export
|
|
287
|
-
'btn.reset': '
|
|
288
|
-
'btn.resetHint': '
|
|
289
|
-
'btn.delete': 'Delete
|
|
302
|
+
'btn.import': 'Import',
|
|
303
|
+
'btn.export': 'Export',
|
|
304
|
+
'btn.reset': 'Factory prompt',
|
|
305
|
+
'btn.resetHint': 'Restores the prompt saved when this assistant was created. The editor changes. Save writes it.',
|
|
306
|
+
'btn.delete': 'Delete',
|
|
290
307
|
'btn.cancel': 'Cancel',
|
|
291
|
-
'msg.created': 'Created.
|
|
308
|
+
'msg.created': 'Created. Refresh once, then it appears in the mode menu for a new session.',
|
|
292
309
|
'msg.duplicated': 'Duplicated. The two are independent from here on.',
|
|
293
310
|
'msg.deleted': 'Deleted.',
|
|
294
311
|
'msg.createFailed': 'Could not create',
|
|
295
312
|
'msg.deleteFailed': 'Could not delete',
|
|
296
313
|
'msg.nameRequired': 'Give the new assistant a name first.',
|
|
297
314
|
'msg.readOnlyHint': 'Manages only the assistants this plugin created; a hand-written preset is not listed and is never rewritten.',
|
|
298
|
-
'msg.reordered': 'Order saved
|
|
315
|
+
'msg.reordered': 'Order saved. New sessions list modes in this order.',
|
|
299
316
|
'msg.reorderFailed': 'Could not reorder',
|
|
300
|
-
'msg.imported': 'Imported into the editor
|
|
317
|
+
'msg.imported': 'Imported into the editor. Not saved yet.',
|
|
301
318
|
'msg.importFailed': 'Import failed',
|
|
302
319
|
'api.badDirection': 'Unknown reorder direction: {direction}',
|
|
303
|
-
'api.unknownAssistant': 'No assistant {id}
|
|
320
|
+
'api.unknownAssistant': 'No assistant "{id}". This page only manages assistants it created.',
|
|
304
321
|
'api.alreadyFirst': '{name} is already first.',
|
|
305
322
|
'api.alreadyLast': '{name} is already last.',
|
|
306
|
-
'api.badVariableName': '{variable} is not a valid variable
|
|
307
|
-
'api.unknownVariable': '{variable}
|
|
308
|
-
'mode.unavailable': '
|
|
323
|
+
'api.badVariableName': '{variable} is not a valid variable. Use a lower-case name.',
|
|
324
|
+
'api.unknownVariable': '{variable} cannot be used. Available: {known}.',
|
|
325
|
+
'mode.unavailable': 'No shipped composition is available, so the base mode cannot be changed.',
|
|
309
326
|
'rows.unavailable': 'No shipped composition is available, so the plugin switches cannot be edited right now; the row states already on disk still apply.',
|
|
310
|
-
'mode.pendingRows': 'Base mode
|
|
327
|
+
'mode.pendingRows': 'Base mode is now {mode}. On save, the tool base becomes this shipped preset.',
|
|
311
328
|
'aria.expand': 'Show details',
|
|
312
329
|
'aria.collapse': 'Hide details',
|
|
313
330
|
'detail.id': 'Row id',
|
|
@@ -324,18 +341,20 @@ export const en = {
|
|
|
324
341
|
'btn.repair': 'Fix for this line',
|
|
325
342
|
'msg.repaired': 'Repaired',
|
|
326
343
|
'meta.version': 'Plugin version',
|
|
327
|
-
'meta.versionHint': '
|
|
328
|
-
'api.saved': 'Saved ({name},
|
|
329
|
-
'api.savedWithExclusiveRows': 'Saved ({name},
|
|
330
|
-
'api.created': 'Created {name}.
|
|
344
|
+
'meta.versionHint': 'Without a pinned version, an older release may be installed. To change it, reinstall with the version pin from the README, then restart.',
|
|
345
|
+
'api.saved': 'Saved ({name}, {mode}). New sessions use it. The current session does not change.',
|
|
346
|
+
'api.savedWithExclusiveRows': 'Saved ({name}, {mode}). Turned off rows that cannot be on together: {rows}.',
|
|
347
|
+
'api.created': 'Created {name}. Refresh once, then it appears in the mode menu for a new session.',
|
|
331
348
|
'api.savedPrompt': 'System prompt saved ({name}). It applies on the next model step.',
|
|
332
349
|
'api.duplicated': 'Copied from {from}. The two are independent from now on.',
|
|
333
|
-
'api.deleted': 'Deleted {name}. Sessions already using it
|
|
334
|
-
'api.reordered': 'Order saved
|
|
350
|
+
'api.deleted': 'Deleted {name}. Sessions already using it are unchanged.',
|
|
351
|
+
'api.reordered': 'Order saved. New sessions list modes in this order.',
|
|
335
352
|
'api.nameRequired': 'Give the new assistant a name first.',
|
|
353
|
+
'api.postureUnknown': 'No such starter: {posture}.',
|
|
354
|
+
'api.posturePromptMissing': 'Could not read the starter prompt for {posture}.',
|
|
336
355
|
'api.nameTooLong': 'That name is too long (limit {max} characters).',
|
|
337
356
|
'api.descriptionTooLong': 'That description is too long (limit {max} characters).',
|
|
338
|
-
'api.promptEmpty': '
|
|
357
|
+
'api.promptEmpty': 'An empty system prompt cannot be saved.',
|
|
339
358
|
'api.badMode': 'Unknown base mode: {mode}',
|
|
340
359
|
'api.dirExists': 'That directory already exists — pick another name: {path}',
|
|
341
360
|
'api.compositionMissing': 'Composition file not found: {path}',
|
|
@@ -345,64 +364,64 @@ export const en = {
|
|
|
345
364
|
'api.selfCheckFailed': 'The generated composition failed its self-check, so nothing was written: {detail}',
|
|
346
365
|
'api.internalError': 'Unexpected host error: {detail}',
|
|
347
366
|
'api.bodyTooLarge': 'Request body too large (limit {max} bytes)',
|
|
348
|
-
'api.repairNotNeeded': 'Nothing to repair
|
|
349
|
-
'api.repaired': '
|
|
367
|
+
'api.repairNotNeeded': 'Nothing to repair.',
|
|
368
|
+
'api.repaired': 'Turned off {count} row(s) that cannot start here ({ids}).',
|
|
350
369
|
'api.badAssistantId': 'Invalid assistant id: {id} (a-z, 0-9 and hyphens only)',
|
|
351
370
|
'api.seedFailed': 'Copying the mode template failed: {detail}',
|
|
352
371
|
'api.metaWriteFailed': 'Writing preset.yml failed: {detail}',
|
|
353
372
|
'api.promptReadFailed': 'Reading the prompt failed: {detail}',
|
|
354
|
-
'api.noRemoveApi': 'This
|
|
373
|
+
'api.noRemoveApi': 'This version cannot delete an assistant.',
|
|
355
374
|
'api.noDirectory': "Delete failed: this assistant's directory is gone from disk, so the list on screen is stale. Refresh and try again.",
|
|
356
375
|
'api.deleteFailed': 'Delete failed: {detail}',
|
|
357
376
|
'api.versionMissing': 'That version is gone (the history is capped).',
|
|
358
377
|
'api.badJson': 'The request body is not valid JSON',
|
|
359
|
-
'api.savedPromptOnly': 'System prompt saved
|
|
378
|
+
'api.savedPromptOnly': 'System prompt saved. Base mode and plugin switches were not changed.',
|
|
360
379
|
'api.baseCompositionUnavailable': 'No shipped composition for base mode "{mode}" on this machine, so its plugin switches and base mode cannot be changed (the system prompt can still be saved on its own).',
|
|
361
|
-
'warn.personaOffWithPrompt': '
|
|
362
|
-
'warn.toolOff': '
|
|
363
|
-
'warn.noDescription': '
|
|
364
|
-
'warn.approvalGateMissing': '
|
|
365
|
-
'warn.unresolvableRows': 'Some rows cannot
|
|
366
|
-
'warn.presetBroken': '
|
|
367
|
-
'warn.badPromptVariable': 'The
|
|
368
|
-
'warn.duplicateRowIds': '
|
|
369
|
-
'warn.predicateFailed': 'A platform condition
|
|
370
|
-
'warn.exclusiveRowsActive': '
|
|
371
|
-
'warn.noName': '
|
|
372
|
-
'warn.baseCompositionUnavailable': '
|
|
380
|
+
'warn.personaOffWithPrompt': 'Identity is off, so this prompt has no effect.',
|
|
381
|
+
'warn.toolOff': 'custom_prompt is off. The prompt can be edited on this page only.',
|
|
382
|
+
'warn.noDescription': 'Without a description, the mode menu shows "no description yet".',
|
|
383
|
+
'warn.approvalGateMissing': 'This version has no approval event. In-session prompt edits are not confirmed.',
|
|
384
|
+
'warn.unresolvableRows': 'Some rows cannot start here, so this mode is absent from the new-session menu. Fix for this line turns off only those rows.',
|
|
385
|
+
'warn.presetBroken': 'This mode cannot start, so it will not appear for a new session. Use Fix for this line. The reason is on the next line.',
|
|
386
|
+
'warn.badPromptVariable': 'The prompt uses a variable that is not available. Fix it before saving.',
|
|
387
|
+
'warn.duplicateRowIds': 'A row id is repeated. A switch applies only to the first one.',
|
|
388
|
+
'warn.predicateFailed': 'A platform condition could not be evaluated. That row is treated as off.',
|
|
389
|
+
'warn.exclusiveRowsActive': 'The two terminals cannot both be on, or this mode will not start. Saving turns one of them off.',
|
|
390
|
+
'warn.noName': 'Without a name, the mode menu shows the directory id.',
|
|
391
|
+
'warn.baseCompositionUnavailable': 'No shipped composition is available. Base mode and plugin switches cannot be changed. The system prompt can still be saved.',
|
|
373
392
|
'history.label': 'Change history',
|
|
374
|
-
'history.pick': '
|
|
375
|
-
'history.load': 'Load
|
|
376
|
-
'history.hint': 'Loading
|
|
377
|
-
'history.by.settings': 'saved
|
|
378
|
-
'history.by.external': '
|
|
393
|
+
'history.pick': 'Choose a version…',
|
|
394
|
+
'history.load': 'Load',
|
|
395
|
+
'history.hint': 'Loading edits the draft only. Save writes it.',
|
|
396
|
+
'history.by.settings': 'saved here',
|
|
397
|
+
'history.by.external': 'external edit',
|
|
379
398
|
'msg.loadFailed': 'Could not load that version',
|
|
380
399
|
'msg.importEmpty': 'That file is empty.',
|
|
381
400
|
'msg.importTooLarge': 'That file is too large (1 MB limit).',
|
|
382
401
|
'msg.exported': 'Exported to a file.',
|
|
383
402
|
'msg.exportFailed': 'Export failed',
|
|
384
|
-
'delete.title': 'Delete "{name}"
|
|
385
|
-
'delete.description': 'This
|
|
403
|
+
'delete.title': 'Delete "{name}"?',
|
|
404
|
+
'delete.description': 'This deletes the assistant directory and its system prompt. It cannot be undone. Sessions already using it are unchanged.',
|
|
386
405
|
'delete.acknowledge': 'I understand this assistant\'s prompt will be deleted permanently',
|
|
387
|
-
'delete.confirm': 'Delete
|
|
406
|
+
'delete.confirm': 'Delete',
|
|
388
407
|
'delete.close': 'Close',
|
|
389
|
-
'delete.plainConfirm': '
|
|
408
|
+
'delete.plainConfirm': 'Delete "{name}"? This cannot be undone.',
|
|
390
409
|
|
|
391
|
-
'name.heading': '
|
|
392
|
-
'name.hint': 'Shown in the mode menu. The internal id
|
|
410
|
+
'name.heading': 'Name',
|
|
411
|
+
'name.hint': 'Shown in the mode menu. The internal id stays the same.',
|
|
393
412
|
'name.placeholder': 'Custom mode',
|
|
394
|
-
'name.descriptionPlaceholder': '
|
|
413
|
+
'name.descriptionPlaceholder': 'Description, shown in the mode menu. Optional.',
|
|
395
414
|
|
|
396
415
|
'mode.heading': 'Base mode',
|
|
397
|
-
'mode.hint': 'Pick a shipped
|
|
416
|
+
'mode.hint': 'Pick a shipped preset as the tool base. The prompt on this page still applies.',
|
|
398
417
|
|
|
399
418
|
'rows.heading': 'Plugin switches',
|
|
400
|
-
'rows.filterPlaceholder': 'Filter
|
|
401
|
-
'cap.heading': '
|
|
402
|
-
'cap.expand': 'Show
|
|
403
|
-
'cap.collapse': 'Hide
|
|
404
|
-
'cap.hint': '
|
|
405
|
-
'rows.hint': '
|
|
419
|
+
'rows.filterPlaceholder': 'Filter by name or id',
|
|
420
|
+
'cap.heading': 'Plugin switches',
|
|
421
|
+
'cap.expand': 'Show plugin switches',
|
|
422
|
+
'cap.collapse': 'Hide plugin switches',
|
|
423
|
+
'cap.hint': 'A row that is off is not used by this assistant.',
|
|
424
|
+
'rows.hint': 'A row that is off is not used by this assistant.',
|
|
406
425
|
|
|
407
426
|
'prompt.heading': 'System prompt',
|
|
408
427
|
'prompt.hint': 'After you save, the next model step uses this text.',
|
|
@@ -422,12 +441,12 @@ export const en = {
|
|
|
422
441
|
'msg.unsaved': 'Unsaved changes',
|
|
423
442
|
'msg.readFailed': 'Load failed',
|
|
424
443
|
'msg.saveFailed': 'Save failed',
|
|
425
|
-
'msg.saved': 'Saved.
|
|
444
|
+
'msg.saved': 'Saved. New sessions use it. The current session does not change.',
|
|
426
445
|
'status.detail': '{message}: {detail}',
|
|
427
446
|
|
|
428
447
|
// ── row labels ────────────────────────────────────────────────────────────
|
|
429
448
|
'row.persona.label': 'Identity (system prompt)',
|
|
430
|
-
'row.persona.note': '
|
|
449
|
+
'row.persona.note': 'Off: this prompt has no effect.',
|
|
431
450
|
'row.custom-prompt-tool.label': 'custom_prompt tool',
|
|
432
451
|
'row.custom-prompt-tool.note': 'Without it the prompt can still be edited here, but not by asking the agent',
|
|
433
452
|
'row.agent-instructions.label': 'Project instructions (AGENTS.md)',
|
|
@@ -439,7 +458,7 @@ export const en = {
|
|
|
439
458
|
'row.tool-fs-search.label': 'File search (glob/grep)',
|
|
440
459
|
'row.tool-jobs.label': 'Background jobs',
|
|
441
460
|
'row.planning.label': 'Plan mode (group)',
|
|
442
|
-
'row.planning.note': '
|
|
461
|
+
'row.planning.note': 'Off: planning is removed with it.',
|
|
443
462
|
'row.plan-mode.label': 'Plan mode implementation',
|
|
444
463
|
'row.compaction.label': 'Context compaction (group)',
|
|
445
464
|
'row.compaction.note': 'Carries an isolate realm',
|
|
@@ -447,7 +466,7 @@ export const en = {
|
|
|
447
466
|
'row.command-compact.label': '/compact command',
|
|
448
467
|
'row.tool-result-pruner.label': 'Tool-result pruning',
|
|
449
468
|
'row.delegation.label': 'Delegation and workflows (group)',
|
|
450
|
-
'row.delegation.note': '
|
|
469
|
+
'row.delegation.note': 'Off: subagents and workflows are removed with it.',
|
|
451
470
|
'row.tool-subagent.label': 'Subagent (spawn)',
|
|
452
471
|
'row.tool-subagent-fork.label': 'Subagent (fork)',
|
|
453
472
|
'row.tool-subagent-control.label': 'Subagent control',
|
|
@@ -457,7 +476,7 @@ export const en = {
|
|
|
457
476
|
'row.tool-subagent-claude-code.label': 'Claude Code subagent',
|
|
458
477
|
'row.tool-subagent-claude-code.note': 'Needs its Bundle installed first; the shipped state is in the details',
|
|
459
478
|
'row.time-context.label': 'Time context (the model can see the clock)',
|
|
460
|
-
'row.time-context.note': '
|
|
479
|
+
'row.time-context.note': 'Adds the current time on some steps.',
|
|
461
480
|
'row.tool-schedule.label': 'Scheduled reminders tool',
|
|
462
481
|
'row.tool-schedule.note': 'Lets the agent create, list, edit and delete durable reminders; the host schedule service owns storage and delivery',
|
|
463
482
|
'row.workflow-ptc.label': 'Workflow engine',
|
|
@@ -472,7 +491,7 @@ export const en = {
|
|
|
472
491
|
'row.tool-cordis.label': 'Cordis runtime tools',
|
|
473
492
|
'row.tool-cordis.note': 'Can read and modify the running harness',
|
|
474
493
|
'row.tool-plugin-manager.label': 'Plugin manager (install / toggle)',
|
|
475
|
-
'row.tool-plugin-manager.note': 'Lets the
|
|
494
|
+
'row.tool-plugin-manager.note': 'Lets the model install or toggle plugins.',
|
|
476
495
|
'row.tool-presentation.label': 'PTC tool presentation',
|
|
477
496
|
'row.present.label': 'Deliverables (present)',
|
|
478
497
|
'row.command-goal.label': 'Goal command',
|
|
@@ -488,13 +507,13 @@ export const en = {
|
|
|
488
507
|
|
|
489
508
|
// ── base mode labels ──────────────────────────────────────────────────────
|
|
490
509
|
'base.standard.label': 'Standard mode',
|
|
491
|
-
'base.standard.note': '
|
|
510
|
+
'base.standard.note': 'The shipped tool set.',
|
|
492
511
|
'base.ptc.label': 'PTC mode',
|
|
493
|
-
'base.ptc.note': 'Standard plus PTC tool presentation
|
|
512
|
+
'base.ptc.note': 'Standard, plus PTC tool presentation.',
|
|
494
513
|
'base.minimal.label': 'Minimal mode',
|
|
495
|
-
'base.minimal.note': 'Shell and terminal only
|
|
514
|
+
'base.minimal.note': 'Shell and terminal only. The prompt on this page still applies.',
|
|
496
515
|
'base.cordis.label': 'Creator mode',
|
|
497
|
-
'base.cordis.note': 'Standard plus
|
|
516
|
+
'base.cordis.note': 'Standard, plus Cordis runtime tools.',
|
|
498
517
|
'base.all.label': 'All shipped rows',
|
|
499
|
-
'base.all.note':
|
|
518
|
+
'base.all.note': 'Rows from all four shipped presets. Each row can be switched.',
|
|
500
519
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-custom-mode",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "Custom modes and custom prompts for DeepSeek Harness (dsh): edit a mode's system prompt on the settings page (it takes effect on the next model step), pick its base mode, switch plugin rows one by one, and keep several assistants side by side — coding, chat or roleplay (RP) personas (multi-mode / multi-agent).",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -71,6 +71,7 @@
|
|
|
71
71
|
"journal.mjs",
|
|
72
72
|
"cordis.patch.yml",
|
|
73
73
|
"LICENSE",
|
|
74
|
+
"postures.mjs",
|
|
74
75
|
"preset-backend/",
|
|
75
76
|
"preset/"
|
|
76
77
|
],
|