mingdao-harness 0.6.42 → 0.6.43

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mingdao-harness",
3
- "version": "0.6.42",
3
+ "version": "0.6.43",
4
4
  "description": "MingDao Harness —— 开源智能体框架(Agent Harness)。零依赖、开箱即用,针对 DeepSeek-V4 系列优化,开放主流模型接入。",
5
5
  "type": "module",
6
6
  "bin": {
@@ -75,6 +75,18 @@ export const SYNTHETIC_REASON = '进程中断(启动时合成闭合事件)';
75
75
  /** 回滚开关:`MINGDAO_EVENT_LOG=0`(或 false/off/no)时全局关闭双写。 */
76
76
  export const EVENT_LOG_ENV = 'MINGDAO_EVENT_LOG';
77
77
 
78
+ /**
79
+ * 事件日志**格式版本**(写在 `session.start` 的 `data.format` 里)。
80
+ *
81
+ * 为什么需要:0.6.42 之前 `rewriteSession()` 完全不写事件,旧日志**无法**从事件流恢复历史。
82
+ * 对拍工具需要一个可靠依据来区分"旧日志不可回溯(历史噪声)"与"新日志重放回归(真 bug)"——
83
+ * 靠"条数/前缀"猜是不行的(实测会把内容不一致误判成历史噪声)。这就是 DSH `session-format-v*` 的同一思路。
84
+ *
85
+ * 1 = 0.6.35–0.6.41:只有 appendMessages 双写,rewrite 无事件
86
+ * 2 = 0.6.42 起:rewriteSession 也写 `messages.replace`
87
+ */
88
+ export const EVENT_LOG_FORMAT = 2;
89
+
78
90
  /** 中断时补的 tool 占位文案——与 `agent.js#finishTurn` 的既有文案保持逐字一致。 */
79
91
  export const INTERRUPTED_TOOL_CONTENT = '(已中断,未执行)';
80
92
 
package/src/session.js CHANGED
@@ -3,7 +3,7 @@
3
3
 
4
4
  import fs from 'node:fs';
5
5
  import path from 'node:path';
6
- import { appendEvent, eventFileFor, eventLogEnabled, isEventLogName, repairEventLog, warnEventFailure } from './session-events.js';
6
+ import { appendEvent, eventFileFor, eventLogEnabled, isEventLogName, repairEventLog, warnEventFailure, EVENT_LOG_FORMAT } from './session-events.js';
7
7
 
8
8
  // —— 冲突备份名(单一事实来源,v0.4.6)——
9
9
  // 同步冲突时写入的备份:<会话名>.server-<时间戳>[-<随机后缀>].jsonl(远端版本)与 .remote-(远端拉取版本)。
@@ -134,7 +134,7 @@ function doubleWriteSessionEvents(file, messages) {
134
134
  try {
135
135
  // 事件流的第一条:只在文件尚不存在时写一次(并发下最多重复一条 session.start,无害)。
136
136
  if (!fs.existsSync(eventFile)) {
137
- const start = appendEvent(eventFile, { type: 'session.start', data: { session: path.basename(String(file)) } });
137
+ const start = appendEvent(eventFile, { type: 'session.start', data: { session: path.basename(String(file)), format: EVENT_LOG_FORMAT } });
138
138
  if (!start.ok) {
139
139
  warnEventFailure(eventFile, start.error ?? null);
140
140
  return;
@@ -192,7 +192,7 @@ function doubleWriteReplaceEvents(file, messages, reason) {
192
192
  try {
193
193
  // 与 appendMessages 一致:事件流的第一条 session.start 只在文件尚不存在时写一次。
194
194
  if (!fs.existsSync(eventFile)) {
195
- const start = appendEvent(eventFile, { type: 'session.start', data: { session: path.basename(String(file)) } });
195
+ const start = appendEvent(eventFile, { type: 'session.start', data: { session: path.basename(String(file)), format: EVENT_LOG_FORMAT } });
196
196
  if (!start.ok) {
197
197
  warnEventFailure(eventFile, start.error ?? null);
198
198
  return;