dsh-super-code 0.1.2 → 0.1.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/README.md CHANGED
@@ -1,110 +1,66 @@
1
1
  # dsh-super-code
2
2
 
3
- 一个更快、更节省、更准确的 DeepSeek Harness 编码插件。
3
+ 一个更快、更节省、更聪明的 DeepSeek Harness 编码插件。它会根据任务选择调研、设计、开发、验证和优化方法:简单任务直接完成,复杂任务按需组织工作。
4
4
 
5
- 在选定的 SWE-bench Pro hard-100 评测中,平均耗时减少约 36%,每题输入 token 减少约 17%,正确率提高 5 个百分点。
5
+ A faster, more efficient, smarter coding plugin for DeepSeek Harness. It selects research, design, development, verification, and optimization methods to fit the task: straightforward work stays simple, while complex work is coordinated as needed.
6
6
 
7
- A faster, more accurate, and more cost-effective DeepSeek Harness plug-in component.
7
+ 在选定的 SWE-bench Pro hard-100 评测中,`0.1.2` 相比 DSH minimal 平均回答耗时减少约 38%,每题输入 token 减少约 14%,正确率提高 8 个百分点。[评测方法与完整结果](docs/EvaluationResults.md)
8
8
 
9
- On the selected SWE-bench Pro hard-100 evaluation, average elapsed time decreased by about 36%, input tokens per task by about 17%, and accuracy increased by 5 percentage points.
9
+ On the selected SWE-bench Pro hard-100 tasks, `0.1.2` reduced average response time by about 38% and input tokens per task by about 14% versus DSH minimal, while accuracy increased by 8 percentage points. [Methods and full results](docs/EvaluationResults.md)
10
10
 
11
- ## 介绍 · Introduction
11
+ ## 开始使用 · Get Started
12
12
 
13
- `dsh-super-code` 是 DeepSeek Harness 的编码插件,提供一个可直接使用的 `super-code` Agent 预设。
13
+ 需要 DeepSeek Harness 0.1.5-alpha.1 或更高版本。三步就能开始:
14
14
 
15
- `dsh-super-code` is a coding plugin for DeepSeek Harness with one ready-to-use `super-code` Agent preset.
15
+ You'll need DeepSeek Harness 0.1.5-alpha.1 or later. To get started:
16
16
 
17
- 它会根据任务选择调研、设计、开发、验证和优化方法,简单任务直接完成,复杂任务按需组织工作。
17
+ 1. **安装插件:** 在 `dsh-market` 搜索 `dsh-super-code`,或运行下面的命令。
18
18
 
19
- It selects research, design, development, verification, and optimization methods as needed for each task.
19
+ **Install the plugin:** Search for `dsh-super-code` in `dsh-market`, or run:
20
20
 
21
- ## 在 DeepSeek Harness 中安装 · Installation
21
+ ```bash
22
+ dsh plugin --profile web add dsh-super-code
23
+ ```
22
24
 
23
- 要求 DeepSeek Harness 0.1.5-alpha.1 或更高版本。
25
+ 2. **选中预设:** 打开 Harness“设置”→“Agent 预设”,选择 `super-code`。
24
26
 
25
- Requires DeepSeek Harness 0.1.5-alpha.1 or later.
27
+ **Select the preset:** In Harness, open “Settings” → “Agent Presets” and select `super-code`.
26
28
 
27
- ```bash
28
- dsh plugin --profile web add dsh-super-code
29
- ```
29
+ 3. **开始对话:** 新建会话,直接描述你要完成的编码任务。
30
30
 
31
- 安装后在 Harness 的 “设置”-“Agent 预设” 中选择 `super-code`,模型、权限和工具继续使用 Harness 的配置。
31
+ **Start a conversation:** Open a new conversation and describe the coding task you want done.
32
32
 
33
- After installation, select `super-code` in "Settings" - "Agent Presets" in Harness; models, permissions, and tools use the Harness configuration.
33
+ 没看到 `super-code`?打开“设置”→“插件”→“插件配置”→ **Super Code** 查看状态并手动安装。标识符已被占用时可换一个,不会覆盖已有预设。[排查与预设管理](docs/UsageGuide.md)
34
34
 
35
- 若安装后找不到预设,插件会在首次加载时尝试安装一份用户预设。也可打开“设置”→“插件”→“插件配置”中的 **Super Code** 查看状态并手动安装;名称冲突时换个名称即可,已有预设不会被覆盖。用户副本不会自动更新,删除后也不会在重启时自动重装。
36
-
37
- If the preset is missing, the plugin attempts a one-time user-preset installation on first load. Open **Super Code** under “Settings” → “Plugins” → “Plugin configuration” to check its status or install manually. Choose another name if it is taken. Existing presets are preserved; user copies are not automatically updated or reinstalled after deletion.
38
-
39
- [版本记录 · Changelog](docs/CHANGELOG.md)
35
+ Can't find `super-code`? Open “Settings” → “Plugins” → “Plugin configuration” → **Super Code** to check its status and install it manually. If the identifier is taken, choose another; existing presets are left untouched. [Troubleshooting and preset management](docs/UsageGuide.md)
40
36
 
41
37
  [![Super Code 配置入口 · Super Code settings](docs/images/preset-settings-preview.png)](docs/images/preset-settings.png)
42
38
 
43
- 当前版本不使用三模型池,也不需要单独配置插件模型。在 Harness“设置”→“模型”中配置提供方,再从对话输入框下方选择模型和推理等级;已有可用配置时直接沿用。插件跟随当前会话的模型,子 Agent 在未单独覆盖时继承父 Agent 的选择。
44
-
45
- The current version has no three-pool model configuration. Configure a provider under Harness “Settings” → “Models”, then select the model and reasoning effort below the message input. Existing working settings can be reused. The plugin follows the current session model, and child Agents inherit their parent's selection unless explicitly overridden.
46
-
47
- ## 效果 · Results
48
-
49
- SWE-bench Pro hard-100,使用 `deepseek-v4.1-flash`、reasoning `high`、原生 DSH Web RPC 和官方评分器。
50
-
51
- SWE-bench Pro hard-100 with `deepseek-v4.1-flash`, reasoning `high`, native DSH Web RPC, and the official grader.
52
-
53
- > 提示:
54
- > SWE-bench Pro 是面向真实软件工程任务的高难度评测集。每道题都来自真实开源仓库,通常需要理解现有代码、修改多个文件、运行测试并根据失败结果继续修复,评测结果以官方测试是否通过为准。这里选取其中难度最高的 100 道题,重点观察长任务中的正确率、调用次数、token 和耗时。
55
- >
56
- > SWE-bench Pro is a challenging benchmark for real-world software engineering tasks. Each task comes from a real open-source repository and typically requires understanding existing code, editing multiple files, running tests, and iterating on failures. The official test result is the pass criterion. This evaluation uses the 100 hardest selected tasks to measure accuracy, model calls, token usage, and elapsed time on long-running tasks.
57
- >
58
- > 经过预评测,`DSH minimal` 预设和 `deepseek-v4.1-flash` 的 `high` 思考强度取得了最高正确率,因此将它们作为统一比较基准。
59
- >
60
- > In preliminary runs, the `DSH minimal` preset with `deepseek-v4.1-flash` at `high` reasoning achieved the highest accuracy, so it is used as the common baseline.
61
-
62
- 这批结果来自 `0.0.9` 候选;`0.1.0` 沿用该历史基准,未重新执行完整 100 题评测。
39
+ 模型、推理等级、权限和工具沿用 Harness 的设置;子 Agent 默认继承父 Agent 的模型选择,不用再配置一套。
63
40
 
64
- These results are from the `0.0.9` candidate. Version `0.1.0` retains this historical benchmark; the full 100-task evaluation has not been rerun for this release.
41
+ Models, reasoning effort, permissions, and tools come from Harness. Child Agents inherit the parent Agent's model choice by default, so there's no second set of settings to manage.
65
42
 
