@nextclaw/ui 0.15.21 → 0.15.22

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 (161) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/assets/{api-CHo2gekJ.js → api-B1yHQYs-.js} +3 -3
  3. package/dist/assets/app-presenter-provider-uP9waOzv.js +108 -0
  4. package/dist/assets/appearance-settings-page-C9Zq3hP9.js +1 -0
  5. package/dist/assets/{book-open-BrZL4o9L.js → book-open-oSmyVXea.js} +1 -1
  6. package/dist/assets/{card-B5rRLu_6.js → card-CGvJZTZp.js} +1 -1
  7. package/dist/assets/{channels-list-page-C1dnm68I.js → channels-list-page-5BTxpQHw.js} +2 -2
  8. package/dist/assets/chat-page-jTvli8Jp.js +1 -0
  9. package/dist/assets/config-split-page-BgBsUmp1.js +1 -0
  10. package/dist/assets/confirm-dialog-h849QRWO.js +5 -0
  11. package/dist/assets/desktop-update-config-BGGHxClR.js +1 -0
  12. package/dist/assets/{dist-C9EX46wM.js → dist-CxUhurq9.js} +1 -1
  13. package/dist/assets/doc-browser-0eL8AX42.js +1 -0
  14. package/dist/assets/{doc-browser-DH-3hDnI.js → doc-browser-DEqE9lsh.js} +1 -1
  15. package/dist/assets/{doc-browser-context-TU2heon0.js → doc-browser-context-DkzFIUoK.js} +1 -1
  16. package/dist/assets/{eye-B-3dyZNA.js → eye-gOWQGt8N.js} +1 -1
  17. package/dist/assets/{form-actions-DvvxCpL4.js → form-actions-CgjYZUzM.js} +1 -1
  18. package/dist/assets/{index-k_eWScvN.js → index-DSAUWCfl.js} +2 -2
  19. package/dist/assets/index-G7cBryJ4.css +1 -0
  20. package/dist/assets/loader-circle-BAuycGf6.js +1 -0
  21. package/dist/assets/{logo-badge-DB51c0cS.js → logo-badge-BNcsDsUM.js} +1 -1
  22. package/dist/assets/{mcp-marketplace-page-DWtsIqml.js → mcp-marketplace-page-BX39MtPa.js} +3 -3
  23. package/dist/assets/mcp-marketplace-page-CkDtOEA4.js +1 -0
  24. package/dist/assets/{model-config-page-D6cGNnMM.js → model-config-page-7MIXg2fQ.js} +1 -1
  25. package/dist/assets/{navigation-link-BSJEUiwD.js → navigation-link-B3iFOdxx.js} +1 -1
  26. package/dist/assets/plus-yvhFgfal.js +1 -0
  27. package/dist/assets/{popover-Bp9IpE_N.js → popover-Cpep_rJe.js} +1 -1
  28. package/dist/assets/{provider-models-CXUgDxGR.js → provider-models-CUrptZ-o.js} +1 -1
  29. package/dist/assets/provider-scoped-model-input-CHmOzz7x.js +1 -0
  30. package/dist/assets/providers-config-page-A6J7Y0II.js +1 -0
  31. package/dist/assets/react-BCJGCjrP.js +8 -0
  32. package/dist/assets/{refresh-cw-C2e94pmp.js → refresh-cw-CkKwPztT.js} +1 -1
  33. package/dist/assets/remote-FD-ZfSIn.js +1 -0
  34. package/dist/assets/rotate-cw-DrJMfHhp.js +1 -0
  35. package/dist/assets/{runtime-config-page-C57OLdPm.js → runtime-config-page-DwjO-Vs6.js} +1 -1
  36. package/dist/assets/{save-CkwDOgvt.js → save-BINMWate.js} +1 -1
  37. package/dist/assets/{search-CLXM2reO.js → search-7M38azRp.js} +1 -1
  38. package/dist/assets/{search-config-page-tnJXaaSr.js → search-config-page-T6tMhXbP.js} +1 -1
  39. package/dist/assets/{secrets-config-page-DQ_Curaj.js → secrets-config-page-2mVejXf2.js} +2 -2
  40. package/dist/assets/security-config-DD5RrjDe.js +1 -0
  41. package/dist/assets/{select-CNFBf00l.js → select-BvidP5Oa.js} +1 -1
  42. package/dist/assets/{settings-2-B9IT2HGd.js → settings-2-DqZstREV.js} +1 -1
  43. package/dist/assets/skeleton-BEQW2Dva.js +1 -0
  44. package/dist/assets/{tabs-BuNr8LSO.js → tabs-BeLxVmkt.js} +1 -1
  45. package/dist/assets/{tag-chip-CDkB5smU.js → tag-chip-BoDaLnWt.js} +1 -1
  46. package/dist/assets/{trash-2-GchaJuEM.js → trash-2-CYUskMMN.js} +1 -1
  47. package/dist/assets/{use-config-C69rR15i.js → use-config-CxKRXXCl.js} +1 -1
  48. package/dist/assets/use-confirm-dialog-HASTvOP2.js +1 -0
  49. package/dist/assets/{use-viewport-layout-BACNZyMY.js → use-viewport-layout-CJxkjoRz.js} +1 -1
  50. package/dist/assets/x-DdUwjre5.js +1 -0
  51. package/dist/index.html +29 -29
  52. package/package.json +7 -7
  53. package/src/app/components/layout/sidebar-rail.styles.ts +0 -2
  54. package/src/app/components/layout/sidebar.tsx +2 -2
  55. package/src/app/styles/design-system.css +12 -0
  56. package/src/features/chat/components/chat-sidebar-list-mode-switch.tsx +2 -2
  57. package/src/features/chat/components/conversation/__tests__/chat-conversation-content.test.tsx +19 -1
  58. package/src/features/chat/components/conversation/__tests__/chat-conversation-header-section.test.tsx +1 -1
  59. package/src/features/chat/components/conversation/chat-conversation-content.tsx +5 -6
  60. package/src/features/chat/components/conversation/chat-conversation-header.tsx +1 -1
  61. package/src/features/chat/components/layout/__tests__/chat-sidebar-read-state.test.tsx +1 -1
  62. package/src/features/chat/components/layout/__tests__/chat-sidebar-session-area.test.tsx +52 -0
  63. package/src/features/chat/components/layout/__tests__/chat-sidebar.test.tsx +11 -17
  64. package/src/features/chat/components/layout/chat-page-shell.tsx +2 -11
  65. package/src/features/chat/components/layout/chat-sidebar-desktop-layout.tsx +32 -42
  66. package/src/features/chat/components/layout/chat-sidebar-toolbar.tsx +13 -64
  67. package/src/features/chat/components/layout/chat-sidebar-utility-menu.tsx +1 -4
  68. package/src/features/chat/features/conversation/components/__tests__/session-conversation-area.test.tsx +1 -1
  69. package/src/features/chat/features/conversation/components/__tests__/session-conversation-input.streaming.test.tsx +15 -4
  70. package/src/features/chat/features/conversation/components/session-conversation-area.tsx +7 -7
  71. package/src/features/chat/features/conversation/components/session-conversation-input.tsx +4 -2
  72. package/src/features/chat/features/conversation/hooks/use-session-conversation-input-attachments.ts +1 -0
  73. package/src/features/chat/features/conversation/utils/session-conversation-input-toolbar.utils.ts +1 -0
  74. package/src/features/chat/features/conversation/utils/session-queued-input.utils.ts +1 -0
  75. package/src/features/chat/features/input/utils/__tests__/chat-input-bar.utils.test.ts +3 -0
  76. package/src/features/chat/features/input/utils/chat-input-bar.utils.ts +0 -1
  77. package/src/features/chat/features/input/utils/chat-input-toolbar.utils.ts +3 -0
  78. package/src/features/chat/features/message/utils/__tests__/chat-message-timeline.utils.test.ts +29 -0
  79. package/src/features/chat/features/message/utils/chat-message-timeline.utils.ts +4 -1
  80. package/src/features/chat/features/session/components/chat-sidebar-session-item.tsx +10 -10
  81. package/src/features/chat/features/session/components/chat-sidebar-session-list.tsx +2 -2
  82. package/src/features/chat/features/session/components/session-header/chat-session-header-menu-item.tsx +1 -1
  83. package/src/features/chat/features/session/components/session-header/chat-session-project-badge.tsx +1 -1
  84. package/src/features/chat/features/session/components/session-header/chat-session-switcher-groups.tsx +1 -1
  85. package/src/features/chat/features/session/components/session-header/chat-session-title-switcher.tsx +1 -1
  86. package/src/features/chat/features/session/utils/__tests__/chat-session-display.utils.test.ts +26 -0
  87. package/src/features/chat/features/session/utils/__tests__/ncp-session-adapter.utils.test.ts +4 -2
  88. package/src/features/chat/features/session/utils/chat-session-display.utils.ts +48 -12
  89. package/src/features/chat/features/session/utils/ncp-session-adapter.utils.ts +13 -4
  90. package/src/features/chat/features/welcome/components/__tests__/chat-conversation-welcome.test.tsx +6 -0
  91. package/src/features/chat/features/welcome/components/__tests__/chat-welcome.test.tsx +10 -7
  92. package/src/features/chat/features/welcome/components/chat-welcome-agent-picker.tsx +1 -1
  93. package/src/features/chat/features/welcome/components/chat-welcome-project-picker.tsx +3 -14
  94. package/src/features/chat/features/welcome/components/chat-welcome-prompt-suggestions.tsx +37 -0
  95. package/src/features/chat/features/welcome/components/chat-welcome-session-type-picker.tsx +1 -1
  96. package/src/features/chat/features/welcome/components/chat-welcome.tsx +33 -31
  97. package/src/features/chat/features/workspace/components/__tests__/chat-session-workspace-panel-content.test.tsx +1 -1
  98. package/src/features/chat/features/workspace/components/__tests__/chat-session-workspace-panel.test.tsx +1 -1
  99. package/src/features/chat/managers/__tests__/chat-session-list.manager.test.ts +15 -3
  100. package/src/features/chat/managers/__tests__/chat-thread.manager.test.ts +3 -10
  101. package/src/features/chat/managers/chat-session-list.manager.ts +3 -23
  102. package/src/features/chat/managers/chat-thread.manager.ts +2 -5
  103. package/src/features/chat/pages/__tests__/ncp-chat-page.test.tsx +3 -9
  104. package/src/features/chat/pages/ncp-chat-page.tsx +0 -1
  105. package/src/features/chat/types/chat-input-bar.types.ts +1 -0
  106. package/src/features/cron/components/cron-task-discovery.tsx +1 -1
  107. package/src/features/marketplace/components/marketplace-page-parts.tsx +1 -1
  108. package/src/features/notifications/components/__tests__/app-notification-toast.test.tsx +3 -0
  109. package/src/features/notifications/components/app-notification-toast.tsx +1 -1
  110. package/src/features/panel-apps/components/panel-app-list-item.tsx +1 -1
  111. package/src/features/panel-apps/components/panel-app-toolbar.tsx +2 -2
  112. package/src/features/panel-apps/components/panel-apps-list.tsx +4 -4
  113. package/src/features/service-apps/components/service-apps-panel.tsx +1 -1
  114. package/src/features/settings/components/config/provider-auth-section.tsx +90 -59
  115. package/src/features/settings/components/config/provider-form.tsx +10 -17
  116. package/src/features/settings/components/config/provider-status-badge.tsx +4 -2
  117. package/src/features/settings/pages/__tests__/providers-config-page.test.tsx +12 -0
  118. package/src/features/settings/pages/providers-config-page.tsx +2 -1
  119. package/src/platforms/mobile/components/__tests__/mobile-app-shell.test.tsx +13 -7
  120. package/src/platforms/mobile/components/__tests__/mobile-bottom-nav.test.tsx +18 -20
  121. package/src/shared/components/doc-browser/doc-browser-panel-parts.tsx +1 -1
  122. package/src/shared/components/path-picker/server-path-picker-directory-list.tsx +1 -1
  123. package/src/shared/components/path-picker/server-path-picker-locations.tsx +1 -1
  124. package/src/shared/components/path-picker/server-path-picker-navigation-bar.tsx +3 -3
  125. package/src/shared/components/ui/actions/__tests__/icon-action-button.test.tsx +1 -1
  126. package/src/shared/components/ui/actions/icon-action-button.tsx +1 -1
  127. package/src/shared/components/ui/button.tsx +4 -4
  128. package/src/shared/components/ui/dialog.tsx +1 -1
  129. package/src/shared/components/ui/input.tsx +1 -1
  130. package/src/shared/components/ui/scroll-area.tsx +2 -0
  131. package/src/shared/components/ui/select.tsx +1 -1
  132. package/src/shared/components/ui/switch.tsx +1 -1
  133. package/src/shared/components/ui/tabs.tsx +1 -1
  134. package/src/shared/components/ui/textarea.tsx +1 -1
  135. package/src/shared/lib/api/ncp-session.types.ts +1 -0
  136. package/src/shared/lib/api/types.ts +2 -0
  137. package/src/shared/lib/i18n/locales/en-US/chat.json +13 -14
  138. package/src/shared/lib/i18n/locales/zh-CN/chat.json +13 -14
  139. package/src/shared/lib/provider-models/__tests__/anonymous-provider-configuration.test.ts +40 -0
  140. package/src/shared/lib/provider-models/index.ts +4 -3
  141. package/dist/assets/app-presenter-provider-2_DmWYT9.js +0 -108
  142. package/dist/assets/appearance-settings-page-BEy2UE7R.js +0 -1
  143. package/dist/assets/chat-page-Dz6tvZ91.js +0 -1
  144. package/dist/assets/config-split-page-6y6W6dz4.js +0 -1
  145. package/dist/assets/confirm-dialog-q1CpEmR8.js +0 -5
  146. package/dist/assets/desktop-update-config-DrdlwP4j.js +0 -1
  147. package/dist/assets/doc-browser-BfttDSti.js +0 -1
  148. package/dist/assets/index-CXDPLDFD.css +0 -1
  149. package/dist/assets/loader-circle-B35NlHTI.js +0 -1
  150. package/dist/assets/mcp-marketplace-page-CkPtwPBk.js +0 -1
  151. package/dist/assets/plus-BRVe5jSJ.js +0 -1
  152. package/dist/assets/provider-scoped-model-input-dk7fz9NL.js +0 -1
  153. package/dist/assets/providers-config-page-DTP2YfxA.js +0 -1
  154. package/dist/assets/react-D6ShNq95.js +0 -8
  155. package/dist/assets/remote-FllhXW3o.js +0 -1
  156. package/dist/assets/rotate-cw-CTC-Qszi.js +0 -1
  157. package/dist/assets/security-config-S00DjFfO.js +0 -1
  158. package/dist/assets/skeleton-Dc06gatK.js +0 -1
  159. package/dist/assets/use-confirm-dialog-DF_EgPYx.js +0 -1
  160. package/dist/assets/x-BXFquY9e.js +0 -1
  161. package/src/features/chat/features/welcome/components/chat-welcome-capability-grid.tsx +0 -59
