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/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}」:这一页只管理本工具创建的助手(目录里有 prompt.md,且组成文件用 prompt-reader.mjs 注入身份)。',
65
+ 'api.unknownAssistant': '找不到助手「{id}」。此页只管理本插件创建的助手。',
58
66
  'api.alreadyFirst': '「{name}」已经在最前面。',
59
67
  'api.alreadyLast': '「{name}」已经在最后面。',
60
- 'api.badVariableName': '变量引用的写法不合法:{variable} 里的名字只能用小写字母、数字、下划线,且以字母开头。要写字面量花括号,请用单个左花括号,或不闭合的双左花括号。',
61
- 'api.unknownVariable': '{variable} 不是已注册的变量,渲染会报错并让本模式每个请求都失败。可用:{known}。',
62
- 'mode.unavailable': '本机这条 DSH 线没有可读的出厂组成,基础模式暂时不能切换。',
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': '安装时不钉版本号会受 pnpm 发布冷却期影响(默认 24 小时),可能装到较旧的版本。要换版本请按 README 的钉版本命令重装,然后重启 DSH。',
82
- 'api.saved': '已保存({name},基础模式 {mode})。新建会话即生效,当前会话保持原配置。',
83
- 'api.savedWithExclusiveRows': '已保存({name},基础模式 {mode})。两套壳注册同名工具、不能同时启用 —— 已自动关掉:{rows}。新建会话即生效,当前会话保持原配置。',
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': '已复制自「{from}」。两份配置彼此独立。',
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': '已按本机这条 dsh 线关闭 {count} 个起不来的行({ids})。现在这个模式能重新出现在选择器里。',
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': '当前 DSH 版本没有 agentPresets.remove(),无法删除。',
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': '本机取不到基础模式「{mode}」的出厂组成,无法改动插件开关或基础模式(系统提示词可以单独保存)。',
115
- 'warn.approvalGateMissing': '审批闸门未启用:本机这个 DSH 版本没有 tools/pre-execute 事件,会话内改写系统提示词不会弹审批。见「详情」。',
116
- 'warn.unresolvableRows': '有行在本机这条 DSH 线上跑不起来。平台会因此判整个模式为 broken,把它从新会话的选择器里丢掉(不报错)。点下方「按本线修复」只关掉那几行,其它选择不动。',
117
- 'warn.presetBroken': '平台判这个模式为 broken,它会从新会话的选择器里消失 —— 而上面的「无法解析」检查解释不了原因(多半是某一行依赖的服务没起来)。点下方「按本线修复」把那几行关掉;平台自己给的原因见下面那行。',
118
- 'warn.badPromptVariable': '系统提示词里有未注册或写错的变量引用,这个模式的每次请求都会失败。改掉那一处后再保存。',
119
- 'warn.duplicateRowIds': '组成文件里有重复的行 id。开关只作用于第一处,请删掉重复的那一行。',
120
- 'warn.predicateFailed': '有一行的平台条件求值失败,这一行已按关闭处理,避免整个模式无法挂载。',
121
- 'warn.exclusiveRowsActive': '两条互斥的壳同时开着(它们注册同名工具),平台会判整个模式为 broken 并从新会话的选择器里丢掉。关掉其中一条即可;在设置页保存一次也会自动避让。',
122
- 'warn.baseCompositionUnavailable': '取不到本机这条 DSH 线的出厂组成:基础模式与插件开关暂时不能改(系统提示词不受影响,照常可保存)。已尝试的途径写在宿主日志里。',
123
- 'warn.personaOffWithPrompt': '「身份(系统提示词)」这一行是关的,所以 prompt.md 不会被注入 —— 所写的提示词不会生效。打开这一行,或清空提示词。',
124
- 'warn.toolOff': '「custom_prompt 工具」这一行是关的:会话里无法让 agent 改提示词,只能在本页改。',
125
- 'warn.noDescription': '没有描述:新建会话的模式选择器里会显示成「暂无描述」。',
126
- 'warn.noName': '没有名字:模式选择器里会显示成目录 id(例如 custom)。',
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': '永久删除「{name}」?',
139
- 'delete.description': '这会删除磁盘上的模式目录,连同它的系统提示词一起消失,无法撤销。正在使用它的会话不受影响;新建会话时它不再出现在选择器里。({id})',
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': '确定永久删除「{name}」吗?该操作无法撤销。',
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': '筛选行(名称或 id)',
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': '含 isolate realm,关掉等于移除整个计划能力',
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': '含 isolate realm;关掉等于移除子代理与工作流',
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': '在合适的步骤里附上当前时间、浏览器时区与距上一条消息的间隔;默认 10 分钟内不重复注入',
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': '模型侧可安装/启停插件;标准与 PTC 模式里出厂即关闭(只有创造模式默认开),本模式可以显式打开它',
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': '完整编码能力:Shell、文件、检索、技能、计划、目标、子代理、工作流',
263
+ 'base.standard.note': '出厂的完整工具集。',
254
264
  'base.ptc.label': 'PTC 模式',
