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:
2025-12-12 10:42:20 +08:00
parent 59dbed926e
commit 5e32375f0e
301 changed files with 3281 additions and 43 deletions
+143
View File
@@ -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),
};
}
},
};