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