
























@@ -1,3 +1,4 @@
1+import fsSync from "node:fs";
12import fs from "node:fs/promises";
23import path from "node:path";
34import { stripInternalRuntimeContext } from "../../agents/internal-runtime-context.js";
@@ -10,14 +11,11 @@ import {
1011isUsageCountedSessionTranscriptFileName,
1112} from "../../config/sessions/artifacts.js";
1213import { resolveSessionTranscriptsDirForAgent } from "../../config/sessions/paths.js";
13-import { loadSessionStore } from "../../config/sessions/store-load.js";
1414import { isExecCompletionEvent } from "../../infra/heartbeat-events-filter.js";
1515import { redactSensitiveText } from "../../logging/redact.js";
16-import { createSubsystemLogger } from "../../logging/subsystem.js";
1716import { isCronRunSessionKey } from "../../sessions/session-key-utils.js";
18-import { hashText } from "./internal.js";
17+import { hashText } from "./hash.js";
191820-const log = createSubsystemLogger("memory");
2119const DREAMING_NARRATIVE_RUN_PREFIX = "dreaming-narrative-";
2220// Keep the historical one-line-per-message export shape for normal turns, but
2321// wrap pathological long messages so downstream indexers never ingest a single
@@ -55,6 +53,11 @@ export type SessionTranscriptClassification = {
5553cronRunTranscriptPaths: ReadonlySet<string>;
5654};
575556+type SessionTranscriptStoreEntry = {
57+sessionFile?: unknown;
58+sessionId?: unknown;
59+};
60+5861function isCheckpointTranscriptFileName(fileName: string): boolean {
5962return fileName.endsWith(".jsonl") && fileName.includes(".checkpoint.");
6063}
@@ -169,7 +172,7 @@ export function loadSessionTranscriptClassificationForSessionsDir(
169172sessionsDir: string,
170173): SessionTranscriptClassification {
171174const storePath = path.join(sessionsDir, "sessions.json");
172-const store = loadSessionStore(storePath);
175+const store = readSessionTranscriptClassificationStore(storePath);
173176const dreamingTranscriptPaths = new Set<string>();
174177const cronRunTranscriptPaths = new Set<string>();
175178for (const [sessionKey, entry] of Object.entries(store)) {
@@ -190,6 +193,20 @@ export function loadSessionTranscriptClassificationForSessionsDir(
190193};
191194}
192195196+function readSessionTranscriptClassificationStore(
197+storePath: string,
198+): Record<string, SessionTranscriptStoreEntry> {
199+try {
200+const parsed = JSON.parse(fsSync.readFileSync(storePath, "utf-8")) as unknown;
201+if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
202+return {};
203+}
204+return parsed as Record<string, SessionTranscriptStoreEntry>;
205+} catch {
206+return {};
207+}
208+}
209+193210export function loadDreamingNarrativeTranscriptPathSetForAgent(
194211agentId: string,
195212): ReadonlySet<string> {
@@ -236,6 +253,11 @@ export function sessionPathForFile(absPath: string): string {
236253return path.join("sessions", path.basename(absPath)).replace(/\\/g, "/");
237254}
238255256+async function logSessionFileReadFailure(absPath: string, err: unknown): Promise<void> {
257+const { createSubsystemLogger } = await import("../../logging/subsystem.js");
258+createSubsystemLogger("memory").debug(`Failed reading session file ${absPath}: ${String(err)}`);
259+}
260+239261function normalizeSessionText(value: string): string {
240262return value
241263.replace(/\s*\n+\s*/g, " ")
@@ -528,7 +550,7 @@ export async function buildSessionEntry(
528550 ...(generatedByCronRun ? { generatedByCronRun: true } : {}),
529551};
530552} catch (err) {
531-log.debug(`Failed reading session file ${absPath}: ${String(err)}`);
553+void logSessionFileReadFailure(absPath, err);
532554return null;
533555}
534556}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。