@@ -202,6 +202,7 @@
202
202
  "chatRuntimeInitializationFailed": "Chat startup failed. Please retry in a moment or inspect the service logs.",
203
203
  "chatInputPlaceholder": "Type a message, / for commands, apps or skills, @ for files, folders, projects or panel apps, Enter to send, Shift + Enter for newline",
204
204
  "chatInputPlaceholderCompact": "Message NextClaw...",
205
+ "chatWelcomeInputPlaceholder": "Describe what you want to get done…",
205
206
  "chatInputHint": "Multi-turn context is preserved in the current session.",
206
207
  "chatSlashSection": "Slash menu",
207
208
  "chatSlashSectionCommands": "Commands",
@@ -283,6 +284,7 @@
283
284
  "chatModelSearchEmpty": "No matching models",
284
285
  "chatFavoriteModel": "Add to favorites",
285
286
  "chatUnfavoriteModel": "Remove from favorites",
287
+ "chatManageModels": "Manage models and providers",
286
288
  "chatPickerAllSkills": "All skills",
287
289
  "chatSend": "Send",
288
290
  "chatStop": "Stop",
@@ -353,6 +355,7 @@
353
355
  "chatProjectExistingAdded": "Project added",
354
356
  "chatProjectExistingFailed": "Failed to add project",
