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 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
- function doReset() {
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 即从断点续跑;如要重头开始请加 --fresh。',
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;重新 /loopbegin 可从断点续跑)。' }
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-mcmp",
3
- "version": "2.1.1",
3
+ "version": "2.1.2",
4
4
  "description": "DeepSeek Harness 插件:数学建模论文自动化流水线 v2(8 步骤 × 19 迭代 × N 轮:图表视觉自检与修复、评审问题修复闭环、跨步骤缺陷台账与向上修复、论文兜底定稿、质疑驱动、断点续跑、进度面板)",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",