



























@@ -28,9 +28,11 @@ import {
2828dropSessionStoreObjectCache,
2929dropSessionStoreSnapshotCache,
3030getSerializedSessionStore,
31+getSerializedSessionStorePromptRefs,
3132getSessionStoreCacheVersion,
3233invalidateSessionStoreCache,
3334isSessionStoreCacheEnabled,
35+setSerializedSessionStorePromptRefs,
3436setSerializedSessionStore,
3537takeMutableSessionStoreCache,
3638writeSessionStoreCache,
@@ -234,11 +236,17 @@ function updateSessionStoreWriteCaches(params: {
234236storePath: string;
235237store: Record<string, SessionEntry>;
236238serialized: string;
239+serializedPromptRefs?: ReadonlyMap<string, SessionSkillPromptRef>;
237240cloneSerialized?: string;
238241takeOwnership?: boolean;
239242}): void {
240243const fileStat = getFileStatSnapshot(params.storePath);
241-setSerializedSessionStore(params.storePath, params.serialized, fileStat?.sizeBytes);
244+setSerializedSessionStore(
245+params.storePath,
246+params.serialized,
247+fileStat?.sizeBytes,
248+params.serializedPromptRefs,
249+);
242250if (!isSessionStoreCacheEnabled()) {
243251dropSessionStoreObjectCache(params.storePath);
244252dropSessionStoreSnapshotCache(params.storePath);
@@ -250,6 +258,7 @@ function updateSessionStoreWriteCaches(params: {
250258mtimeMs: fileStat?.mtimeMs,
251259sizeBytes: fileStat?.sizeBytes,
252260serialized: params.serialized,
261+serializedPromptRefs: params.serializedPromptRefs,
253262cloneSerialized: params.cloneSerialized,
254263takeOwnership: params.takeOwnership,
255264});
@@ -273,18 +282,26 @@ function restoreUnchangedSessionStoreCache(
273282return;
274283}
275284const serialized = getSerializedSessionStore(storePath);
285+const serializedPromptRefs =
286+serialized !== undefined ? getSerializedSessionStorePromptRefs(storePath) : undefined;
276287writeSessionStoreCache({
277288 storePath,
278289 store,
279290mtimeMs: loadedFileStat?.mtimeMs,
280291sizeBytes: loadedFileStat?.sizeBytes,
281292 serialized,
293+ serializedPromptRefs,
282294takeOwnership: true,
283295});
284296if (serialized !== undefined) {
285297// Keep hydrated blob prompts in the object cache, but preserve the disk JSON
286298// comparison string so repeated no-op saves do not rewrite sessions.json.
287-setSerializedSessionStore(storePath, serialized, loadedFileStat?.sizeBytes);
299+setSerializedSessionStore(
300+storePath,
301+serialized,
302+loadedFileStat?.sizeBytes,
303+serializedPromptRefs,
304+);
288305}
289306}
290307@@ -333,11 +350,16 @@ function indentTopLevelEntryJson(json: string): string {
333350function buildSingleEntrySerializedStore(params: {
334351storePath: string;
335352patch: SingleEntryPersistencePatch;
336-}): { serialized: string; promptBlobs: SessionSkillPromptBlobProjection[] } | null {
353+}): {
354+serialized: string;
355+promptBlobs: SessionSkillPromptBlobProjection[];
356+promptRefs: ReadonlyMap<string, SessionSkillPromptRef>;
357+} | null {
337358const currentSerialized = getSerializedSessionStore(params.storePath);
338359if (currentSerialized === undefined) {
339360return null;
340361}
362+const currentPromptRefs = getSerializedPromptRefs(params.storePath, currentSerialized);
341363const marker = `\n ${JSON.stringify(params.patch.sessionKey)}: `;
342364const markerIndex = currentSerialized.indexOf(marker);
343365if (markerIndex < 0) {
@@ -360,10 +382,18 @@ function buildSingleEntrySerializedStore(params: {
360382return null;
361383}
362384const entryJson = indentTopLevelEntryJson(JSON.stringify(projectedEntry, null, 2));
385+const promptRefs = new Map(currentPromptRefs);
386+const promptRef = projectedEntry.skillsSnapshot?.promptRef;
387+if (promptRef) {
388+promptRefs.set(params.patch.sessionKey, promptRef);
389+} else {
390+promptRefs.delete(params.patch.sessionKey);
391+}
363392return {
364393serialized:
365394currentSerialized.slice(0, valueStart) + entryJson + currentSerialized.slice(valueEnd),
366395promptBlobs: [...projected.promptBlobs.values()],
396+ promptRefs,
367397};
368398}
369399@@ -383,15 +413,42 @@ function collectSerializedPromptRefs(serialized: string): Map<string, SessionSki
383413return refs;
384414}
385415416+function collectStorePromptRefs(
417+store: Record<string, SessionEntry>,
418+): Map<string, SessionSkillPromptRef> {
419+const refs = new Map<string, SessionSkillPromptRef>();
420+for (const [key, entry] of Object.entries(store)) {
421+const ref = entry?.skillsSnapshot?.promptRef;
422+if (ref) {
423+refs.set(key, ref);
424+}
425+}
426+return refs;
427+}
428+429+function getSerializedPromptRefs(
430+storePath: string,
431+serialized: string,
432+): ReadonlyMap<string, SessionSkillPromptRef> {
433+const cached = getSerializedSessionStorePromptRefs(storePath);
434+if (cached) {
435+return cached;
436+}
437+const refs = collectSerializedPromptRefs(serialized);
438+setSerializedSessionStorePromptRefs(storePath, refs);
439+return refs;
440+}
441+386442function storeHasUnsafeUntouchedHydratedSkillPrompts(
387443storePath: string,
388444store: Record<string, SessionEntry>,
389445changedSessionKey: string,
390446): boolean {
391447const currentSerialized = getSerializedSessionStore(storePath);
392-const serializedPromptRefs = currentSerialized
393- ? collectSerializedPromptRefs(currentSerialized)
394- : undefined;
448+const serializedPromptRefs =
449+currentSerialized !== undefined
450+ ? getSerializedPromptRefs(storePath, currentSerialized)
451+ : undefined;
395452for (const [key, entry] of Object.entries(store)) {
396453if (key === changedSessionKey || typeof entry.skillsSnapshot?.prompt !== "string") {
397454continue;
@@ -684,6 +741,7 @@ async function saveSessionStoreUnlocked(
684741 storePath,
685742 store,
686743serialized: singleEntrySerialized.serialized,
744+serializedPromptRefs: singleEntrySerialized.promptRefs,
687745promptBlobs: singleEntrySerialized.promptBlobs,
688746takeOwnership: opts?.takeCacheOwnership,
689747});
@@ -692,6 +750,7 @@ async function saveSessionStoreUnlocked(
692750}
693751const persisted = projectSessionStoreForPersistence({ storePath, store });
694752const promptBlobs = [...persisted.promptBlobs.values()];
753+const promptRefs = collectStorePromptRefs(persisted.store);
695754const json = JSON.stringify(persisted.store, null, 2);
696755const cloneSerialized = persisted.changed ? undefined : json;
697756if (getSerializedSessionStore(storePath) === json) {
@@ -703,6 +762,7 @@ async function saveSessionStoreUnlocked(
703762 storePath,
704763 store,
705764serialized: json,
765+serializedPromptRefs: promptRefs,
706766 cloneSerialized,
707767takeOwnership: opts?.takeCacheOwnership,
708768});
@@ -717,6 +777,7 @@ async function saveSessionStoreUnlocked(
717777 storePath,
718778 store,
719779serialized: json,
780+serializedPromptRefs: promptRefs,
720781 cloneSerialized,
721782 promptBlobs,
722783takeOwnership: opts?.takeCacheOwnership,
@@ -744,6 +805,7 @@ async function saveSessionStoreUnlocked(
744805 storePath,
745806 store,
746807serialized: json,
808+serializedPromptRefs: promptRefs,
747809 cloneSerialized,
748810 promptBlobs,
749811takeOwnership: opts?.takeCacheOwnership,
@@ -759,6 +821,7 @@ async function saveSessionStoreUnlocked(
759821 storePath,
760822 store,
761823serialized: json,
824+serializedPromptRefs: promptRefs,
762825 cloneSerialized,
763826 promptBlobs,
764827takeOwnership: opts?.takeCacheOwnership,
@@ -882,6 +945,7 @@ async function writeSessionStoreAtomic(params: {
882945storePath: string;
883946store: Record<string, SessionEntry>;
884947serialized: string;
948+serializedPromptRefs?: ReadonlyMap<string, SessionSkillPromptRef>;
885949cloneSerialized?: string;
886950promptBlobs: Iterable<SessionSkillPromptBlobProjection>;
887951takeOwnership?: boolean;
@@ -904,6 +968,7 @@ async function writeSessionStoreAtomic(params: {
904968storePath: params.storePath,
905969store: params.store,
906970serialized: params.serialized,
971+serializedPromptRefs: params.serializedPromptRefs,
907972cloneSerialized: params.cloneSerialized,
908973takeOwnership: params.takeOwnership,
909974});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。