355
357
  "chatSessionErrorTitle": "Something went wrong",
358
+ "chatSessionActivityInterrupted": "The run was interrupted. Send the message again.",
356
359
  "chatSendFailed": "Failed to send message",
357
360
  "chatErrorDetails": "Details",
358
361
  "chatRoleUser": "You",
@@ -422,24 +425,20 @@
422
425
  "chatBackgroundReplyFallbackTitle": "New reply",
423
426
  "chatBackgroundReplyFallbackPreview": "A reply is ready. Open the session to view it.",
424
427
  "chatBackgroundReplyOpenAriaLabel": "Open the new reply in {title}",
425
- "chatWelcomeTitle": "Hello, how can I help you?",
426
- "chatWelcomeSubtitle": "Describe the goal, choose the project context, and let NextClaw take it from there.",
428
+ "chatWelcomeTitle": "What would you like to get done?",
429
+ "chatWelcomeContextLabel": "Task context",
427
430
  "chatWelcomeProjectPickerLabel": "Choose working directory",
428
431
  "chatWelcomeProjectPickerPlaceholder": "Choose working directory",
429
- "chatWelcomeProjectDefaultBadge": "Default",
430
432
  "chatWelcomeProjectRecentTitle": "Recent projects",
431
433
  "chatWelcomeProjectNoRecent": "No recent projects yet",
