























@@ -157,6 +157,31 @@ function buildRequestScopedFallbackNarrative(data: NarrativePhaseData): string {
157157);
158158}
159159160+async function appendFallbackNarrativeEntry(params: {
161+workspaceDir: string;
162+data: NarrativePhaseData;
163+nowMs: number;
164+timezone?: string;
165+logger: Logger;
166+reason: string;
167+}): Promise<void> {
168+try {
169+await appendNarrativeEntry({
170+workspaceDir: params.workspaceDir,
171+narrative: buildRequestScopedFallbackNarrative(params.data),
172+nowMs: params.nowMs,
173+timezone: params.timezone,
174+});
175+params.logger.info(
176+`memory-core: narrative generation used fallback for ${params.data.phase} phase because ${params.reason}.`,
177+);
178+} catch (fallbackErr) {
179+params.logger.warn(
180+`memory-core: narrative fallback failed for ${params.data.phase} phase (${formatFallbackWriteFailure(fallbackErr)})`,
181+);
182+}
183+}
184+160185function buildNarrativeAttemptSessionKey(baseSessionKey: string, attempt: number): string {
161186return attempt === 0 ? baseSessionKey : `${baseSessionKey}-retry-${attempt}`;
162187}
@@ -234,21 +259,14 @@ async function startNarrativeRunOrFallback(params: {
234259if (!isRequestScopedSubagentRuntimeError(runErr)) {
235260throw runErr;
236261}
237-try {
238-await appendNarrativeEntry({
239-workspaceDir: params.workspaceDir,
240-narrative: buildRequestScopedFallbackNarrative(params.data),
241-nowMs: params.nowMs,
242-timezone: params.timezone,
243-});
244-params.logger.info(
245-`memory-core: narrative generation used fallback for ${params.data.phase} phase because subagent runtime is request-scoped.`,
246-);
247-} catch (fallbackErr) {
248-params.logger.warn(
249-`memory-core: narrative fallback failed for ${params.data.phase} phase (${formatFallbackWriteFailure(fallbackErr)})`,
250-);
251-}
262+await appendFallbackNarrativeEntry({
263+workspaceDir: params.workspaceDir,
264+data: params.data,
265+nowMs: params.nowMs,
266+timezone: params.timezone,
267+logger: params.logger,
268+reason: "subagent runtime is request-scoped",
269+});
252270return null;
253271}
254272}
@@ -990,8 +1008,19 @@ export async function generateAndAppendDreamNarrative(params: {
9901008`memory-core: narrative generation ended with ${formatNarrativeTerminalStatus({
9911009 status: result.status,
9921010 error: result.error,
993- })} for ${params.data.phase} phase.`,
1011+ })} for ${params.data.phase} phase; writing fallback diary entry.`,
9941012);
1013+await appendFallbackNarrativeEntry({
1014+workspaceDir: params.workspaceDir,
1015+data: params.data,
1016+ nowMs,
1017+timezone: params.timezone,
1018+logger: params.logger,
1019+reason: `the narrative run ended with ${formatNarrativeTerminalStatus({
1020+ status: result.status,
1021+ error: result.error,
1022+ })}`,
1023+});
9951024return;
9961025} catch (err) {
9971026if (attemptModel && isConfiguredModelUnavailableNarrativeError(formatErrorMessage(err))) {
@@ -1016,8 +1045,16 @@ export async function generateAndAppendDreamNarrative(params: {
10161045const narrative = extractNarrativeText(messages);
10171046if (!narrative) {
10181047params.logger.warn(
1019-`memory-core: narrative generation produced no text for ${params.data.phase} phase.`,
1048+`memory-core: narrative generation produced no text for ${params.data.phase} phase; writing fallback diary entry.`,
10201049);
1050+await appendFallbackNarrativeEntry({
1051+workspaceDir: params.workspaceDir,
1052+data: params.data,
1053+ nowMs,
1054+timezone: params.timezone,
1055+logger: params.logger,
1056+reason: "the narrative run produced no text",
1057+});
10211058return;
10221059}
10231060此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。