diff --git a/packages/builtin-tool-creds/src/systemRole.ts b/packages/builtin-tool-creds/src/systemRole.ts
index 6c6d8255e4..04cfb5507c 100644
--- a/packages/builtin-tool-creds/src/systemRole.ts
+++ b/packages/builtin-tool-creds/src/systemRole.ts
@@ -1,9 +1,9 @@
export const systemPrompt = `You have access to a LobeHub Credentials Tool. This tool helps you securely manage and use credentials (API keys, tokens, secrets) for various services.
-Current user: Arvin Xu
-Session date: Wednesday, May 20, 2026
-Sandbox mode: false
+Current user: {{username}}
+Session date: {{session_date}}
+Sandbox mode: {{sandbox_enabled}}
@@ -67,7 +67,7 @@ When suggesting to save, always:
-**Only applies when sandbox mode is enabled (current value: false).**
+**Only applies when sandbox mode is enabled (current value: {{sandbox_enabled}}).**
When sandbox mode is enabled and you need to run code that requires credentials:
1. Check if the required credential is in the available credentials list
diff --git a/src/server/modules/AgentRuntime/RuntimeExecutors.ts b/src/server/modules/AgentRuntime/RuntimeExecutors.ts
index 8cfad24b9e..4e226b54ea 100644
--- a/src/server/modules/AgentRuntime/RuntimeExecutors.ts
+++ b/src/server/modules/AgentRuntime/RuntimeExecutors.ts
@@ -14,7 +14,6 @@ import {
} from '@lobechat/agent-runtime';
import { LobeActivatorIdentifier } from '@lobechat/builtin-tool-activator';
import {
- CredsIdentifier,
type CredSummary,
generateCredsList,
generateKlavisServicesList,
@@ -639,18 +638,25 @@ export const createRuntimeExecutors = (
// {{sandbox_enabled}} — mirrors client-side check for lobe-cloud-sandbox.
const sandboxEnabled = String(resolved.enabledToolIds.includes('lobe-cloud-sandbox'));
+ // {{session_date}} — current date formatted for user's timezone.
+ const sessionDate = new Intl.DateTimeFormat('en-US', {
+ day: 'numeric',
+ month: 'long',
+ timeZone: ctx.userTimezone || 'UTC',
+ weekday: 'long',
+ year: 'numeric',
+ }).format(new Date());
+
// {{memory_effort}} — read from agentConfig chatConfig; no extra query needed.
const memoryEffort = String(
(state.metadata?.agentConfig as any)?.chatConfig?.memory?.effort ?? '',
);
// {{CREDS_LIST}} — used by lobe-creds system role.
- // Gate on manifestMap presence, NOT enabledToolIds: in execAgent mode lobe-creds is
- // added to manifestMap (for activator discovery) but never into enabledToolIds, so
- // checking enabledToolIds would always be false while the system role IS injected.
- const isCredsEnabled = !!resolved.manifestMap[CredsIdentifier];
+ // Always fetched when userId is available so substitution works regardless of which
+ // execution path (execAgent / client-side activator) injected the system role.
let credsListStr = '';
- if (isCredsEnabled && ctx.userId) {
+ if (ctx.userId) {
try {
const { MarketService } = await import('@/server/services/market');
const marketService = new MarketService({ userInfo: { userId: ctx.userId } });
@@ -675,7 +681,7 @@ export const createRuntimeExecutors = (
// {{KLAVIS_SERVICES_LIST}} — used by lobe-creds system role (Klavis integrations section).
// Mirrors client-side: klavisStoreSelectors.getServers() filtered by connection status.
let klavisServicesListStr = '';
- if (isCredsEnabled && ctx.serverDB && ctx.userId && !!klavisEnv.KLAVIS_API_KEY) {
+ if (ctx.serverDB && ctx.userId && !!klavisEnv.KLAVIS_API_KEY) {
try {
const { PluginModel } = await import('@/database/models/plugin');
const pluginModel = new PluginModel(ctx.serverDB, ctx.userId);
@@ -718,10 +724,11 @@ export const createRuntimeExecutors = (
// User identity variables
username: serverUsername,
language: serverLanguage,
+ session_date: sessionDate,
// Creds tool variables
sandbox_enabled: sandboxEnabled,
- ...(isCredsEnabled && { CREDS_LIST: credsListStr }),
- ...(isCredsEnabled && { KLAVIS_SERVICES_LIST: klavisServicesListStr }),
+ CREDS_LIST: credsListStr,
+ KLAVIS_SERVICES_LIST: klavisServicesListStr,
// Memory tool variables
memory_effort: memoryEffort,
},
diff --git a/src/server/modules/AgentRuntime/__tests__/RuntimeExecutors.test.ts b/src/server/modules/AgentRuntime/__tests__/RuntimeExecutors.test.ts
index 011c3ab4cc..3741ed6769 100644
--- a/src/server/modules/AgentRuntime/__tests__/RuntimeExecutors.test.ts
+++ b/src/server/modules/AgentRuntime/__tests__/RuntimeExecutors.test.ts
@@ -62,6 +62,13 @@ vi.mock('model-bank', () => ({
LOBE_DEFAULT_MODEL_LIST: mockBuiltinModels,
}));
+// klavisEnv uses @t3-oss/env-nextjs which throws in jsdom (treats it as client context)
+vi.mock('@/config/klavis', () => ({
+ getKlavisConfig: vi.fn(),
+ getServerKlavisApiKey: vi.fn().mockReturnValue(undefined),
+ klavisEnv: { KLAVIS_API_KEY: undefined },
+}));
+
describe('RuntimeExecutors', () => {
let mockMessageModel: any;
let mockStreamManager: any;
diff --git a/src/services/chat/mecha/contextEngineering.ts b/src/services/chat/mecha/contextEngineering.ts
index 6442dbbc93..fd81b258b5 100644
--- a/src/services/chat/mecha/contextEngineering.ts
+++ b/src/services/chat/mecha/contextEngineering.ts
@@ -719,6 +719,15 @@ export const contextEngineering = async ({
CREDS_LIST: () => (credsList ? generateCredsList(credsList) : ''),
// NOTICE: required by builtin-tool-creds/src/systemRole.ts (Klavis integrations)
KLAVIS_SERVICES_LIST: () => klavisServicesList,
+ // NOTICE: required by builtin-tool-creds/src/systemRole.ts (session_context)
+ session_date: () =>
+ new Intl.DateTimeFormat('en-US', {
+ day: 'numeric',
+ month: 'long',
+ weekday: 'long',
+ year: 'numeric',
+ }).format(new Date()),
+ sandbox_enabled: () => String(tools?.includes('lobe-cloud-sandbox') ?? false),
// NOTICE(@nekomeowww): required by builtin-tool-memory/src/systemRole.ts
memory_effort: () => (userMemoryConfig ? (memoryContext?.effort ?? '') : ''),
// Current agent + topic identity — referenced by the LobeHub builtin