432
434
  "chatWelcomeProjectOpenFolder": "Open folder",
433
435
  "chatWelcomeSessionTypePickerLabel": "Choose session type",
434
- "chatWelcomeCapability1Title": "Smart Conversations",
435
- "chatWelcomeCapability1Desc": "Multi-turn context conversations with multiple AI models",
436
- "chatWelcomeCapability1Prompt": "Help me understand this project and propose the next three concrete things we should build.",
437
- "chatWelcomeCapability2Title": "Skill Extensions",
438
- "chatWelcomeCapability2Desc": "Extend Agent capabilities by installing skills",
439
- "chatWelcomeCapability2Prompt": "Review the skills that would be useful for this project and recommend which ones I should enable first.",
440
- "chatWelcomeCapability3Title": "Scheduled Tasks",
441
- "chatWelcomeCapability3Desc": "Set up scheduled automated tasks",
442
- "chatWelcomeCapability3Prompt": "Help me design a scheduled automation for this project, including the trigger, message, and safety checks.",
436
+ "chatWelcomeSuggestion1Label": "Review this project",
437
+ "chatWelcomeSuggestion1Prompt": "Help me understand this project and propose the next three concrete things we should build.",
438
+ "chatWelcomeSuggestion2Label": "Find useful skills",
439
+ "chatWelcomeSuggestion2Prompt": "Review the skills that would be useful for this project and recommend which ones I should enable first.",
440
+ "chatWelcomeSuggestion3Label": "Create a scheduled task",
441
+ "chatWelcomeSuggestion3Prompt": "Help me design a scheduled automation for this project, including the trigger, message, and safety checks.",
443
442
  "chatSkillsPickerTitle": "Skills",