66
- | 指标 / Metric | DSH minimal | super-code 0.0.9 | 优化幅度 / Change |
67
- |---|---:|---:|---:|
68
- | 有效评分 / Valid scores | 100/100 | 100/100 | **持平 / 0%** |
69
- | 通过题数 / Passed | 41 | 46 | **+12.2%** |
70
- | 正确率 / Accuracy | 41% | 46% | **+5 个百分点 / +5 pp** |
71
- | 平均模型调用/题 / Model calls per task | 124.85 | 92.78 | **-25.7%** |
72
- | 平均工具调用/题 / Tool calls per task | 126.54 | 115.41 | **-8.9%** |
73
- | 每题平均总输入 token / Average total input tokens per task | 11,477,170 | 9,525,316 | **-17.0%** |
74
- | 每题平均总输出 token / Average total output tokens per task | 100,877 | 97,901 | **-3.0%** |
75
- | 缓存命中率 / Cache hit rate | 99.360% | 99.329% | **-0.031%** |
76
- | 平均测试时长 / Average test time | 25.49 分钟 / min | 16.27 分钟 / min | **-36.2%** |
77
-
78
- > 因为输入和输出 token 均有减少,因此缓存命中率略微下降是可以接受的,属于正常波动范围。
79
- >
80
- > Since both input and output token usage decrease, the slight drop in cache hit rate is acceptable and within normal variation.
81
-
82
- > Token 指标按每道题的历史明细计算:先分别合计该题已记录模型调用的输入(含缓存)和输出 token,再对 100 道题取平均,包含多轮调用和上下文增长;未返回用量的请求不作估算,不代表完整账单费用。
83
- >
84
- > Token metrics are calculated from task histories: input (including cached tokens) and output tokens are summed separately across recorded model calls for each task, then averaged over 100 tasks. This includes multi-turn calls and context growth. Requests without reported usage are not estimated; these figures do not represent complete billing costs.
85
-
86
- 测试题号和每题明细见 [`eval/results/swebench-pro-final-100/`](eval/results/swebench-pro-final-100/),详细文档见 [`docs/`](docs/)。
87
-
88
- Task IDs and per-task details are available in [`eval/results/swebench-pro-final-100/`](eval/results/swebench-pro-final-100); detailed documentation is in [`docs/`](docs/).
43
+ 任务开始后,可以在右侧 Agent 执行树查看每个 Agent 的状态与用量。拖动空白处平移,滚轮或按钮缩放;点一个节点,就能在侧栏标签中查看详情。[界面说明](docs/UsageGuide.md)
89
44
 
90
- ## 使用 · Usage
91
-
92
- 安装后,在 DeepSeek Harness 的“设置”→“Agent 预设”中选择 `super-code`。创建任务后,插件会按任务复杂度组织调研、实现和验证;复杂任务可在右侧 Agent 执行树中查看进度,点击节点查看对应的执行内容和用量。
93
-
94
- After installation, select `super-code` under “Settings” → “Agent Presets” in DeepSeek Harness. The plugin organizes research, implementation, and verification according to task complexity; for complex tasks, use the Agent execution tree on the right to inspect progress, execution details, and usage.
45
+ Once a task is running, the Agent tree on the right shows each Agent's status and usage. Drag empty space to pan, zoom with the wheel or buttons, and click a node to see its details in a sidebar tab. [Interface guide](docs/UsageGuide.md)
95
46
 
96
47
  [![Agent 执行树 · Agent execution tree](docs/images/agent-tree-preview.png)](docs/images/agent-tree.png)
97
48
 
98
- 截图来自全新隔离会话中的 DSH 网页版,展示 hard-100 难度排名第一题 `task-099`(`future-architect/vuls` 的 OS 生命周期预警)的初步调研:一个主 Agent 与三个子 Agent 分别核查 EOL/版本解析、告警链路和测试边界。图中保留了整个右侧栏,包括状态、用量、缓存率和缩放操作;这是协作展示,不代表该题已修复或通过评分。
49
+ ## 效果 · Results
99
50
 
100
- Captured from a fresh, isolated DSH web session, the full sidebar shows initial investigation of the highest-ranked hard-100 task, `task-099` (`future-architect/vuls`, OS lifecycle warnings). A lead Agent and three child Agents investigate EOL/version parsing, the warning pipeline, and test boundaries. Status, usage, cache hit rate, and zoom controls are all visible. This is a collaboration example, not a claim that the task was fixed or passed grading.
51
+ 这组成绩来自选定的 SWE-bench Pro hard-100,使用 `deepseek-v4.1-flash`、`high` 推理等级、原生 DSH Web RPC 和官方评分器。两组都完成了 100/100 题评分。
101
52
 
102
- 拖动空白处平移,滚轮或按钮缩放,点击节点在侧边栏新标签中查看详情。插件界面跟随 Harness 的中英文语言设置。
53
+ These results come from the selected SWE-bench Pro hard-100 tasks, using `deepseek-v4.1-flash`, `high` reasoning, native DSH Web RPC, and the official grader. Both runs received scores for all 100 tasks.
103
54
 
104
- Drag empty space to pan, use the wheel or buttons to zoom, and click a node to open its details in a sidebar tab. The plugin follows the Harness Chinese/English language setting.
55
+ | 指标 / Metric | DSH minimal | super-code 0.1.2 | 变化 / Change |
56
+ |---|---:|---:|---:|
57
+ | 正确率 / Accuracy | 41% | **49%** | **+8 个百分点 / +8 pp** |
58
+ | 平均模型调用/题 / Model calls per task | 124.85 | 99.78 | -20.1% |
59
+ | 平均输入 token/题 / Input tokens per task | 11,477,170 | 9,840,383 | -14.3% |
60
+ | 平均回答耗时 / Response time | 25.69 分钟 / min | 16.01 分钟 / min | -37.7% |
105
61
 
106
- ## 感谢 · Thanks
62
+ 两次运行使用不同的 Harness 提交,不能将全部差异归因于插件。完整指标、回退题目、统计口径和逐题证据见[评测文档](docs/EvaluationResults.md)。
107
63
 
108
- 感谢 DeepSeek Harness、SWE-bench Pro 及所有开源项目维护者。
64
+ The runs used different Harness commits, so not every difference can be attributed to the plugin. See the [evaluation details](docs/EvaluationResults.md) for all metrics, regressions, calculation methods, and per-task evidence.
109
65
 
