@nextclaw/ui 0.13.12 → 0.13.13

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.
Files changed (147) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/assets/{api-DmxQnm30.js → api-D0hARyyl.js} +1 -1
  3. package/dist/assets/app-presenter-provider-C7EsUuEJ.js +3 -0
  4. package/dist/assets/arrow-left-CzSkR5L6.js +1 -0
  5. package/dist/assets/book-open-DmeQPqkd.js +1 -0
  6. package/dist/assets/{channels-list-page-D-WYFmcG.js → channels-list-page-B0yiiH01.js} +2 -2
  7. package/dist/assets/chat-page-ChPjx_X9.js +105 -0
  8. package/dist/assets/{config-split-page-CdJEkWxv.js → config-split-page-BzfZSyAr.js} +1 -1
  9. package/dist/assets/{confirm-dialog-BWRNsRgb.js → confirm-dialog-CTcaBp-8.js} +1 -1
  10. package/dist/assets/desktop-update-config-CExpdkqD.js +1 -0
  11. package/dist/assets/{dist-CyWdaJvr.js → dist-C59BKqbX.js} +1 -1
  12. package/dist/assets/{dist-DzM2ZEVN.js → dist-Di6EHp2x.js} +1 -1
  13. package/dist/assets/{doc-browser-DewXa6oX.js → doc-browser-EZbnEcdk.js} +1 -1
  14. package/dist/assets/doc-browser-XIwe1Tg-.js +1 -0
  15. package/dist/assets/{doc-browser-context-CpL2m4Sp.js → doc-browser-context-BzEA1lm1.js} +1 -1
  16. package/dist/assets/{ellipsis-BDgTYNDX.js → ellipsis-hXUNwi63.js} +1 -1
  17. package/dist/assets/{es2015-WqekV0OK.js → es2015-CJlVSTh-.js} +1 -1
  18. package/dist/assets/{external-link-BLjo8z2a.js → external-link-J0fCK-vu.js} +1 -1
  19. package/dist/assets/host-capabilities-DjiRQ0Q9.js +1 -0
  20. package/dist/assets/index-DfZTO6Pi.js +101 -0
  21. package/dist/assets/index-mIb_YMrc.css +1 -0
  22. package/dist/assets/{key-round-Du8x3sWa.js → key-round-BzYZ0Nno.js} +1 -1
  23. package/dist/assets/loader-circle-BbdIlBbQ.js +1 -0
  24. package/dist/assets/mcp-marketplace-page-L22aCzHX.js +40 -0
  25. package/dist/assets/mcp-marketplace-page-f80Jmv37.js +1 -0
  26. package/dist/assets/model-config-DkD7vSQT.js +1 -0
  27. package/dist/assets/{notice-card-3a7FmAz-.js → notice-card-CD9Ok62G.js} +1 -1
  28. package/dist/assets/play-DHuSeKs8.js +1 -0
  29. package/dist/assets/plus-DrV685KC.js +1 -0
  30. package/dist/assets/{popover-BlJLguiZ.js → popover-CoBu3mbV.js} +1 -1
  31. package/dist/assets/{provider-scoped-model-input-IMD4W0jD.js → provider-scoped-model-input-DZlmTCJU.js} +1 -1
  32. package/dist/assets/providers-list-CVkWiqIy.js +1 -0
  33. package/dist/assets/{react-BVjl1ZaK.js → react-C7HsxuKH.js} +1 -1
  34. package/dist/assets/{refresh-cw-DFR87zei.js → refresh-cw-CVo4nWpq.js} +1 -1
  35. package/dist/assets/remote-Bznw9iji.js +1 -0
  36. package/dist/assets/rotate-cw-CXDpRO6D.js +1 -0
  37. package/dist/assets/{runtime-config-page-DzbTVebD.js → runtime-config-page-5IycbIxs.js} +1 -1
  38. package/dist/assets/{save-BDmIlHvN.js → save-Z1QTovIt.js} +1 -1
  39. package/dist/assets/search-8nY6PGm0.js +1 -0
  40. package/dist/assets/{search-config-CJ6OPxAf.js → search-config-DEH80WkC.js} +1 -1
  41. package/dist/assets/{secrets-config-CYOHWL7P.js → secrets-config-Gzo5nDJG.js} +1 -1
  42. package/dist/assets/{status-dot-SVPjIyG5.js → status-dot-C1-FKgvv.js} +1 -1
  43. package/dist/assets/{tabs-Czd2mj6z.js → tabs-BqkKwx1R.js} +1 -1
  44. package/dist/assets/{tabs-custom-Ix4nkp2h.js → tabs-custom-DOkaJZmt.js} +1 -1
  45. package/dist/assets/{tag-chip-Cdwb3JSH.js → tag-chip-3kpiMTST.js} +1 -1
  46. package/dist/assets/{tooltip-CKGxLGnG.js → tooltip-Bw-mXQAM.js} +1 -1
  47. package/dist/assets/{trash-2-yLA8BEcE.js → trash-2-CmIwAJIT.js} +1 -1
  48. package/dist/assets/x-CSRTOZnM.js +1 -0
  49. package/dist/index.html +27 -25
  50. package/package.json +8 -8
  51. package/src/features/account/components/account-panel.tsx +2 -2
  52. package/src/features/account/managers/account.manager.ts +6 -5
  53. package/src/features/chat/components/chat-session-workspace-panel-nav.tsx +45 -13
  54. package/src/features/chat/components/chat-session-workspace-panel.tsx +17 -8
  55. package/src/features/chat/components/conversation/chat-conversation-panel.test.tsx +69 -0
  56. package/src/features/chat/components/conversation/chat-conversation-panel.tsx +3 -0
  57. package/src/features/chat/components/providers/chat-presenter.provider.tsx +2 -0
  58. package/src/features/chat/managers/chat-session-list.manager.test.ts +4 -0
  59. package/src/features/chat/managers/chat-session-list.manager.ts +2 -0
  60. package/src/features/chat/managers/ncp-chat-thread.manager.test.ts +153 -25
  61. package/src/features/chat/managers/ncp-chat-thread.manager.ts +153 -7
  62. package/src/features/chat/stores/chat-thread.store.test.ts +148 -0
  63. package/src/features/chat/stores/chat-thread.store.ts +287 -9
  64. package/src/features/marketplace/components/marketplace-catalog-grid.tsx +19 -1
  65. package/src/features/marketplace/components/marketplace-external-skill-source-action.tsx +14 -0
  66. package/src/features/marketplace/components/marketplace-page-parts.tsx +10 -2
  67. package/src/features/marketplace/components/marketplace-page.test.tsx +37 -1
  68. package/src/features/marketplace/components/marketplace-page.tsx +38 -16
  69. package/src/features/marketplace/components/mcp/mcp-marketplace-page.tsx +1 -0
  70. package/src/features/marketplace/hooks/use-marketplace.test.tsx +109 -0
  71. package/src/features/marketplace/hooks/use-marketplace.ts +3 -5
  72. package/src/features/side-dock/components/side-dock.test.tsx +25 -0
  73. package/src/features/side-dock/components/side-dock.tsx +13 -0
  74. package/src/features/system-status/components/desktop-update-config.tsx +2 -1
  75. package/src/platforms/desktop/types/desktop-update.types.ts +9 -0
  76. package/src/shared/components/config/provider-form.tsx +2 -2
  77. package/src/shared/components/doc-browser/managers/doc-browser.manager.ts +39 -32
  78. package/src/shared/components/ui/action-link.tsx +23 -1
  79. package/src/shared/lib/host-capabilities/host-capability.manager.test.ts +50 -0
  80. package/src/shared/lib/host-capabilities/host-capability.manager.ts +62 -0
  81. package/src/shared/lib/host-capabilities/index.ts +1 -0
  82. package/src/shared/lib/i18n/README.md +16 -3
  83. package/src/shared/lib/i18n/index.ts +93 -426
  84. package/src/shared/lib/i18n/locales/en-US/agents.json +49 -0
  85. package/src/shared/lib/i18n/locales/en-US/channel-auth.json +51 -0
  86. package/src/shared/lib/i18n/locales/en-US/channels.json +50 -0
  87. package/src/shared/lib/i18n/locales/en-US/chat.json +181 -0
  88. package/src/shared/lib/i18n/locales/en-US/core.json +310 -0
  89. package/src/shared/lib/i18n/locales/en-US/cron.json +32 -0
  90. package/src/shared/lib/i18n/locales/en-US/desktop-update.json +90 -0
  91. package/src/shared/lib/i18n/locales/en-US/doc-browser.json +87 -0
  92. package/src/shared/lib/i18n/locales/en-US/marketplace.json +72 -0
  93. package/src/shared/lib/i18n/locales/en-US/path-picker.json +12 -0
  94. package/src/shared/lib/i18n/locales/en-US/pwa.json +26 -0
  95. package/src/shared/lib/i18n/locales/en-US/remote.json +168 -0
  96. package/src/shared/lib/i18n/locales/en-US/runtime-control.json +105 -0
  97. package/src/shared/lib/i18n/locales/en-US/search.json +28 -0
  98. package/src/shared/lib/i18n/locales/zh-CN/agents.json +49 -0
  99. package/src/shared/lib/i18n/locales/zh-CN/channel-auth.json +51 -0
  100. package/src/shared/lib/i18n/locales/zh-CN/channels.json +50 -0
  101. package/src/shared/lib/i18n/locales/zh-CN/chat.json +181 -0
  102. package/src/shared/lib/i18n/locales/zh-CN/core.json +310 -0
  103. package/src/shared/lib/i18n/locales/zh-CN/cron.json +32 -0
  104. package/src/shared/lib/i18n/locales/zh-CN/desktop-update.json +90 -0
  105. package/src/shared/lib/i18n/locales/zh-CN/doc-browser.json +87 -0
  106. package/src/shared/lib/i18n/locales/zh-CN/marketplace.json +72 -0
  107. package/src/shared/lib/i18n/locales/zh-CN/path-picker.json +12 -0
  108. package/src/shared/lib/i18n/locales/zh-CN/pwa.json +26 -0
  109. package/src/shared/lib/i18n/locales/zh-CN/remote.json +168 -0
  110. package/src/shared/lib/i18n/locales/zh-CN/runtime-control.json +105 -0
  111. package/src/shared/lib/i18n/locales/zh-CN/search.json +28 -0
  112. package/src/shared/lib/navigation-history/index.ts +1 -0
  113. package/src/shared/lib/navigation-history/navigation-history.utils.test.ts +60 -0
  114. package/src/shared/lib/navigation-history/navigation-history.utils.ts +105 -0
  115. package/dist/assets/app-presenter-provider-CDSjiqfE.js +0 -3
  116. package/dist/assets/arrow-left-Dd45Mvr1.js +0 -1
  117. package/dist/assets/chat-page-D1X8YNTC.js +0 -105
  118. package/dist/assets/desktop-update-config-DOi5R1fX.js +0 -1
  119. package/dist/assets/doc-browser-D5FJcAyz.js +0 -1
  120. package/dist/assets/index-Q891JiF_.css +0 -1
  121. package/dist/assets/index-ZDJP_uJc.js +0 -101
  122. package/dist/assets/loader-circle-Dz4FssYC.js +0 -1
  123. package/dist/assets/mcp-marketplace-page-LmMhKH5a.js +0 -1
  124. package/dist/assets/mcp-marketplace-page-RqISBSqO.js +0 -40
  125. package/dist/assets/model-config-JUsW1Khb.js +0 -1
  126. package/dist/assets/play-BziM-Y34.js +0 -1
  127. package/dist/assets/plus-DrpyArC8.js +0 -1
  128. package/dist/assets/providers-list-BsDpxNzy.js +0 -1
  129. package/dist/assets/remote-DjhVMpVd.js +0 -1
  130. package/dist/assets/rotate-cw-DMBnsYKm.js +0 -1
  131. package/dist/assets/search-CjHGYvTI.js +0 -1
  132. package/dist/assets/x-dpDISboO.js +0 -1
  133. package/src/shared/lib/i18n/agents.ts +0 -85
  134. package/src/shared/lib/i18n/channel-auth.constants.ts +0 -87
  135. package/src/shared/lib/i18n/channels.ts +0 -53
  136. package/src/shared/lib/i18n/chat-labels.utils.ts +0 -206
  137. package/src/shared/lib/i18n/cron-labels.utils.ts +0 -32
  138. package/src/shared/lib/i18n/desktop-update-labels.utils.ts +0 -165
  139. package/src/shared/lib/i18n/marketplace-labels.utils.ts +0 -78
  140. package/src/shared/lib/i18n/pwa.ts +0 -62
  141. package/src/shared/lib/i18n/remote.ts +0 -273
  142. package/src/shared/lib/i18n/runtime/doc-browser-labels.utils.ts +0 -120
  143. package/src/shared/lib/i18n/runtime/i18n.path-picker.ts +0 -12
  144. package/src/shared/lib/i18n/runtime-control-labels.utils.ts +0 -180
  145. package/src/shared/lib/i18n/search.ts +0 -37
  146. /package/dist/assets/{config-hints-Ceiol9x4.js → config-hints-fGnUjDe9.js} +0 -0
  147. /package/dist/assets/{provider-models-C_yOh6DE.js → provider-models-C9VRroK3.js} +0 -0