444
443
  "chatSkillsPickerEmpty": "No skills installed",
445
444
  "chatSkillsPickerSearchPlaceholder": "Search skills",
@@ -447,9 +446,9 @@
447
446
  "chatSkillsPickerOfficial": "Official",
448
447
  "chatSkillsPickerManage": "Manage Skills",
449
448
  "chatSkillPreviewUnavailable": "This skill file is unavailable. It may have been moved or removed.",
449
+ "chatInputAdd": "Add content",
450
450
  "chatInputAttach": "Attach file",
451
451
  "chatInputAttachmentUnsupported": "This file type is not supported in the current upload flow.",
452
452
  "chatInputAttachmentTooLarge": "Files must be {maxMb} MB or smaller.",
453
- "chatInputAttachmentReadFailed": "Failed to read the file. Please try again.",
454
- "chatInputAttachComingSoon": "Coming soon"
453
+ "chatInputAttachmentReadFailed": "Failed to read the file. Please try again."
455
454
  }
@@ -202,6 +202,7 @@
202
202
  "chatRuntimeInitializationFailed": "聊天能力启动失败,请稍后重试或检查服务日志。",
203
203
  "chatInputPlaceholder": "输入消息,/ 选命令、应用或技能,@ 引用文件、目录、项目或面板应用,Enter 发送,Shift + Enter 换行",
