dsh-mcmp 2.1.1 → 2.1.2
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 +4 -3
- package/lib/client.js +1 -1
- package/lib/index.js +33 -4
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -17,7 +17,8 @@ DeepSeek Harness **持久化 Cordis 插件**:面向全国大学生数学建模
|
|
|
17
17
|
- **跨步骤缺陷回传(台账机制)**:后续步骤发现前序步骤的错误时,必须登记 `00_缺陷与裁决台账.md` 并**直接修复出错文件**(标注修正来源),下游以台账最新裁决为最高权威——错误在源头修掉,不打下游补丁
|
|
18
18
|
- **论文兜底定稿**:S8 组装完整、可直接提交的 `论文定稿.md`;即使流水线提前出错或中止,也会追加一次兜底定稿
|
|
19
19
|
- **成果全落盘**:每步迭代完整追加保存(含质疑清单),旧内容绝不覆盖;代码保留全部历史版本;全新运行时旧目录自动归档为 `数学建模流水线_历史归档_*`
|
|
20
|
-
- **实时进度面板**:独立浮动窗口(可拖拽/最小化/关闭),显示百分比进度条、当前轮/步骤/迭代、8
|
|
20
|
+
- **实时进度面板**:独立浮动窗口(可拖拽/最小化/关闭),显示百分比进度条、当前轮/步骤/迭代、8 步骤打点、日志、产出文件,支持一键中止、重置(全新开始)
|
|
21
|
+
- **断点续跑与重置**:中断/关闭窗口不丢进度,再次 `/loopbegin` 自动续跑;`/loopreset` 或面板「重置(全新开始)」清空续跑记录,下次从头跑
|
|
21
22
|
- **原生工作流卡片**:聊天区实时显示每个子智能体的运行状态(按阶段分组)
|
|
22
23
|
|
|
23
24
|
## 八大步骤(每轮 19 次迭代)
|
|
@@ -44,7 +45,7 @@ DeepSeek Harness **持久化 Cordis 插件**:面向全国大学生数学建模
|
|
|
44
45
|
- `/loopbegin --from 题目.txt` —— 从文件读取赛题(支持含空格/中文的文件名,如 `--from 2024 年高教社杯全国大学生数学建模竞赛题目.md`,也可用 `--from=文件` 形式)
|
|
45
46
|
3. **查看进度**:右下角浮动面板(百分比、步骤打点、日志、文件)+ 聊天区工作流卡片。
|
|
46
47
|
|
|
47
|
-
辅助命令:`/loopstatus`(查看进度)、`/loopabort`(中止,已产出成果保留)。
|
|
48
|
+
辅助命令:`/loopstatus`(查看进度)、`/loopabort`(中止,已产出成果保留)、`/loopreset`(清空状态与断点续跑记录,下次 `/loopbegin` 从头全新开始;等价于面板「重置(全新开始)」按钮)。
|
|
48
49
|
|
|
49
50
|
### 触发规则
|
|
50
51
|
|
|
@@ -53,7 +54,7 @@ DeepSeek Harness **持久化 Cordis 插件**:面向全国大学生数学建模
|
|
|
53
54
|
| `/loopbegin --round=3`(开头) | ✅ |
|
|
54
55
|
| ` /loopbegin`(前导空格) | ✅ |
|
|
55
56
|
| `题目正文… /loopbegin`(不在开头) | ❌ |
|
|
56
|
-
| `/loopstatus`、`/loopabort` | 辅助命令,不触发 |
|
|
57
|
+
| `/loopstatus`、`/loopabort`、`/loopreset` | 辅助命令,不触发 |
|
|
57
58
|
|
|
58
59
|
## 安装方式
|
|
59
60
|
|
package/lib/client.js
CHANGED
|
@@ -156,7 +156,7 @@ window.__ModuleLoader__.load({
|
|
|
156
156
|
if (st === 'running') {
|
|
157
157
|
actions.push(h('button', { key: 'abort', className: 'mcmp-btn mcmp-abort', onClick: () => { fetch('/mcmp-api/abort', { method: 'POST' }).catch(() => {}) } }, '中止'))
|
|
158
158
|
} else {
|
|
159
|
-
actions.push(h('button', { key: 'reset', className: 'mcmp-btn', onClick: () => { fetch('/mcmp-api/reset', { method: 'POST' }).then(() => setDismissedRun(snap.runId)).catch(() => {}) } }, '
|
|
159
|
+
actions.push(h('button', { key: 'reset', className: 'mcmp-btn', title: '清空状态与断点续跑记录,下次 /loopbegin 从头全新开始', onClick: () => { fetch('/mcmp-api/reset', { method: 'POST' }).then(() => setDismissedRun(snap.runId)).catch(() => {}) } }, '重置(全新开始)'))
|
|
160
160
|
}
|
|
161
161
|
actions.push(h('button', { key: 'hide', className: 'mcmp-btn', onClick: () => setDismissedRun(snap.runId) }, '关闭'))
|
|
162
162
|
body.push(h('div', { key: 'actions', className: 'mcmp-actions' }, actions))
|
package/lib/index.js
CHANGED
|
@@ -112,6 +112,7 @@ export function apply(ctx) {
|
|
|
112
112
|
}
|
|
113
113
|
let state = freshState()
|
|
114
114
|
let active = null
|
|
115
|
+
let lastSession = null // 最近一次运行所属会话,供「清空状态」追加重置标记
|
|
115
116
|
const recording = new Map()
|
|
116
117
|
|
|
117
118
|
function fmtTime(ts) {
|
|
@@ -167,6 +168,12 @@ export function apply(ctx) {
|
|
|
167
168
|
let current = null
|
|
168
169
|
for (const ev of session.events) {
|
|
169
170
|
try {
|
|
171
|
+
if (ev.type === 'tool-workflow/mcmp-reset') {
|
|
172
|
+
// 用户点过「清空状态/重置」:此前的所有运行记录作废,只从标记之后开始计数
|
|
173
|
+
runs.length = 0
|
|
174
|
+
current = null
|
|
175
|
+
continue
|
|
176
|
+
}
|
|
170
177
|
if (ev.type === 'tool-workflow/run-start') {
|
|
171
178
|
const d = ev.data || {}
|
|
172
179
|
if (d.name === FLOW_NAME) {
|
|
@@ -401,13 +408,23 @@ export function apply(ctx) {
|
|
|
401
408
|
return { ok: true }
|
|
402
409
|
}
|
|
403
410
|
|
|
404
|
-
|
|
411
|
+
// 清空状态 + 重置断点续跑记录:向最近一次运行所属会话追加一条重置标记,
|
|
412
|
+
// 续跑扫描遇到该标记会把之前的运行记录全部作废,下次 /loopbegin 从第 1 个迭代全新开始。
|
|
413
|
+
function resetRecords() {
|
|
405
414
|
if (state.status === 'running') return { ok: false, reason: '流水线运行中,不能重置' }
|
|
415
|
+
if (lastSession) {
|
|
416
|
+
try { lastSession.append('tool-workflow/mcmp-reset', { ts: Date.now() }) } catch (err) { /* 会话不可追加时忽略 */ }
|
|
417
|
+
lastSession = null
|
|
418
|
+
}
|
|
406
419
|
state = freshState()
|
|
407
420
|
active = null
|
|
408
421
|
return { ok: true }
|
|
409
422
|
}
|
|
410
423
|
|
|
424
|
+
function doReset() {
|
|
425
|
+
return resetRecords()
|
|
426
|
+
}
|
|
427
|
+
|
|
411
428
|
// 启动一个子智能体并返回 { ok, text, outcome }
|
|
412
429
|
async function runChild(provider, session, agent, controller, label, promptText, onStarted) {
|
|
413
430
|
let child = null
|
|
@@ -526,6 +543,7 @@ export function apply(ctx) {
|
|
|
526
543
|
if (typeof cwd !== 'string' || cwd.length === 0) {
|
|
527
544
|
return { kind: 'error', text: '无法确定当前会话的工作区目录,无法启动流水线。' }
|
|
528
545
|
}
|
|
546
|
+
lastSession = session
|
|
529
547
|
const raw = rawInput || ''
|
|
530
548
|
const mRound = /(?:^|\s)--round\s*[=:]?\s*(\d+)/i.exec(raw)
|
|
531
549
|
let rounds = 1
|
|
@@ -596,7 +614,7 @@ export function apply(ctx) {
|
|
|
596
614
|
kind: 'success',
|
|
597
615
|
text: '数学建模论文自动化流水线(v2)已启动:' + rounds + ' 轮 × 19 次迭代 = ' + (rounds * PER_ROUND) + ' 个子任务。\n输出目录: ' + wsDir
|
|
598
616
|
+ (resumeCount > 0 ? '\n断点续跑:已跳过此前完成的 ' + resumeCount + ' 次迭代,从第 ' + (resumeCount + 1) + ' 次继续。' : '\n全新运行(若输出目录有旧成果,第一步会自动归档为 数学建模流水线_历史归档_*)。')
|
|
599
|
-
+ '\n新流程:赛题分析 → 模型建立与求解 → 编程实现 → 图表与流程图 → 图表视觉自检与修复(有识图插件自动调用,无则脚本分析)→ 论文撰写 → 评审与修复落实(问题必须真正修复)→ 论文定稿。\n无论成败,最终都会生成完整论文 数学建模流水线/论文定稿.md。\n进度请在右下角浮动面板实时查看(含百分比),聊天区也会出现流水线运行卡片。\n提示:中断或关闭聊天窗口都不会丢进度,再次发送 /loopbegin
|
|
617
|
+
+ '\n新流程:赛题分析 → 模型建立与求解 → 编程实现 → 图表与流程图 → 图表视觉自检与修复(有识图插件自动调用,无则脚本分析)→ 论文撰写 → 评审与修复落实(问题必须真正修复)→ 论文定稿。\n无论成败,最终都会生成完整论文 数学建模流水线/论文定稿.md。\n进度请在右下角浮动面板实时查看(含百分比),聊天区也会出现流水线运行卡片。\n提示:中断或关闭聊天窗口都不会丢进度,再次发送 /loopbegin 即从断点续跑;如要重头开始,点面板「重置(全新开始)」、运行 /loopreset 或加 --fresh。',
|
|
600
618
|
}
|
|
601
619
|
} catch (err) {
|
|
602
620
|
return { kind: 'error', text: '启动失败: ' + String((err && err.message) || err) }
|
|
@@ -620,10 +638,21 @@ export function apply(ctx) {
|
|
|
620
638
|
handler: () => {
|
|
621
639
|
if (!active) return { kind: 'error', text: '当前没有运行中的流水线。' }
|
|
622
640
|
try { active.controller.abort(new Error('用户通过 /loopabort 中止')) } catch (err) { /* ignore */ }
|
|
623
|
-
return { kind: 'success', text: '已发送中止请求,流水线将在当前子任务结束后停止(已产出的成果全部保留,随后会自动兜底生成 论文定稿.md
|
|
641
|
+
return { kind: 'success', text: '已发送中止请求,流水线将在当前子任务结束后停止(已产出的成果全部保留,随后会自动兜底生成 论文定稿.md)。\n- 想从断点继续:直接再次发送 /loopbegin;\n- 想从头重新开始:先运行 /loopreset(或点面板「重置(全新开始)」),再发送 /loopbegin;也可直接 /loopbegin --fresh。' }
|
|
624
642
|
},
|
|
625
643
|
})
|
|
626
644
|
} catch (err) { console.warn('dsh-mcmp: loopabort 注册失败: ' + String((err && err.message) || err)) }
|
|
645
|
+
try {
|
|
646
|
+
commands.register({
|
|
647
|
+
name: 'loopreset',
|
|
648
|
+
description: '清空流水线状态与断点续跑记录(下次 /loopbegin 从头全新开始)',
|
|
649
|
+
handler: () => {
|
|
650
|
+
const r = resetRecords()
|
|
651
|
+
if (!r.ok) return { kind: 'error', text: r.reason }
|
|
652
|
+
return { kind: 'success', text: '已清空流水线状态与断点续跑记录。下次发送 /loopbegin 将从第 1 个迭代全新开始(工作区旧成果不删除,首步会自动归档为 数学建模流水线_历史归档_*)。' }
|
|
653
|
+
},
|
|
654
|
+
})
|
|
655
|
+
} catch (err) { console.warn('dsh-mcmp: loopreset 注册失败: ' + String((err && err.message) || err)) }
|
|
627
656
|
try {
|
|
628
657
|
commands.register({
|
|
629
658
|
name: 'loopstatus',
|
|
@@ -667,7 +696,7 @@ export function apply(ctx) {
|
|
|
667
696
|
systemPrompt.section({
|
|
668
697
|
name: 'mcmp-pipeline',
|
|
669
698
|
order: 130,
|
|
670
|
-
text: '数学建模流水线说明:当用户消息以 /loopbegin 开头(可带 --round=N、--from 文件或 --fresh 参数)时,插件已自动在后台启动「数学建模论文自动化流水线」(8 步骤、每轮 19 次迭代,由工作流子智能体执行:赛题分析→模型建立与求解→编程实现→图表与流程图→图表视觉自检与修复→论文撰写→评审与修复落实→论文定稿)。此时你只需用一两句话确认已启动,并提示用户查看右下角进度面板与聊天区的工作流运行卡片;绝对不要自己去编写或执行该流水线的任何步骤,不要重复启动。流水线无论成败都会在 数学建模流水线/论文定稿.md 生成一版完整论文。若用户消息包含赛题但未以 /loopbegin 开头,说明尚未启动流水线,不要擅自运行。辅助命令 /loopstatus、/loopabort
|
|
699
|
+
text: '数学建模流水线说明:当用户消息以 /loopbegin 开头(可带 --round=N、--from 文件或 --fresh 参数)时,插件已自动在后台启动「数学建模论文自动化流水线」(8 步骤、每轮 19 次迭代,由工作流子智能体执行:赛题分析→模型建立与求解→编程实现→图表与流程图→图表视觉自检与修复→论文撰写→评审与修复落实→论文定稿)。此时你只需用一两句话确认已启动,并提示用户查看右下角进度面板与聊天区的工作流运行卡片;绝对不要自己去编写或执行该流水线的任何步骤,不要重复启动。流水线无论成败都会在 数学建模流水线/论文定稿.md 生成一版完整论文。若用户消息包含赛题但未以 /loopbegin 开头,说明尚未启动流水线,不要擅自运行。辅助命令 /loopstatus、/loopabort、/loopreset(清空续跑记录,下次从头开始)由系统处理,你无需执行。',
|
|
671
700
|
})
|
|
672
701
|
} catch (err) { console.warn('dsh-mcmp: systemPrompt 注册失败: ' + String((err && err.message) || err)) }
|
|
673
702
|
}
|
package/package.json
CHANGED