diff --git a/server/services/company-heartbeat-service.js b/server/services/company-heartbeat-service.js index f08bf27..65a6305 100644 --- a/server/services/company-heartbeat-service.js +++ b/server/services/company-heartbeat-service.js @@ -473,6 +473,11 @@ class CompanyHeartbeatService { * isHeartbeat 仍然发,但只对真心跳为真 —— 老的消费方(如果还有)行为不变。 */ _sendAgentChat(companyId, agentId, message, conversationId, kind = 'heartbeat') { + // agent-chat.js 挂了 requireAuthOrInternal(38 号文档 Phase 1)——这是一条服务端自环 + // fetch,没有用户 cookie,不带内部令牌会被 401 挡住。company.js/task-settle.js 的自环 + // 调用都带了这个头,这里漏了,是心跳(含 CEO 心跳、pipeline/schedule 触发)一直在暗中 + // 401 的根因:失败只落一行 console.warn,界面上什么都看不出来。 + const { INTERNAL_TOKEN, INTERNAL_TOKEN_HEADER } = require('../middleware/jwt-auth'); const postData = JSON.stringify({ message, conversationId, @@ -488,6 +493,7 @@ class CompanyHeartbeatService { headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(postData), + [INTERNAL_TOKEN_HEADER]: INTERNAL_TOKEN, }, }; diff --git a/server/services/heartbeat-service.js b/server/services/heartbeat-service.js index 88a1ec4..3fae3ff 100644 --- a/server/services/heartbeat-service.js +++ b/server/services/heartbeat-service.js @@ -228,6 +228,11 @@ class HeartbeatService { `无需等待人类确认,请完全自主决策。` ].join('\n'); + // agent-chat.js 挂了 requireAuthOrInternal(38 号文档 Phase 1)——这是一条服务端自环 + // fetch,没有用户 cookie,不带内部令牌会被 401 挡住。company.js/task-settle.js 的自环 + // 调用都带了这个头,这里漏了,是"心跳一直在暗中 401"的根因之一(另一处见 + // company-heartbeat-service.js 的同款漏洞):失败只落一行 console.warn,界面上看不出来。 + const { INTERNAL_TOKEN, INTERNAL_TOKEN_HEADER } = require('../middleware/jwt-auth'); const postData = JSON.stringify({ message: heartbeatMessage, conversationId: convId, @@ -241,7 +246,8 @@ class HeartbeatService { method: 'POST', headers: { 'Content-Type': 'application/json', - 'Content-Length': Buffer.byteLength(postData) + 'Content-Length': Buffer.byteLength(postData), + [INTERNAL_TOKEN_HEADER]: INTERNAL_TOKEN, } };