feat: v3.0 — add human_readable operation receipts
This commit is contained in:
parent
da7ac1a195
commit
49cda91740
@ -184,7 +184,7 @@ app.post('/api/exec', async (req, res) => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// ========== MCP 终端会话 (v2.0) ==========
|
// ========== MCP 终端会话 (v3.0) ==========
|
||||||
|
|
||||||
const terminalSessions = {};
|
const terminalSessions = {};
|
||||||
|
|
||||||
@ -216,7 +216,9 @@ app.post('/api/terminal/open', (req, res) => {
|
|||||||
request_id: requestId,
|
request_id: requestId,
|
||||||
status: 'awaiting_auth',
|
status: 'awaiting_auth',
|
||||||
temp_key: null,
|
temp_key: null,
|
||||||
created_at: new Date().toISOString()
|
created_at: new Date().toISOString(),
|
||||||
|
operation_stage: '敲门中',
|
||||||
|
human_readable: '铸渊正在连接 ' + srv.name + ',请求操作权限...'
|
||||||
};
|
};
|
||||||
|
|
||||||
res.json({
|
res.json({
|
||||||
@ -240,8 +242,12 @@ app.get('/api/terminal/status/:session_id', (req, res) => {
|
|||||||
if (entry.status === 'approved') {
|
if (entry.status === 'approved') {
|
||||||
session.status = 'ready';
|
session.status = 'ready';
|
||||||
session.temp_key = entry.temp_key;
|
session.temp_key = entry.temp_key;
|
||||||
|
session.operation_stage = '已授权';
|
||||||
|
session.human_readable = '冰朔已确认信任,铸渊获得操作权限,准备执行操作...';
|
||||||
} else if (entry.status === 'rejected') {
|
} else if (entry.status === 'rejected') {
|
||||||
session.status = 'rejected';
|
session.status = 'rejected';
|
||||||
|
session.operation_stage = '已拒绝';
|
||||||
|
session.human_readable = '冰朔未确认此操作,铸渊等待新的指令。';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -252,6 +258,8 @@ app.get('/api/terminal/status/:session_id', (req, res) => {
|
|||||||
status: session.status,
|
status: session.status,
|
||||||
server: session.server,
|
server: session.server,
|
||||||
server_name: session.server_name,
|
server_name: session.server_name,
|
||||||
|
operation_stage: session.operation_stage,
|
||||||
|
human_readable: session.human_readable,
|
||||||
created_at: session.created_at
|
created_at: session.created_at
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@ -265,6 +273,9 @@ app.post('/api/terminal/exec', async (req, res) => {
|
|||||||
if (!session) return res.status(404).json({ error: '会话不存在' });
|
if (!session) return res.status(404).json({ error: '会话不存在' });
|
||||||
if (session.status !== 'ready') return res.status(400).json({ error: '会话尚未就绪,等待冰朔授权中' });
|
if (session.status !== 'ready') return res.status(400).json({ error: '会话尚未就绪,等待冰朔授权中' });
|
||||||
|
|
||||||
|
session.operation_stage = '执行中';
|
||||||
|
session.human_readable = '铸渊正在 ' + session.server_name + ' 上执行操作...';
|
||||||
|
|
||||||
const srv = SERVERS.find(s => s.code === session.server);
|
const srv = SERVERS.find(s => s.code === session.server);
|
||||||
if (!srv) return res.status(404).json({ error: '未找到服务器' });
|
if (!srv) return res.status(404).json({ error: '未找到服务器' });
|
||||||
|
|
||||||
@ -298,6 +309,8 @@ app.post('/api/terminal/exec', async (req, res) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
const elapsed = Date.now() - startTime;
|
const elapsed = Date.now() - startTime;
|
||||||
|
session.operation_stage = '完成';
|
||||||
|
session.human_readable = '操作已完成,铸渊已返回结果到对话。耗时 ' + elapsed + 'ms。';
|
||||||
res.json({
|
res.json({
|
||||||
ok: true,
|
ok: true,
|
||||||
cmd: cmd,
|
cmd: cmd,
|
||||||
@ -310,20 +323,32 @@ app.post('/api/terminal/exec', async (req, res) => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// 11. 关闭终端会话
|
// 11. 更新终端会话操作状态(铸渊从对话中推送)
|
||||||
|
app.post('/api/terminal/update-status/:session_id', (req, res) => {
|
||||||
|
const session = terminalSessions[req.params.session_id];
|
||||||
|
if (!session) return res.status(404).json({ error: '会话不存在' });
|
||||||
|
const { operation_stage, human_readable } = req.body;
|
||||||
|
if (operation_stage) session.operation_stage = operation_stage;
|
||||||
|
if (human_readable) session.human_readable = human_readable;
|
||||||
|
res.json({ ok: true, operation_stage: session.operation_stage, human_readable: session.human_readable });
|
||||||
|
});
|
||||||
|
|
||||||
|
// 12. 关闭终端会话
|
||||||
app.post('/api/terminal/close/:session_id', (req, res) => {
|
app.post('/api/terminal/close/:session_id', (req, res) => {
|
||||||
const session = terminalSessions[req.params.session_id];
|
const session = terminalSessions[req.params.session_id];
|
||||||
if (session) delete terminalSessions[req.params.session_id];
|
if (session) delete terminalSessions[req.params.session_id];
|
||||||
res.json({ ok: true });
|
res.json({ ok: true });
|
||||||
});
|
});
|
||||||
|
|
||||||
// 12. 获取所有活跃终端会话
|
// 13. 获取所有活跃终端会话
|
||||||
app.get('/api/terminal/sessions', (req, res) => {
|
app.get('/api/terminal/sessions', (req, res) => {
|
||||||
const sessions = Object.entries(terminalSessions).map(([id, s]) => ({
|
const sessions = Object.entries(terminalSessions).map(([id, s]) => ({
|
||||||
session_id: id,
|
session_id: id,
|
||||||
server: s.server,
|
server: s.server,
|
||||||
server_name: s.server_name,
|
server_name: s.server_name,
|
||||||
status: s.status,
|
status: s.status,
|
||||||
|
operation_stage: s.operation_stage,
|
||||||
|
human_readable: s.human_readable,
|
||||||
created_at: s.created_at,
|
created_at: s.created_at,
|
||||||
age_seconds: Math.floor((Date.now() - new Date(s.created_at).getTime()) / 1000)
|
age_seconds: Math.floor((Date.now() - new Date(s.created_at).getTime()) / 1000)
|
||||||
}));
|
}));
|
||||||
@ -332,7 +357,7 @@ app.get('/api/terminal/sessions', (req, res) => {
|
|||||||
|
|
||||||
const PORT = process.env.CONSOLE_PORT || 3920;
|
const PORT = process.env.CONSOLE_PORT || 3920;
|
||||||
app.listen(PORT, '127.0.0.1', () => {
|
app.listen(PORT, '127.0.0.1', () => {
|
||||||
console.log(`光湖服务器主控台 API v2.0`);
|
console.log(`光湖服务器主控台 API v3.0 — 操作回执系统`);
|
||||||
console.log(` 监听: 127.0.0.1:${PORT}`);
|
console.log(` 监听: 127.0.0.1:${PORT}`);
|
||||||
console.log(` 服务器: ${SERVERS.length} 台`);
|
console.log(` 服务器: ${SERVERS.length} 台`);
|
||||||
console.log(` MCP终端: 已启用`);
|
console.log(` MCP终端: 已启用`);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user