@@ -1,19 +1,97 @@
1
- import { AGENT_LABELS } from './agents';
2
- import { CHANNEL_LABELS } from './channels';
3
- import { CHANNEL_AUTH_LABELS } from './channel-auth.constants';
4
- import { CHAT_LABELS } from './chat-labels.utils';
5
- import { CRON_LABELS } from './cron-labels.utils';
6
- import { getLanguage, getLocale, initializeI18n, LANGUAGE_OPTIONS, resolveInitialLanguage, setLanguage, subscribeLanguageChange, type I18nLanguage } from './runtime/i18n-language-owner';
7
- import { DESKTOP_UPDATE_LABELS } from './desktop-update-labels.utils';
8
- import { DOC_BROWSER_LABELS } from './runtime/doc-browser-labels.utils';
9
- import { MARKETPLACE_LABELS } from './marketplace-labels.utils';
10
- import { PATH_PICKER_LABELS } from './runtime/i18n.path-picker';
11
- import { PWA_LABELS } from './pwa';
12
- import { REMOTE_LABELS } from './remote';
13
- import { RUNTIME_CONTROL_LABELS } from './runtime-control-labels.utils';
14
- import { SEARCH_LABELS } from './search';
1
+ import zhAgents from './locales/zh-CN/agents.json';
2
+ import zhChannelAuth from './locales/zh-CN/channel-auth.json';
3
+ import zhChannels from './locales/zh-CN/channels.json';
4
+ import zhChat from './locales/zh-CN/chat.json';
5
+ import zhCore from './locales/zh-CN/core.json';
6
+ import zhCron from './locales/zh-CN/cron.json';
7
+ import zhDesktopUpdate from './locales/zh-CN/desktop-update.json';
8
+ import zhDocBrowser from './locales/zh-CN/doc-browser.json';
9
+ import zhMarketplace from './locales/zh-CN/marketplace.json';
10
+ import zhPathPicker from './locales/zh-CN/path-picker.json';
11
+ import zhPwa from './locales/zh-CN/pwa.json';
12
+ import zhRemote from './locales/zh-CN/remote.json';
13
+ import zhRuntimeControl from './locales/zh-CN/runtime-control.json';
14
+ import zhSearch from './locales/zh-CN/search.json';
15
+ import enAgents from './locales/en-US/agents.json';
16
+ import enChannelAuth from './locales/en-US/channel-auth.json';
17
+ import enChannels from './locales/en-US/channels.json';
18
+ import enChat from './locales/en-US/chat.json';
19
+ import enCore from './locales/en-US/core.json';
20
+ import enCron from './locales/en-US/cron.json';
21
+ import enDesktopUpdate from './locales/en-US/desktop-update.json';
22
+ import enDocBrowser from './locales/en-US/doc-browser.json';
23
+ import enMarketplace from './locales/en-US/marketplace.json';
24
+ import enPathPicker from './locales/en-US/path-picker.json';
25
+ import enPwa from './locales/en-US/pwa.json';
26
+ import enRemote from './locales/en-US/remote.json';
27
+ import enRuntimeControl from './locales/en-US/runtime-control.json';
28
+ import enSearch from './locales/en-US/search.json';
29
+ import {
30
+ getLanguage,
31
+ getLocale,
32
+ initializeI18n,
33
+ LANGUAGE_OPTIONS,
34
+ resolveInitialLanguage,
35
+ setLanguage,
36
+ subscribeLanguageChange,
37
+ type I18nLanguage
38
+ } from './runtime/i18n-language-owner';
39
+
15
40
  export type { I18nLanguage };
