diff --git a/agent-run-gateway.mjs b/agent-run-gateway.mjs index 656e93e..7866e5c 100644 --- a/agent-run-gateway.mjs +++ b/agent-run-gateway.mjs @@ -7,6 +7,7 @@ import { persistSessionTranscriptFromSnapshot, persistSessionTranscriptMessages, } from './conversation-transcript-persist.mjs'; +import { ensureGooseUserMessageMetadata } from './goose-message.mjs'; const DEFAULT_RUN_RETRY_DELAYS_MS = [1500, 5000, 15000]; const TERMINAL_STATUSES = new Set(['succeeded', 'failed']); @@ -614,7 +615,7 @@ export function createAgentRunGateway({ row.user_id, sessionId, row.request_id, - userMessage, + ensureGooseUserMessageMetadata(userMessage), { toolMode: runOptions.toolMode, forceDeepReasoning: runOptions.forceDeepReasoning, diff --git a/goose-message.mjs b/goose-message.mjs index cc4e91b..dec9517 100644 --- a/goose-message.mjs +++ b/goose-message.mjs @@ -1,7 +1,8 @@ -/** - * Goosed requires user_message.metadata.userVisible (and agentVisible) on /reply. - */ +import crypto from 'node:crypto'; +/** + * Goosed requires user_message.metadata.userVisible/agentVisible and created on /reply. + */ export function ensureGooseUserMessageMetadata(userMessage) { if (!userMessage || typeof userMessage !== 'object' || Array.isArray(userMessage)) { return userMessage; @@ -12,8 +13,12 @@ export function ensureGooseUserMessageMetadata(userMessage) { : {}; if (metadata.userVisible == null) metadata.userVisible = true; if (metadata.agentVisible == null) metadata.agentVisible = true; + const created = Number(userMessage.created ?? 0) || Math.floor(Date.now() / 1000); return { ...userMessage, + id: userMessage.id ?? crypto.randomUUID(), + role: userMessage.role ?? 'user', + created, metadata, }; } diff --git a/goose-message.test.mjs b/goose-message.test.mjs index 535b992..2b28514 100644 --- a/goose-message.test.mjs +++ b/goose-message.test.mjs @@ -9,6 +9,8 @@ test('ensureGooseUserMessageMetadata adds required visibility flags', () => { }); assert.equal(normalized.metadata.userVisible, true); assert.equal(normalized.metadata.agentVisible, true); + assert.equal(typeof normalized.created, 'number'); + assert.ok(normalized.id); }); test('ensureGooseUserMessageMetadata preserves existing metadata fields', () => { diff --git a/scripts/release-portal-runtime-prod.sh b/scripts/release-portal-runtime-prod.sh index 795ac83..26ebe29 100755 --- a/scripts/release-portal-runtime-prod.sh +++ b/scripts/release-portal-runtime-prod.sh @@ -539,6 +539,12 @@ if ! launchctl kickstart -k "${LAUNCHD_GUI}/${PORTAL_LABEL}" >/dev/null 2>&1; th nohup "${APP_DIR}/scripts/run-memind-portal-prod.sh" >> "${HOME}/Library/Logs/memind-portal.log" 2>&1 & fi +AGENT_RUN_WORKER_LABEL="${MEMIND_AGENT_RUN_WORKER_LABEL:-cn.tkmind.memind-agent-run-worker}" +if launchctl print "${LAUNCHD_GUI}/${AGENT_RUN_WORKER_LABEL}" >/dev/null 2>&1; then + say "重启 agent run worker" + launchctl kickstart -k "${LAUNCHD_GUI}/${AGENT_RUN_WORKER_LABEL}" >/dev/null 2>&1 || true +fi + say "健康检查" for _ in $(seq 1 60); do portal_code="$(curl -s -o /dev/null -w '%{http_code}' "${HEALTH_URL}" || true)"