@lobehub/lobehub 2.0.0-next.337 → 2.0.0-next.338

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,31 @@
2
2
 
3
3
  # Changelog
4
4
 
5
+ ## [Version 2.0.0-next.338](https://github.com/lobehub/lobe-chat/compare/v2.0.0-next.337...v2.0.0-next.338)
6
+
7
+ <sup>Released on **2026-01-22**</sup>
8
+
9
+ #### 🐛 Bug Fixes
10
+
11
+ - **misc**: Updata cron job ui & fixed commnuity pagenation goto error.
12
+
13
+ <br/>
14
+
15
+ <details>
16
+ <summary><kbd>Improvements and Fixes</kbd></summary>
17
+
18
+ #### What's fixed
19
+
20
+ - **misc**: Updata cron job ui & fixed commnuity pagenation goto error, closes [#11700](https://github.com/lobehub/lobe-chat/issues/11700) ([42ad2a0](https://github.com/lobehub/lobe-chat/commit/42ad2a0))
21
+
22
+ </details>
23
+
24
+ <div align="right">
25
+
26
+ [![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
27
+
28
+ </div>
29
+
5
30
  ## [Version 2.0.0-next.337](https://github.com/lobehub/lobe-chat/compare/v2.0.0-next.336...v2.0.0-next.337)
6
31
 
7
32
  <sup>Released on **2026-01-22**</sup>
package/changelog/v1.json CHANGED
@@ -1,4 +1,13 @@
1
1
  [
2
+ {
3
+ "children": {
4
+ "fixes": [
5
+ "Updata cron job ui & fixed commnuity pagenation goto error."
6
+ ]
7
+ },
8
+ "date": "2026-01-22",
9
+ "version": "2.0.0-next.338"
10
+ },
2
11
  {
3
12
  "children": {
4
13
  "fixes": [
@@ -36,7 +36,11 @@
36
36
  "agentCronJobs.noExecutionResults": "No execution results",
37
37
  "agentCronJobs.remainingExecutions": "Remaining: {{count}}",
38
38
  "agentCronJobs.save": "Save",
39
+ "agentCronJobs.saveAsNew": "Save as New",
39
40
  "agentCronJobs.schedule": "Schedule",
41
+ "agentCronJobs.scheduleType.daily": "Daily",
42
+ "agentCronJobs.scheduleType.hourly": "Hourly",
43
+ "agentCronJobs.scheduleType.weekly": "Weekly",
40
44
  "agentCronJobs.status.depleted": "Depleted",
41
45
  "agentCronJobs.status.disabled": "Disabled",
42
46
  "agentCronJobs.status.enabled": "Enabled",
@@ -45,6 +49,20 @@
45
49
  "agentCronJobs.unlimited": "Unlimited",
46
50
  "agentCronJobs.unnamedTask": "Unnamed Task",
47
51
  "agentCronJobs.updateSuccess": "Scheduled task updated successfully",
52
+ "agentCronJobs.weekday.friday": "Friday",
53
+ "agentCronJobs.weekday.monday": "Monday",
54
+ "agentCronJobs.weekday.saturday": "Saturday",
55
+ "agentCronJobs.weekday.short.friday": "Fri",
56
+ "agentCronJobs.weekday.short.monday": "Mon",
57
+ "agentCronJobs.weekday.short.saturday": "Sat",
58
+ "agentCronJobs.weekday.short.sunday": "Sun",
59
+ "agentCronJobs.weekday.short.thursday": "Thu",
60
+ "agentCronJobs.weekday.short.tuesday": "Tue",
61
+ "agentCronJobs.weekday.short.wednesday": "Wed",
62
+ "agentCronJobs.weekday.sunday": "Sunday",
63
+ "agentCronJobs.weekday.thursday": "Thursday",
64
+ "agentCronJobs.weekday.tuesday": "Tuesday",
65
+ "agentCronJobs.weekday.wednesday": "Wednesday",
48
66
  "agentCronJobs.weekdays": "Weekdays",
49
67
  "agentInfoDescription.basic.avatar": "Avatar",
50
68
  "agentInfoDescription.basic.description": "Description",
@@ -544,6 +562,7 @@
544
562
  "systemAgent.translation.title": "Message Translation Agent",
545
563
  "tab.about": "About",
546
564
  "tab.agent": "Agent Service",
565
+ "tab.all": "All",
547
566
  "tab.apikey": "API Key Management",
548
567
  "tab.chatAppearance": "Chat Appearance",
549
568
  "tab.common": "Appearance",
@@ -221,6 +221,7 @@
221
221
  "stats.updatedAt": "更新至",
222
222
  "stats.welcome": "{{username}},这是你与 {{appName}} 一起记录协作的第 <span>{{days}}</span> 天",
223
223
  "stats.words": "累计字数",
224
+ "tab.all": "全部",
224
225
  "tab.apikey": "API Key",
225
226
  "tab.profile": "账号",
226
227
  "tab.security": "安全",
@@ -36,7 +36,11 @@
36
36
  "agentCronJobs.noExecutionResults": "无执行结果",
37
37
  "agentCronJobs.remainingExecutions": "剩余:{{count}}",
38
38
  "agentCronJobs.save": "保存",
39
+ "agentCronJobs.saveAsNew": "另存为新任务",
39
40
  "agentCronJobs.schedule": "计划",
41
+ "agentCronJobs.scheduleType.daily": "每日",
42
+ "agentCronJobs.scheduleType.hourly": "每小时",
43
+ "agentCronJobs.scheduleType.weekly": "每周",
40
44
  "agentCronJobs.status.depleted": "已耗尽",
41
45
  "agentCronJobs.status.disabled": "已禁用",
42
46
  "agentCronJobs.status.enabled": "已启用",
@@ -45,6 +49,20 @@
45
49
  "agentCronJobs.unlimited": "无限",
46
50
  "agentCronJobs.unnamedTask": "未命名任务",
47
51
  "agentCronJobs.updateSuccess": "定时任务更新成功",
52
+ "agentCronJobs.weekday.friday": "星期五",
53
+ "agentCronJobs.weekday.monday": "星期一",
54
+ "agentCronJobs.weekday.saturday": "星期六",
55
+ "agentCronJobs.weekday.short.friday": "周五",
56
+ "agentCronJobs.weekday.short.monday": "周一",
57
+ "agentCronJobs.weekday.short.saturday": "周六",
58
+ "agentCronJobs.weekday.short.sunday": "周日",
59
+ "agentCronJobs.weekday.short.thursday": "周四",
60
+ "agentCronJobs.weekday.short.tuesday": "周二",
61
+ "agentCronJobs.weekday.short.wednesday": "周三",
62
+ "agentCronJobs.weekday.sunday": "星期日",
63
+ "agentCronJobs.weekday.thursday": "星期四",
64
+ "agentCronJobs.weekday.tuesday": "星期二",
65
+ "agentCronJobs.weekday.wednesday": "星期三",
48
66
  "agentCronJobs.weekdays": "工作日",
49
67
  "agentInfoDescription.basic.avatar": "头像",
50
68
  "agentInfoDescription.basic.description": "描述",
@@ -544,6 +562,7 @@
544
562
  "systemAgent.translation.title": "消息内容翻译助理",
545
563
  "tab.about": "关于",
546
564
  "tab.agent": "助理服务",
565
+ "tab.all": "全部",
547
566
  "tab.apikey": "API Key 管理",
548
567
  "tab.chatAppearance": "聊天外观",
549
568
  "tab.common": "外观",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lobehub/lobehub",
3
- "version": "2.0.0-next.337",
3
+ "version": "2.0.0-next.338",
4
4
  "description": "LobeHub - an open-source,comprehensive AI Agent framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.",
5
5
  "keywords": [
6
6
  "framework",
@@ -242,7 +242,7 @@ export class LobeGoogleAI implements LobeRuntimeAI {
242
242
  } catch (e) {
243
243
  const err = e as Error;
244
244
 
245
- // 移除之前的静默处理,统一抛出错误
245
+ // Remove previous silent handling, throw error uniformly
246
246
  if (isAbortError(err)) {
247
247
  log('Request was cancelled');
248
248
  throw AgentRuntimeError.chat({
@@ -307,10 +307,10 @@ export class LobeGoogleAI implements LobeRuntimeAI {
307
307
  try {
308
308
  for await (const chunk of originalStream) {
309
309
  if (signal.aborted) {
310
- // 如果有数据已经输出,优雅地关闭流而不是抛出错误
310
+ // If data has already been output, close the stream gracefully instead of throwing an error
311
311
  if (hasData) {
312
312
  log('Stream cancelled gracefully, preserving existing output');
313
- // 显式注入取消错误,避免走 SSE 兜底 unexpected_end
313
+ // Explicitly inject cancellation error to avoid SSE fallback unexpected_end
314
314
  controller.enqueue({
315
315
  [LOBE_ERROR_KEY]: {
316
316
  body: { name: 'Stream cancelled', provider, reason: 'aborted' },
@@ -322,7 +322,7 @@ export class LobeGoogleAI implements LobeRuntimeAI {
322
322
  controller.close();
323
323
  return;
324
324
  } else {
325
- // 如果还没有数据输出,直接关闭流,由下游 SSE flush 阶段补发错误事件
325
+ // If no data has been output yet, close the stream directly and let downstream SSE emit error event during flush phase
326
326
  log('Stream cancelled before any output');
327
327
  controller.close();
328
328
  return;
@@ -335,12 +335,12 @@ export class LobeGoogleAI implements LobeRuntimeAI {
335
335
  } catch (error) {
336
336
  const err = error as Error;
337
337
 
338
- // 统一处理所有错误,包括 abort 错误
338
+ // Handle all errors uniformly, including abort errors
339
339
  if (isAbortError(err) || signal.aborted) {
340
- // 如果有数据已经输出,优雅地关闭流
340
+ // If data has already been output, close the stream gracefully
341
341
  if (hasData) {
342
342
  log('Stream reading cancelled gracefully, preserving existing output');
343
- // 显式注入取消错误,避免走 SSE 兜底 unexpected_end
343
+ // Explicitly inject cancellation error to avoid SSE fallback unexpected_end
344
344
  controller.enqueue({
345
345
  [LOBE_ERROR_KEY]: {
346
346
  body: { name: 'Stream cancelled', provider, reason: 'aborted' },
@@ -353,7 +353,7 @@ export class LobeGoogleAI implements LobeRuntimeAI {
353
353
  return;
354
354
  } else {
355
355
  log('Stream reading cancelled before any output');
356
- // 注入一个带详细错误信息的错误标记,交由下游 google-ai transformer 输出 error 事件
356
+ // Inject an error marker with detailed error information to be handled by downstream google-ai transformer to output error event
357
357
  controller.enqueue({
358
358
  [LOBE_ERROR_KEY]: {
359
359
  body: {
@@ -371,14 +371,14 @@ export class LobeGoogleAI implements LobeRuntimeAI {
371
371
  return;
372
372
  }
373
373
  } else {
374
- // 处理其他流解析错误
374
+ // Handle other stream parsing errors
375
375
  log('Stream parsing error: %O', err);
376
- // 尝试解析 Google 错误并提取 code/message/status
376
+ // Try to parse Google error and extract code/message/status
377
377
  const { error: parsedError, errorType } = parseGoogleErrorMessage(
378
378
  err?.message || String(err),
379
379
  );
380
380
 
381
- // 注入一个带详细错误信息的错误标记,交由下游 google-ai transformer 输出 error 事件
381
+ // Inject an error marker with detailed error information to be handled by downstream google-ai transformer to output error event
382
382
  controller.enqueue({
383
383
  [LOBE_ERROR_KEY]: {
384
384
  body: { ...parsedError, provider },
@@ -453,12 +453,12 @@ export class LobeGoogleAI implements LobeRuntimeAI {
453
453
  const hasUrlContext = payload?.urlContext;
454
454
  const hasFunctionTools = tools && tools.length > 0;
455
455
 
456
- // 如果已经有 tool_calls,优先处理 function declarations
456
+ // If tool_calls already exist, prioritize handling function declarations
457
457
  if (hasToolCalls && hasFunctionTools) {
458
458
  return buildGoogleTools(tools);
459
459
  }
460
460
 
461
- // 构建并返回搜索相关工具(搜索工具不能与 FunctionCall 同时使用)
461
+ // Build and return search-related tools (search tools cannot be used with FunctionCall simultaneously)
462
462
  if (hasUrlContext && hasSearch) {
463
463
  return [{ urlContext: {} }, { googleSearch: {} }];
464
464
  }
@@ -469,7 +469,7 @@ export class LobeGoogleAI implements LobeRuntimeAI {
469
469
  return [{ googleSearch: {} }];
470
470
  }
471
471
 
472
- // 最后考虑 function declarations
472
+ // Finally consider function declarations
473
473
  return buildGoogleTools(tools);
474
474
  }
475
475
  }
@@ -21,7 +21,7 @@ export const params = {
21
21
  const filteredMessages = messages.map((message: any) => {
22
22
  let normalizedMessage = message;
23
23
 
24
- // assistant 空消息添加一个空格 (#8418)
24
+ // Add a space for empty assistant messages (#8418)
25
25
  if (message.role === 'assistant' && (!message.content || message.content === '')) {
26
26
  normalizedMessage = { ...normalizedMessage, content: ' ' };
27
27
  }
@@ -16,10 +16,10 @@ export interface OpenAIModelCard {
16
16
  const prunePrefixes = ['o1', 'o3', 'o4', 'codex', 'computer-use', 'gpt-5'];
17
17
  const oaiSearchContextSize = process.env.OPENAI_SEARCH_CONTEXT_SIZE; // low, medium, high
18
18
  const enableServiceTierFlex = process.env.OPENAI_SERVICE_TIER_FLEX === '1';
19
- const flexSupportedModels = ['gpt-5', 'o3', 'o4-mini']; // Flex 处理仅适用于这些模型
19
+ const flexSupportedModels = ['gpt-5', 'o3', 'o4-mini']; // Flex tier is only available for these models
20
20
 
21
21
  const supportsFlexTier = (model: string) => {
22
- // 排除 o3-mini,其不支持 Flex 处理
22
+ // Exclude o3-mini, which does not support Flex tier
23
23
  if (model.startsWith('o3-mini')) {
24
24
  return false;
25
25
  }
@@ -74,7 +74,7 @@ export const params = {
74
74
  const modelsPage = (await client.models.list()) as any;
75
75
  const modelList: OpenAIModelCard[] = modelsPage.data;
76
76
 
77
- // 自动检测模型提供商并选择相应配置
77
+ // Automatically detect model provider and select corresponding configuration
78
78
  return processMultiProviderModelList(modelList, 'openai');
79
79
  },
80
80
  provider: ModelProvider.OpenAI,
@@ -10,7 +10,7 @@ export * from './plugins';
10
10
  export * from './providers';
11
11
 
12
12
  export enum DiscoverTab {
13
- Assistants = 'assistant',
13
+ Assistants = 'agent',
14
14
  GroupAgents = 'group_agent',
15
15
  Home = 'home',
16
16
  Mcp = 'mcp',
@@ -61,24 +61,24 @@ export const TIMEZONE_OPTIONS = [
61
61
 
62
62
  // Weekday options for checkbox group
63
63
  export const WEEKDAY_OPTIONS = [
64
- { label: 'Mon', value: 1 },
65
- { label: 'Tue', value: 2 },
66
- { label: 'Wed', value: 3 },
67
- { label: 'Thu', value: 4 },
68
- { label: 'Fri', value: 5 },
69
- { label: 'Sat', value: 6 },
70
- { label: 'Sun', value: 0 },
71
- ];
64
+ { label: 'agentCronJobs.weekday.short.monday', value: 1 },
65
+ { label: 'agentCronJobs.weekday.short.tuesday', value: 2 },
66
+ { label: 'agentCronJobs.weekday.short.wednesday', value: 3 },
67
+ { label: 'agentCronJobs.weekday.short.thursday', value: 4 },
68
+ { label: 'agentCronJobs.weekday.short.friday', value: 5 },
69
+ { label: 'agentCronJobs.weekday.short.saturday', value: 6 },
70
+ { label: 'agentCronJobs.weekday.short.sunday', value: 0 },
71
+ ] as const;
72
72
 
73
- // Weekday labels for display
73
+ // Weekday labels for display (i18n keys)
74
74
  export const WEEKDAY_LABELS: Record<number, string> = {
75
- 0: 'Sunday',
76
- 1: 'Monday',
77
- 2: 'Tuesday',
78
- 3: 'Wednesday',
79
- 4: 'Thursday',
80
- 5: 'Friday',
81
- 6: 'Saturday',
75
+ 0: 'agentCronJobs.weekday.sunday',
76
+ 1: 'agentCronJobs.weekday.monday',
77
+ 2: 'agentCronJobs.weekday.tuesday',
78
+ 3: 'agentCronJobs.weekday.wednesday',
79
+ 4: 'agentCronJobs.weekday.thursday',
80
+ 5: 'agentCronJobs.weekday.friday',
81
+ 6: 'agentCronJobs.weekday.saturday',
82
82
  };
83
83
 
84
84
  /**
@@ -22,7 +22,7 @@ const CronJobSaveButton = memo<CronJobSaveButtonProps>(({ disabled, loading, onS
22
22
  style={{ width: 200 }}
23
23
  type="primary"
24
24
  >
25
- {t('agentCronJobs.saveAsNew', { defaultValue: 'Save as New Scheduled Task' })}
25
+ {t('agentCronJobs.saveAsNew')}
26
26
  </Button>
27
27
  </Flexbox>
28
28
  );
@@ -81,7 +81,7 @@ const CronJobScheduleConfig = memo<CronJobScheduleConfigProps>(
81
81
  if (scheduleType === 'weekly' && weekdays.length > 0) {
82
82
  result.push({
83
83
  key: 'weekdays',
84
- label: weekdays.map((day) => WEEKDAY_LABELS[day]).join(', '),
84
+ label: weekdays.map((day) => t(WEEKDAY_LABELS[day] as any)).join(', '),
85
85
  });
86
86
  }
87
87
 
@@ -126,7 +126,10 @@ const CronJobScheduleConfig = memo<CronJobScheduleConfigProps>(
126
126
  maxTagCount="responsive"
127
127
  mode="multiple"
128
128
  onChange={(values: number[]) => onScheduleChange({ weekdays: values })}
129
- options={WEEKDAY_OPTIONS}
129
+ options={WEEKDAY_OPTIONS.map((opt) => ({
130
+ label: t(opt.label as any),
131
+ value: opt.value,
132
+ }))}
130
133
  placeholder="Select days"
131
134
  size="small"
132
135
  style={{ minWidth: 150 }}
@@ -33,7 +33,7 @@ const Search = memo<StoreSearchBarProps>(() => {
33
33
  const { q } = useQuery() as { q?: string };
34
34
  const router = useQueryRoute();
35
35
  const [word, setWord] = useState<string>(q || '');
36
- const activeTab = pathname.split('/')[2] || 'assistant';
36
+ const activeTab = pathname.split('/')[2] || 'agent';
37
37
  const handleSearch = (value: string) => {
38
38
  router.push(urlJoin('/community', activeTab), {
39
39
  query: value ? { q: value } : {},
@@ -7,6 +7,7 @@ import MobileChatLayout from '@/app/[variants]/(mobile)/chat/_layout';
7
7
  import MobileMeHomeLayout from '@/app/[variants]/(mobile)/me/(home)/layout';
8
8
  import MobileMeProfileLayout from '@/app/[variants]/(mobile)/me/profile/layout';
9
9
  import MobileMeSettingsLayout from '@/app/[variants]/(mobile)/me/settings/layout';
10
+ import MobileSettingsProviderLayout from '@/app/[variants]/(mobile)/settings/provider/_layout';
10
11
  import {
11
12
  BusinessMobileRoutesWithMainLayout,
12
13
  BusinessMobileRoutesWithoutMainLayout,
@@ -174,6 +175,32 @@ export const mobileRoutes: RouteConfig[] = [
174
175
  element: dynamicElement(() => import('../settings'), 'Mobile > Settings'),
175
176
  index: true,
176
177
  },
178
+ // Provider routes with nested structure
179
+ {
180
+ children: [
181
+ {
182
+ element: redirectElement('/settings/provider/all'),
183
+ index: true,
184
+ },
185
+ {
186
+ element: dynamicElement(
187
+ () => import('../../(main)/settings/provider').then((m) => m.ProviderDetailPage),
188
+ 'Mobile > Settings > Provider > Detail',
189
+ ),
190
+ path: ':providerId',
191
+ },
192
+ ],
193
+ element: <MobileSettingsProviderLayout />,
194
+ path: 'provider',
195
+ },
196
+ // Other settings tabs (common, agent, memory, tts, about, etc.)
197
+ {
198
+ element: dynamicElement(
199
+ () => import('../../(main)/settings'),
200
+ 'Mobile > Settings > Tab',
201
+ ),
202
+ path: ':tab',
203
+ },
177
204
  ],
178
205
  element: <MobileSettingsLayout />,
179
206
  errorElement: <ErrorBoundary resetPath="/settings" />,
@@ -4,10 +4,9 @@ import { Flexbox } from '@lobehub/ui';
4
4
  import { ChatHeader } from '@lobehub/ui/mobile';
5
5
  import { memo } from 'react';
6
6
  import { useTranslation } from 'react-i18next';
7
- import { useNavigate } from 'react-router-dom';
7
+ import { useNavigate, useParams } from 'react-router-dom';
8
8
 
9
9
  import { enableAuth } from '@/envs/auth';
10
- import { useQueryState } from '@/hooks/useQueryParam';
11
10
  import { useShowMobileWorkspace } from '@/hooks/useShowMobileWorkspace';
12
11
  import { type SettingsTabs } from '@/store/global/initialState';
13
12
  import { useSessionStore } from '@/store/session';
@@ -17,26 +16,16 @@ const Header = memo(() => {
17
16
  const { t } = useTranslation('setting');
18
17
  const showMobileWorkspace = useShowMobileWorkspace();
19
18
  const navigate = useNavigate();
20
- const [activeSettingsKey, setActiveSettingsKey] = useQueryState('active');
21
- const [providerName, setProviderName] = useQueryState('provider');
19
+ const params = useParams<{ providerId?: string, tab?: string; }>();
22
20
 
23
21
  const isSessionActive = useSessionStore((s) => !!s.activeId);
24
- const isProvider = providerName ? true : false;
22
+ const isProvider = params.providerId && params.providerId !== 'all';
25
23
 
26
24
  const handleBackClick = () => {
27
- console.log(
28
- 'gobackclick',
29
- isSessionActive,
30
- showMobileWorkspace,
31
- activeSettingsKey,
32
- providerName,
33
- );
34
25
  if (isSessionActive && showMobileWorkspace) {
35
26
  navigate('/agent');
36
- } else if (activeSettingsKey === 'provider' && providerName) {
37
- setProviderName(null);
38
- setActiveSettingsKey('provider');
39
- navigate(-1);
27
+ } else if (isProvider) {
28
+ navigate('/settings/provider/all');
40
29
  } else {
41
30
  navigate(enableAuth ? '/me/settings' : '/me');
42
31
  }
@@ -49,7 +38,9 @@ const Header = memo(() => {
49
38
  title={
50
39
  <Flexbox align={'center'} gap={8} horizontal>
51
40
  <span style={{ lineHeight: 1.2 }}>
52
- {isProvider ? providerName : t(`tab.${activeSettingsKey as SettingsTabs}` as any)}
41
+ {isProvider
42
+ ? params.providerId
43
+ : t(`tab.${(params.tab || 'all') as SettingsTabs}` as any)}
53
44
  </span>
54
45
  </Flexbox>
55
46
  }
@@ -3,7 +3,10 @@
3
3
  import { memo } from 'react';
4
4
  import { Outlet } from 'react-router-dom';
5
5
 
6
+ import MobileContentLayout from '@/components/server/MobileNavLayout';
7
+
6
8
  import SettingsContextProvider from '../../../(main)/settings/_layout/ContextProvider';
9
+ import Header from './Header';
7
10
 
8
11
  const MobileSettingsWrapper = memo(() => {
9
12
  return (
@@ -13,7 +16,9 @@ const MobileSettingsWrapper = memo(() => {
13
16
  showOpenAIProxyUrl: true,
14
17
  }}
15
18
  >
16
- <Outlet />
19
+ <MobileContentLayout header={<Header />}>
20
+ <Outlet />
21
+ </MobileContentLayout>
17
22
  </SettingsContextProvider>
18
23
  );
19
24
  });
@@ -0,0 +1,22 @@
1
+ 'use client';
2
+
3
+ import { Outlet, useNavigate, useParams } from 'react-router-dom';
4
+
5
+ import ProviderMenu from '../../../../(main)/settings/provider/ProviderMenu';
6
+
7
+ const Layout = () => {
8
+ const params = useParams<{ providerId: string }>();
9
+ const navigate = useNavigate();
10
+
11
+ const handleProviderSelect = (providerKey: string) => {
12
+ navigate(`/settings/provider/${providerKey}`);
13
+ };
14
+
15
+ return params.providerId === 'all' ? (
16
+ <ProviderMenu mobile={true} onProviderSelect={handleProviderSelect} />
17
+ ) : (
18
+ <Outlet />
19
+ );
20
+ };
21
+
22
+ export default Layout;
@@ -36,7 +36,11 @@ export default {
36
36
  'agentCronJobs.noExecutionResults': 'No execution results',
37
37
  'agentCronJobs.remainingExecutions': 'Remaining: {{count}}',
38
38
  'agentCronJobs.save': 'Save',
39
+ 'agentCronJobs.saveAsNew': 'Save as New',
39
40
  'agentCronJobs.schedule': 'Schedule',
41
+ 'agentCronJobs.scheduleType.daily': 'Daily',
42
+ 'agentCronJobs.scheduleType.hourly': 'Hourly',
43
+ 'agentCronJobs.scheduleType.weekly': 'Weekly',
40
44
  'agentCronJobs.status.depleted': 'Depleted',
41
45
  'agentCronJobs.status.disabled': 'Disabled',
42
46
  'agentCronJobs.status.enabled': 'Enabled',
@@ -45,6 +49,20 @@ export default {
45
49
  'agentCronJobs.unlimited': 'Unlimited',
46
50
  'agentCronJobs.unnamedTask': 'Unnamed Task',
47
51
  'agentCronJobs.updateSuccess': 'Scheduled task updated successfully',
52
+ 'agentCronJobs.weekday.friday': 'Friday',
53
+ 'agentCronJobs.weekday.monday': 'Monday',
54
+ 'agentCronJobs.weekday.saturday': 'Saturday',
55
+ 'agentCronJobs.weekday.short.friday': 'Fri',
56
+ 'agentCronJobs.weekday.short.monday': 'Mon',
57
+ 'agentCronJobs.weekday.short.saturday': 'Sat',
58
+ 'agentCronJobs.weekday.short.sunday': 'Sun',
59
+ 'agentCronJobs.weekday.short.thursday': 'Thu',
60
+ 'agentCronJobs.weekday.short.tuesday': 'Tue',
61
+ 'agentCronJobs.weekday.short.wednesday': 'Wed',
62
+ 'agentCronJobs.weekday.sunday': 'Sunday',
63
+ 'agentCronJobs.weekday.thursday': 'Thursday',
64
+ 'agentCronJobs.weekday.tuesday': 'Tuesday',
65
+ 'agentCronJobs.weekday.wednesday': 'Wednesday',
48
66
  'agentCronJobs.weekdays': 'Weekdays',
49
67
  'agentInfoDescription.basic.avatar': 'Avatar',
50
68
  'agentInfoDescription.basic.description': 'Description',
@@ -622,6 +640,7 @@ export default {
622
640
  'systemAgent.translation.title': 'Message Translation Agent',
623
641
  'tab.about': 'About',
624
642
  'tab.agent': 'Agent Service',
643
+ 'tab.all': 'All',
625
644
  'tab.apikey': 'API Key Management',
626
645
  'tab.chatAppearance': 'Chat Appearance',
627
646
  'tab.common': 'Appearance',