diff --git a/server/routes/agent-chat.js b/server/routes/agent-chat.js index 539fbb1..1c2f668 100644 --- a/server/routes/agent-chat.js +++ b/server/routes/agent-chat.js @@ -2872,3 +2872,10 @@ ${resultsText.join('\n\n')} }); module.exports = router; +// 供 open-api.js 的 invoke 端点复用——外部 API 调用也要写进同一份会话存储, +// 否则网页 AgentChat 看不到 API 触发的对话(见 docs/done/open-api-manual.md 的 invoke 端点)。 +module.exports.loadMeta = loadMeta; +module.exports.saveMeta = saveMeta; +module.exports.appendHistory = appendHistory; +module.exports.logMessage = logMessage; +module.exports.flushLogBufferForConv = flushLogBufferForConv; diff --git a/server/routes/open-api.js b/server/routes/open-api.js index 7ce23b0..2d5ad0e 100644 --- a/server/routes/open-api.js +++ b/server/routes/open-api.js @@ -607,9 +607,26 @@ async function _executeAgentInvocation(job, { agentDir, namespacedId, task, cont const { loadConfigFromSkills } = require('../src/core/skill-config-loader'); const AgentManager = require('../src/core/agent-manager'); const config = require('../config'); + // 复用 agent-chat.js 的会话存储,让 API 调用也能在网页 AgentChat 里追溯 + // (否则 job 结果只落 .data/jobs-openapi.json,网页永远看不到)。 + const agentChat = require('./agent-chat'); + const convId = `conv-${Date.now().toString(36)}`; jobManager.updateJob(job.jobId, { status: 'running', progress: 'Initializing agent session...' }); + agentChat.saveMeta(namespacedId, convId, { + conversationId: convId, + agentId: namespacedId, + title: task.slice(0, 50), + type: 'api_invoke', + createdAt: new Date().toISOString(), + status: 'running', + stats: { messageCount: 1, toolCallCount: 0 }, + jobId: job.jobId, + }); + agentChat.logMessage(namespacedId, convId, 'user', task); + agentChat.appendHistory(namespacedId, convId, { role: 'user', content: task, messageId: `job-${job.jobId}`, timestamp: new Date().toISOString() }); + let enrichedTask = task; // Process Context Files @@ -662,18 +679,28 @@ async function _executeAgentInvocation(job, { agentDir, namespacedId, task, cont try { const result = await manager.callAgent(namespacedId, enrichedTask, { onData: onData(namespacedId) }); - - jobManager.updateJob(job.jobId, { - status: 'completed', - progress: 'Invocation completed', - result: { - output: result.output || fullOutput || '(Empty Output)' + const output = result.output || fullOutput || '(Empty Output)'; + + jobManager.updateJob(job.jobId, { + status: 'completed', + progress: 'Invocation completed', + result: { + output } }); + agentChat.logMessage(namespacedId, convId, 'agent', output); + agentChat.appendHistory(namespacedId, convId, { role: 'assistant', content: output, messageId: `job-${job.jobId}-out`, timestamp: new Date().toISOString() }); + const meta = agentChat.loadMeta(namespacedId, convId); + if (meta) { meta.status = 'completed'; agentChat.saveMeta(namespacedId, convId, meta); } + agentChat.flushLogBufferForConv(namespacedId, convId); + try { await manager.closeAllSessions(); } catch {} } catch (err) { jobManager.updateJob(job.jobId, { status: 'failed', error: err.message, progress: `Agent execution failed: ${err.message}` }); + const meta = agentChat.loadMeta(namespacedId, convId); + if (meta) { meta.status = 'failed'; agentChat.saveMeta(namespacedId, convId, meta); } + agentChat.flushLogBufferForConv(namespacedId, convId); try { await manager.closeAllSessions(); } catch {} throw err; }