255
- 'base.ptc.note': '在标准模式基础上启用 PTC 工具呈现(tool-presentation)',
265
+ 'base.ptc.note': '标准模式,另开 PTC 工具呈现。',
256
266
  'base.minimal.label': '极简模式',
257
- 'base.minimal.note': '只有 Shell 与终端,共 7 行;没有文件、检索、技能、子代理。系统提示词不是极简那一套(persona 行被本模式替换)',
267
+ 'base.minimal.note': '只有 Shell 与终端。提示词仍以本页为准。',
258
268
  'base.cordis.label': '创造模式',
259
- 'base.cordis.note': '标准模式 + 读写运行时的 Cordis 工具集,可让 agent 自己改 harness',
269
+ 'base.cordis.note': '标准模式,另开 Cordis 运行时工具。',
260
270
  'base.all.label': '全部出厂行',
261
- 'base.all.note': '不继承任何单一原生模式:以标准模式的全套行为底,补上只有 PTC / 极简 / 创造模式才有的行,全部都能逐行开关',
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
- 'Each assistant is its own mode, with its own prompt, base mode and plugin switches. Pick one from the mode menu when you start a session.',
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': 'The platform cannot mount this mode, so it will not appear in the new-session picker. Click Fix for this line below to turn off just those rows.',
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 prompt',
286
- 'btn.export': 'Export prompt',
287
- 'btn.reset': 'Reset to factory prompt',
288
- 'btn.resetHint': 'Puts the shipped template back into the editor (the text a new assistant starts from). Like every other edit it only changes the draft — save to apply, or use Reload to discard.',
289
- 'btn.delete': 'Delete this assistant',
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. You can write its system prompt now. Refresh once before the new-session mode menu will list it.',
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: the mode picker for new sessions follows it.',
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 (not saved yet) — review it, then click Save.',
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}: this page only manages the assistants it created (a directory with prompt.md whose composition injects the identity through prompt-reader.mjs).',
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 reference: names may use lower-case letters, digits and underscores, and must start with a letter. For a literal brace, use a single opening brace or an unclosed double brace.',
307
- 'api.unknownVariable': '{variable} is not a registered variable — rendering would fail every request in this mode. Available: {known}.',
308
- 'mode.unavailable': 'This DSH line exposes no readable shipped composition, so the base mode cannot be switched right now.',
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 changed to {mode}: the row list below is recomputed from it when you save.',
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': 'Installing without a pinned version is subject to pnpm’s release cooldown (24 h by default) and can land on an older release. To change version, reinstall with the pinned command from the README and restart DSH.',
328
- 'api.saved': 'Saved ({name}, base mode {mode}). A new session picks it up; the current one keeps its configuration.',
329
- 'api.savedWithExclusiveRows': 'Saved ({name}, base mode {mode}). The two shell implementations register the same tool names and cannot both be on — turned off automatically: {rows}. A new session picks it up; the current one keeps its configuration.',
330
- 'api.created': 'Created {name}. You can write its system prompt now. Refresh once before the new-session mode menu will list it.',
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 keep running; it no longer appears for new sessions.',
334
- 'api.reordered': 'Order saved: the new-session mode picker follows it.',
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': 'Save rejected: the system prompt is empty. Emptying it would not clear the identity — the reader keeps the last good text.',
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 — every row of this assistant can start on this machine.',
349
- 'api.repaired': 'Disabled {count} row(s) this dsh line cannot start ({ids}). The mode can appear in the pickers again.',
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 DSH build has no agentPresets.remove(), so deleting is unavailable.',
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 (this machine exposes no shipped composition, so the plugin switches and the base mode were left untouched).',
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': 'The "Identity (system prompt)" row is off, so prompt.md is never injected — the prompt being edited has no effect. Turn the row on, or clear the prompt.',
362
- 'warn.toolOff': 'The "custom_prompt tool" row is off: the agent cannot change the prompt from inside a session, only this page can.',
363
- 'warn.noDescription': 'No description: the new-session mode picker will show it as "no description yet".',
364
- 'warn.approvalGateMissing': 'The approval gate is off: this DSH build has no tools/pre-execute event, so in-session prompt rewrites do not ask for approval. See the details.',
365
- 'warn.unresolvableRows': 'Some rows cannot be resolved on this DSH line: the platform marks the whole mode broken and silently drops it from the new-session picker. Click Fix for this line — it only turns those rows off and leaves your other choices alone.',
366
- 'warn.presetBroken': 'The platform marks this mode broken, so it disappears from the new-session picker — and the "unresolvable" check above cannot explain why (usually a row whose service or engine never started). Click Fix for this line to turn those rows off. The host\'s own reason is on the line below.',
367
- 'warn.badPromptVariable': 'The system prompt contains an unknown or invalid variable reference, so every request in this mode fails. Fix it, then save.',
368
- 'warn.duplicateRowIds': 'The composition repeats a row id. A switch applies only to the first copy. Remove the duplicate.',
369
- 'warn.predicateFailed': 'A platform condition failed to evaluate. That row is treated as off so the mode can still mount.',
370
- 'warn.exclusiveRowsActive': 'Both shells are on, and they register the same tool names: the platform marks the whole mode broken and silently drops it from the new-session picker. Turn one of them off — saving from the settings page also resolves it automatically.',
371
- 'warn.noName': 'No name: the mode picker will show the directory id (e.g. custom).',
372
- 'warn.baseCompositionUnavailable': 'This DSH line exposes no shipped composition: the base mode and the plugin switches cannot be changed right now (the system prompt is unaffected and still saves). The routes that were tried are in the host log.',
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': 'Pick a version to load…',
375
- 'history.load': 'Load this version',
376
- 'history.hint': 'Loading a version only edits the draft. Nothing is written until you save.',
377
- 'history.by.settings': 'saved from this page',
378
- 'history.by.external': 'changed in a session / by hand',
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}" permanently?',
385
- 'delete.description': 'This removes the mode directory from disk, system prompt included, and cannot be undone. Sessions already using it keep running; new sessions no longer offer it. ({id})',
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 permanently',
406
+ 'delete.confirm': 'Delete',
388
407
  'delete.close': 'Close',
