Commit 5fe74b39d72816ac980cf54ec6581e3a2dbb9f5e

Authored by yibo
1 parent dc48ebe1

fix(open-api): 全局 agent invoke 端点补写会话历史

之前 invoke 端点只把结果落 job(.data/jobs-openapi.json),从不生成 conv-*
会话、也不写 meta.json/history.json,导致网页 AgentChat 看不到任何 API
调用产生的对话记录。现在复用 agent-chat.js 的会话存储函数,写到同一份
system/agents/{agentId}/_global/conversations/{convId}/ 下。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
server/routes/agent-chat.js
@@ -2872,3 +2872,10 @@ ${resultsText.join(&#39;\n\n&#39;)} @@ -2872,3 +2872,10 @@ ${resultsText.join(&#39;\n\n&#39;)}
2872 }); 2872 });
2873 2873
2874 module.exports = router; 2874 module.exports = router;
  2875 +// 供 open-api.js 的 invoke 端点复用——外部 API 调用也要写进同一份会话存储,
  2876 +// 否则网页 AgentChat 看不到 API 触发的对话(见 docs/done/open-api-manual.md 的 invoke 端点)。
  2877 +module.exports.loadMeta = loadMeta;
  2878 +module.exports.saveMeta = saveMeta;
  2879 +module.exports.appendHistory = appendHistory;
  2880 +module.exports.logMessage = logMessage;
  2881 +module.exports.flushLogBufferForConv = flushLogBufferForConv;
server/routes/open-api.js
@@ -607,9 +607,26 @@ async function _executeAgentInvocation(job, { agentDir, namespacedId, task, cont @@ -607,9 +607,26 @@ async function _executeAgentInvocation(job, { agentDir, namespacedId, task, cont
607 const { loadConfigFromSkills } = require('../src/core/skill-config-loader'); 607 const { loadConfigFromSkills } = require('../src/core/skill-config-loader');
608 const AgentManager = require('../src/core/agent-manager'); 608 const AgentManager = require('../src/core/agent-manager');
609 const config = require('../config'); 609 const config = require('../config');
  610 + // 复用 agent-chat.js 的会话存储,让 API 调用也能在网页 AgentChat 里追溯
  611 + // (否则 job 结果只落 .data/jobs-openapi.json,网页永远看不到)。
  612 + const agentChat = require('./agent-chat');
  613 + const convId = `conv-${Date.now().toString(36)}`;
610 614
611 jobManager.updateJob(job.jobId, { status: 'running', progress: 'Initializing agent session...' }); 615 jobManager.updateJob(job.jobId, { status: 'running', progress: 'Initializing agent session...' });
612 616
  617 + agentChat.saveMeta(namespacedId, convId, {
  618 + conversationId: convId,
  619 + agentId: namespacedId,
  620 + title: task.slice(0, 50),
  621 + type: 'api_invoke',
  622 + createdAt: new Date().toISOString(),
  623 + status: 'running',
  624 + stats: { messageCount: 1, toolCallCount: 0 },
  625 + jobId: job.jobId,
  626 + });
  627 + agentChat.logMessage(namespacedId, convId, 'user', task);
  628 + agentChat.appendHistory(namespacedId, convId, { role: 'user', content: task, messageId: `job-${job.jobId}`, timestamp: new Date().toISOString() });
  629 +
613 let enrichedTask = task; 630 let enrichedTask = task;
614 631
615 // Process Context Files 632 // Process Context Files
@@ -662,18 +679,28 @@ async function _executeAgentInvocation(job, { agentDir, namespacedId, task, cont @@ -662,18 +679,28 @@ async function _executeAgentInvocation(job, { agentDir, namespacedId, task, cont
662 679
663 try { 680 try {
664 const result = await manager.callAgent(namespacedId, enrichedTask, { onData: onData(namespacedId) }); 681 const result = await manager.callAgent(namespacedId, enrichedTask, { onData: onData(namespacedId) });
665 -  
666 - jobManager.updateJob(job.jobId, {  
667 - status: 'completed',  
668 - progress: 'Invocation completed',  
669 - result: {  
670 - output: result.output || fullOutput || '(Empty Output)' 682 + const output = result.output || fullOutput || '(Empty Output)';
  683 +
  684 + jobManager.updateJob(job.jobId, {
  685 + status: 'completed',
  686 + progress: 'Invocation completed',
  687 + result: {
  688 + output
671 } 689 }
672 }); 690 });
673 691
  692 + agentChat.logMessage(namespacedId, convId, 'agent', output);
  693 + agentChat.appendHistory(namespacedId, convId, { role: 'assistant', content: output, messageId: `job-${job.jobId}-out`, timestamp: new Date().toISOString() });
  694 + const meta = agentChat.loadMeta(namespacedId, convId);
  695 + if (meta) { meta.status = 'completed'; agentChat.saveMeta(namespacedId, convId, meta); }
  696 + agentChat.flushLogBufferForConv(namespacedId, convId);
  697 +
674 try { await manager.closeAllSessions(); } catch {} 698 try { await manager.closeAllSessions(); } catch {}
675 } catch (err) { 699 } catch (err) {
676 jobManager.updateJob(job.jobId, { status: 'failed', error: err.message, progress: `Agent execution failed: ${err.message}` }); 700 jobManager.updateJob(job.jobId, { status: 'failed', error: err.message, progress: `Agent execution failed: ${err.message}` });
  701 + const meta = agentChat.loadMeta(namespacedId, convId);
  702 + if (meta) { meta.status = 'failed'; agentChat.saveMeta(namespacedId, convId, meta); }
  703 + agentChat.flushLogBufferForConv(namespacedId, convId);
677 try { await manager.closeAllSessions(); } catch {} 704 try { await manager.closeAllSessions(); } catch {}
678 throw err; 705 throw err;
679 } 706 }