204
204
  "chatInputPlaceholderCompact": "发消息...",
205
+ "chatWelcomeInputPlaceholder": "描述你想完成的目标……",
205
206
  "chatInputHint": "支持多轮上下文,默认走当前会话。",
206
207
  "chatSlashSection": "斜杠菜单",
207
208
  "chatSlashSectionCommands": "命令",
@@ -283,6 +284,7 @@
283
284
  "chatModelSearchEmpty": "没有匹配的模型",
284
285
  "chatFavoriteModel": "收藏模型",
285
286
  "chatUnfavoriteModel": "取消收藏",
287
+ "chatManageModels": "管理模型与提供商",
286
288
  "chatPickerAllSkills": "全部技能",
287
289
  "chatSend": "发送",
288
290
  "chatStop": "停止",
@@ -353,6 +355,7 @@
353
355
  "chatProjectExistingAdded": "项目已添加",
354
356
  "chatProjectExistingFailed": "添加项目失败",
355
357
  "chatSessionErrorTitle": "出错了",
358
+ "chatSessionActivityInterrupted": "运行意外中断,请重新发送消息。",
356
359
  "chatSendFailed": "发送消息失败",
357
360
  "chatErrorDetails": "查看详情",
358
361
  "chatRoleUser": "你",
@@ -422,24 +425,20 @@
422
425
  "chatBackgroundReplyFallbackTitle": "有新回复",
423
426
  "chatBackgroundReplyFallbackPreview": "回复已完成,点击查看。",
424
427
  "chatBackgroundReplyOpenAriaLabel": "打开“{title}”的新回复",
425
- "chatWelcomeTitle": "你好,有什么可以帮你的吗?",
426
- "chatWelcomeSubtitle": "描述目标,选择项目上下文,让 NextClaw 接住这次任务。",
428
+ "chatWelcomeTitle": "今天想完成什么?",
429
+ "chatWelcomeContextLabel": "任务上下文",
427
430
  "chatWelcomeProjectPickerLabel": "选择工作目录",
428
431
  "chatWelcomeProjectPickerPlaceholder": "选择工作目录",
429
- "chatWelcomeProjectDefaultBadge": "默认",
430
432
  "chatWelcomeProjectRecentTitle": "最近项目",
431
433
  "chatWelcomeProjectNoRecent": "暂无最近项目",
432
434
  "chatWelcomeProjectOpenFolder": "打开文件夹",
433
435
  "chatWelcomeSessionTypePickerLabel": "选择会话类型",
