Skip to content

Commit 7e2b2d2

Browse files
authored
refactor: migrate bundled session metadata reads (#96527)
1 parent 8670d28 commit 7e2b2d2

22 files changed

Lines changed: 164 additions & 147 deletions

extensions/codex/src/conversation-binding.ts

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,7 @@ import type {
1111
PluginHookInboundClaimEvent,
1212
} from "openclaw/plugin-sdk/plugin-entry";
1313
import type { ReplyPayload } from "openclaw/plugin-sdk/reply-payload";
14-
import {
15-
loadSessionStore,
16-
resolveSessionStoreEntry,
17-
resolveStorePath,
18-
} from "openclaw/plugin-sdk/session-store-runtime";
14+
import { getSessionEntry, resolveStorePath } from "openclaw/plugin-sdk/session-store-runtime";
1915
import { resolveCodexAppServerForModelProvider } from "./app-server/app-server-policy.js";
2016
import { resolveCodexAppServerAuthProfileIdForAgent } from "./app-server/auth-bridge.js";
2117
import { CODEX_CONTROL_METHODS } from "./app-server/capabilities.js";
@@ -881,10 +877,11 @@ function readSessionExecOverrides(params: {
881877
return undefined;
882878
}
883879
const storePath = resolveStorePath(params.config.session?.store, { agentId: params.agentId });
884-
const entry = resolveSessionStoreEntry({
885-
store: loadSessionStore(storePath, { skipCache: true }),
880+
const entry = getSessionEntry({
881+
storePath,
886882
sessionKey,
887-
}).existing;
883+
readConsistency: "latest",
884+
});
888885
if (!entry?.execSecurity && !entry?.execAsk) {
889886
return undefined;
890887
}

extensions/discord/src/monitor/native-command-model-picker-ui.ts

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {
88
} from "openclaw/plugin-sdk/command-auth-native";
99
import type { OpenClawConfig } from "openclaw/plugin-sdk/config-contracts";
1010
import type { ResolvedAgentRoute } from "openclaw/plugin-sdk/routing";
11-
import { loadSessionStore, resolveStorePath } from "openclaw/plugin-sdk/session-store-runtime";
11+
import { getSessionEntry, resolveStorePath } from "openclaw/plugin-sdk/session-store-runtime";
1212
import {
1313
normalizeLowercaseStringOrEmpty,
1414
normalizeOptionalString,
@@ -202,11 +202,10 @@ export async function resolveDiscordNativeChoiceContext(params: {
202202
const storePath = resolveStorePath(params.cfg.session?.store, {
203203
agentId: route.agentId,
204204
});
205-
const sessionStore = loadSessionStore(storePath);
206-
const sessionEntry = sessionStore[route.sessionKey];
205+
const sessionEntry = getSessionEntry({ storePath, sessionKey: route.sessionKey });
207206
const override = resolveStoredModelOverride({
208207
sessionEntry,
209-
sessionStore,
208+
loadSessionEntry: (sessionKey) => getSessionEntry({ storePath, sessionKey }),
210209
sessionKey: route.sessionKey,
211210
defaultProvider: fallback.provider,
212211
});
@@ -238,11 +237,15 @@ export function resolveDiscordModelPickerCurrentModel(params: {
238237
const storePath = resolveStorePath(params.cfg.session?.store, {
239238
agentId: params.route.agentId,
240239
});
241-
const sessionStore = loadSessionStore(storePath, { skipCache: true });
242-
const sessionEntry = sessionStore[params.route.sessionKey];
240+
const sessionEntry = getSessionEntry({
241+
storePath,
242+
sessionKey: params.route.sessionKey,
243+
readConsistency: "latest",
244+
});
243245
const override = resolveStoredModelOverride({
244246
sessionEntry,
245-
sessionStore,
247+
loadSessionEntry: (sessionKey) =>
248+
getSessionEntry({ storePath, sessionKey, readConsistency: "latest" }),
246249
sessionKey: params.route.sessionKey,
247250
defaultProvider: params.data.resolvedDefault.provider,
248251
});
@@ -267,9 +270,12 @@ export function resolveDiscordModelPickerCurrentRuntime(params: {
267270
const storePath = resolveStorePath(params.cfg.session?.store, {
268271
agentId: params.route.agentId,
269272
});
270-
const sessionStore = loadSessionStore(storePath, { skipCache: true });
271273
const sessionRuntime = normalizeOptionalString(
272-
sessionStore[params.route.sessionKey]?.agentRuntimeOverride,
274+
getSessionEntry({
275+
storePath,
276+
sessionKey: params.route.sessionKey,
277+
readConsistency: "latest",
278+
})?.agentRuntimeOverride,
273279
);
274280
if (sessionRuntime) {
275281
return sessionRuntime;

extensions/matrix/src/matrix/monitor/handler.ts

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,7 @@ import {
4040
import type { GetReplyOptions } from "openclaw/plugin-sdk/reply-runtime";
4141
import { resolveInboundLastRouteSessionKey } from "openclaw/plugin-sdk/routing";
4242
import { resolvePinnedMainDmOwnerFromAllowlist } from "openclaw/plugin-sdk/security-runtime";
43-
import {
44-
loadSessionStore,
45-
resolveSessionStoreEntry,
46-
} from "openclaw/plugin-sdk/session-store-runtime";
43+
import { getSessionEntry } from "openclaw/plugin-sdk/session-store-runtime";
4744
import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
4845
import type {
4946
CoreConfig,
@@ -347,12 +344,11 @@ function resolveMatrixSharedDmContextNotice(params: {
347344
}
348345

349346
try {
350-
const store = loadSessionStore(params.storePath);
351347
const currentSession = resolveMatrixStoredSessionMeta(
352-
resolveSessionStoreEntry({
353-
store,
348+
getSessionEntry({
349+
storePath: params.storePath,
354350
sessionKey: params.sessionKey,
355-
}).existing,
351+
}),
356352
);
357353
if (!currentSession) {
358354
return null;

extensions/matrix/src/session-route.ts

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,7 @@ import {
66
type ChannelOutboundSessionRouteParams,
77
} from "openclaw/plugin-sdk/channel-core";
88
import { parseThreadSessionSuffix } from "openclaw/plugin-sdk/routing";
9-
import {
10-
loadSessionStore,
11-
resolveSessionStoreEntry,
12-
resolveStorePath,
13-
} from "openclaw/plugin-sdk/session-store-runtime";
9+
import { getSessionEntry, resolveStorePath } from "openclaw/plugin-sdk/session-store-runtime";
1410
import { resolveMatrixAccountConfig } from "./matrix/account-config.js";
1511
import { resolveDefaultMatrixAccountId } from "./matrix/accounts.js";
1612
import { resolveMatrixStoredSessionMeta } from "./matrix/session-store-metadata.js";
@@ -51,11 +47,10 @@ function resolveMatrixCurrentDmRoomId(params: {
5147
const storePath = resolveStorePath(params.cfg.session?.store, {
5248
agentId: params.agentId,
5349
});
54-
const store = loadSessionStore(storePath);
55-
const existing = resolveSessionStoreEntry({
56-
store,
50+
const existing = getSessionEntry({
51+
storePath,
5752
sessionKey,
58-
}).existing;
53+
});
5954
const currentSession = resolveMatrixStoredSessionMeta(existing);
6055
if (!currentSession) {
6156
return undefined;

extensions/mattermost/src/mattermost/model-picker.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ describe("Mattermost model picker", () => {
221221
const storePath = path.join(testDir, "{agentId}.json");
222222
const supportStorePath = path.join(testDir, "support.json");
223223
const parentSessionKey = "agent:support:mattermost:default:channel-1";
224-
const childSessionKey = `${parentSessionKey}:thread:root-1`;
224+
const childSessionKey = "agent:support:mattermost:default:child-with-explicit-parent";
225225
const directSessionKey = "agent:support:mattermost:default:direct-1";
226226
fs.writeFileSync(
227227
supportStorePath,

extensions/mattermost/src/mattermost/model-picker.ts

Lines changed: 10 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import {
77
import type { OpenClawConfig } from "openclaw/plugin-sdk/core";
88
import { parseStrictInteger } from "openclaw/plugin-sdk/number-runtime";
99
import { normalizeProviderId } from "openclaw/plugin-sdk/provider-model-shared";
10-
import { parseThreadSessionSuffix } from "openclaw/plugin-sdk/routing";
1110
import { getSessionEntry, resolveStorePath } from "openclaw/plugin-sdk/session-store-runtime";
1211
import {
1312
normalizeOptionalString,
@@ -40,8 +39,6 @@ type MattermostModelPickerRenderedView = {
4039
buttons: MattermostInteractiveButtonInput[][];
4140
};
4241

43-
type MattermostModelPickerSessionEntry = ReturnType<typeof getSessionEntry>;
44-
4542
function splitModelRef(modelRef?: string | null): { provider: string; model: string } | null {
4643
const trimmed = normalizeOptionalString(modelRef);
4744
const match = trimmed?.match(/^([^/]+)\/(.+)$/u);
@@ -80,24 +77,6 @@ function normalizePage(value: number | undefined): number {
8077
return Math.max(1, Math.floor(value as number));
8178
}
8279

83-
function resolveMattermostModelPickerParentSessionKey(params: {
84-
sessionEntry: MattermostModelPickerSessionEntry;
85-
sessionKey: string;
86-
}): string | undefined {
87-
// Preserve inherited model overrides without exposing whole-store reads to the UI path.
88-
const persistedParent =
89-
typeof params.sessionEntry?.parentSessionKey === "string"
90-
? params.sessionEntry.parentSessionKey.trim()
91-
: "";
92-
if (persistedParent && persistedParent !== params.sessionKey) {
93-
return persistedParent;
94-
}
95-
const parsed = parseThreadSessionSuffix(params.sessionKey);
96-
return parsed.threadId && parsed.baseSessionKey && parsed.baseSessionKey !== params.sessionKey
97-
? parsed.baseSessionKey
98-
: undefined;
99-
}
100-
10180
function paginateItems<T>(items: T[], page?: number, pageSize = MODELS_PAGE_SIZE) {
10281
const totalPages = Math.max(1, Math.ceil(items.length / pageSize));
10382
const safePage = Math.max(1, Math.min(normalizePage(page), totalPages));
@@ -258,38 +237,28 @@ export function resolveMattermostModelPickerCurrentModel(params: {
258237
cfg: OpenClawConfig;
259238
route: { agentId: string; sessionKey: string };
260239
data: ModelsProviderData;
261-
skipCache?: boolean;
240+
readConsistency?: "latest";
262241
}): string {
263242
const fallback = `${params.data.resolvedDefault.provider}/${params.data.resolvedDefault.model}`;
264243
try {
265244
const storePath = resolveStorePath(params.cfg.session?.store, {
266245
agentId: params.route.agentId,
267246
});
268-
const readOptions = {
269-
storePath,
270-
...(params.skipCache ? { readConsistency: "latest" as const } : {}),
271-
};
272247
const sessionEntry = getSessionEntry({
273-
...readOptions,
274-
sessionKey: params.route.sessionKey,
275-
});
276-
const parentSessionKey = resolveMattermostModelPickerParentSessionKey({
277-
sessionEntry,
248+
storePath,
278249
sessionKey: params.route.sessionKey,
250+
...(params.readConsistency === "latest" ? { readConsistency: "latest" as const } : {}),
279251
});
280-
const parentEntry = parentSessionKey
281-
? getSessionEntry({
282-
...readOptions,
283-
sessionKey: parentSessionKey,
284-
})
285-
: undefined;
286252
const override = resolveStoredModelOverride({
287253
sessionEntry,
288-
...(parentEntry && parentSessionKey
289-
? { sessionStore: { [parentSessionKey]: parentEntry } }
290-
: {}),
254+
loadSessionEntry: (sessionKey) =>
255+
getSessionEntry({
256+
storePath,
257+
sessionKey,
258+
...(params.readConsistency === "latest" ? { readConsistency: "latest" as const } : {}),
259+
}),
291260
sessionKey: params.route.sessionKey,
292-
parentSessionKey,
261+
parentSessionKey: sessionEntry?.parentSessionKey,
293262
defaultProvider: params.data.resolvedDefault.provider,
294263
});
295264
if (!override?.model) {

extensions/mattermost/src/mattermost/monitor.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1256,7 +1256,7 @@ export async function monitorMattermostProvider(opts: MonitorMattermostOpts = {}
12561256
cfg,
12571257
route: modelSessionRoute,
12581258
data,
1259-
skipCache: true,
1259+
readConsistency: "latest",
12601260
});
12611261
const view = renderMattermostModelsPickerView({
12621262
ownerUserId: pickerState.ownerUserId,

extensions/slack/src/monitor/slash.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import type { ReplyPayload } from "openclaw/plugin-sdk/reply-runtime";
2020
import type { ResolvedAgentRoute } from "openclaw/plugin-sdk/routing";
2121
import { getRuntimeConfigSnapshot } from "openclaw/plugin-sdk/runtime-config-snapshot";
2222
import { danger, logVerbose, warn } from "openclaw/plugin-sdk/runtime-env";
23-
import { loadSessionStore, resolveStorePath } from "openclaw/plugin-sdk/session-store-runtime";
23+
import { getSessionEntry, resolveStorePath } from "openclaw/plugin-sdk/session-store-runtime";
2424
import {
2525
normalizeLowercaseStringOrEmpty,
2626
normalizeOptionalString,
@@ -112,14 +112,13 @@ function resolveSlackCommandMenuModelContext(params: {
112112
agentId: params.agentId,
113113
});
114114
const storePath = resolveStorePath(params.cfg.session?.store, { agentId: params.agentId });
115-
const store = loadSessionStore(storePath);
116-
const entry = store[params.sessionKey];
115+
const entry = getSessionEntry({ storePath, sessionKey: params.sessionKey });
117116
if (entry?.modelOverrideSource === "auto" && normalizeOptionalString(entry.modelOverride)) {
118117
return { provider: defaultModel.provider, model: defaultModel.model };
119118
}
120119
const override = resolveStoredModelOverride({
121120
sessionEntry: entry,
122-
sessionStore: store,
121+
loadSessionEntry: (sessionKey) => getSessionEntry({ storePath, sessionKey }),
123122
sessionKey: params.sessionKey,
124123
defaultProvider: defaultModel.provider,
125124
});

extensions/telegram/src/bot-core.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -310,12 +310,11 @@ export function createTelegramBotCore(
310310
`agent:${agentId}:telegram:group:${buildTelegramGroupPeerId(params.chatId, params.messageThreadId)}`;
311311
const storePath = telegramDeps.resolveStorePath(cfg.session?.store, { agentId });
312312
try {
313-
const loadSessionStore = telegramDeps.loadSessionStore;
314-
if (!loadSessionStore) {
313+
const getSessionEntry = telegramDeps.getSessionEntry;
314+
if (!getSessionEntry) {
315315
return undefined;
316316
}
317-
const store = loadSessionStore(storePath);
318-
const entry = store[sessionKey];
317+
const entry = getSessionEntry({ storePath, sessionKey });
319318
if (entry?.groupActivation === "always") {
320319
return false;
321320
}

extensions/telegram/src/bot-message-dispatch.runtime.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
// Telegram plugin module implements bot message dispatch behavior.
22
export {
3-
loadSessionStore,
4-
resolveSessionStoreEntry,
3+
getSessionEntry,
54
resolveStorePath,
5+
type SessionEntry,
66
} from "openclaw/plugin-sdk/session-store-runtime";
77
export { resolveMarkdownTableMode } from "openclaw/plugin-sdk/markdown-table-runtime";
88
export { getAgentScopedMediaLocalRoots } from "openclaw/plugin-sdk/media-runtime";

0 commit comments

Comments
 (0)