16
41
  export { getLanguage, getLocale, initializeI18n, LANGUAGE_OPTIONS, resolveInitialLanguage, setLanguage, subscribeLanguageChange };
42
+
43
+ type MessageCatalog = Record<string, string>;
44
+ type LegacyLabelCatalog = Record<string, Record<I18nLanguage, string>>;
45
+
46
+ const zhCatalog: MessageCatalog = {
47
+ ...zhCore,
48
+ ...zhDesktopUpdate,
49
+ ...zhSearch,
50
+ ...zhChannels,
51
+ ...zhCron,
52
+ ...zhRemote,
53
+ ...zhRuntimeControl,
54
+ ...zhChat,
55
+ ...zhAgents,
56
+ ...zhMarketplace,
57
+ ...zhDocBrowser,
58
+ ...zhPathPicker,
59
+ ...zhPwa,
60
+ ...zhChannelAuth
61
+ };
62
+
63
+ const enCatalog: MessageCatalog = {
64
+ ...enCore,
65
+ ...enDesktopUpdate,
66
+ ...enSearch,
67
+ ...enChannels,
68
+ ...enCron,
69
+ ...enRemote,
70
+ ...enRuntimeControl,
71
+ ...enChat,
72
+ ...enAgents,
73
+ ...enMarketplace,
74
+ ...enDocBrowser,
75
+ ...enPathPicker,
76
+ ...enPwa,
77
+ ...enChannelAuth
78
+ };
79
+
80
+ const CATALOGS: Record<I18nLanguage, MessageCatalog> = {
81
+ zh: zhCatalog,
82
+ en: enCatalog
83
+ };
84
+
85
+ export const LABELS: LegacyLabelCatalog = Object.fromEntries(
86
+ Object.keys(enCatalog).map((key) => [
87
+ key,
88
+ {
89
+ zh: zhCatalog[key] ?? enCatalog[key] ?? key,
90
+ en: enCatalog[key] ?? key
91
+ }
92
+ ])
93
+ );
94
+
17
95
  export function formatDateTime(value?: string | Date, lang: I18nLanguage = getLanguage()): string {
18
96
  if (!value) {
19
97
  return '-';
@@ -47,417 +125,6 @@ export function formatNumber(value: number, lang: I18nLanguage = getLanguage()):
47
125
  return new Intl.NumberFormat(getLocale(lang)).format(value);
48
126
  }
49
127
 
50
- export const LABELS: Record<string, { zh: string; en: string }> = {
51
- // Navigation
52
- chat: { zh: '对话', en: 'Chat' },
53
- model: { zh: '模型', en: 'Model' },
54
- searchChannels: { zh: '搜索渠道', en: 'Search Channels' },
55
- providers: { zh: '提供商', en: 'Providers' },
56
- channels: { zh: '渠道', en: 'Channels' },
57
- cron: { zh: '定时任务', en: 'Cron Jobs' },
58
- secrets: { zh: '密钥管理', en: 'Secrets' },
59
- runtime: { zh: '路由与运行时', en: 'Routing & Runtime' },
60
- remote: { zh: '远程访问', en: 'Remote Access' },
61
- marketplace: { zh: '市场', en: 'Marketplace' },
62
- advanced: { zh: '高级', en: 'Advanced' },
63
- settings: { zh: '设置', en: 'Settings' },
64
- security: { zh: '安全', en: 'Security' },
65
- backToMain: { zh: '返回主界面', en: 'Back to Main' },
66
-
67
- // Common
68
- enabled: { zh: '启用', en: 'Enabled' },
69
- disabled: { zh: '禁用', en: 'Disabled' },
70
- save: { zh: '保存', en: 'Save' },
71
- cancel: { zh: '取消', en: 'Cancel' },
72
- delete: { zh: '删除', en: 'Delete' },
73
- add: { zh: '添加', en: 'Add' },
74
- edit: { zh: '编辑', en: 'Edit' },
75
- loading: { zh: '加载中...', en: 'Loading...' },
76
- success: { zh: '成功', en: 'Success' },
77
- error: { zh: '错误', en: 'Error' },
78
- confirm: { zh: '确认', en: 'Confirm' },
79
- unchanged: { zh: '未修改', en: 'Unchanged' },
80
- saving: { zh: '保存中...', en: 'Saving...' },
81
- remove: { zh: '移除', en: 'Remove' },
82
- more: { zh: '更多', en: 'More' },
83
- all: { zh: '全部', en: 'All' },
84
- yes: { zh: '是', en: 'Yes' },
85
- no: { zh: '否', en: 'No' },
86
- prev: { zh: '上一页', en: 'Prev' },
87
- next: { zh: '下一页', en: 'Next' },
88
- noneOption: { zh: '无', en: 'None' },
89
- language: { zh: '语言', en: 'Language' },
90
- theme: { zh: '主题', en: 'Theme' },
91
- themeWarm: { zh: '暖色', en: 'Warm' },
92
- themeCool: { zh: '冷色', en: 'Cool' },
93
- isRequired: { zh: '必填', en: 'is required' },
94
- duplicate: { zh: '重复', en: 'duplicate' },
95
- notFound: { zh: '未找到', en: 'not found' },
96
-
97
- // Model
98
- modelPageTitle: { zh: '模型配置', en: 'Model Configuration' },
99
- modelPageDescription: { zh: '配置默认 AI 模型选择', en: 'Configure default AI model selection' },
100
- defaultModel: { zh: '默认模型', en: 'Default Model' },
101
- workspace: { zh: '工作空间', en: 'Workspace' },
102
- modelName: { zh: '模型', en: 'Model' },
103
- modelPickerNoOptions: { zh: '暂无可选模型', en: 'No model options available' },
104
- modelPickerUseCustom: { zh: '使用自定义模型:{value}', en: 'Use custom model: {value}' },
105
- modelInputCustomHint: {
106
- zh: '如果列表里没有目标模型,可直接输入自定义模型 ID。',
107
- en: 'If the model is not listed, type a custom model ID directly.'
108
- },
109
- modelIdentifierHelp: {
110
- zh: '智能体默认模型标识,使用带提供商前缀的格式。例如:openai/gpt-5.1、anthropic/claude-opus-4-1、deepseek/deepseek-chat、minimax/MiniMax-M2.5、openrouter/openai/gpt-5.3-codex。',
111
- en: 'Default model identifier used by the agent. Use provider-prefixed format. Examples: openai/gpt-5.1 · anthropic/claude-opus-4-1 · deepseek/deepseek-chat · minimax/MiniMax-M2.5 · openrouter/openai/gpt-5.3-codex.'
112
- },
113
- maxToolIterations: { zh: '最大工具迭代次数', en: 'Max Tool Iterations' },
114
- saveChanges: { zh: '保存变更', en: 'Save Changes' },
115
-
116
- providersPageTitle: { zh: 'AI 提供商', en: 'AI Providers' },
117
- providersPageDescription: { zh: '在一个页面内完成提供商切换、配置与保存。', en: 'Switch, configure, and save providers in one continuous workspace.' },
118
- providersLoading: { zh: '加载中...', en: 'Loading...' },
119
- providersTabConfigured: { zh: '已配置', en: 'Configured' },
120
- providersTabAll: { zh: '全部提供商', en: 'All Providers' },
121
- providersFilterPlaceholder: { zh: '搜索提供商', en: 'Search providers' },
122
- providersNoMatch: { zh: '没有匹配的提供商', en: 'No matching providers' },
123
- providerAdd: { zh: '新增提供商', en: 'Add Provider' },
124
- providerAddCustom: { zh: '新增自定义提供商', en: 'Add Custom Provider' },
125
- providerTemplatePickerTitle: { zh: '选择提供商模板', en: 'Choose a provider template' },
126
- providerDelete: { zh: '删除该提供商', en: 'Delete Provider' },
127
- providerDeleteConfirm: { zh: '确认删除这个提供商吗?删除后不可恢复。', en: 'Delete this provider? This action cannot be undone.' },
128
- providersSelectPlaceholder: { zh: '选择提供商', en: 'Select Provider' },
129
- providersSelectTitle: { zh: '选择左侧提供商开始配置', en: 'Select a provider from the left to configure' },
130
- providersSelectDescription: { zh: '你可以连续切换多个提供商并逐个保存配置。', en: 'Switch between providers continuously and save each configuration.' },
131
- providersDefaultDescription: { zh: '为你的智能体配置 AI 服务', en: 'Configure AI services for your agents' },
132
- providersEmptyTitle: { zh: '尚未配置提供商', en: 'No providers configured' },
133
- providersEmptyDescription: { zh: '添加一个 AI 提供商后即可开始使用。', en: 'Add an AI provider to start using the platform.' },
134
- apiKey: { zh: 'API 密钥', en: 'API Key' },
135
- apiBase: { zh: 'API Base URL', en: 'API Base URL' },
136
- extraHeaders: { zh: '额外请求头', en: 'Extra Headers' },
137
- wireApi: { zh: '请求接口', en: 'Wire API' },
138
- wireApiAuto: { zh: '自动(优先 Chat,必要时 Responses)', en: 'Auto (Chat with fallback)' },
139
- wireApiChat: { zh: 'Chat Completions', en: 'Chat Completions' },
140
- wireApiResponses: { zh: 'Responses', en: 'Responses' },
141
- apiKeySet: { zh: '已设置', en: 'Set' },
142
- apiKeyNotSet: { zh: '未设置', en: 'Not Set' },
143
- showKey: { zh: '显示密钥', en: 'Show Key' },
144
- hideKey: { zh: '隐藏密钥', en: 'Hide Key' },
145
- providerFormDescription: { zh: '配置 AI 提供商的 API 密钥与参数', en: 'Configure API keys and parameters for AI provider' },
146
- providerDisplayName: { zh: '自定义名称', en: 'Custom Name' },
147
- providerDisplayNamePlaceholder: { zh: '例如:中转站 A', en: 'For example: Relay A' },
148
- providerDisplayNameHelp: {
149
- zh: '仅用于界面展示,便于区分多个自定义 Provider。',
150
- en: 'Display-only label to distinguish multiple custom providers.'
151
- },
152
- enterApiKey: { zh: '请输入 API 密钥', en: 'Enter API Key' },
153
- providerApiBaseHelp: { zh: '留空或恢复默认即可使用预置 API Base。', en: 'Leave empty or reset to use the default API base.' },
154
- providerApiBaseHelpMinimax: {
155
- zh: 'MiniMax 中国区请使用 https://api.minimaxi.com/v1;海外请使用 https://api.minimax.io/v1。',
156
- en: 'Use https://api.minimaxi.com/v1 for Mainland China accounts, and https://api.minimax.io/v1 for overseas accounts.'
157
- },
158
- providerOpenAICompatHint: {
159
- zh: '自定义提供商默认按 OpenAI 兼容 API 格式接入(Chat Completions / Responses)。',
160
- en: 'Custom providers use OpenAI-compatible API format by default (Chat Completions / Responses).'
161
- },
162
- providerExtraHeadersHelp: { zh: '用于自定义请求头(可选)。', en: 'Optional custom request headers.' },
163
- providerTestConnection: { zh: '测试连接', en: 'Test Connection' },
164
- providerTestingConnection: { zh: '测试中...', en: 'Testing...' },
165
- providerTestConnectionSuccess: { zh: '连接测试通过', en: 'Connection test passed' },
166
- providerTestConnectionFailed: { zh: '连接测试失败', en: 'Connection test failed' },
167
- providerModelsTitle: { zh: '可用模型列表', en: 'Available Models' },
168
- providerModelInputPlaceholder: {
169
- zh: '输入模型 ID(无需 provider 前缀,不在列表也可)',
170
- en: 'Enter model id (without provider prefix; custom values allowed)'
171
- },
172
- providerModelInputHint: {
173
- zh: '列表仅作参考,不在列表也可直接输入并添加。',
174
- en: 'The list is only a reference. You can type and add models that are not listed.'
175
- },
176
- providerAddModel: { zh: '添加模型', en: 'Add Model' },
177
- providerModelsEmpty: { zh: '当前没有模型,可直接输入并添加。', en: 'No models yet. Add one by typing model id.' },
178
- providerModelDefaultTag: { zh: '默认', en: 'Default' },
179
- providerModelCustomTag: { zh: '自定义', en: 'Custom' },
180
- providerModelsHelp: {
181
- zh: '系统会先填充预置模型;你可以在这里新增或删除。请填写当前提供商自己的模型 ID(不带当前 provider 前缀);若输入带当前 provider 前缀会自动去除,但会保留后续路径(如 openai/gpt-5)。',
182
- en: 'Built-in models are prefilled and can be added or removed here. Enter provider-local model ids without the current provider prefix; if prefixed input is entered, only the current provider prefix is removed while the remaining path is preserved (for example, openai/gpt-5).'
183
- },
184
- providerModelsEmptyShort: { zh: '暂无可用模型', en: 'No models available' },
185
- providerAddFirstModel: { zh: '添加第一个模型', en: 'Add first model' },
186
- providerModelVisionTitle: { zh: 'Vision', en: 'Vision' },
187
- providerModelVisionHint: { zh: '允许向该模型发送图片输入。', en: 'Allow image input for this model.' },
188
- providerModelThinkingTitle: { zh: '思考档位能力', en: 'Thinking Capability' },
189
- providerModelThinkingHint: {
190
- zh: '为该模型声明可切换的思考档位,聊天会话将按这里的能力展示下拉。',
191
- en: 'Declare supported thinking levels for this model. Chat sessions will show the selector accordingly.'
192
- },
193
- providerModelThinkingDefault: { zh: '默认思考档位', en: 'Default Thinking Level' },
194
- providerModelThinkingDefaultNone: { zh: '无默认(回落 off)', en: 'No default (fallback off)' },
195
- providerModelThinkingNoSupported: { zh: '请先至少选择一个支持档位。', en: 'Select at least one supported level first.' },
196
- providerModelInvalidProviderPrefix: {
197
- zh: '模型 ID 不能使用其他 provider 前缀。',
198
- en: 'Model id cannot use another provider prefix.'
199
- },
200
- providerDisplayNameHelpShort: { zh: '便于区分多个自定义提供商', en: 'Helps distinguish multiple custom providers' },
201
- providerApiBaseHelpShort: { zh: '一般只需填写域名,系统自动补全路径', en: 'Usually just the domain; path auto-appended' },
202
- providerExtraHeadersHelpShort: { zh: '可选,用于自定义鉴权等场景', en: 'Optional, for custom auth etc.' },
203
- providerAdvancedSettings: { zh: '高级设置', en: 'Advanced Settings' },
204
- providerAuthSectionTitle: { zh: '提供商授权', en: 'Provider Authorization' },
205
- providerAuthStarting: { zh: '启动中...', en: 'Starting...' },
206
- providerAuthAuthorizing: { zh: '授权中...', en: 'Authorizing...' },
207
- providerAuthAuthorizeInBrowser: { zh: '浏览器授权', en: 'Authorize in Browser' },
208
- providerAuthWaitingBrowser: { zh: '等待浏览器完成授权...', en: 'Waiting for browser authorization...' },
209
- providerAuthCompleted: { zh: '授权已完成。', en: 'Authorization completed.' },
210
- providerAuthOpenPrompt: { zh: '请在浏览器完成授权,验证码:', en: 'Open browser and complete authorization (code: ' },
211
- providerAuthOpenPromptSuffix: { zh: '', en: ')' },
212
- providerAuthStartFailed: { zh: '启动授权失败', en: 'Failed to start authorization' },
213
- providerAuthMethodLabel: { zh: '授权区域', en: 'Authorization Region' },
214
- providerAuthMethodPlaceholder: { zh: '请选择授权方式', en: 'Select authorization method' },
215
- providerAuthImportFromCli: { zh: '从 Qwen CLI 导入', en: 'Import From Qwen CLI' },
216
- providerAuthImporting: { zh: '导入中...', en: 'Importing...' },
217
- providerAuthImportSuccess: { zh: '已从 CLI 导入凭证。', en: 'Imported provider credentials from CLI.' },
218
- providerAuthImportStatusPrefix: { zh: 'CLI 导入成功。', en: 'Imported credentials from CLI successfully.' },
219
- providerAuthImportFailed: { zh: '导入凭证失败', en: 'Failed to import credentials' },
220
- providerAuthSessionLabel: { zh: '会话', en: 'Session' },
221
- resetToDefault: { zh: '恢复默认', en: 'Reset to Default' },
222
- leaveBlankToKeepUnchanged: { zh: '留空则保持不变', en: 'Leave blank to keep unchanged' },
223
- ...DESKTOP_UPDATE_LABELS,
224
- ...SEARCH_LABELS,
225
-
226
- // Channel
227
- ...CHANNEL_LABELS,
228
- consentGranted: { zh: '同意条款', en: 'Consent Granted' },
229
- imapHost: { zh: 'IMAP 服务器', en: 'IMAP Host' },
230
- imapPort: { zh: 'IMAP 端口', en: 'IMAP Port' },
231
- imapUsername: { zh: 'IMAP 用户名', en: 'IMAP Username' },
232
- imapPassword: { zh: 'IMAP 密码', en: 'IMAP Password' },
233
- imapMailbox: { zh: 'IMAP 邮箱', en: 'IMAP Mailbox' },
234
- imapUseSsl: { zh: 'IMAP 使用 SSL', en: 'IMAP Use SSL' },
235
- smtpHost: { zh: 'SMTP 服务器', en: 'SMTP Host' },
236
- smtpPort: { zh: 'SMTP 端口', en: 'SMTP Port' },
237
- smtpUsername: { zh: 'SMTP 用户名', en: 'SMTP Username' },
238
- smtpPassword: { zh: 'SMTP 密码', en: 'SMTP Password' },
239
- smtpUseTls: { zh: 'SMTP 使用 TLS', en: 'SMTP Use TLS' },
240
- smtpUseSsl: { zh: 'SMTP 使用 SSL', en: 'SMTP Use SSL' },
241
- fromAddress: { zh: '发件地址', en: 'From Address' },
242
- autoReplyEnabled: { zh: '自动回复已启用', en: 'Auto Reply Enabled' },
243
- pollIntervalSeconds: { zh: '轮询间隔(秒)', en: 'Poll Interval (s)' },
244
- markSeen: { zh: '标记为已读', en: 'Mark Seen' },
245
- maxBodyChars: { zh: '最大正文字符数', en: 'Max Body Chars' },
246
- subjectPrefix: { zh: '主题前缀', en: 'Subject Prefix' },
247
- baseUrl: { zh: 'Base URL', en: 'Base URL' },
248
- socketUrl: { zh: 'Socket URL', en: 'Socket URL' },
249
- socketPath: { zh: 'Socket 路径', en: 'Socket Path' },
250
- socketDisableMsgpack: { zh: '禁用 Msgpack', en: 'Disable Msgpack' },
251
- socketReconnectDelayMs: { zh: '重连延迟(ms)', en: 'Reconnect Delay (ms)' },
252
- socketMaxReconnectDelayMs: { zh: '最大重连延迟(ms)', en: 'Max Reconnect Delay (ms)' },
253
- socketConnectTimeoutMs: { zh: '连接超时(ms)', en: 'Connect Timeout (ms)' },
254
- refreshIntervalMs: { zh: '刷新间隔(ms)', en: 'Refresh Interval (ms)' },
255
- watchTimeoutMs: { zh: '监视超时(ms)', en: 'Watch Timeout (ms)' },
256
- watchLimit: { zh: '监视限制', en: 'Watch Limit' },
257
- retryDelayMs: { zh: '重试延迟(ms)', en: 'Retry Delay (ms)' },
258
- maxRetryAttempts: { zh: '最大重试次数', en: 'Max Retry Attempts' },
259
- clawToken: { zh: 'Claw Token', en: 'Claw Token' },
260
- agentUserId: { zh: '代理用户ID', en: 'Agent User ID' },
261
- sessions: { zh: '会话', en: 'Sessions' },
262
- panels: { zh: '面板', en: 'Panels' },
263
- mentionRequireInGroups: { zh: '群组中需要@', en: 'Require Mention in Groups' },
264
- groups: { zh: '群组', en: 'Groups' },
265
- replyDelayMode: { zh: '回复延迟模式', en: 'Reply Delay Mode' },
266
- replyDelayMs: { zh: '回复延迟(ms)', en: 'Reply Delay (ms)' },
267
- secret: { zh: '密钥', en: 'Secret' },
268
- accountId: { zh: '账号 ID', en: 'Account ID' },
269
- dmPolicy: { zh: '私聊策略', en: 'DM Policy' },
270
- groupAllowFrom: { zh: '群组允许来源', en: 'Group Allow From' },
271
- requireMention: { zh: '需要 @ 提及', en: 'Require Mention' },
272
- mentionPatterns: { zh: '提及匹配规则', en: 'Mention Patterns' },
273
- groupRulesJson: { zh: '群组规则(JSON)', en: 'Group Rules (JSON)' },
274
- allowBotMessages: { zh: '允许机器人消息', en: 'Allow Bot Messages' },
275
- attachmentMaxSizeMb: { zh: '附件最大体积(MB)', en: 'Attachment Max Size (MB)' },
276
- streamingMode: { zh: '流式模式', en: 'Streaming Mode' },
277
- draftChunkingJson: { zh: '草稿分块(JSON)', en: 'Draft Chunking (JSON)' },
278
- textChunkLimit: { zh: '文本分块上限', en: 'Text Chunk Limit' },
279
- invalidJson: { zh: 'JSON 格式无效', en: 'Invalid JSON' },
280
-
281
- // Auth
282
- authBrand: { zh: 'NextClaw UI', en: 'NextClaw UI' },
283
- authLoginTitle: { zh: '管理员登录', en: 'Admin Sign In' },
284
- authLoginDescription: {
285
- zh: '认证已开启。登录后才能查看这台机器的 NextClaw UI。',
286
- en: 'Authentication is enabled. Sign in to access this machine’s NextClaw UI.'
287
- },
288
- authUsername: { zh: '管理员用户名', en: 'Admin Username' },
289
- authUsernamePlaceholder: { zh: '输入管理员用户名', en: 'Enter admin username' },
290
- authPassword: { zh: '管理员密码', en: 'Admin Password' },
291
- authPasswordPlaceholder: { zh: '输入管理员密码', en: 'Enter admin password' },
292
- authConfirmPassword: { zh: '确认密码', en: 'Confirm Password' },
293
- authConfirmPasswordPlaceholder: { zh: '再次输入密码', en: 'Enter password again' },
294
- authLoginAction: { zh: '登录', en: 'Sign In' },
295
- authLoggingIn: { zh: '登录中...', en: 'Signing in...' },
296
- authLoggingOut: { zh: '退出中...', en: 'Signing out...' },
297
- authActionFailed: { zh: '认证操作失败', en: 'Authentication action failed' },
298
- authLoginSuccess: { zh: '登录成功', en: 'Signed in successfully' },
299
- authLogoutSuccess: { zh: '已退出登录', en: 'Signed out successfully' },
300
- authSetupSuccess: { zh: '认证已开启,当前标签页已自动登录,可直接继续使用', en: 'Authentication enabled. This tab is now signed in and ready to use.' },
301
- authPasswordUpdated: { zh: '管理员密码已更新', en: 'Admin password updated' },
302
- authEnabledSuccess: { zh: '认证已开启', en: 'Authentication enabled' },
303
- authDisabledSuccess: { zh: '认证已关闭', en: 'Authentication disabled' },
304
- authRetryStatus: { zh: '重试', en: 'Retry' },
305
- authStatusLoadFailed: { zh: '无法获取认证状态,请检查 UI 服务是否正常。', en: 'Failed to load authentication status. Check whether the UI server is healthy.' },
306
-
307
- ...RUNTIME_CONTROL_LABELS,
308
- authSecurityTitle: { zh: 'Security', en: 'Security' },
309
- authSecurityDescription: {
310
- zh: '保持本机控制台默认简单;只有在你需要远程暴露时,再给 UI 加一层登录门。',
311
- en: 'Keep the local console simple by default, and add a lightweight login gate only when you expose the UI remotely.'
312
- },
313
- authSetupTitle: { zh: '开启轻量认证', en: 'Enable Lightweight Authentication' },
314
- authSetupDescription: {
315
- zh: '首次开启时设置单个管理员账号。完成后当前标签页会自动登录。',
316
- en: 'Create the single admin account the first time you enable authentication. This tab will be signed in automatically.'
317
- },
318
- authSetupAction: { zh: '开启认证', en: 'Enable Authentication' },
319
- authSettingUp: { zh: '开启中...', en: 'Enabling...' },
320
- authPasswordMismatch: { zh: '两次输入的密码不一致', en: 'Passwords do not match' },
321
- authPasswordMinLengthHint: {
322
- zh: '密码至少 8 个字符。当前版本只支持单管理员账号。',
323
- en: 'Passwords must be at least 8 characters. This version supports a single admin account only.'
324
- },
325
- authStatusLabel: { zh: '当前状态', en: 'Current Status' },
326
- authStatusConfiguredUser: { zh: '管理员账号:{username}', en: 'Admin account: {username}' },
327
- authUsernameFixedHelp: {
328
- zh: '首版不提供修改用户名和多用户管理;如需重新定义账号,请后续扩展这套边界。',
329
- en: 'This first version does not support renaming the admin account or managing multiple users.'
330
- },
331
- authEnableLabel: { zh: '要求登录', en: 'Require Login' },
332
- authEnableOnHelp: {
333
- zh: '已开启后,除健康检查与认证接口外,其余 UI API 和 WebSocket 都需要登录。',
334
- en: 'When enabled, every UI API and WebSocket except health and auth endpoints requires login.'
335
- },
336
- authEnableOffHelp: {
337
- zh: '当前保持即开即用。重新打开后,这个标签页会自动拿到新的登录会话。',
338
- en: 'The UI is currently open for local-style use. Re-enabling will issue a fresh signed-in session to this tab.'
339
- },
340
- authPasswordSectionTitle: { zh: '修改管理员密码', en: 'Change Admin Password' },
341
- authPasswordSectionDescription: {
342
- zh: '更新密码后,旧会话会立即失效;当前标签页会自动续成新会话(仅在认证开启时)。',
343
- en: 'Updating the password invalidates old sessions immediately. This tab gets a fresh session automatically while auth is enabled.'
344
- },
345
- authPasswordAction: { zh: '更新密码', en: 'Update Password' },
346
- authPasswordUpdating: { zh: '更新中...', en: 'Updating...' },
347
- authLogoutAction: { zh: '退出当前标签页', en: 'Sign Out This Tab' },
348
- authSessionMemoryNotice: { zh: '当前版本的会话只保存在服务端内存里。NextClaw UI 进程重启后,需要重新登录。', en: 'Sessions are stored only in server memory for now. You will need to sign in again after the NextClaw UI process restarts.' },
349
- dmScope: { zh: '私聊范围', en: 'DM Scope' },
350
- dmScopeHelp: { zh: '控制私聊会话如何隔离。', en: 'Control how direct-message sessions are isolated.' },
351
- defaultContextTokens: { zh: '默认上下文额度', en: 'Default Context Tokens' },
352
- defaultContextTokensHelp: { zh: '当智能体未设置单独值时使用该上下文预算。', en: 'Input context budget for agents when no per-agent override is set.' },
353
- runtimeCompanionEnabled: { zh: '桌宠 Companion', en: 'Companion' },
354
- runtimeCompanionEnabledHelp: { zh: '开启后会自动拉起悬浮 Companion;关闭后会立即停止,并在下次启动时保持关闭。', en: 'When enabled, NextClaw auto-starts the floating companion. When disabled, it stops immediately and stays off after restart.' },
355
- defaultEngine: { zh: '默认运行时', en: 'Default Runtime' },
356
- defaultEngineHelp: { zh: '默认使用的智能体运行时,例如 native、codex 或 claude。', en: 'Default agent runtime, for example native, codex, or claude.' },
357
- agentList: { zh: '智能体列表', en: 'Agent List' },
358
- agentListHelp: { zh: '在同一个网关进程中运行多个固定角色智能体。', en: 'Run multiple fixed-role agents in one gateway process.' },
359
- bindings: { zh: '绑定规则', en: 'Bindings' },
360
- bindingsHelp: { zh: '根据渠道 + 账号 + 对端将入站消息路由到目标智能体。', en: 'Route inbound message by channel + account + peer to target agent.' },
361
- agentIdRequiredError: { zh: 'agents.list[{index}].id 必填', en: 'agents.list[{index}].id is required' },
362
- duplicateAgentId: { zh: '重复的智能体 ID', en: 'Duplicate agent id' },
363
- bindingAgentIdRequired: { zh: 'bindings[{index}].agentId 必填', en: 'bindings[{index}].agentId is required' },
364
- bindingAgentIdNotFound: { zh: 'bindings[{index}].agentId 未在 agents.list/main 中找到', en: "bindings[{index}].agentId not found in agents.list/main" },
365
- bindingChannelRequired: { zh: 'bindings[{index}].match.channel 必填', en: 'bindings[{index}].match.channel is required' },
366
- bindingPeerIdRequired: { zh: '设置 peer.kind 时,bindings[{index}].match.peer.id 必填', en: 'bindings[{index}].match.peer.id is required when peer.kind is set' },
367
- agentIdPlaceholder: { zh: '智能体 ID(例如 engineer)', en: 'Agent ID (e.g. engineer)' },
368
- workspaceOverridePlaceholder: { zh: '工作空间覆盖(可选)', en: 'Workspace override (optional)' },
369
- modelOverridePlaceholder: { zh: '模型覆盖(可选)', en: 'Model override (optional)' },
370
- defaultEnginePlaceholder: { zh: '默认运行时(如 native 或 codex)', en: 'Default runtime (e.g. native or codex)' },
371
- engineOverridePlaceholder: { zh: '运行时覆盖(可选)', en: 'Runtime override (optional)' },
372
- contextTokensPlaceholder: { zh: '上下文额度', en: 'Context tokens' },
373
- maxToolsPlaceholder: { zh: '最大工具次数', en: 'Max tools' },
374
- defaultAgent: { zh: '默认智能体', en: 'Default agent' },
375
- addAgent: { zh: '添加智能体', en: 'Add Agent' },
376
- targetAgentIdPlaceholder: { zh: '目标智能体 ID', en: 'Target agent ID' },
377
- channelPlaceholder: { zh: '渠道(例如 discord)', en: 'Channel (e.g. discord)' },
378
- accountIdOptionalPlaceholder: { zh: '账号 ID(可选)', en: 'Account ID (optional)' },
379
- peerKindOptional: { zh: '对端类型(可选)', en: 'Peer kind (optional)' },
380
- peerIdPlaceholder: { zh: '对端 ID(需先设置对端类型)', en: 'Peer ID (requires peer kind)' },
381
- addBinding: { zh: '添加绑定', en: 'Add Binding' },
382
- saveRuntimeSettings: { zh: '保存运行时设置', en: 'Save Runtime Settings' },
383
- // Secrets
384
- secretsPageTitle: { zh: '密钥管理', en: 'Secrets Management' },
385
- secretsPageDescription: {
386
- zh: '集中管理 secrets.providers、secrets.defaults 与 secrets.refs。',
387
- en: 'Manage secrets.providers, secrets.defaults, and secrets.refs in one place.'
388
- },
389
- secretsEnabledHelp: {
390
- zh: '关闭后不会解析 `{{secret:*}}` 引用。',
391
- en: 'When disabled, `{{secret:*}}` refs are not resolved.'
392
- },
393
- defaultEnvProvider: { zh: '默认 Env 提供器', en: 'Default Env Provider' },
394
- defaultFileProvider: { zh: '默认 File 提供器', en: 'Default File Provider' },
395
- defaultExecProvider: { zh: '默认 Exec 提供器', en: 'Default Exec Provider' },
396
- secretProvidersTitle: { zh: 'Secret Providers', en: 'Secret Providers' },
397
- secretProvidersDescription: {
398
- zh: '定义可复用的 secrets provider(env/file/exec)。',
399
- en: 'Define reusable secret providers (env/file/exec).'
400
- },
401
- providerAlias: { zh: '提供器别名', en: 'Provider Alias' },
402
- removeProvider: { zh: '移除提供器', en: 'Remove Provider' },
403
- envPrefix: { zh: '环境变量前缀', en: 'Environment Prefix' },
404
- secretFilePath: { zh: 'Secrets 文件路径', en: 'Secrets File Path' },
405
- secretExecCommand: { zh: '执行命令', en: 'Exec Command' },
406
- secretExecArgs: { zh: '命令参数(每行一个)', en: 'Exec Args (one per line)' },
407
- secretExecCwd: { zh: '执行目录(可选)', en: 'Exec Working Directory (optional)' },
408
- secretExecTimeoutMs: { zh: '超时(毫秒)', en: 'Timeout (ms)' },
409
- addSecretProvider: { zh: '添加 Provider', en: 'Add Provider' },
410
- secretRefsTitle: { zh: 'Secret Refs', en: 'Secret Refs' },
411
- secretRefsDescription: {
412
- zh: '把配置路径映射到 secret 引用(source/provider/id)。',
413
- en: 'Map config paths to secret refs (source/provider/id).'
414
- },
415
- secretConfigPath: { zh: '配置路径', en: 'Config Path' },
416
- secretId: { zh: 'Secret ID', en: 'Secret ID' },
417
- secretProviderAlias: { zh: 'Provider 别名', en: 'Provider Alias' },
418
- addSecretRef: { zh: '添加 Ref', en: 'Add Ref' },
419
-
420
- // Session labels shared by the main chat workspace.
421
- sessionsLoading: { zh: '加载会话中...', en: 'Loading sessions...' },
422
- sessionsEmpty: { zh: '暂无会话。', en: 'No sessions yet.' },
423
- sessionsLabelPlaceholder: { zh: '会话标签(可选)', en: 'Session label (optional)' },
424
- sessionsRunStatusRunning: { zh: '运行中', en: 'Running' },
425
- sessionsRunStatusQueued: { zh: '排队中', en: 'Queued' },
426
- // Chat
427
- ...AGENT_LABELS,
428
- ...CHAT_LABELS,
429
-
430
- // Cron
431
- ...CRON_LABELS,
432
-
433
- // Marketplace
434
- ...MARKETPLACE_LABELS,
435
-
436
- // Remote & Status
437
- ...REMOTE_LABELS,
438
- actionConfigure: { zh: '配置', en: 'Configure' },
439
- actionAddProvider: { zh: '添加提供商', en: 'Add Provider' },
440
- actionEnable: { zh: '启用', en: 'Enable' },
441
- configSaved: { zh: '配置已保存', en: 'Configuration saved' },
442
- configSavedApplying: { zh: '配置已保存,正在应用', en: 'Configuration saved, applying changes' },
443
- configSavedApplied: { zh: '配置已保存并已应用', en: 'Configuration saved and applied' },
444
- configSaveFailed: { zh: '保存配置失败', en: 'Failed to save configuration' },
445
- configReloaded: { zh: '配置已重载', en: 'Configuration reloaded' },
446
- configReloadFailed: { zh: '重载配置失败', en: 'Failed to reload configuration' },
447
- channelConfigApplying: { zh: '渠道配置正在应用', en: 'Channel configuration is applying' },
448
- channelConfigApplied: { zh: '渠道配置已应用', en: 'Channel configuration applied' },
449
- channelConfigApplyFailed: { zh: '渠道配置应用失败', en: 'Failed to apply channel configuration' },
450
- feishuVerifySuccess: { zh: '验证成功,请到飞书开放平台完成事件订阅与发布后再开始使用。', en: 'Verified. Please finish Feishu event subscription and app publishing before using.' },
451
- feishuVerifyFailed: { zh: '验证失败', en: 'Verification failed' },
452
- enterTag: { zh: '输入后按回车...', en: 'Type and press Enter...' },
453
- headerName: { zh: 'Header 名称', en: 'Header Name' },
454
- headerValue: { zh: 'Header 值', en: 'Header Value' },
455
- ...DOC_BROWSER_LABELS,
456
- ...PATH_PICKER_LABELS,
457
- ...PWA_LABELS,
458
- ...CHANNEL_AUTH_LABELS,
459
- };
460
-
461
128
  export function t(key: string, lang: I18nLanguage = getLanguage()): string {
462
- return LABELS[key]?.[lang] || LABELS[key]?.en || key;
129
+ return CATALOGS[lang]?.[key] ?? enCatalog[key] ?? key;
463
130
  }
@@ -0,0 +1,49 @@
1
+ {
2
+ "agentsPageTitle": "Agents",
3
+ "agentsPageDescription": "Manage conversational agent identities. Each agent owns its home directory, setup, memory, and skills.",
4
+ "agentsHeroEyebrow": "Agent Gallery",
5
+ "agentsHeroTitle": "Give every agent the presence of a real collaborator",
6
+ "agentsHeroDescription": "Browse, create, and choose distinct agent identities. Every agent carries its own avatar, name, home directory, memory, and skills space.",
7
+ "agentsCreateButton": "New Agent",
8
+ "agentsCreateDialogTitle": "Create a new agent identity",
9
+ "agentsCreateDialogDescription": "Keep the flow simple. Provide only the essentials and let shared defaults plus the home directory template do the rest.",
10
+ "agentsCreateDialogHint": "If you want AI to automate the full setup, you can still use `nextclaw agents new`.",
11
+ "agentsCreateTitle": "Create Agent",
12
+ "agentsCreateDescription": "This is the lightweight UI entry. The full automation path is also available through `nextclaw agents new`.",
13
+ "agentsFormIdPlaceholder": "Agent ID, for example engineer",
14
+ "agentsFormNamePlaceholder": "Display name, optional",
15
+ "agentsFormDescriptionPlaceholder": "Role description, optional",
16
+ "agentsFormAvatarPlaceholder": "Avatar URL or local path, optional",
17
+ "agentsFormHomePlaceholder": "Home Directory, optional",
18
+ "agentsFormRuntimePlaceholder": "Runtime (e.g. native or codex, optional)",
19
+ "agentsRuntimeSelectPlaceholder": "Select runtime",
20
+ "agentsRuntimeUnavailableHelp": "This runtime is no longer available in the current list. Switch to an installed and available runtime.",
21
+ "agentsCreateAction": "Create Agent",
22
+ "agentsEditAction": "Edit",
23
+ "agentsEditDialogTitle": "Edit agent identity",
24
+ "agentsEditDialogDescription": "Update the name, role description, and avatar. The agent ID and home directory stay stable to protect existing memory, skills, and sessions.",
25
+ "agentsEditHomeReadonly": "Home directory stays unchanged",
26
+ "agentsEditHomeReadonlyHint": "Use a dedicated config migration flow to move the home directory and avoid losing agent context unexpectedly.",
27
+ "agentsEditSaveAction": "Save edits",
28
+ "agentsRemoveAction": "Remove",
29
+ "agentsNewChat": "New Chat",
30
+ "agentsLoading": "Loading agents...",
31
+ "agentsEmpty": "No extra agents yet",
32
+ "agentsEmptyDescription": "Create the first specialist agent with its own name, avatar, and home directory.",
33
+ "agentsBuiltIn": "Built-in",
34
+ "agentsCustom": "Custom",
35
+ "agentsOverviewTotal": "Conversational agents",
36
+ "agentsOverviewBuiltIn": "System main agents",
37
+ "agentsOverviewCustom": "Specialist agents",
38
+ "agentsCardBuiltInSummary": "The built-in main agent, ideal as the default entry and coordinating collaborator.",
39
+ "agentsCardCustomSummary": "A dedicated identity with its own memory, skills, and role style.",
40
+ "agentsCardRuntimeLabel": "Runtime",
41
+ "agentsCardHomeLabel": "Home Directory",
42
+ "agentsCardAvatarLabel": "Avatar",
43
+ "agentsCardStartChat": "Start Chat",
44
+ "agentsCardBuiltInTag": "Main Agent",
45
+ "agentsCardCustomTag": "Specialist",
46
+ "chatDraftAgentTitle": "Draft agent",
47
+ "chatDraftAgentDescription": "Locked after creation",
48
+ "chatDraftAgentCurrent": "Current Agent"
49
+ }
@@ -0,0 +1,51 @@
1
+ {
2
+ "weixinAuthTitle": "Connect Weixin by QR",
3
+ "weixinAuthDescription": "Weixin now uses QR login as the primary setup flow.",
4
+ "weixinAuthHint": "In most cases you only need to start the flow, scan the QR code, and confirm on your phone. The config will be saved automatically.",
5
+ "weixinAuthCapabilityHint": "After connecting, the agent can proactively message known Weixin users through this channel.",
6
+ "weixinAuthPrimaryAccount": "Current default account",
7
+ "weixinAuthConnectedAccounts": "Connected accounts",
8
+ "weixinAuthBaseUrl": "Current API base URL",
9
+ "weixinAuthConnect": "Scan QR to connect Weixin",
10
+ "weixinAuthReconnect": "Reconnect with QR",
11
+ "weixinAuthStarting": "Generating QR code...",
12
+ "weixinAuthWaiting": "Waiting for scan confirmation",
13
+ "weixinAuthScanned": "Scanned, waiting for confirmation",
14
+ "weixinAuthAuthorized": "Connected",
15
+ "weixinAuthConnectedDisabled": "Connected, but channel inactive",
16
+ "weixinAuthNotConnected": "Not connected",
17
+ "weixinAuthDisabledHint": "This account is connected, but the channel is inactive. Turn on Enabled before it can send or receive messages.",
18
+ "weixinAuthRetryRequired": "QR session expired. Please start again.",
19
+ "weixinAuthQrAlt": "Weixin login QR code",
20
+ "weixinAuthScanPrompt": "Scan with Weixin and confirm the login on your phone.",
21
+ "weixinAuthExpiresAt": "QR expires at",
22
+ "weixinAuthOpenQr": "Open QR code in new tab",
23
+ "weixinAuthReadyTitle": "Ready to connect Weixin",
24
+ "weixinAuthReadyDescription": "After you start the flow, the QR code will appear here. Most first-time setups do not require filling low-level fields manually.",
25
+ "weixinAuthAdvancedTitle": "Advanced settings",
26
+ "weixinAuthAdvancedDescription": "Expand these fields only when you need to customize the API base URL, account mapping, or allowlist.",
27
+ "feishuAuthTitle": "Connect Feishu by QR",
28
+ "feishuAuthCreateNew": "Create new agent",
29
+ "feishuAuthConnectExisting": "Connect existing agent",
30
+ "feishuAuthDescription": "Feishu can create a new agent by QR, so you no longer need to copy app credentials manually.",
31
+ "feishuAuthHint": "Start the flow, scan with Feishu, and the new agent credentials will be saved automatically for WebSocket messaging.",
32
+ "feishuAuthCapabilityHint": "After connecting, the agent can send and receive Feishu direct and group messages through the registered app.",
33
+ "feishuAuthDisabledHint": "This Feishu app is connected, but the channel is inactive. Turn on Enabled before it can send or receive messages.",
34
+ "feishuAuthConnect": "Scan QR to connect Feishu",
35
+ "feishuAuthQrAlt": "Feishu agent creation QR code",
36
+ "feishuAuthScanPrompt": "Scan with Feishu and follow the prompts to finish agent creation.",
37
+ "feishuAuthReadyTitle": "Ready to connect Feishu",
38
+ "feishuAuthReadyDescription": "After you start the flow, the agent creation QR code will appear here. Use the existing-agent tab when you already have one.",
39
+ "feishuAuthAdvancedTitle": "Advanced settings",
40
+ "feishuAuthAdvancedDescription": "Expand these fields only when you need to switch Feishu/Lark domains, choose a default account, or adjust allowlist and group policies.",
41
+ "feishuAuthDomain": "Feishu platform",
42
+ "feishuPlatform": "Platform",
43
+ "feishuExistingAgentTitle": "Connect an existing Feishu agent",
44
+ "feishuExistingAgentDescription": "Enter the App ID and App Secret for an existing agent.",
45
+ "feishuExistingAgentHint": "Open the developer console, choose an existing agent, then copy the credentials from its basic information page.",
46
+ "feishuExistingAgentOpenFeishuList": "Open Feishu agent list",
47
+ "feishuExistingAgentOpenLarkList": "Open Lark agent list",
48
+ "feishuExistingAgentConnect": "Verify and connect",
49
+ "feishuExistingAgentConnecting": "Verifying",
50
+ "feishuExistingAgentConnectSuccess": "Feishu agent connected"
51
+ }