434
- "chatWelcomeCapability1Title": "智能对话",
435
- "chatWelcomeCapability1Desc": "多轮上下文对话,支持多种 AI 模型",
436
- "chatWelcomeCapability1Prompt": "帮我理解当前项目,并给出接下来最值得推进的三个具体建设方向。",
437
- "chatWelcomeCapability2Title": "技能扩展",
438
- "chatWelcomeCapability2Desc": "通过安装技能扩展 Agent 能力",
439
- "chatWelcomeCapability2Prompt": "帮我看看这个项目适合启用哪些技能,并推荐我优先配置哪些能力。",
440
- "chatWelcomeCapability3Title": "定时任务",
441
- "chatWelcomeCapability3Desc": "设置定时执行的自动化任务",
442
- "chatWelcomeCapability3Prompt": "帮我设计一个适合当前项目的定时自动化任务,包括触发条件、消息内容和安全检查。",
436
+ "chatWelcomeSuggestion1Label": "梳理当前项目",
437
+ "chatWelcomeSuggestion1Prompt": "帮我理解当前项目,并给出接下来最值得推进的三个具体建设方向。",
438
+ "chatWelcomeSuggestion2Label": "推荐实用技能",
439
+ "chatWelcomeSuggestion2Prompt": "帮我看看这个项目适合启用哪些技能,并推荐我优先配置哪些能力。",
440
+ "chatWelcomeSuggestion3Label": "创建定时任务",
441
+ "chatWelcomeSuggestion3Prompt": "帮我设计一个适合当前项目的定时自动化任务,包括触发条件、消息内容和安全检查。",
443
442
  "chatSkillsPickerTitle": "技能",
444
443
  "chatSkillsPickerEmpty": "暂无已安装技能",
445
444
  "chatSkillsPickerSearchPlaceholder": "搜索技能",
@@ -447,9 +446,9 @@
447
446
  "chatSkillsPickerOfficial": "官方",
448
447
  "chatSkillsPickerManage": "管理技能",
449
448
  "chatSkillPreviewUnavailable": "无法打开这个技能文件,它可能已被移动或删除。",
449
+ "chatInputAdd": "添加内容",
450
450
  "chatInputAttach": "添加附件",
451
451
  "chatInputAttachmentUnsupported": "当前上传流程不支持该文件类型。",
452
452
  "chatInputAttachmentTooLarge": "文件不能超过 {maxMb} MB。",
453
- "chatInputAttachmentReadFailed": "读取文件失败,请重试。",
454
- "chatInputAttachComingSoon": "即将支持"
453
+ "chatInputAttachmentReadFailed": "读取文件失败,请重试。"
455
454
  }
@@ -0,0 +1,40 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { buildProviderModelCatalog } from '@/shared/lib/provider-models';
3
+
4
+ describe('anonymous provider configuration', () => {
5
+ it('includes an enabled provider that does not require a user API key', () => {
6
+ const catalog = buildProviderModelCatalog({
7
+ onlyConfigured: true,
8
+ providersView: {
9
+ providers: {
10
+ opencode: {
11
+ providerId: 'opencode',
12
+ providerType: 'opencode',
13
+ isBuiltInType: true,
14
+ isCustom: false,
15
+ enabled: true,
16
+ apiKeyRequired: false,
17
+ apiKeySet: false,
18
+ models: ['opencode/big-pickle']
19
+ }
20
+ }
21
+ },
22
+ templatesView: {
23
+ providerTemplates: [
24
+ {
25
+ id: 'opencode',
26
+ providerType: 'opencode',
27
+ displayName: 'OpenCode Zen Free Trial',
28
+ modelPrefix: 'opencode',
29
+ defaultModels: ['opencode/big-pickle'],
30
+ keywords: ['opencode'],
31
+ envKey: 'OPENCODE_API_KEY'
32
+ }
33
+ ]
34
+ }
35
+ });
36
+
37
+ expect(catalog).toHaveLength(1);
38
+ expect(catalog[0]?.models).toEqual(['big-pickle']);
39
+ });
40
+ });
@@ -201,12 +201,13 @@ export function findProviderByModel(
201
201
  return null;
202
202
  }
203
203
 
204
- function isProviderConfigured(provider: ProviderConfigView | undefined): boolean {
204
+ export function isProviderConfigured(provider: ProviderConfigView | undefined): boolean {
205
205
  if (!provider) {
206
206
  return false;
207
207
  }
208
- // Keep in sync with ProvidersList "已配置" tab: only enabled providers with apiKey count as configured.
209
- return provider.enabled !== false && provider.apiKeySet === true;
208
+ return provider.enabled !== false && (
209
+ provider.apiKeyRequired === false || provider.apiKeySet === true
210
+ );
210
211
  }
211
212
 
212
213
  export function buildProviderModelCatalog(params: {