110
- Thanks to the DeepSeek Harness team, SWE-bench Pro contributors, and all open-source maintainers.
66
+ [使用说明 · Usage guide](docs/UsageGuide.md) · [评测详情 · Evaluation details](docs/EvaluationResults.md) · [版本记录 · Changelog](docs/Changelog.md)
package/client/index.js CHANGED
@@ -18,14 +18,20 @@ const zh = {
18
18
  'preset.description': '更快、更省、更聪明的编码模式。', 'preset.refresh': '刷新状态', 'preset.expand': '展开设置', 'preset.collapse': '收起设置',
19
19
  'preset.state.available': '预设可用', 'preset.state.installed': '用户预设已安装', 'preset.state.conflict': '已有同名预设',
20
20
  'preset.state.missing': '尚未安装', 'preset.state.broken': '预设不可用',
21
- 'preset.availableHint': '可在新对话中选择此预设。用户副本不会自动覆盖或更新。',
22
- 'preset.installHint': '安装一份用户预设;已有内容会保留,重名时请换个名称。',
23
- 'preset.userConflict': '用户目录中已有同名预设,已保留。可换名安装独立副本。',
21
+ 'preset.availableHint': '可在新对话中选择此预设。升级仅更新未修改的默认名称和描述。',
22
+ 'preset.installHint': '安装一份用户预设;已有内容会保留,标识符冲突时请换个标识符。',
23
+ 'preset.userConflict': '用户目录中已有相同标识符的预设,已保留。可更换标识符安装独立副本。',
24
24
  'preset.readonly': '此宿主未提供用户预设目录,无法安装副本。',
25
- 'preset.name': '预设名称', 'preset.nameHint': '使用小写字母、数字和连字符,最多 64 个字符。安装后在新对话中选择。',
25
+ 'preset.displayName': '显示名称', 'preset.displayNameHint': '支持中文和空格,最多 120 个字符,例如 Super Code 模式。', 'preset.name': '预设标识符', 'preset.nameHint': '用于安装目录,通常保留 super-code 即可。以小写字母或数字开头,仅含小写字母、数字和连字符,最多 64 个字符。',
26
+ 'preset.confirmTitle': '确认重新安装预设',
27
+ 'preset.confirmHint': '以下是通过本插件安装的预设,将会被移除并按照新名称重新安装,旧内容会保留恢复备份。对于需要保留的预设可以手动在列表中移除。',
28
+ 'preset.confirmEmpty': '没有需要重装的预设。', 'preset.remove': '从列表移除', 'preset.cancel': '取消', 'preset.confirm': '确认重装',
29
+ 'preset.reinstall': '重新安装预设', 'preset.reinstallHint': '使用下方名称和标识符重新安装,移除旧预设并保留恢复备份。',
30
+ 'preset.error.ownership-unverified': '无法确认旧预设归属(可能来自旧版本或目录已被替换),未删除任何预设。',
26
31
  'preset.install': '安装用户预设', 'preset.working': '处理中…',
27
- 'preset.error.invalid-name': '名称格式不正确,请使用小写字母、数字和连字符。',
28
- 'preset.error.name-taken': '该名称已被占用,原预设未改动。请换个名称。',
32
+ 'preset.error.invalid-name': '标识符须以小写字母或数字开头,仅含小写字母、数字和连字符,最多 64 个字符。',
33
+ 'preset.error.invalid-display-name': '显示名称不能为空或全为空格,最多 120 个字符;支持中文和空格。',
34
+ 'preset.error.name-taken': '该标识符已被占用,原预设未改动。请更换标识符。',
29
35
  'preset.error.no-user-root': '此宿主没有可写的用户预设目录。',
30
36
  'preset.error.install-failed': '安装未完成,请检查预设目录的写入权限后重试。',
31
37
  'preset.error.connection': '暂时无法读取预设状态,请刷新重试。',
@@ -47,14 +53,20 @@ const en = {
47
53
  'preset.description': 'A faster, more efficient, smarter coding mode.', 'preset.refresh': 'Refresh status', 'preset.expand': 'Show settings', 'preset.collapse': 'Hide settings',
48
54
  'preset.state.available': 'Preset available', 'preset.state.installed': 'User preset installed', 'preset.state.conflict': 'Preset name already exists',
49
55
  'preset.state.missing': 'Not installed', 'preset.state.broken': 'Preset unavailable',
50
- 'preset.availableHint': 'Select this preset in a new conversation. User copies are never overwritten or updated automatically.',
51
- 'preset.installHint': 'Install a user copy. Existing content is preserved; choose another name if it is taken.',
52
- 'preset.userConflict': 'A user preset with this name already exists and was preserved. Choose another name for a separate copy.',
56
+ 'preset.availableHint': 'Select this preset in a new conversation. Upgrades update only unchanged default names and descriptions.',
57
+ 'preset.installHint': 'Install a user copy. Existing content is preserved; choose another identifier if it is taken.',
58
+ 'preset.userConflict': 'A user preset with this identifier already exists and was preserved. Choose another identifier for a separate copy.',
53
59
  'preset.readonly': 'This host does not provide a user preset directory.',
54
- 'preset.name': 'Preset name', 'preset.nameHint': 'Lowercase letters, digits and hyphens, up to 64 characters. Select it in a new conversation after installing.',
60
+ 'preset.displayName': 'Display name', 'preset.displayNameHint': 'Supports Chinese characters and spaces, up to 120 characters, e.g. Super Code 模式.', 'preset.name': 'Preset identifier', 'preset.nameHint': 'Used for the installation directory; usually keep super-code. Start with a lowercase letter or digit; use only lowercase letters, digits and hyphens, up to 64 characters.',
61
+ 'preset.confirmTitle': 'Confirm preset reinstallation',
62
+ 'preset.confirmHint': 'These presets were installed by this plugin. They will be removed and reinstalled with the new names shown, and recovery backups will be kept. Remove any preset you want to keep from the list.',
63
+ 'preset.confirmEmpty': 'No presets selected for reinstallation.', 'preset.remove': 'Remove from list', 'preset.cancel': 'Cancel', 'preset.confirm': 'Confirm reinstall',
64
+ 'preset.reinstall': 'Reinstall preset', 'preset.reinstallHint': 'Reinstall with the name and identifier below, removing the old preset and keeping a recovery backup.',
65
+ 'preset.error.ownership-unverified': 'Cannot verify ownership of the old preset (it may come from an older version or a replaced directory). No presets were deleted.',
55
66
  'preset.install': 'Install user preset', 'preset.working': 'Working…',
56
- 'preset.error.invalid-name': 'Use lowercase letters, digits and hyphens for the name.',
57
- 'preset.error.name-taken': 'This name is taken. The existing preset was preserved. Choose another name.',
67
+ 'preset.error.invalid-name': 'The identifier must start with a lowercase letter or digit and contain only lowercase letters, digits and hyphens, up to 64 characters.',
68
+ 'preset.error.invalid-display-name': 'The display name cannot be empty or whitespace-only and must be at most 120 characters. Chinese characters and spaces are supported.',
69
+ 'preset.error.name-taken': 'This identifier is taken. The existing preset was preserved. Choose another identifier.',
58
70
  'preset.error.no-user-root': 'This host has no writable user preset directory.',
59
71
  'preset.error.install-failed': 'Installation failed. Check directory write permissions and retry.',
60
72
  'preset.error.connection': 'Preset status is unavailable. Refresh to try again.',
@@ -796,33 +808,85 @@ function AgentDetail({ useTabInfo, useSessions, createInspector, detailStates, t
796
808
  }
797
809
 
798
810
  // Explicit public Remote contribution; no model tools or private transport hooks.
811
+ const remoteStringCodec = { mode: 'strict', typeSymbol: 'string', schema: {
812
+ parse(value) {
813
+ if (typeof value !== 'string') throw new TypeError('Expected a string')
814
+ return value
815
+ },
816
+ } }
799
817
  const presetRemoteContribution = {
800
818
  package: 'dsh-super-code',
801
- descriptors: ['status', 'installPreset'].map(method => ({
819
+ descriptors: ['status', 'installPreset', 'reinstallPreset', 'synchronize'].map(method => ({
802
820
  id: `dsh-super-code:superCodePresets/${method}`, service: 'superCodePresets',
803
821
  namespace: 'superCodePresets', method, invocation: { kind: 'direct' },
804
- parameters: method === 'installPreset' ? [{ name: 'id', wire: 'id', source: 'json', codec: { mode: 'strict', typeSymbol: 'dsh-super-code#PresetId', schema: { parse(value) {
805
- if (typeof value !== 'string' || !/^[a-z0-9][a-z0-9-]{0,63}$/.test(value)) throw new Error('Invalid preset name')
806
- return value
807
- } } } }] : [],
822
+ parameters: (method === 'reinstallPreset' ? ['previousId', 'id', 'name'] : method === 'installPreset' ? ['id', 'name'] : method === 'synchronize' ? ['language'] : []).map(name => ({
823
+ name, wire: name, source: 'json', codec: remoteStringCodec,
824
+ })),
808
825
  result: { mode: 'src-json' },
809
826
  })),
810
827
  }
811
828
 
829
+ // Old hosts render file metadata. Synchronize through our own Remote, then
830
+ // reload their cached roster only when a managed field actually changed.
831
+ function synchronizePresetDisplay(api, locale, reload, onError) {
832
+ let disposed = false, running = false, pending = '', last = '', needsReload = false
833
+ const changed = () => {
834
+ pending = locale.getSnapshot().active
835
+ if (running || pending === last) return
836
+ running = true
837
+ void (async () => {
838
+ try {
839
+ while (!disposed && pending !== last) {
840
+ const language = pending
841
+ const result = await api.synchronize(language)
842
+ if (!result.ok) throw new Error('Preset display synchronization failed')
843
+ last = language
844
+ needsReload ||= result.value.changed
845
+ if (!disposed && needsReload && pending === language) { reload(); return }
846
+ }
847
+ } catch (error) { if (!disposed) onError(error) }
848
+ finally { running = false }
849
+ })()
850
+ }
851
+ const unsubscribe = locale.subscribe(changed)
852
+ changed()
853
+ return () => { disposed = true; unsubscribe() }
854
+ }
855
+
812
856
  function PresetSettings({ api, t }) {
813
- const [status, setStatus] = useState(null), [name, setName] = useState('super-code')
857
+ const [status, setStatus] = useState(null), [customId, setCustomId] = useState(null)
858
+ const name = customId ?? (status?.state === 'installed' ? status.id : 'super-code')
859
+ const [customDisplayName, setCustomDisplayName] = useState(null)
860
+ const displayName = customDisplayName ?? (status?.state === 'installed' ? status.name || t('preset.title') : t('preset.title'))
814
861
  const [busy, setBusy] = useState(true), [error, setError] = useState(''), [open, setOpen] = useState(false)
862
+ const [confirmation, setConfirmation] = useState(null)
863
+ const dialog = useRef(null)
815
864
  const alive = useRef(false), pending = useRef(false)
816
- const run = async install => {
865
+ useEffect(() => {
866
+ if (!confirmation || !dialog.current) return
867
+ const element = dialog.current
868
+ element.showModal()
869
+ element.querySelector('[data-super-code-cancel]')?.focus()
870
+ return () => { if (element.open) element.close() }
871
+ }, [confirmation !== null])
872
+ const run = async (install, confirmed = null) => {
817
873
  if (pending.current) return
818
874
  pending.current = true; setBusy(true); setError('')
819
875
  try {
820
- const response = install ? await api.installPreset(name.trim()) : await api.status()
876
+ const installName = customDisplayName === null ? '' : displayName.trim()
877
+ const response = !install ? await api.status() : confirmed
878
+ ? await api.reinstallPreset(confirmed.previousId, confirmed.id, confirmed.name)
879
+ : await api.installPreset(name.trim(), installName)
821
880
  if (!response.ok) throw new Error('Remote unavailable')
822
881
  if (!alive.current) return
823
882
  const value = response.value
824
883
  setStatus(install ? value.status : value)
825
884
  if (install && !value.ok) setError(`preset.error.${value.error}`)
885
+ if (!install || value.ok) {
886
+ const synced = await api.synchronize(localeCode(t))
887
+ if (!synced.ok) throw new Error('Preset display synchronization failed')
888
+ if (install || synced.value.changed) window.location.reload()
889
+ }
826
890
  } catch {
827
891
  if (alive.current) setError('preset.error.connection')
828
892
  } finally {
@@ -831,6 +895,13 @@ function PresetSettings({ api, t }) {
831
895
  }
832
896
  }
833
897
  useEffect(() => { alive.current = true; run(false); return () => { alive.current = false } }, [api])
898
+ const submit = () => {
899
+ if (busy || pending.current || !displayName.trim() || !/^[a-z0-9][a-z0-9-]{0,63}$/.test(name.trim())) return
900
+ if (status?.state === 'installed') {
901
+ setConfirmation([{ previousId: status.id, id: name.trim(),
902
+ name: customDisplayName === null && displayName === t('preset.title') ? '' : displayName.trim(), label: displayName.trim() }])
903
+ } else run(true)
904
+ }
834
905
  const available = status && ['available', 'installed'].includes(status.state)
835
906
  return React.createElement('li', { className: `dsh-super-code-settings${open ? ' dsh-super-code-settings-open' : ''}` },
836
907
  React.createElement('button', { type: 'button', className: 'dsh-super-code-settings-header', 'aria-expanded': open,
@@ -840,22 +911,47 @@ function PresetSettings({ api, t }) {
840
911
  React.createElement('span', { className: 'dsh-super-code-settings-description' }, t('preset.description'))),
841
912
  React.createElement(IconChevronDownOutline14, { className: `dsh-super-code-settings-chevron${open ? ' dsh-super-code-settings-chevron-open' : ''}`, 'aria-hidden': true })),
842
913
  open && React.createElement('div', { className: 'dsh-super-code-settings-body' },
843
- React.createElement('div', { className: 'dsh-super-code-settings-actions' },
844
- React.createElement('button', { type: 'button', disabled: busy, onClick: () => run(false), 'aria-label': t('preset.refresh') }, t('preset.refresh'))),
845
914
  status && React.createElement('p', { className: 'dsh-super-code-preset-status', role: 'status', 'data-available': available },
846
915
  React.createElement('span', { 'aria-hidden': true }, '●'), ' ', t(`preset.state.${status.state}`), ' · ', status.id),
916
+ React.createElement('div', { className: 'dsh-super-code-settings-actions' },
917
+ React.createElement('button', { type: 'button', disabled: busy, onClick: () => run(false), 'aria-label': t('preset.refresh') }, t('preset.refresh'))),
847
918
  status && React.createElement('p', null, t(available ? 'preset.availableHint' : 'preset.installHint')),
919
+ status?.state === 'installed' && React.createElement('p', null, t('preset.reinstallHint')),
848
920
  status?.userConflict && status.state !== 'conflict' && React.createElement('p', null, t('preset.userConflict')),
849
921
  status && !status.authorable && React.createElement('p', { role: 'note' }, t('preset.readonly')),
850
- status?.authorable && React.createElement('form', { onSubmit: event => { event.preventDefault(); run(true) } },
922
+ status?.authorable && React.createElement('form', { onSubmit: event => { event.preventDefault(); submit() } },
923
+ React.createElement('label', { htmlFor: 'super-code-display-name' }, t('preset.displayName')),
924
+ React.createElement('input', { id: 'super-code-display-name', value: displayName, maxLength: 120, required: true, disabled: busy, 'aria-describedby': 'super-code-display-name-hint', onChange: event => setCustomDisplayName(event.target.value) }),
925
+ React.createElement('small', { id: 'super-code-display-name-hint' }, t('preset.displayNameHint')),
851
926
  React.createElement('label', { htmlFor: 'super-code-preset-name' }, t('preset.name')),
852
927
  React.createElement('div', { className: 'dsh-super-code-install-row' },
853
928
  React.createElement('input', { id: 'super-code-preset-name', value: name, maxLength: 64, disabled: busy,
854
929
  pattern: '[a-z0-9][a-z0-9\\-]{0,63}', required: true, autoComplete: 'off', spellCheck: false,
855
- 'aria-describedby': 'super-code-preset-name-hint', onChange: event => setName(event.target.value) }),
856
- React.createElement('button', { type: 'submit', disabled: busy || !/^[a-z0-9][a-z0-9-]{0,63}$/.test(name.trim()) }, t(busy ? 'preset.working' : 'preset.install'))),
930
+ 'aria-describedby': 'super-code-preset-name-hint', onChange: event => setCustomId(event.target.value) }),
931
+ React.createElement('button', { type: 'submit', disabled: busy || !displayName.trim() || !/^[a-z0-9][a-z0-9-]{0,63}$/.test(name.trim()) }, t(busy ? 'preset.working' : status?.state === 'installed' ? 'preset.reinstall' : 'preset.install'))),
857
932
  React.createElement('small', { id: 'super-code-preset-name-hint' }, t('preset.nameHint'))),
858
- error && React.createElement('p', { role: 'alert' }, t(error))))
933
+ error && React.createElement('p', { role: 'alert' }, t(error))),
934
+ confirmation && React.createElement('dialog', { ref: dialog, className: 'dsh-super-code-confirm',
935
+ 'aria-labelledby': 'super-code-confirm-title', 'aria-describedby': 'super-code-confirm-hint',
936
+ onKeyDown: event => { if (event.key === 'Escape') event.stopPropagation() },
937
+ onCancel: event => { event.preventDefault(); event.stopPropagation(); setConfirmation(null) } },
938
+ React.createElement('h3', { id: 'super-code-confirm-title' }, t('preset.confirmTitle')),
939
+ React.createElement('p', { id: 'super-code-confirm-hint' }, t('preset.confirmHint')),
940
+ confirmation.length ? React.createElement('ul', null, ...confirmation.map(item =>
941
+ React.createElement('li', { key: item.previousId },
942
+ React.createElement('span', null, `${item.previousId} → ${item.label} · ${item.id}`),
943
+ React.createElement('button', { type: 'button', 'aria-label': `${t('preset.remove')}: ${item.previousId}`,
944
+ onClick: () => setConfirmation(items => items.filter(row => row.previousId !== item.previousId)) }, t('preset.remove')))))
945
+ : React.createElement('p', { role: 'status' }, t('preset.confirmEmpty')),
946
+ React.createElement('div', { className: 'dsh-super-code-confirm-actions' },
947
+ React.createElement('button', { type: 'button', autoFocus: true, 'data-super-code-cancel': true, onClick: () => setConfirmation(null) }, t('preset.cancel')),
948
+ React.createElement('button', { type: 'button', disabled: busy || !confirmation.length,
949
+ onClick: () => {
950
+ if (busy || pending.current || !confirmation.length) return
951
+ const selected = confirmation[0]
952
+ setConfirmation(null)
953
+ run(true, selected)
954
+ } }, t('preset.confirm')))))
859
955
  }
860
956
 
861
957
  const inject = [
@@ -867,13 +963,16 @@ function apply(ctx) {
867
963
  const locale = ctx.locale || { register: () => () => {}, bind: () => key => zh[key] || key }
868
964
  ctx.effect(() => locale.register(LOCALE_NS, { zh, en }), 'dsh-super-code: dictionaries')
869
965
  const t = locale.bind(LOCALE_NS)
870
- ctx.effect(async () => {
871
- const owner = ctx
872
- await owner.remote.$mount(presetRemoteContribution)
873
- owner.inject(['remote.superCodePresets'], ready => ready.slots.inject('settings.plugin.item', () => ready.slots.register({
966
+ // $mount creates a lifecycle effect on this same fiber; awaiting it from
967
+ // another effect would stall the namespace and the settings contribution.
968
+ void ctx.remote.$mount(presetRemoteContribution).catch(error => console.warn('Super Code preset Remote:', error))
969
+ ctx.inject(['remote.superCodePresets'], ready => {
970
+ ready.effect(() => synchronizePresetDisplay(ready.remote.superCodePresets, locale,
971
+ () => window.location.reload(), error => console.warn('Super Code preset display:', error)), 'super-code: preset display')
972
+ return ready.slots.inject('settings.plugin.item', () => ready.slots.register({
874
973
  name: 'settings.plugin.item', key: 'super-code', locale: LOCALE_NS,
875
974
  inject: () => ({ api: ready.remote.superCodePresets }),
876
- }, PresetSettings)))
975
+ }, PresetSettings))
877
976
  })
878
977
  ctx.effect(() => {
879
978
  const style = document.createElement('style')
@@ -884,6 +983,7 @@ function apply(ctx) {
884
983
  .dsh-super-code-settings-header{width:100%;appearance:none;border:0;background:none;font:inherit;color:inherit;text-align:left;cursor:pointer;display:flex;align-items:center;gap:12px;padding:14px 16px;border-radius:12px}
885
984
  .dsh-super-code-settings-head-text{flex:1;min-width:0;display:flex;flex-direction:column;gap:4px}.dsh-super-code-settings-name{font-size:15px;font-weight:600;line-height:1.4;color:var(--dsw-alias-label-primary,inherit)}
886
985
  .dsh-super-code-settings-description{font-size:13px;line-height:1.5;color:var(--dsw-alias-label-tertiary,#70757d)}.dsh-super-code-settings-chevron{flex:none;color:var(--dsw-alias-label-tertiary,#70757d);transition:transform .16s}.dsh-super-code-settings-chevron-open{transform:rotate(180deg)}
986
+ .dsh-super-code-confirm{box-sizing:border-box;width:min(560px,calc(100vw - 48px));max-height:80vh;overflow:auto;border:1px solid var(--dsw-alias-border-l2,#dedfe3);border-radius:8px;padding:24px;color:var(--dsw-alias-label-primary,#202126);background:var(--dsw-alias-bg-layer-1,#fff);font-size:13px;line-height:1.6}.dsh-super-code-confirm::backdrop{background:#0006}.dsh-super-code-confirm h3{font-size:16px;margin:0 0 12px}.dsh-super-code-confirm p{margin:0 0 14px}.dsh-super-code-confirm ul{padding:0;margin:0 0 18px;list-style:none}.dsh-super-code-confirm li{display:flex;align-items:center;justify-content:space-between;gap:16px;margin:12px 0;overflow-wrap:anywhere}.dsh-super-code-confirm-actions{display:flex;justify-content:flex-end;gap:8px}.dsh-super-code-confirm button{font:inherit;color:inherit;border:1px solid var(--dsw-alias-border-l1,#dedfe3);border-radius:6px;background:transparent;padding:7px 10px;min-height:34px;cursor:pointer}.dsh-super-code-confirm button:disabled{opacity:.45;cursor:default}.dsh-super-code-confirm button:focus-visible{outline:2px solid var(--dsw-color-primary,#3276dc);outline-offset:2px}
887
987
  .dsh-super-code-settings-body{border-top:.5px solid var(--dsw-alias-border-l2,#dedfe3);margin:0 16px;padding:12px 0 14px}.dsh-super-code-settings-actions{display:flex;justify-content:flex-end}
888
988
  .dsh-super-code-settings p{margin:8px 0;color:var(--dsw-alias-label-secondary,#70757d)}
889
989
  .dsh-super-code-settings-body button,.dsh-super-code-settings input{font:inherit;color:inherit;border:1px solid var(--dsw-alias-border-l1,#dedfe3);border-radius:7px;background:transparent;padding:7px 10px;min-height:34px}
@@ -1065,5 +1165,5 @@ function apply(ctx) {
1065
1165
  ctx.effect(() => disposeDetailType, 'super-code: Agent detail tab')
1066
1166
  }
1067
1167
 
1068
- return { inject, apply, buildAgentView, visibleAgentRows, agentTreeDisplay, agentTreeTotals, agentTreeLayout, agentExecutionStatus, agentDetailAddress, agentDetailTarget, agentPath, detailRecord, createAgentInspector, agentHistoryRange, agentHistoryRows, agentHistoryWindow }
1168
+ return { inject, apply, synchronizePresetDisplay, buildAgentView, visibleAgentRows, agentTreeDisplay, agentTreeTotals, agentTreeLayout, agentExecutionStatus, agentDetailAddress, agentDetailTarget, agentPath, detailRecord, createAgentInspector, agentHistoryRange, agentHistoryRows, agentHistoryWindow }
1069
1169
  } })
@@ -1,21 +1,32 @@
1
1
  import type { Context } from '@deepseek-ai/cordis';
2
2
  import { type AgentPresets } from '@deepseek-ai/dsh-agent-presets';
3
+ import { type DisplayBaseline } from './preset-metadata.js';
3
4
  import type { SettingsScope } from '@deepseek-ai/dsh-settings';
4
5
  import { TypertRemoteService } from '@deepseek-ai/dsh-typert-protocol';
5
6
  interface InstallationSettings {
6
7
  checked: boolean;
7
8
  installedId: string;
9
+ installation?: {
10
+ id: string;
11
+ path: string;
12
+ token: string;
13
+ dev: number;
14
+ ino: number;
15
+ };
16
+ display?: Record<string, DisplayBaseline>;
17
+ pendingDisplay?: Record<string, DisplayBaseline>;
8
18
  }
9
19
  export interface PresetInstallationStatus {
10
20
  state: 'available' | 'installed' | 'conflict' | 'missing' | 'broken';
11
21
  id: string;
22
+ name?: string;
12
23
  authorable: boolean;
13
24
  userConflict: boolean;
14
25
  }
15
26
  export interface PresetInstallationResult {
16
27
  ok: boolean;
17
28
  status: PresetInstallationStatus;
18
- error?: 'invalid-name' | 'name-taken' | 'no-user-root' | 'install-failed';
29
+ error?: 'ownership-unverified' | 'invalid-name' | 'invalid-display-name' | 'name-taken' | 'no-user-root' | 'install-failed';
19
30
  }
20
31
  /** Serialized writes protect double clicks; mkdir claims only an unoccupied name. */
21
32
  export declare class PresetInstaller {
@@ -27,7 +38,11 @@ export declare class PresetInstaller {
27
38
  constructor(roster: Pick<AgentPresets, 'list' | 'roots'>, settings: SettingsScope<InstallationSettings>, bundledRoot?: string, baseUrl?: string);
28
39
  status(): Promise<PresetInstallationStatus>;
29
40
  initialize(): Promise<void>;
30
- install(id: unknown): Promise<PresetInstallationResult>;
41
+ synchronize(language: string): Promise<{
42
+ changed: boolean;
43
+ }>;
44
+ install(id: unknown, name?: string): Promise<PresetInstallationResult>;
45
+ reinstall(previousId: string, id: unknown, name?: string): Promise<PresetInstallationResult>;
31
46
  private occupied;
32
47
  private installNow;
33
48
  private enqueue;
@@ -36,7 +51,11 @@ export declare class SuperCodePresets extends TypertRemoteService {
36
51
  private readonly installer;
37
52
  constructor(ctx: Context, installer: PresetInstaller);
38
53
  status(): Promise<PresetInstallationStatus>;
39
- installPreset(id: unknown): Promise<PresetInstallationResult>;
54
+ installPreset(id: unknown, name?: string): Promise<PresetInstallationResult>;
55
+ reinstallPreset(previousId: string, id: unknown, name?: string): Promise<PresetInstallationResult>;
56
+ synchronize(language: string): Promise<{
57
+ changed: boolean;
58
+ }>;
40
59
  }
41
60
  export declare function applyPresetInstallation(ctx: Context): void;
42
61
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"preset-installation.d.ts","sourceRoot":"","sources":["../../src/dsh/preset-installation.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAElD,OAAO,EAAkD,KAAK,YAAY,EAAE,MAAM,gCAAgC,CAAA;AAClH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,EAAU,mBAAmB,EAAE,MAAM,kCAAkC,CAAA;AAE9E,UAAU,oBAAoB;IAC5B,OAAO,EAAE,OAAO,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;CACpB;AACD,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAA;IACpE,EAAE,EAAE,MAAM,CAAA;IACV,UAAU,EAAE,OAAO,CAAA;IACnB,YAAY,EAAE,OAAO,CAAA;CACtB;AACD,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,OAAO,CAAA;IACX,MAAM,EAAE,wBAAwB,CAAA;IAChC,KAAK,CAAC,EAAE,cAAc,GAAG,YAAY,GAAG,cAAc,GAAG,gBAAgB,CAAA;CAC1E;AAWD,qFAAqF;AACrF,qBAAa,eAAe;IAGxB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAL1B,OAAO,CAAC,IAAI,CAAsC;gBAE/B,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,EAC5C,QAAQ,EAAE,aAAa,CAAC,oBAAoB,CAAC,EAC7C,WAAW,GAAE,MAAmB,EAChC,OAAO,GAAE,MAAwC;IAG9D,MAAM,IAAI,OAAO,CAAC,wBAAwB,CAAC;IAgB3C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAW3B,OAAO,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,wBAAwB,CAAC;YAI/C,QAAQ;YAOR,UAAU;IAoCxB,OAAO,CAAC,OAAO;CAKhB;AAED,qBAAa,gBAAiB,SAAQ,mBAAmB;IACvD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiB;gBAC/B,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,eAAe;IAKpD,MAAM,IAAI,OAAO,CAAC,wBAAwB,CAAC;IAE3C,aAAa,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,wBAAwB,CAAC;CAC9D;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAY1D"}
1
+ {"version":3,"file":"preset-installation.d.ts","sourceRoot":"","sources":["../../src/dsh/preset-installation.ts"],"names":[],"mappings":"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"}
@@ -33,13 +33,16 @@ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn,
33
33
  done = true;
34
34
  };
35
35
  /** Host-only preset discovery repair; never part of a model's tool surface. */
36
- import { cp, lstat, mkdir, mkdtemp, readdir, rm } from 'node:fs/promises';
36
+ import { cp, lstat, mkdir, mkdtemp, readdir, rm, readFile, writeFile, rename, realpath } from 'node:fs/promises';
37
+ import { randomUUID } from 'node:crypto';
37
38
  import { join, resolve } from 'node:path';
38
39
  import { fileURLToPath, pathToFileURL } from 'node:url';
39
40
  import s from '@deepseek-ai/schemastery';
40
41
  import { copyComposition, discoverPresets, writableRoot } from '@deepseek-ai/dsh-agent-presets';
42
+ import { displayCopy, migrateMetadata } from './preset-metadata.js';
41
43
  import { Remote, TypertRemoteService } from '@deepseek-ai/dsh-typert-protocol';
42
44
  const sourceRoot = fileURLToPath(new URL('../../presets/', import.meta.url));
45
+ const ownershipFile = '.super-code-installation.json';
43
46
  const validId = /^[a-z0-9][a-z0-9-]{0,63}$/;
44
47
  async function exists(path) {
45
48
  try {
@@ -75,7 +78,7 @@ export class PresetInstaller {
75
78
  const userConflict = occupied && this.settings.get().installedId !== id;
76
79
  if (preset) {
77
80
  const owned = preset.trust === 'system' && resolve(preset.path) === join(this.bundledRoot, 'super-code', 'agent.cordis.yml');
78
- return { id, authorable, userConflict, state: preset.broken ? 'broken' : owned ? 'available'
81
+ return { id, name: preset.name, authorable, userConflict, state: preset.broken ? 'broken' : owned ? 'available'
79
82
  : preset.trust === 'user' && this.settings.get().installedId === id ? 'installed' : 'conflict' };
80
83
  }
81
84
  return { id, authorable, userConflict, state: occupied ? 'conflict' : 'missing' };
@@ -92,8 +95,116 @@ export class PresetInstaller {
92
95
  await this.installNow('super-code');
93
96
  });
94
97
  }
95
- async install(id) {
96
- return await this.enqueue(() => this.installNow(id));
98
+ async synchronize(language) {
99
+ if (!/^[a-z]{2,8}(?:-[a-z0-9]{1,8})*$/i.test(language))
100
+ throw new Error('Invalid language');
101
+ return await this.enqueue(async () => {
102
+ const stored = this.settings.get();
103
+ const display = { ...stored.display };
104
+ const pendingDisplay = { ...stored.pendingDisplay };
105
+ let changed = false;
106
+ for (const preset of await this.roster.list()) {
107
+ const bundled = preset.trust === 'system' && resolve(preset.path) === join(this.bundledRoot, 'super-code', 'agent.cordis.yml');
108
+ const owned = preset.trust === 'user' && (preset.id === stored.installedId || Object.hasOwn(display, preset.path));
109
+ if (!bundled && !owned)
110
+ continue;
111
+ if ((await lstat(join(preset.path, '..'))).isSymbolicLink())
112
+ continue;
113
+ const metadata = join(preset.path, '..', 'preset.yml');
114
+ let previous = display[preset.path];
115
+ const pending = pendingDisplay[preset.path];
116
+ if (previous && pending) {
117
+ previous = { ...previous };
118
+ for (const field of ['name', 'description']) {
119
+ if (pending[field] !== undefined && preset[field] === pending[field])
120
+ previous[field] = pending[field];
121
+ }
122
+ }
123
+ const result = await migrateMetadata(metadata, preset.id, preset, previous, displayCopy(language), async (baseline) => {
124
+ pendingDisplay[preset.path] = baseline;
125
+ await this.settings.update({ pendingDisplay: { ...pendingDisplay } });
126
+ });
127
+ changed ||= result.changed;
128
+ display[preset.path] = result.baseline;
129
+ delete pendingDisplay[preset.path];
130
+ }
131
+ if (JSON.stringify(display) !== JSON.stringify(stored.display ?? {}) || JSON.stringify(pendingDisplay) !== JSON.stringify(this.settings.get().pendingDisplay ?? {})) {
132
+ await this.settings.update({ display, pendingDisplay });
133
+ }
134
+ return { changed };
135
+ });
136
+ }
137
+ async install(id, name) {
138
+ return await this.enqueue(() => this.installNow(id, name));
139
+ }
140
+ async reinstall(previousId, id, name) {
141
+ return await this.enqueue(async () => {
142
+ const reject = async (error) => ({ ok: false, error, status: await this.status() });
143
+ if (typeof id !== 'string' || !validId.test(id))
144
+ return reject('invalid-name');
145
+ if (name !== undefined && (typeof name !== 'string' || !name.trim() || name.length > 120))
146
+ return reject('invalid-display-name');
147
+ const stored = this.settings.get(), installation = stored.installation;
148
+ if (!installation || previousId !== stored.installedId || installation.id !== previousId)
149
+ return reject('ownership-unverified');
150
+ const roots = this.roster.roots.filter(root => root.trust === 'user');
151
+ const expected = await Promise.all(roots
152
+ .map(async (root) => {
153
+ try {
154
+ return join(await realpath(writableRoot([root], previousId)), previousId);
155
+ }
156
+ catch {
157
+ return '';
158
+ }
159
+ }));
160
+ if (!expected.includes(installation.path))
161
+ return reject('ownership-unverified');
162
+ const originalPath = join(writableRoot([roots[expected.indexOf(installation.path)]], previousId), previousId);
163
+ let backup = '';
164
+ try {
165
+ const directory = await lstat(installation.path);
166
+ const markerPath = join(installation.path, ownershipFile);
167
+ const markerStat = await lstat(markerPath);
168
+ if (!directory.isDirectory() || directory.isSymbolicLink() || !markerStat.isFile() || markerStat.isSymbolicLink()
169
+ || await realpath(installation.path) !== installation.path
170
+ || directory.dev !== installation.dev || directory.ino !== installation.ino)
171
+ return reject('ownership-unverified');
172
+ const marker = JSON.parse(await readFile(markerPath, 'utf8'));
173
+ if (marker.plugin !== 'dsh-super-code' || marker.token !== installation.token || marker.id !== previousId)
174
+ return reject('ownership-unverified');
175
+ if (id !== previousId && ((await this.roster.list()).some(row => row.id === id) || await this.occupied(id)))
176
+ return reject('name-taken');
177
+ // A container without agent.cordis.yml is not a discoverable preset.
178
+ // Retain it after success as a recovery copy of the removed preset.
179
+ backup = await mkdtemp(join(installation.path, '..', '.super-code-backup-'));
180
+ await rename(installation.path, join(backup, previousId));
181
+ const moved = await lstat(join(backup, previousId));
182
+ if (!moved.isDirectory() || moved.dev !== installation.dev || moved.ino !== installation.ino) {
183
+ if (!await exists(installation.path))
184
+ await rename(join(backup, previousId), installation.path);
185
+ return reject('ownership-unverified');
186
+ }
187
+ }
188
+ catch {
189
+ return reject('ownership-unverified');
190
+ }
191
+ try {
192
+ const result = await this.installNow(id, name, originalPath);
193
+ if (result.ok)
194
+ return result;
195
+ if (await exists(installation.path))
196
+ return reject('install-failed');
197
+ await rename(join(backup, previousId), installation.path);
198
+ await rm(backup, { recursive: true, force: true });
199
+ return { ...result, status: await this.status() };
200
+ }
201
+ catch {
202
+ // Never overwrite a directory created by another actor during repair.
203
+ if (!await exists(installation.path))
204
+ await rename(join(backup, previousId), installation.path);
205
+ return reject('install-failed');
206
+ }
207
+ });
97
208
  }
98
209
  async occupied(id) {
99
210
  for (const root of this.roster.roots.filter(root => root.trust === 'user')) {
@@ -102,11 +213,13 @@ export class PresetInstaller {
102
213
  }
103
214
  return false;
104
215
  }
105
- async installNow(value) {
216
+ async installNow(value, name, replacedPath) {
106
217
  const reject = async (error) => ({ ok: false, error, status: await this.status() });
107
218
  if (typeof value !== 'string' || !validId.test(value))
108
219
  return reject('invalid-name');
109
220
  const id = value;
221
+ if (name !== undefined && (typeof name !== 'string' || !name.trim() || name.length > 120))
222
+ return reject('invalid-display-name');
110
223
  if (!this.roster.roots.some(root => root.trust === 'user'))
111
224
  return reject('no-user-root');
112
225
  if ((await this.roster.list()).some(row => row.id === id) || await this.occupied(id))
@@ -124,15 +237,31 @@ export class PresetInstaller {
124
237
  staging = await mkdtemp(join(root, '.super-code-install-'));
125
238
  // The host copy helper can clean up its destination on failure. Isolate
126
239
  // it from user-owned paths, then exclusively claim the final directory.
127
- const prepared = await copyComposition([{ path: staging, trust: 'user' }], source, id, id);
240
+ const prepared = await copyComposition([{ path: staging, trust: 'user' }], source, id, name?.trim() ?? 'Super Code');
128
241
  await mkdir(target, { mode: 0o700 });
129
242
  claimed = true;
130
243
  for (const entry of await readdir(prepared)) {
131
244
  await cp(join(prepared, entry), join(target, entry), { recursive: true, force: false, errorOnExist: true });
132
245
  }
133
- await this.settings.update({ checked: true, installedId: id });
246
+ const token = randomUUID();
247
+ await writeFile(join(target, ownershipFile), JSON.stringify({ plugin: 'dsh-super-code', id, token }), { flag: 'wx', mode: 0o600 });
248
+ const directory = await lstat(target);
249
+ const installation = { id, path: await realpath(target), token, dev: directory.dev, ino: directory.ino };
250
+ const display = { ...this.settings.get().display }, pendingDisplay = { ...this.settings.get().pendingDisplay };
251
+ if (replacedPath) {
252
+ delete display[join(replacedPath, 'agent.cordis.yml')];
253
+ delete pendingDisplay[join(replacedPath, 'agent.cordis.yml')];
254
+ }
255
+ const status = { id, authorable: true, userConflict: false, state: 'installed' };
256
+ await this.settings.update({ checked: true, installedId: id, installation, pendingDisplay, display: {
257
+ ...display,
258
+ [join(target, 'agent.cordis.yml')]: {
259
+ ...(name === undefined ? { name: 'Super Code' } : {}),
260
+ ...(source.description === undefined ? {} : { description: source.description }),
261
+ },
262
+ } });
134
263
  claimed = false;
135
- return { ok: true, status: await this.status() };
264
+ return { ok: true, status };
136
265
  }
137
266
  catch (error) {
138
267
  if (claimed)
@@ -155,13 +284,19 @@ let SuperCodePresets = (() => {
155
284
  let _instanceExtraInitializers = [];
156
285
  let _status_decorators;
157
286
  let _installPreset_decorators;
287
+ let _reinstallPreset_decorators;
288
+ let _synchronize_decorators;
158
289
  return class SuperCodePresets extends _classSuper {
159
290
  static {
160
291
  const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
161
292
  _status_decorators = [Remote];
162
293
  _installPreset_decorators = [Remote];
294
+ _reinstallPreset_decorators = [Remote];
295
+ _synchronize_decorators = [Remote];
163
296
  __esDecorate(this, null, _status_decorators, { kind: "method", name: "status", static: false, private: false, access: { has: obj => "status" in obj, get: obj => obj.status }, metadata: _metadata }, null, _instanceExtraInitializers);
164
297
  __esDecorate(this, null, _installPreset_decorators, { kind: "method", name: "installPreset", static: false, private: false, access: { has: obj => "installPreset" in obj, get: obj => obj.installPreset }, metadata: _metadata }, null, _instanceExtraInitializers);
298
+ __esDecorate(this, null, _reinstallPreset_decorators, { kind: "method", name: "reinstallPreset", static: false, private: false, access: { has: obj => "reinstallPreset" in obj, get: obj => obj.reinstallPreset }, metadata: _metadata }, null, _instanceExtraInitializers);
299
+ __esDecorate(this, null, _synchronize_decorators, { kind: "method", name: "synchronize", static: false, private: false, access: { has: obj => "synchronize" in obj, get: obj => obj.synchronize }, metadata: _metadata }, null, _instanceExtraInitializers);
165
300
  if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
166
301
  }
167
302
  installer = __runInitializers(this, _instanceExtraInitializers);
@@ -170,7 +305,9 @@ let SuperCodePresets = (() => {
170
305
  this.installer = installer;
171
306
  }
172
307
  status() { return this.installer.status(); }
173
- installPreset(id) { return this.installer.install(id); }
308
+ installPreset(id, name) { return this.installer.install(id, name === '' ? undefined : name); }
309
+ reinstallPreset(previousId, id, name) { return this.installer.reinstall(previousId, id, name === '' ? undefined : name); }
310
+ synchronize(language) { return this.installer.synchronize(language); }
174
311
  };
175
312
  })();
176
313
  export { SuperCodePresets };
@@ -179,11 +316,17 @@ export function applyPresetInstallation(ctx) {
179
316
  const settings = owner.settings.register('super-code', s.object({
180
317
  checked: s.boolean().default(false),
181
318
  installedId: s.string().default(''),
319
+ installation: s.object({ id: s.string(), path: s.string(), token: s.string(), dev: s.number(), ino: s.number() }).required(false),
320
+ pendingDisplay: s.dict(s.object({ name: s.string().required(false), description: s.string().required(false) })).default({}),
321
+ display: s.dict(s.object({ name: s.string().required(false), description: s.string().required(false) })).default({}),
182
322
  }));
183
323
  const installer = new PresetInstaller(owner.agentPresets, settings, sourceRoot, owner.baseUrl);
184
324
  new SuperCodePresets(owner, installer);
185
325
  try {
186
326
  await installer.initialize();
327
+ const language = owner.settings.get('locale');
328
+ if (language?.preference)
329
+ await installer.synchronize(language.preference);
187
330
  }
188
331
  catch {
189
332
  owner.logger.warn('Super Code preset installation unavailable; retry in plugin settings.');
@@ -1 +1 @@
1
- {"version":3,"file":"preset-installation.js","sourceRoot":"","sources":["../../src/dsh/preset-installation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"preset-installation.js","sourceRoot":"","sources":["../../src/dsh/preset-installation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export interface DisplayBaseline {
2
+ name?: string;
3
+ description?: string;
4
+ }
5
+ export interface DisplayCopy {
6
+ name: string;
7
+ description: string;
8
+ }
9
+ export declare function displayCopy(language: string): DisplayCopy;
10
+ export interface MetadataMigration {
11
+ changed: boolean;
12
+ baseline: DisplayBaseline;
13
+ }
14
+ export declare function migrateMetadata(path: string, id: string, current: DisplayBaseline, previous: DisplayBaseline | undefined, copy: DisplayCopy, beforeWrite?: (baseline: DisplayBaseline) => Promise<void>): Promise<MetadataMigration>;
15
+ //# sourceMappingURL=preset-metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preset-metadata.d.ts","sourceRoot":"","sources":["../../src/dsh/preset-metadata.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AACD,MAAM,WAAW,WAAW;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE;AAClE,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAIzD;AAQD,MAAM,WAAW,iBAAiB;IAAG,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,eAAe,CAAA;CAAE;AAClF,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,eAAe,GAAG,SAAS,EAAE,IAAI,EAAE,WAAW,EAC5G,WAAW,GAAE,CAAC,QAAQ,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAkB,GACzE,OAAO,CAAC,iBAAiB,CAAC,CAgD5B"}
@@ -0,0 +1,83 @@
1
+ /** Update only recognized or previously managed display fields, preserving YAML around them. */
2
+ import { lstat, readFile, open, mkdtemp, rename, rm } from 'node:fs/promises';
3
+ import { constants } from 'node:fs';
4
+ import { dirname, join } from 'node:path';
5
+ import { readPresetMetadata } from '@deepseek-ai/dsh-agent-presets';
6
+ export function displayCopy(language) {
7
+ return language.toLowerCase().startsWith('zh')
8
+ ? { name: 'Super Code 模式', description: '更快、更省、更聪明的编码模式。' }
9
+ : { name: 'Super Code', description: 'A faster, more efficient, smarter coding mode.' };
10
+ }
11
+ const legacyDescriptions = [
12
+ 'Coding with on-demand research, design, development, testing and optimization expertise.',
13
+ 'A faster, more efficient, smarter coding mode.',
14
+ '更快、更省、更聪明的编码模式。',
15
+ '按需协同调研、设计、开发、测试与优化的编码助手。',
16
+ ];
17
+ export async function migrateMetadata(path, id, current, previous, copy, beforeWrite = async () => { }) {
18
+ const baseline = {};
19
+ let original;
20
+ try {
21
+ if (!(await lstat(path)).isFile())
22
+ return { changed: false, baseline: previous ?? {} };
23
+ original = await readFile(path, 'utf8');
24
+ }
25
+ catch (error) {
26
+ if (error.code === 'ENOENT')
27
+ return { changed: false, baseline: previous ?? {} };
28
+ throw error;
29
+ }
30
+ // Discovery may predate a user edit; re-read the metadata before deciding ownership.
31
+ current = await readPresetMetadata(dirname(path));
32
+ let updated = original;
33
+ for (const field of ['name', 'description']) {
34
+ const value = current[field];
35
+ const managed = previous === undefined
36
+ ? value !== undefined && (field === 'name'
37
+ ? [id, 'Super Code', 'Super Code 模式', '超级编码'].includes(value)
38
+ : legacyDescriptions.includes(value))
39
+ : previous[field] !== undefined && value === previous[field];
40
+ if (!managed)
41
+ continue;
42
+ // A single top-level scalar only: preserve comments/unknown fields; leave
43
+ // aliases, multiline values and duplicate keys untouched for user review.
44
+ const pattern = new RegExp(`^${field}:[ \\t]*([^\\r\\n]*)$`, 'gm');
45
+ const matches = [...updated.matchAll(pattern)];
46
+ const match = matches[0];
47
+ if (matches.length !== 1 || !match || /^[>|&*]/.test(match[1].trim()))
48
+ continue;
49
+ baseline[field] = copy[field];
50
+ if (value === copy[field])
51
+ continue;
52
+ const comment = match[1].match(/\s+#.*$/)?.[0] ?? '';
53
+ updated = updated.replace(pattern, () => `${field}: ${JSON.stringify(copy[field])}${comment}`);
54
+ }
55
+ if (updated === original)
56
+ return { changed: false, baseline };
57
+ // Stage beside the original so interruption cannot leave a partial YAML file.
58
+ const staging = await mkdtemp(join(dirname(path), '.super-code-metadata-'));
59
+ try {
60
+ const temporary = join(staging, 'preset.yml');
61
+ const file = await open(temporary, constants.O_CREAT | constants.O_EXCL | constants.O_WRONLY, 0o600);
62
+ try {
63
+ await file.writeFile(updated);
64
+ await file.sync();
65
+ }
66
+ finally {
67
+ await file.close();
68
+ }
69
+ if (!(await lstat(path)).isFile() || await readFile(path, 'utf8') !== original) {
70
+ throw new Error('Preset metadata changed during migration');
71
+ }
72
+ await beforeWrite(baseline);
73
+ // Persistence can await I/O; check once more before replacing the file.
74
+ if (await readFile(path, 'utf8') !== original)
75
+ throw new Error('Preset metadata changed during migration');
76
+ await rename(temporary, path);
77
+ }
78
+ finally {
79
+ await rm(staging, { recursive: true, force: true });
80
+ }
81
+ return { changed: true, baseline };
82
+ }
83
+ //# sourceMappingURL=preset-metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preset-metadata.js","sourceRoot":"","sources":["../../src/dsh/preset-metadata.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-super-code",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "description": "One super-code preset with specialist teams and durable task memory for DeepSeek Harness.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",