feat: 重构为 Monorepo 架构并实现 HTTP Server
架构变更: - 采用 pnpm workspaces 实现 Monorepo 结构 - 将现有代码迁移到 packages/core - 新增 packages/server HTTP 服务层 Server 功能: - REST API: 会话管理、工具管理、配置管理 - WebSocket: 实时双向通信支持 - SSE: 服务端事件推送 - Hono + Bun 作为运行时 API 端点: - GET/POST /api/sessions - 会话 CRUD - GET/POST /api/sessions/:id/messages - 消息管理 - GET /api/sessions/:id/events - SSE 事件流 - WS /api/ws/:sessionId - WebSocket 连接 - GET/POST /api/tools - 工具管理 - GET/PUT /api/config - 配置管理
This commit is contained in:
@@ -0,0 +1,143 @@
|
||||
/**
|
||||
* 撤销操作工具 (快捷回滚)
|
||||
*/
|
||||
|
||||
import type { ToolResult } from '../../types/index.js';
|
||||
import type { ToolWithMetadata } from '../types.js';
|
||||
import { loadDescription } from '../load_description.js';
|
||||
import { getCheckpointManager } from '../../checkpoint/index.js';
|
||||
|
||||
export const undoTool: ToolWithMetadata = {
|
||||
name: 'undo',
|
||||
description: loadDescription('undo'),
|
||||
metadata: {
|
||||
name: 'undo',
|
||||
category: 'core',
|
||||
description: '撤销上一次文件操作,回滚到最近的检查点',
|
||||
keywords: ['undo', 'rollback', 'revert', '撤销', '回滚', '恢复'],
|
||||
deferLoading: false, // 常用命令,始终加载
|
||||
},
|
||||
parameters: {
|
||||
confirm: {
|
||||
type: 'boolean',
|
||||
description: '确认执行撤销操作 (默认 true)',
|
||||
required: false,
|
||||
},
|
||||
},
|
||||
execute: async (params: Record<string, unknown>): Promise<ToolResult> => {
|
||||
const confirm = params.confirm !== false;
|
||||
|
||||
try {
|
||||
const manager = getCheckpointManager();
|
||||
|
||||
if (!manager.isEnabled()) {
|
||||
return {
|
||||
success: false,
|
||||
output: '',
|
||||
error: '检查点系统已禁用,无法执行撤销操作',
|
||||
};
|
||||
}
|
||||
|
||||
await manager.initialize();
|
||||
|
||||
// 获取最近两个检查点
|
||||
const checkpoints = await manager.listCheckpoints();
|
||||
|
||||
if (checkpoints.length === 0) {
|
||||
return {
|
||||
success: false,
|
||||
output: '',
|
||||
error: '没有可用的检查点,无法执行撤销操作',
|
||||
};
|
||||
}
|
||||
|
||||
// 预览模式
|
||||
if (!confirm) {
|
||||
const targetCheckpoint =
|
||||
checkpoints.length > 1 ? checkpoints[1] : checkpoints[0];
|
||||
|
||||
const diff = await manager.getDiff(targetCheckpoint.id);
|
||||
|
||||
const lines = [
|
||||
'预览: 撤销将恢复以下文件变更:',
|
||||
'',
|
||||
`目标检查点: ${targetCheckpoint.commitHash.slice(0, 8)}`,
|
||||
` ${targetCheckpoint.description || targetCheckpoint.trigger}`,
|
||||
` ${new Date(targetCheckpoint.timestamp).toLocaleString()}`,
|
||||
'',
|
||||
];
|
||||
|
||||
if (diff.files.length > 0) {
|
||||
lines.push('将恢复的文件:');
|
||||
for (const file of diff.files.slice(0, 10)) {
|
||||
const symbol =
|
||||
file.type === 'added'
|
||||
? '+'
|
||||
: file.type === 'deleted'
|
||||
? '-'
|
||||
: 'M';
|
||||
lines.push(` ${symbol} ${file.path}`);
|
||||
}
|
||||
if (diff.files.length > 10) {
|
||||
lines.push(` ... 还有 ${diff.files.length - 10} 个文件`);
|
||||
}
|
||||
} else {
|
||||
lines.push('(无文件变更)');
|
||||
}
|
||||
|
||||
lines.push('');
|
||||
lines.push('使用 confirm=true 执行撤销');
|
||||
|
||||
return {
|
||||
success: true,
|
||||
output: lines.join('\n'),
|
||||
};
|
||||
}
|
||||
|
||||
// 执行撤销
|
||||
const result = await manager.undo();
|
||||
|
||||
if (!result.success) {
|
||||
const errorLines = ['撤销失败:'];
|
||||
for (const err of result.errors) {
|
||||
errorLines.push(` ${err.file}: ${err.error}`);
|
||||
}
|
||||
return {
|
||||
success: false,
|
||||
output: '',
|
||||
error: errorLines.join('\n'),
|
||||
};
|
||||
}
|
||||
|
||||
const lines = [
|
||||
'✓ 撤销成功',
|
||||
'',
|
||||
`恢复了 ${result.restoredFiles.length} 个文件`,
|
||||
];
|
||||
|
||||
if (result.restoredFiles.length > 0 && result.restoredFiles.length <= 5) {
|
||||
for (const file of result.restoredFiles) {
|
||||
lines.push(` - ${file}`);
|
||||
}
|
||||
}
|
||||
|
||||
if (result.previousCommit) {
|
||||
lines.push('');
|
||||
lines.push(
|
||||
`提示: 使用 checkpoint_restore --checkpoint_id ${result.previousCommit.slice(0, 8)} 可以撤销此操作`
|
||||
);
|
||||
}
|
||||
|
||||
return {
|
||||
success: true,
|
||||
output: lines.join('\n'),
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
success: false,
|
||||
output: '',
|
||||
error: error instanceof Error ? error.message : String(error),
|
||||
};
|
||||
}
|
||||
},
|
||||
};
|
||||
Reference in New Issue
Block a user