389
- 'delete.plainConfirm': 'Permanently delete "{name}"? This cannot be undone.',
408
+ 'delete.plainConfirm': 'Delete "{name}"? This cannot be undone.',
390
409
 
391
- 'name.heading': 'Mode name',
392
- 'name.hint': 'Shown in the mode menu. The internal id does not change.',
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': 'Mode description (shown in the mode picker, optional)',
413
+ 'name.descriptionPlaceholder': 'Description, shown in the mode menu. Optional.',
395
414
 
396
415
  'mode.heading': 'Base mode',
397
- 'mode.hint': 'Pick a shipped tool set as the starting point. The prompt on this page still wins.',
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 rows by name or id',
401
- 'cap.heading': 'Tools',
402
- 'cap.expand': 'Show tools',
403
- 'cap.collapse': 'Hide tools',
404
- 'cap.hint': 'Leave this closed to keep the tools this assistant already has.',
405
- 'rows.hint': 'Turn a row off and this assistant will not use it.',
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. A new session picks it up; the current one keeps its configuration.',
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': 'Where the prompt is injected; turning it off falls back to the deployment identity',
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': 'Carries an isolate realm; turning it off removes planning entirely',
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': 'Carries an isolate realm; turning it off removes subagents and workflows',
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': 'On eligible steps, appends the current time, the browser zone and the gap since the previous model-visible message; 10-minute minimum interval by default',
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 agent install and toggle plugins; shipped OFF in Standard and PTC (only Creator enables it) — this mode can switch it on',
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': 'Full coding agent: shell, files, search, skills, planning, goals, subagents, workflows',
510
+ 'base.standard.note': 'The shipped tool set.',
492
511
  'base.ptc.label': 'PTC mode',
493
- 'base.ptc.note': 'Standard plus PTC tool presentation (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, 7 rows; no files, search, skills or subagents. The system prompt is not minimal\'s either (this mode replaces the persona row)',
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 the Cordis toolset, letting the agent modify its own harness',
516
+ 'base.cordis.note': 'Standard, plus Cordis runtime tools.',
498
517
  'base.all.label': 'All shipped rows',
499
- 'base.all.note': "Inherits no single shipped mode: standard's full row list plus the rows only PTC / Minimal / Creator declare, every one of them switchable",
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": "1.13.0",
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
  ],