@allbluecn/web-app 0.9.5 → 0.10.2

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 (684) hide show
  1. package/package.json +9 -8
  2. package/public/favicon.ico +0 -0
  3. package/src/__tests__/paraglide.test.ts +43 -0
  4. package/src/__tests__/setup.ts +27 -9
  5. package/src/assets/illustrations/empty-states/workspace-empty.svg +5 -0
  6. package/src/assets/illustrations/knowledge/law-card-illustration.svg +5 -0
  7. package/src/assets/logo/logo.tsx +53 -36
  8. package/src/components/agents/agent-card.tsx +7 -7
  9. package/src/components/agents/agent-form-dialog.tsx +41 -42
  10. package/src/components/agents/agent-selector.tsx +6 -8
  11. package/src/components/agents/agents-page.tsx +26 -28
  12. package/src/components/agents/skill-card.tsx +1 -4
  13. package/src/components/agents/skill-form-dialog.tsx +19 -21
  14. package/src/components/agents/slash-skill-menu.tsx +5 -7
  15. package/src/components/agents/use-agent-handlers.ts +5 -8
  16. package/src/components/ai/ai-chat-prompt.tsx +26 -33
  17. package/src/components/ai/global-chat-panel.tsx +10 -11
  18. package/src/components/ai/use-knowledge-bases.ts +2 -2
  19. package/src/components/anyhub/anyhub-app-card.tsx +13 -15
  20. package/src/components/anyhub/anyhub-app-runner.tsx +5 -7
  21. package/src/components/anyhub/anyhub-install-dialog.tsx +16 -18
  22. package/src/components/anyhub/anyhub-management-view.tsx +9 -11
  23. package/src/components/anyhub/anyhub-marketplace-view.tsx +14 -17
  24. package/src/components/anyhub/anyhub-permission-panel.tsx +8 -11
  25. package/src/components/anyhub/anyhub-provider.tsx +0 -1
  26. package/src/components/anyhub/anyhub-top-nav.tsx +5 -8
  27. package/src/components/auth/auth-header.tsx +2 -2
  28. package/src/components/auth/icon-input.tsx +0 -1
  29. package/src/components/auth/oauth-section.tsx +3 -5
  30. package/src/components/auth/password-input.tsx +2 -4
  31. package/src/components/auth/session-guard.tsx +0 -1
  32. package/src/components/auth/sso-section.tsx +3 -4
  33. package/src/components/billing/__tests__/seats-manager.test.tsx +5 -9
  34. package/src/components/billing/billing-panel.tsx +5 -6
  35. package/src/components/billing/checkout-redirect.ts +6 -10
  36. package/src/components/billing/feature-gate.tsx +2 -3
  37. package/src/components/billing/invoice-history.tsx +9 -11
  38. package/src/components/billing/login-prompt-dialog.tsx +10 -11
  39. package/src/components/billing/pricing-card.tsx +6 -7
  40. package/src/components/billing/pricing-page.tsx +4 -5
  41. package/src/components/billing/seats-manager.tsx +19 -20
  42. package/src/components/billing/subscription-card.tsx +13 -14
  43. package/src/components/billing/upgrade-prompt.tsx +11 -13
  44. package/src/components/changelog/changelog-page.tsx +36 -26
  45. package/src/components/chat/ai-chat-history/components/conversation-header.tsx +4 -5
  46. package/src/components/chat/ai-chat-history/components/conversation-item.tsx +15 -17
  47. package/src/components/chat/ai-chat-history/components/conversation-search.tsx +3 -4
  48. package/src/components/chat/ai-chat-history/components/empty-state.tsx +5 -6
  49. package/src/components/chat/ai-chat-history/index.tsx +11 -15
  50. package/src/components/chat/ai-chat-history/utils/group-conversations.ts +9 -2
  51. package/src/components/chat/ai-citations/components/citation-item.tsx +3 -5
  52. package/src/components/chat/ai-citations/components/citations-list.tsx +4 -6
  53. package/src/components/chat/ai-citations/components/inline-citation.tsx +2 -4
  54. package/src/components/chat/ai-citations/components/source-components.tsx +6 -10
  55. package/src/components/chat/ai-citations/index.tsx +3 -4
  56. package/src/components/chat/ai-citations/utils.ts +15 -3
  57. package/src/components/chat/ai-conversation.tsx +10 -12
  58. package/src/components/chat/ai-message/components/message-actions.tsx +7 -9
  59. package/src/components/chat/ai-message/components/streaming-indicator.tsx +3 -4
  60. package/src/components/chat/ai-message/index.tsx +5 -5
  61. package/src/components/chat/ai-message/utils/dom-utils.ts +1 -1
  62. package/src/components/chat/ai-prompt-input/components/action-buttons.tsx +14 -16
  63. package/src/components/chat/ai-prompt-input/components/agent-mode-select.tsx +10 -5
  64. package/src/components/chat/ai-prompt-input/components/context-badge.tsx +2 -3
  65. package/src/components/chat/ai-prompt-input/components/kb-context-selector.tsx +6 -8
  66. package/src/components/chat/ai-prompt-input/components/model-select.tsx +14 -7
  67. package/src/components/chat/ai-prompt-input/components/page-user-context-selector.tsx +6 -8
  68. package/src/components/chat/ai-prompt-input/index.tsx +18 -11
  69. package/src/components/chat/ai-prompt-input/types.ts +6 -5
  70. package/src/components/chat/ai-thinking.tsx +6 -9
  71. package/src/components/chat/chat-thread-page.tsx +4 -5
  72. package/src/components/chat/interrupt-approval.tsx +6 -8
  73. package/src/components/command/command-palette.tsx +7 -10
  74. package/src/components/design/project-card.tsx +2 -3
  75. package/src/components/design/sketch/code-preview.tsx +3 -4
  76. package/src/components/design/sketch/export-panel.tsx +3 -4
  77. package/src/components/design/sketch/property-panel.tsx +16 -17
  78. package/src/components/error/global-error-boundary.tsx +65 -0
  79. package/src/components/forms/app-array-field.tsx +3 -4
  80. package/src/components/forms/app-combobox.tsx +2 -3
  81. package/src/components/forms/app-date-picker.tsx +2 -3
  82. package/src/components/forms/app-form-dialog.tsx +3 -4
  83. package/src/components/forms/app-select.tsx +2 -3
  84. package/src/components/forms/hooks/use-form-submit.ts +2 -2
  85. package/src/components/forms/schemas/common.ts +4 -6
  86. package/src/components/hotkeys/shortcuts-panel.tsx +2 -3
  87. package/src/components/iteration/auto-schedule-dialog.tsx +12 -13
  88. package/src/components/iteration/burndown-chart.tsx +6 -8
  89. package/src/components/iteration/constants.ts +5 -4
  90. package/src/components/iteration/create-iteration-dialog.tsx +14 -15
  91. package/src/components/iteration/iteration-card.tsx +3 -4
  92. package/src/components/iteration/iteration-editor.tsx +7 -8
  93. package/src/components/iteration/iteration-progress-bar.tsx +3 -5
  94. package/src/components/iteration/iteration-status-badge.tsx +1 -3
  95. package/src/components/kibo-ui/contribution-graph/index.tsx +37 -9
  96. package/src/components/knowledge/dialog/knowledge-form-dialog.tsx +8 -9
  97. package/src/components/knowledge/doc-properties.tsx +12 -13
  98. package/src/components/knowledge/editor/doc-header.tsx +7 -8
  99. package/src/components/knowledge/editor/knowledge-doc-editor.tsx +9 -9
  100. package/src/components/knowledge/knowledge-homepage.tsx +6 -7
  101. package/src/components/knowledge/knowledge-tag-input.tsx +3 -4
  102. package/src/components/knowledge/knowledge-toolbar.tsx +38 -40
  103. package/src/components/knowledge/knowledge-tree-item.tsx +21 -22
  104. package/src/components/knowledge/knowledge-tree.tsx +15 -16
  105. package/src/components/knowledge-public/bookmark-card.tsx +13 -14
  106. package/src/components/knowledge-public/bookmark-form-dialog.tsx +25 -26
  107. package/src/components/knowledge-public/knowledge-card-grid.tsx +3 -3
  108. package/src/components/knowledge-public/knowledge-filters.tsx +9 -10
  109. package/src/components/knowledge-public/knowledge-form-dialog.tsx +62 -63
  110. package/src/components/knowledge-public/knowledge-search-bar.tsx +3 -4
  111. package/src/components/knowledge-public/legal-compliance-editor.tsx +30 -31
  112. package/src/components/knowledge-public/markdown-editor.tsx +3 -4
  113. package/src/components/knowledge-public/markdown-view.tsx +2 -3
  114. package/src/components/knowledge-public/sharers-avatar-group.tsx +3 -4
  115. package/src/components/knowledge-public/tag-filter.tsx +3 -4
  116. package/src/components/layout/sidebar-03/__tests__/nav-workspace.test.tsx +42 -79
  117. package/src/components/layout/sidebar-03/__tests__/user-menu-anonymous.test.tsx +51 -0
  118. package/src/components/layout/sidebar-03/app-sidebar.tsx +3 -4
  119. package/src/components/layout/sidebar-03/index.tsx +0 -1
  120. package/src/components/layout/sidebar-03/nav-anyhub.tsx +4 -5
  121. package/src/components/layout/sidebar-03/nav-knowledge.tsx +80 -37
  122. package/src/components/layout/sidebar-03/nav-main.tsx +10 -12
  123. package/src/components/layout/sidebar-03/nav-notifications.tsx +19 -28
  124. package/src/components/layout/sidebar-03/nav-search-trigger.tsx +3 -5
  125. package/src/components/layout/sidebar-03/nav-workspace.tsx +32 -12
  126. package/src/components/layout/sidebar-03/team-switcher.tsx +0 -1
  127. package/src/components/layout/sidebar-03/user-menu.tsx +33 -13
  128. package/src/components/magicui/components/animate/avatar-group.tsx +0 -1
  129. package/src/components/magicui/primitives/animate/avatar-group.tsx +0 -1
  130. package/src/components/magicui/primitives/animate/slot.tsx +0 -1
  131. package/src/components/magicui/primitives/animate/tooltip.tsx +0 -1
  132. package/src/components/magicui/sparkles-text.tsx +0 -1
  133. package/src/components/mindmap/mindmap-doc-editor.tsx +15 -15
  134. package/src/components/notifications/settings-notifications.tsx +22 -23
  135. package/src/components/notifications/team-notifications.tsx +27 -29
  136. package/src/components/plugin-slots/__tests__/plugin-settings-tabs.test.tsx +4 -4
  137. package/src/components/plugin-slots/plugin-settings-tabs.tsx +15 -11
  138. package/src/components/project/create-project-dialog.tsx +60 -34
  139. package/src/components/project/invite-member-dialog.tsx +20 -21
  140. package/src/components/project/project-activity-list.tsx +19 -24
  141. package/src/components/project/project-member-manager.tsx +27 -28
  142. package/src/components/project/project-module-card.tsx +5 -6
  143. package/src/components/project/schemas/create-project.ts +3 -5
  144. package/src/components/prototype/component/GenericPrototype.tsx +0 -1
  145. package/src/components/prototype/component-preview.tsx +0 -1
  146. package/src/components/settings/ai/api-key-field.tsx +8 -10
  147. package/src/components/settings/ai/create-custom-model-dialog.tsx +28 -21
  148. package/src/components/settings/ai/create-custom-provider-dialog.tsx +15 -16
  149. package/src/components/settings/ai/model-card.tsx +25 -10
  150. package/src/components/settings/ai/model-manager.tsx +24 -16
  151. package/src/components/settings/ai/provider-card.tsx +9 -11
  152. package/src/components/settings/ai/provider-detail-form.tsx +24 -26
  153. package/src/components/settings/ai/provider-grid.tsx +23 -13
  154. package/src/components/settings/language-selector.tsx +13 -15
  155. package/src/components/settings/personal-team/account/account-client.tsx +14 -16
  156. package/src/components/settings/personal-team/account/avatar/notion-avatar-editor.tsx +36 -28
  157. package/src/components/settings/personal-team/account/settings-profile.tsx +39 -40
  158. package/src/components/settings/personal-team/team/team-client.tsx +45 -50
  159. package/src/components/settings/personal-team/team/team-invitations.tsx +89 -95
  160. package/src/components/settings/personal-team/team/team-member-list.tsx +50 -47
  161. package/src/components/shadcn-space/blocks/pricing-01/pricing.tsx +170 -172
  162. package/src/components/shared-kit/data-viz/contribution-graph-tooltip.tsx +128 -15
  163. package/src/components/shared-kit/dialogs/name-confirm-dialog.tsx +16 -16
  164. package/src/components/shared-kit/i18n/language-switcher.tsx +6 -9
  165. package/src/components/shared-kit/i18n/translator-text.tsx +2 -4
  166. package/src/components/shared-kit/icons/lucide-icon-picker/panel.tsx +7 -8
  167. package/src/components/shared-kit/logos/logo-icon.tsx +64 -0
  168. package/src/components/shared-kit/navigation/nav-float-button.tsx +3 -5
  169. package/src/components/shared-kit/pages/placeholder-page.tsx +2 -4
  170. package/src/components/shared-kit/theme/animated-theme-toggler.tsx +0 -1
  171. package/src/components/shared-kit/theme/theme-toggle.tsx +0 -1
  172. package/src/components/shared-kit/timezone/timezone-select.tsx +6 -7
  173. package/src/components/story/__tests__/constants.test.ts +7 -7
  174. package/src/components/story/__tests__/dependency-type-badge.test.ts +5 -5
  175. package/src/components/story/ai/action-registry.ts +12 -11
  176. package/src/components/story/ai/handlers/more-popover.tsx +5 -6
  177. package/src/components/story/ai/prototype-dialog.tsx +9 -10
  178. package/src/components/story/ai/split-dialog.tsx +22 -23
  179. package/src/components/story/ai/story-ai-panel.tsx +29 -30
  180. package/src/components/story/ai/story-ai-preview-list.tsx +16 -9
  181. package/src/components/story/ai/story-ai-toolbar.tsx +12 -13
  182. package/src/components/story/columns.tsx +33 -17
  183. package/src/components/story/constants.ts +73 -69
  184. package/src/components/story/create-story-dialog.tsx +13 -14
  185. package/src/components/story/detail/__tests__/categories.test.tsx +8 -10
  186. package/src/components/story/detail/__tests__/dependencies-button.test.tsx +3 -5
  187. package/src/components/story/detail/activity-tabs.tsx +6 -7
  188. package/src/components/story/detail/activity-timeline.tsx +33 -35
  189. package/src/components/story/detail/comment-input.tsx +7 -8
  190. package/src/components/story/detail/comment-item.tsx +15 -16
  191. package/src/components/story/detail/comment-thread.tsx +6 -7
  192. package/src/components/story/detail/reaction-bar.tsx +2 -3
  193. package/src/components/story/detail/story-detail-body.tsx +26 -28
  194. package/src/components/story/detail/story-detail-toolbar/associated-attachments-panel.tsx +42 -45
  195. package/src/components/story/detail/story-detail-toolbar/categories.tsx +13 -14
  196. package/src/components/story/detail/story-detail-toolbar/children.tsx +19 -22
  197. package/src/components/story/detail/story-detail-toolbar/dependencies.tsx +3 -5
  198. package/src/components/story/detail/story-detail-toolbar/dependency-panel.tsx +30 -20
  199. package/src/components/story/detail/story-detail-toolbar.tsx +16 -11
  200. package/src/components/story/detail/story-properties.tsx +7 -8
  201. package/src/components/story/display/__tests__/display-dropdown.test.tsx +3 -5
  202. package/src/components/story/display/__tests__/use-paged-story-groups.test.ts +2 -0
  203. package/src/components/story/display/constants.ts +27 -26
  204. package/src/components/story/display/display-dropdown.tsx +20 -26
  205. package/src/components/story/display/group-resolver.tsx +12 -14
  206. package/src/components/story/display/use-grouped-stories.ts +3 -5
  207. package/src/components/story/display/use-paged-story-groups.ts +12 -13
  208. package/src/components/story/filters/add-filter-dropdown.tsx +4 -5
  209. package/src/components/story/filters/applied-filters.tsx +7 -9
  210. package/src/components/story/filters/filter-condition.tsx +9 -12
  211. package/src/components/story/filters/filter-row.tsx +5 -6
  212. package/src/components/story/filters/filter-toggle.tsx +2 -3
  213. package/src/components/story/filters/filter-types.ts +24 -23
  214. package/src/components/story/filters/filter-value-input.tsx +3 -4
  215. package/src/components/story/infinite-scroll-sentinel.tsx +2 -3
  216. package/src/components/story/inline-editors/__tests__/dependency-type-select.test.tsx +18 -23
  217. package/src/components/story/inline-editors/__tests__/labels-editor.test.tsx +9 -11
  218. package/src/components/story/inline-editors/__tests__/priority-editor.test.tsx +21 -25
  219. package/src/components/story/inline-editors/__tests__/state-editor.test.tsx +21 -25
  220. package/src/components/story/inline-editors/assignee-editor.tsx +8 -9
  221. package/src/components/story/inline-editors/date-editor.tsx +4 -5
  222. package/src/components/story/inline-editors/dependency-type-select.tsx +15 -12
  223. package/src/components/story/inline-editors/inline-trigger.tsx +2 -3
  224. package/src/components/story/inline-editors/labels-editor.tsx +16 -17
  225. package/src/components/story/inline-editors/parent-story-editor.tsx +3 -4
  226. package/src/components/story/inline-editors/priority-editor.tsx +6 -8
  227. package/src/components/story/inline-editors/state-editor.tsx +6 -7
  228. package/src/components/story/inline-editors/story-select-dialog.tsx +25 -26
  229. package/src/components/story/inline-editors/title-editor.tsx +2 -3
  230. package/src/components/story/peek-panel.tsx +6 -7
  231. package/src/components/story/relations/__tests__/knowledge-select-dialog.test.tsx +2 -0
  232. package/src/components/story/relations/__tests__/link-manage-dialog.test.tsx +2 -0
  233. package/src/components/story/relations/attachment-manage-dialog.tsx +23 -24
  234. package/src/components/story/relations/general-groups.ts +12 -29
  235. package/src/components/story/relations/knowledge-select-dialog.tsx +21 -22
  236. package/src/components/story/relations/link-manage-dialog.tsx +12 -13
  237. package/src/components/story/relations/story-ref-row.tsx +20 -21
  238. package/src/components/story/schemas/story-create.ts +3 -5
  239. package/src/components/story/search-popover.tsx +5 -6
  240. package/src/components/story/story-list-table.tsx +3 -4
  241. package/src/components/story/story-list-view.tsx +9 -10
  242. package/src/components/story/story-panel-header.tsx +27 -28
  243. package/src/components/story/story-toolbar.tsx +11 -12
  244. package/src/components/story/transfer-story-popover.tsx +15 -16
  245. package/src/components/story/views/calendar-view.tsx +12 -14
  246. package/src/components/story/views/create-view-dialog.tsx +19 -52
  247. package/src/components/story/views/kanban-board.tsx +9 -12
  248. package/src/components/story/views/kanban-card.tsx +1 -3
  249. package/src/components/story/views/story-list/__tests__/batch-toolbar.test.tsx +9 -2
  250. package/src/components/story/views/story-list/__tests__/group-header.test.tsx +15 -17
  251. package/src/components/story/views/story-list/batch-preview-dialog.tsx +26 -28
  252. package/src/components/story/views/story-list/batch-toolbar.tsx +12 -13
  253. package/src/components/story/views/story-list/group.tsx +9 -11
  254. package/src/components/story/views/story-list/index.tsx +13 -14
  255. package/src/components/story/views/story-list/inline-story-creator.tsx +6 -7
  256. package/src/components/story/views/story-list/row.tsx +6 -7
  257. package/src/components/story/views/timeline-view.tsx +7 -8
  258. package/src/components/story/views/view-list-section.tsx +14 -16
  259. package/src/components/story/views/view-selector-button.tsx +6 -7
  260. package/src/components/story/views/view-switcher.tsx +9 -10
  261. package/src/components/story/views/view-types.ts +15 -15
  262. package/src/components/tiptap/extension/code-block-ellipsis-input-extension.ts +0 -1
  263. package/src/components/tiptap/hooks/use-composed-ref.ts +0 -1
  264. package/src/components/tiptap/hooks/use-cursor-visibility.ts +0 -1
  265. package/src/components/tiptap/hooks/use-floating-element.ts +0 -1
  266. package/src/components/tiptap/hooks/use-is-breakpoint.ts +0 -1
  267. package/src/components/tiptap/hooks/use-isomorphic-layout-effect.ts +0 -1
  268. package/src/components/tiptap/hooks/use-menu-navigation.ts +0 -1
  269. package/src/components/tiptap/hooks/use-on-click-outside.ts +0 -1
  270. package/src/components/tiptap/hooks/use-tiptap-editor.ts +0 -1
  271. package/src/components/tiptap/hooks/use-ui-editor-state.ts +0 -1
  272. package/src/components/tiptap/mindmap/lib/__tests__/default-mindmap-data.test.ts +3 -2
  273. package/src/components/tiptap/mindmap/lib/default-mindmap-data.ts +2 -2
  274. package/src/components/tiptap/mindmap/mind-map.tsx +36 -39
  275. package/src/components/tiptap/mindmap/mindmap-fullscreen-dialog.tsx +2 -3
  276. package/src/components/tiptap/node/annotation-node/annotation-node-view.tsx +11 -12
  277. package/src/components/tiptap/node/doc-card-extension.tsx +8 -10
  278. package/src/components/tiptap/node/image-node/image-node-floating.tsx +2 -3
  279. package/src/components/tiptap/node/image-upload-node/image-upload-node.tsx +0 -1
  280. package/src/components/tiptap/node/mention-extension.ts +5 -5
  281. package/src/components/tiptap/node/table-node/hooks/use-table-handle-state.ts +0 -1
  282. package/src/components/tiptap/node/table-node/ui/table-add-row-column-button/table-add-row-column-button.tsx +0 -1
  283. package/src/components/tiptap/node/table-node/ui/table-add-row-column-button/use-table-add-row-column.ts +5 -6
  284. package/src/components/tiptap/node/table-node/ui/table-align-cell-button/table-align-cell-button.tsx +0 -1
  285. package/src/components/tiptap/node/table-node/ui/table-align-cell-button/use-table-align-cell.ts +8 -9
  286. package/src/components/tiptap/node/table-node/ui/table-alignment-menu/table-alignment-menu.tsx +2 -4
  287. package/src/components/tiptap/node/table-node/ui/table-cell-handle-menu/table-cell-handle-menu.tsx +2 -5
  288. package/src/components/tiptap/node/table-node/ui/table-clear-row-column-content-button/table-clear-row-column-content-button.tsx +0 -1
  289. package/src/components/tiptap/node/table-node/ui/table-clear-row-column-content-button/use-table-clear-row-column-content.ts +4 -5
  290. package/src/components/tiptap/node/table-node/ui/table-delete-row-column-button/table-delete-row-column-button.tsx +0 -1
  291. package/src/components/tiptap/node/table-node/ui/table-delete-row-column-button/use-table-delete-row-column.ts +3 -4
  292. package/src/components/tiptap/node/table-node/ui/table-duplicate-row-column-button/table-duplicate-row-column-button.tsx +0 -1
  293. package/src/components/tiptap/node/table-node/ui/table-duplicate-row-column-button/use-table-duplicate-row-column.ts +3 -4
  294. package/src/components/tiptap/node/table-node/ui/table-extend-row-column-button/table-extend-row-column-button.tsx +2 -4
  295. package/src/components/tiptap/node/table-node/ui/table-fit-to-width-button/table-fit-to-width-button.tsx +0 -1
  296. package/src/components/tiptap/node/table-node/ui/table-fit-to-width-button/use-table-fit-to-width.ts +3 -4
  297. package/src/components/tiptap/node/table-node/ui/table-handle/table-handle.tsx +0 -1
  298. package/src/components/tiptap/node/table-node/ui/table-handle-menu/table-handle-menu.tsx +3 -5
  299. package/src/components/tiptap/node/table-node/ui/table-header-row-column-button/table-header-row-column-button.tsx +0 -1
  300. package/src/components/tiptap/node/table-node/ui/table-header-row-column-button/use-table-header-row-column.ts +3 -4
  301. package/src/components/tiptap/node/table-node/ui/table-merge-split-cell-button/table-merge-split-cell-button.tsx +0 -1
  302. package/src/components/tiptap/node/table-node/ui/table-merge-split-cell-button/use-table-merge-split-cell.ts +3 -4
  303. package/src/components/tiptap/node/table-node/ui/table-move-row-column-button/table-move-row-column-button.tsx +0 -1
  304. package/src/components/tiptap/node/table-node/ui/table-move-row-column-button/use-table-move-row-column.ts +9 -10
  305. package/src/components/tiptap/node/table-node/ui/table-selection-overlay/table-selection-overlay.tsx +0 -1
  306. package/src/components/tiptap/node/table-node/ui/table-selection-overlay/use-resize-overlay.ts +0 -1
  307. package/src/components/tiptap/node/table-node/ui/table-sort-row-column-button/table-sort-row-column-button.tsx +0 -1
  308. package/src/components/tiptap/node/table-node/ui/table-sort-row-column-button/use-table-sort-row-column.ts +5 -6
  309. package/src/components/tiptap/node/table-node/ui/table-trigger-button/table-grid-selector.tsx +2 -3
  310. package/src/components/tiptap/node/table-node/ui/table-trigger-button/table-trigger-button.tsx +0 -1
  311. package/src/components/tiptap/node/table-node/ui/table-trigger-button/use-table-trigger.ts +3 -4
  312. package/src/components/tiptap/node/toc-node/toc-node.tsx +2 -4
  313. package/src/components/tiptap/node/toc-node/ui/toc-show-title-button/toc-show-title-button.tsx +0 -1
  314. package/src/components/tiptap/node/toc-node/ui/toc-show-title-button/toc-show-title.ts +2 -3
  315. package/src/components/tiptap/node/toc-node/ui/toc-sidebar/toc-sidebar.tsx +2 -5
  316. package/src/components/tiptap/notion-like/notion-like-editor-header.tsx +2 -4
  317. package/src/components/tiptap/notion-like/notion-like-editor-mobile-toolbar.tsx +17 -23
  318. package/src/components/tiptap/notion-like/notion-like-editor-theme-toggle.tsx +2 -5
  319. package/src/components/tiptap/notion-like/notion-like-editor-toolbar-floating.tsx +16 -12
  320. package/src/components/tiptap/notion-like/notion-like-editor.tsx +2 -7
  321. package/src/components/tiptap/notion-like/setup-error-message/setup-error-message.tsx +0 -1
  322. package/src/components/tiptap/ui/ai-ask-button/ai-ask-button.tsx +0 -1
  323. package/src/components/tiptap/ui/ai-ask-button/use-ai-ask.ts +2 -3
  324. package/src/components/tiptap/ui/ai-menu/ai-menu-actions/ai-menu-actions.tsx +4 -6
  325. package/src/components/tiptap/ui/ai-menu/ai-menu-input/ai-menu-input.tsx +6 -10
  326. package/src/components/tiptap/ui/ai-menu/ai-menu-items/ai-menu-items-constants.ts +36 -36
  327. package/src/components/tiptap/ui/ai-menu/ai-menu-items/ai-menu-items.tsx +13 -16
  328. package/src/components/tiptap/ui/ai-menu/ai-menu-items/language-selection-submenu.tsx +3 -4
  329. package/src/components/tiptap/ui/ai-menu/ai-menu-items/tone-selection-submenu.tsx +2 -3
  330. package/src/components/tiptap/ui/ai-menu/ai-menu-utils.ts +3 -3
  331. package/src/components/tiptap/ui/ai-menu/ai-menu.tsx +3 -5
  332. package/src/components/tiptap/ui/blockquote-button/blockquote-button.tsx +2 -6
  333. package/src/components/tiptap/ui/blockquote-button/use-blockquote.ts +2 -3
  334. package/src/components/tiptap/ui/code-block-button/code-block-button.tsx +2 -6
  335. package/src/components/tiptap/ui/code-block-button/use-code-block.ts +2 -3
  336. package/src/components/tiptap/ui/color-highlight-button/color-highlight-button.tsx +0 -1
  337. package/src/components/tiptap/ui/color-highlight-button/use-color-highlight.ts +14 -14
  338. package/src/components/tiptap/ui/color-highlight-popover/color-highlight-popover.tsx +9 -11
  339. package/src/components/tiptap/ui/color-menu/color-menu.tsx +5 -11
  340. package/src/components/tiptap/ui/color-text-button/color-text-button.tsx +2 -3
  341. package/src/components/tiptap/ui/color-text-button/use-color-text.ts +12 -13
  342. package/src/components/tiptap/ui/color-text-popover/color-text-popover.tsx +6 -10
  343. package/src/components/tiptap/ui/color-text-popover/use-color-text-popover.ts +2 -3
  344. package/src/components/tiptap/ui/copy-anchor-link-button/copy-anchor-link-button.tsx +2 -6
  345. package/src/components/tiptap/ui/copy-anchor-link-button/use-copy-anchor-link.ts +2 -3
  346. package/src/components/tiptap/ui/copy-anchor-link-button/use-scroll-to-hash.ts +0 -1
  347. package/src/components/tiptap/ui/copy-to-clipboard-button/copy-to-clipboard-button.tsx +2 -6
  348. package/src/components/tiptap/ui/copy-to-clipboard-button/use-copy-to-clipboard.ts +2 -3
  349. package/src/components/tiptap/ui/delete-node-button/delete-node-button.tsx +2 -6
  350. package/src/components/tiptap/ui/delete-node-button/use-delete-node.ts +2 -3
  351. package/src/components/tiptap/ui/doc-reference-floating/doc-reference-floating.tsx +10 -11
  352. package/src/components/tiptap/ui/doc-reference-interaction/doc-reference-interaction.tsx +10 -11
  353. package/src/components/tiptap/ui/drag-context-menu/drag-context-menu.tsx +7 -9
  354. package/src/components/tiptap/ui/duplicate-button/duplicate-button.tsx +2 -6
  355. package/src/components/tiptap/ui/duplicate-button/use-duplicate.ts +2 -3
  356. package/src/components/tiptap/ui/emoji-dropdown-menu/emoji-dropdown-menu.tsx +0 -1
  357. package/src/components/tiptap/ui/emoji-menu/emoji-menu.tsx +2 -5
  358. package/src/components/tiptap/ui/emoji-trigger-button/emoji-trigger-button.tsx +2 -6
  359. package/src/components/tiptap/ui/emoji-trigger-button/use-emoji-trigger.ts +2 -3
  360. package/src/components/tiptap/ui/heading-button/heading-button.tsx +0 -1
  361. package/src/components/tiptap/ui/heading-button/use-heading.ts +7 -8
  362. package/src/components/tiptap/ui/image-align-button/image-align-button.tsx +0 -1
  363. package/src/components/tiptap/ui/image-align-button/use-image-align.ts +4 -5
  364. package/src/components/tiptap/ui/image-caption-button/image-caption-button.tsx +0 -1
  365. package/src/components/tiptap/ui/image-caption-button/use-image-caption.ts +2 -3
  366. package/src/components/tiptap/ui/image-download-button/image-download-button.tsx +0 -1
  367. package/src/components/tiptap/ui/image-download-button/use-image-download.ts +2 -3
  368. package/src/components/tiptap/ui/image-upload-button/image-upload-button.tsx +0 -1
  369. package/src/components/tiptap/ui/image-upload-button/use-image-upload.ts +2 -3
  370. package/src/components/tiptap/ui/improve-dropdown/improve-dropdown.tsx +14 -17
  371. package/src/components/tiptap/ui/improve-dropdown/use-improve-dropdown.ts +2 -3
  372. package/src/components/tiptap/ui/indent-button/indent-button.tsx +0 -1
  373. package/src/components/tiptap/ui/indent-button/use-indent.ts +3 -4
  374. package/src/components/tiptap/ui/link-popover/link-popover.tsx +7 -12
  375. package/src/components/tiptap/ui/link-popover/use-link-popover.ts +2 -3
  376. package/src/components/tiptap/ui/list-button/list-button.tsx +0 -1
  377. package/src/components/tiptap/ui/list-button/use-list.ts +4 -5
  378. package/src/components/tiptap/ui/mark-button/mark-button.tsx +0 -1
  379. package/src/components/tiptap/ui/mark-button/use-mark.ts +8 -9
  380. package/src/components/tiptap/ui/mention-dropdown-menu/mention-dropdown-menu.tsx +0 -2
  381. package/src/components/tiptap/ui/mention-trigger-button/mention-trigger-button.tsx +0 -1
  382. package/src/components/tiptap/ui/mention-trigger-button/use-mention-trigger.ts +2 -3
  383. package/src/components/tiptap/ui/move-node-button/move-node-button.tsx +2 -6
  384. package/src/components/tiptap/ui/move-node-button/use-move-node.ts +2 -3
  385. package/src/components/tiptap/ui/reference-dropdown-menu/reference-dropdown-menu.tsx +6 -10
  386. package/src/components/tiptap/ui/reset-all-formatting-button/reset-all-formatting-button.tsx +2 -6
  387. package/src/components/tiptap/ui/reset-all-formatting-button/use-reset-all-formatting.ts +2 -3
  388. package/src/components/tiptap/ui/slash-command-trigger-button/slash-command-trigger-button.tsx +0 -1
  389. package/src/components/tiptap/ui/slash-command-trigger-button/use-slash-command-trigger.ts +2 -3
  390. package/src/components/tiptap/ui/slash-dropdown-menu/slash-dropdown-menu.tsx +2 -5
  391. package/src/components/tiptap/ui/slash-dropdown-menu/use-slash-dropdown-menu.ts +78 -79
  392. package/src/components/tiptap/ui/text-align-button/text-align-button.tsx +0 -1
  393. package/src/components/tiptap/ui/text-align-button/use-text-align.ts +5 -6
  394. package/src/components/tiptap/ui/text-button/text-button.tsx +2 -6
  395. package/src/components/tiptap/ui/text-button/use-text.ts +2 -3
  396. package/src/components/tiptap/ui/turn-into-dropdown/turn-into-dropdown.tsx +4 -7
  397. package/src/components/tiptap/ui/turn-into-dropdown/use-turn-into-dropdown.ts +11 -12
  398. package/src/components/tiptap/ui/undo-redo-button/undo-redo-button.tsx +0 -1
  399. package/src/components/tiptap/ui/undo-redo-button/use-undo-redo.ts +3 -4
  400. package/src/components/tiptap/ui-primitive/avatar/avatar.tsx +0 -1
  401. package/src/components/tiptap/ui-primitive/badge/badge.tsx +0 -1
  402. package/src/components/tiptap/ui-primitive/button/button.tsx +0 -1
  403. package/src/components/tiptap/ui-primitive/card/card.tsx +0 -1
  404. package/src/components/tiptap/ui-primitive/combobox/combobox.tsx +0 -1
  405. package/src/components/tiptap/ui-primitive/dropdown-menu/dropdown-menu.tsx +0 -1
  406. package/src/components/tiptap/ui-primitive/input/input.tsx +0 -1
  407. package/src/components/tiptap/ui-primitive/input-group/input-group.tsx +0 -1
  408. package/src/components/tiptap/ui-primitive/label/label.tsx +0 -1
  409. package/src/components/tiptap/ui-primitive/menu/menu-context.ts +0 -1
  410. package/src/components/tiptap/ui-primitive/menu/menu-hooks.ts +0 -1
  411. package/src/components/tiptap/ui-primitive/menu/menu-types.ts +0 -1
  412. package/src/components/tiptap/ui-primitive/menu/menu-utils.ts +0 -1
  413. package/src/components/tiptap/ui-primitive/menu/menu.tsx +0 -1
  414. package/src/components/tiptap/ui-primitive/popover/popover.tsx +0 -1
  415. package/src/components/tiptap/ui-primitive/separator/separator.tsx +0 -1
  416. package/src/components/tiptap/ui-primitive/sidebar/sidebar.tsx +0 -1
  417. package/src/components/tiptap/ui-primitive/spacer/spacer.tsx +0 -1
  418. package/src/components/tiptap/ui-primitive/textarea/textarea.tsx +0 -1
  419. package/src/components/tiptap/ui-primitive/textarea-autosize/textarea-autosize.tsx +0 -1
  420. package/src/components/tiptap/ui-primitive/toolbar/toolbar.tsx +0 -1
  421. package/src/components/tiptap/ui-primitive/tooltip/tooltip.tsx +0 -1
  422. package/src/components/tiptap/ui-utils/floating-element/floating-element.tsx +0 -1
  423. package/src/components/tiptap/ui-utils/suggestion-menu/suggestion-menu.tsx +0 -1
  424. package/src/components/ui/field.tsx +1 -1
  425. package/src/components/ui/radio-group.tsx +2 -3
  426. package/src/components/ui/spinner.tsx +2 -2
  427. package/src/components/workspace/create-workspace-dialog.tsx +12 -13
  428. package/src/components/workspace/delete-workspace-options.tsx +177 -0
  429. package/src/components/workspace/edit-workspace-dialog.tsx +153 -0
  430. package/src/components/workspace/schemas/create-workspace.ts +2 -2
  431. package/src/components/workspace/workspace-activity-card.tsx +60 -0
  432. package/src/components/workspace/workspace-contribution-card.tsx +37 -0
  433. package/src/components/workspace/workspace-header.tsx +100 -0
  434. package/src/components/workspace/workspace-kb-card.tsx +31 -0
  435. package/src/components/workspace/workspace-member-item.tsx +80 -0
  436. package/src/components/workspace/workspace-members-manager.tsx +291 -0
  437. package/src/components/workspace/workspace-project-list.tsx +129 -0
  438. package/src/config/sidebar-routes.tsx +25 -24
  439. package/src/config/sidebar-teams.ts +4 -4
  440. package/src/hooks/__tests__/use-commands.test.tsx +0 -10
  441. package/src/hooks/use-commands.ts +3 -7
  442. package/src/hooks/use-entity-subscription.ts +0 -1
  443. package/src/hooks/use-notifications.ts +5 -6
  444. package/src/hooks/useTranslator.ts +0 -1
  445. package/src/lib/__tests__/edition.test.ts +9 -0
  446. package/src/lib/analytics.ts +0 -1
  447. package/src/lib/anyhub/anyhub-message-bridge.ts +1 -1
  448. package/src/lib/auth/__tests__/anonymous-safe.test.ts +89 -0
  449. package/src/lib/auth/__tests__/page-gate.test.ts +29 -0
  450. package/src/lib/auth/anonymous-safe.ts +39 -0
  451. package/src/lib/auth/page-gate.ts +18 -0
  452. package/src/lib/changelog/sdk-versions.ts +19 -19
  453. package/src/lib/collections/knowledge/knowledge-bases-collection.ts +1 -1
  454. package/src/lib/collections/reference/bookmark-categories-collection.ts +1 -1
  455. package/src/lib/collections/reference/labels-collection.ts +1 -1
  456. package/src/lib/collections/reference/projects-collection.ts +1 -1
  457. package/src/lib/collections/reference/users-brief-collection.ts +1 -1
  458. package/src/lib/collections/reference/workspaces-collection.ts +3 -3
  459. package/src/lib/commands/__tests__/registry.test.ts +3 -3
  460. package/src/lib/commands/registry.ts +22 -21
  461. package/src/lib/commands/types.ts +1 -1
  462. package/src/lib/edition.ts +7 -0
  463. package/src/lib/router-context.ts +1 -2
  464. package/src/plugins/.gen-manifest.json +13 -0
  465. package/src/plugins/core/inspiration/pages/inspiration-page.tsx +2 -3
  466. package/src/plugins/core/inspiration/ui.tsx +2 -3
  467. package/src/plugins/core/prd/components/agent-input.tsx +7 -8
  468. package/src/plugins/core/prd/components/component-editor/content-section.tsx +3 -3
  469. package/src/plugins/core/prd/components/component-editor/position-section.tsx +3 -4
  470. package/src/plugins/core/prd/components/component-editor/style-fields.tsx +13 -16
  471. package/src/plugins/core/prd/components/dialog/create-prd-dialog.tsx +11 -12
  472. package/src/plugins/core/prd/components/dialog/prd-detail-client.tsx +7 -9
  473. package/src/plugins/core/prd/components/page-version-panel/components/create-version-dialog.tsx +7 -8
  474. package/src/plugins/core/prd/components/page-version-panel/components/delete-version-dialog.tsx +5 -6
  475. package/src/plugins/core/prd/components/page-version-panel/components/edit-version-dialog.tsx +7 -8
  476. package/src/plugins/core/prd/components/page-version-panel/constants.tsx +3 -2
  477. package/src/plugins/core/prd/components/page-version-panel.tsx +43 -45
  478. package/src/plugins/core/prd/components/page-version-tree.tsx +6 -8
  479. package/src/plugins/core/prd/components/prd-agent-panel.tsx +29 -23
  480. package/src/plugins/core/prd/components/prd-comment-review-panel.tsx +21 -23
  481. package/src/plugins/core/prd/components/prd-component-editor-content.tsx +6 -7
  482. package/src/plugins/core/prd/components/prd-dashboard.tsx +28 -23
  483. package/src/plugins/core/prd/components/prd-doc-panel.tsx +6 -9
  484. package/src/plugins/core/prd/components/prd-editor-layout.tsx +11 -13
  485. package/src/plugins/core/prd/components/prd-filter-bar.tsx +2 -3
  486. package/src/plugins/core/prd/components/prd-left-sidebar.tsx +19 -20
  487. package/src/plugins/core/prd/components/prd-navigation.tsx +12 -14
  488. package/src/plugins/core/prd/components/prd-outline-tab.tsx +3 -4
  489. package/src/plugins/core/prd/components/prd-prototype-panel.tsx +8 -10
  490. package/src/plugins/core/prd/components/prd-right-sidebar.tsx +10 -12
  491. package/src/plugins/core/prd/components/prd-share-panel/components/single-version-share-card.tsx +13 -14
  492. package/src/plugins/core/prd/components/prd-share-panel/constants.ts +5 -3
  493. package/src/plugins/core/prd/components/prd-share-panel.tsx +58 -60
  494. package/src/plugins/core/prd/components/prd-tree-page-tab.tsx +20 -22
  495. package/src/plugins/core/prd/components/prototype/PrototypeCanvas.tsx +2 -4
  496. package/src/plugins/core/prd/components/prototype/PrototypeElement.tsx +3 -5
  497. package/src/plugins/core/prd/components/prototype/ResizeHandles.tsx +0 -1
  498. package/src/plugins/core/prd/components/prototype/icon-components.ts +19 -21
  499. package/src/plugins/core/prd/components/prototype/index.ts +3 -0
  500. package/src/plugins/core/prd/components/restore-version-dialog.tsx +5 -7
  501. package/src/plugins/core/prd/components/share/prd-share-client.tsx +7 -9
  502. package/src/plugins/core/prd/components/share/share-annotation-overlay.tsx +0 -1
  503. package/src/plugins/core/prd/components/share/share-comment-panel.tsx +15 -16
  504. package/src/plugins/core/prd/components/share/share-comment-review-panel.tsx +7 -9
  505. package/src/plugins/core/prd/components/share/share-directory-tree.tsx +3 -5
  506. package/src/plugins/core/prd/components/share/share-doc-view.tsx +3 -5
  507. package/src/plugins/core/prd/components/share/share-layout.tsx +3 -5
  508. package/src/plugins/core/prd/components/share/share-nav-bar.tsx +3 -5
  509. package/src/plugins/core/prd/components/share/share-password-gate.tsx +8 -9
  510. package/src/plugins/core/prd/components/share/share-prototype-view.tsx +3 -5
  511. package/src/plugins/core/prd/components/share/share-review-panel.tsx +9 -11
  512. package/src/plugins/core/prd/components/share/share-sse-listener.tsx +0 -1
  513. package/src/plugins/core/prd/components/share/version-share-client.tsx +3 -5
  514. package/src/plugins/core/prd/pages/prd-detail-page.tsx +9 -21
  515. package/src/plugins/core/prd/pages/share-prd-page.tsx +6 -16
  516. package/src/plugins/core/prd/prd-nav.tsx +2 -3
  517. package/src/plugins/core/tags/nav-tag.tsx +14 -15
  518. package/src/plugins/core/tags/pages/tag-detail-page.tsx +3 -5
  519. package/src/plugins/core/tags/pages/tag-settings-page.tsx +3 -5
  520. package/src/plugins/core/tags/pages/tags-index-page.tsx +3 -5
  521. package/src/plugins/core/tags/tag-badge.tsx +2 -3
  522. package/src/plugins/core/tags/tag-color-picker.tsx +2 -4
  523. package/src/plugins/core/tags/tag-manager.tsx +23 -25
  524. package/src/plugins/core/tags/tag-selector.tsx +4 -5
  525. package/src/plugins/modules.gen.ts +21 -0
  526. package/src/plugins/plugins.gen.ts +20 -0
  527. package/src/plugins/ui.gen.ts +8 -0
  528. package/src/providers/index.tsx +3 -14
  529. package/src/routeTree.gen.ts +27 -0
  530. package/src/router.tsx +16 -6
  531. package/src/routes/__desktop/onboarding/route.lazy.tsx +22 -23
  532. package/src/routes/__root.tsx +13 -36
  533. package/src/routes/__tests__/-edition-routing.test.tsx +151 -0
  534. package/src/routes/_login/forgot-password/route.lazy.tsx +14 -15
  535. package/src/routes/_login/login/route.lazy.tsx +26 -25
  536. package/src/routes/_login/register/route.lazy.tsx +23 -24
  537. package/src/routes/_login/reset-password/route.lazy.tsx +16 -17
  538. package/src/routes/_login/schemas/-auth.ts +11 -13
  539. package/src/routes/_nav/acceptance-criteria/route.tsx +2 -3
  540. package/src/routes/_nav/apps/anyhub/$id/route.tsx +2 -3
  541. package/src/routes/_nav/chat/route.lazy.tsx +9 -10
  542. package/src/routes/_nav/dashboard/-components/activity-feed.tsx +3 -4
  543. package/src/routes/_nav/dashboard/-components/quick-actions.tsx +3 -4
  544. package/src/routes/_nav/dashboard/-components/stats-grid.tsx +5 -6
  545. package/src/routes/_nav/dashboard/route.lazy.tsx +7 -8
  546. package/src/routes/_nav/design/$projectId/$artboardId/route.lazy.tsx +7 -9
  547. package/src/routes/_nav/design/$projectId/route.lazy.tsx +3 -5
  548. package/src/routes/_nav/design/index.lazy.tsx +26 -27
  549. package/src/routes/_nav/inspiration/route.tsx +8 -0
  550. package/src/routes/_nav/knowledge/$kbId/doc/$docId/route.lazy.tsx +4 -5
  551. package/src/routes/_nav/knowledge/$kbId/route.lazy.tsx +3 -4
  552. package/src/routes/_nav/knowledge/bookmarks/$id.lazy.tsx +29 -30
  553. package/src/routes/_nav/knowledge/bookmarks/index.lazy.tsx +12 -13
  554. package/src/routes/_nav/knowledge/compliance/$id.lazy.tsx +22 -23
  555. package/src/routes/_nav/knowledge/compliance/index.lazy.tsx +18 -19
  556. package/src/routes/_nav/knowledge/dictionaries/$id.lazy.tsx +5 -6
  557. package/src/routes/_nav/knowledge/dictionaries/index.lazy.tsx +17 -18
  558. package/src/routes/_nav/knowledge/index.lazy.tsx +248 -40
  559. package/src/routes/_nav/knowledge/laws/$id.lazy.tsx +22 -23
  560. package/src/routes/_nav/knowledge/laws/index.lazy.tsx +14 -15
  561. package/src/routes/_nav/knowledge/summary/index.lazy.tsx +31 -32
  562. package/src/routes/_nav/notifications/route.lazy.tsx +3 -4
  563. package/src/routes/_nav/notifications/route.tsx +2 -0
  564. package/src/routes/_nav/notion-like/route.tsx +2 -3
  565. package/src/routes/_nav/prd/$id/route.tsx +9 -0
  566. package/src/routes/_nav/prd/index.tsx +9 -0
  567. package/src/routes/_nav/prd/route.tsx +8 -0
  568. package/src/routes/_nav/pricing-02/route.tsx +2 -3
  569. package/src/routes/_nav/projects/$projectId/$storyId/route.lazy.tsx +23 -24
  570. package/src/routes/_nav/projects/$projectId/index.lazy.tsx +54 -74
  571. package/src/routes/_nav/projects/$projectId/iterations/$iterationId/route.lazy.tsx +27 -30
  572. package/src/routes/_nav/projects/$projectId/iterations/index.lazy.tsx +9 -10
  573. package/src/routes/_nav/projects/$projectId/route.tsx +4 -2
  574. package/src/routes/_nav/projects/$projectId/settings/route.lazy.tsx +40 -41
  575. package/src/routes/_nav/route.tsx +13 -16
  576. package/src/routes/_nav/settings/-settings-tabs.tsx +24 -51
  577. package/src/routes/_nav/settings/account/route.lazy.tsx +1 -9
  578. package/src/routes/_nav/settings/ai/index/route.lazy.tsx +5 -6
  579. package/src/routes/_nav/settings/billing/route.lazy.tsx +4 -5
  580. package/src/routes/_nav/settings/connection/route.lazy.tsx +14 -10
  581. package/src/routes/_nav/settings/design/route.lazy.tsx +21 -22
  582. package/src/routes/_nav/settings/general/route.lazy.tsx +10 -11
  583. package/src/routes/_nav/settings/notifications/route.lazy.tsx +3 -5
  584. package/src/routes/_nav/settings/privacy/route.lazy.tsx +15 -16
  585. package/src/routes/_nav/settings/route.lazy.tsx +2 -3
  586. package/src/routes/_nav/settings/route.tsx +10 -15
  587. package/src/routes/_nav/settings/team/route.lazy.tsx +1 -9
  588. package/src/routes/_nav/tags/$id/route.tsx +8 -0
  589. package/src/routes/_nav/tags/index.tsx +8 -0
  590. package/src/routes/_nav/tags/route.tsx +8 -0
  591. package/src/routes/_nav/tags/settings/route.tsx +9 -0
  592. package/src/routes/_nav/test-cases/route.tsx +2 -3
  593. package/src/routes/_nav/workspaces/$workspaceId/activities/route.lazy.tsx +69 -0
  594. package/src/routes/_nav/workspaces/$workspaceId/activities/route.tsx +28 -0
  595. package/src/routes/_nav/workspaces/$workspaceId/route.lazy.tsx +194 -99
  596. package/src/routes/_nav/workspaces/$workspaceId/route.tsx +12 -3
  597. package/src/routes/_nav/workspaces/$workspaceId/settings/route.lazy.tsx +75 -61
  598. package/src/routes/_nav/workspaces/index.lazy.tsx +196 -22
  599. package/src/routes/_nav/workspaces/route.tsx +2 -0
  600. package/src/routes/_public/index/route.tsx +5 -1
  601. package/src/routes/invite/$token/route.lazy.tsx +36 -37
  602. package/src/routes/share/$versionId/route.lazy.tsx +4 -11
  603. package/src/routes/share/compliance/$id/route.lazy.tsx +6 -8
  604. package/src/routes/share/law/$id/route.lazy.tsx +6 -8
  605. package/src/routes/share/prd/$prdId/route.tsx +10 -0
  606. package/src/server/__tests__/agent-client-graph.test.ts +4 -8
  607. package/src/server/ai-ports.ts +7 -6
  608. package/src/server/builtin-project.ts +43 -0
  609. package/src/server/design/sketch/file-storage.ts +1 -1
  610. package/src/server/pro-services.ts +1 -1
  611. package/src/server/serverFns/__tests__/workspace.test.ts +101 -0
  612. package/src/server/serverFns/activity.ts +15 -9
  613. package/src/server/serverFns/knowledge-public/bookmarks/list.ts +1 -1
  614. package/src/server/serverFns/knowledge-public/bookmarks/share.ts +3 -3
  615. package/src/server/serverFns/knowledge-public/compliance/share.ts +3 -3
  616. package/src/server/serverFns/knowledge-public/dictionary/share.ts +3 -3
  617. package/src/server/serverFns/knowledge-public/legal/share.ts +3 -3
  618. package/src/server/serverFns/knowledge.ts +27 -2
  619. package/src/server/serverFns/notifications.ts +3 -0
  620. package/src/server/serverFns/project.ts +48 -35
  621. package/src/server/serverFns/story/story-crud/bulk.ts +2 -2
  622. package/src/server/serverFns/story/story-crud.ts +9 -7
  623. package/src/server/serverFns/story/story-groups.ts +6 -6
  624. package/src/server/serverFns/workspace.ts +334 -13
  625. package/src/server-entry.ts +29 -0
  626. package/vite.shared.ts +4 -1
  627. package/src/components/layout/sidebar-03/logo.tsx +0 -41
  628. package/src/i18n/__tests__/detect.test.ts +0 -48
  629. package/src/i18n/__tests__/integration.test.tsx +0 -32
  630. package/src/i18n/__tests__/server.test.ts +0 -33
  631. package/src/i18n/client.ts +0 -32
  632. package/src/i18n/config.ts +0 -116
  633. package/src/i18n/detect.ts +0 -43
  634. package/src/i18n/locales/en/agents.json +0 -134
  635. package/src/i18n/locales/en/apps.json +0 -6
  636. package/src/i18n/locales/en/auth.json +0 -90
  637. package/src/i18n/locales/en/billing.json +0 -78
  638. package/src/i18n/locales/en/chat.json +0 -194
  639. package/src/i18n/locales/en/common.json +0 -242
  640. package/src/i18n/locales/en/dashboard.json +0 -38
  641. package/src/i18n/locales/en/design.json +0 -70
  642. package/src/i18n/locales/en/desktop.json +0 -35
  643. package/src/i18n/locales/en/display.json +0 -37
  644. package/src/i18n/locales/en/editor.json +0 -304
  645. package/src/i18n/locales/en/enterprise.json +0 -1
  646. package/src/i18n/locales/en/invite.json +0 -56
  647. package/src/i18n/locales/en/iterations.json +0 -92
  648. package/src/i18n/locales/en/knowledge.json +0 -462
  649. package/src/i18n/locales/en/mindmap.json +0 -28
  650. package/src/i18n/locales/en/notifications.json +0 -79
  651. package/src/i18n/locales/en/prd.json +0 -51
  652. package/src/i18n/locales/en/projects.json +0 -140
  653. package/src/i18n/locales/en/settings.json +0 -428
  654. package/src/i18n/locales/en/share.json +0 -20
  655. package/src/i18n/locales/en/story.json +0 -923
  656. package/src/i18n/locales/en/tags.json +0 -42
  657. package/src/i18n/locales/en/workspace.json +0 -90
  658. package/src/i18n/locales/zh/agents.json +0 -134
  659. package/src/i18n/locales/zh/apps.json +0 -6
  660. package/src/i18n/locales/zh/auth.json +0 -90
  661. package/src/i18n/locales/zh/billing.json +0 -78
  662. package/src/i18n/locales/zh/chat.json +0 -194
  663. package/src/i18n/locales/zh/common.json +0 -242
  664. package/src/i18n/locales/zh/dashboard.json +0 -38
  665. package/src/i18n/locales/zh/design.json +0 -70
  666. package/src/i18n/locales/zh/desktop.json +0 -35
  667. package/src/i18n/locales/zh/display.json +0 -37
  668. package/src/i18n/locales/zh/editor.json +0 -304
  669. package/src/i18n/locales/zh/enterprise.json +0 -1
  670. package/src/i18n/locales/zh/invite.json +0 -56
  671. package/src/i18n/locales/zh/iterations.json +0 -92
  672. package/src/i18n/locales/zh/knowledge.json +0 -462
  673. package/src/i18n/locales/zh/mindmap.json +0 -28
  674. package/src/i18n/locales/zh/notifications.json +0 -79
  675. package/src/i18n/locales/zh/prd.json +0 -51
  676. package/src/i18n/locales/zh/projects.json +0 -140
  677. package/src/i18n/locales/zh/settings.json +0 -428
  678. package/src/i18n/locales/zh/share.json +0 -20
  679. package/src/i18n/locales/zh/story.json +0 -923
  680. package/src/i18n/locales/zh/tags.json +0 -42
  681. package/src/i18n/locales/zh/workspace.json +0 -90
  682. package/src/i18n/server.ts +0 -18
  683. package/src/i18n/types.ts +0 -5
  684. package/src/server/serverFns/locale.ts +0 -20
@@ -1,6 +1,5 @@
1
1
  import { useEffect, useState } from "react"
2
2
  import { useMutation, useQueryClient } from "@tanstack/react-query"
3
- import { useTranslation } from "react-i18next"
4
3
  import { toast } from '@/components/ui/sonner'
5
4
  import { Input } from "@/components/ui/input"
6
5
  import { Label } from "@/components/ui/label"
@@ -14,6 +13,7 @@ import {
14
13
  DialogTitle,
15
14
  } from "@/components/ui/dialog"
16
15
  import { createCustomProviderFn } from "@/server/serverFns/ai/providers"
16
+ import { m } from "@/paraglide/messages.js";
17
17
 
18
18
  interface FormState {
19
19
  displayName: string
@@ -37,7 +37,6 @@ export function CreateCustomProviderDialog({
37
37
  onOpenChange: (v: boolean) => void
38
38
  }) {
39
39
  const [form, setForm] = useState<FormState>(EMPTY_FORM)
40
- const { t } = useTranslation("settings")
41
40
  const queryClient = useQueryClient()
42
41
 
43
42
  useEffect(() => {
@@ -58,20 +57,20 @@ export function CreateCustomProviderDialog({
58
57
  onOpenChange(false)
59
58
  await queryClient.invalidateQueries({ queryKey: ["ai-providers"] })
60
59
  await queryClient.invalidateQueries({ queryKey: ["ai-enabled-models"] })
61
- toast.success(t("ai.providerCreated"))
60
+ toast.success(m.settings_ai_providerCreated())
62
61
  },
63
62
  onError: (err) => {
64
- toast.error(err instanceof Error ? err.message : t("ai.operationFailed"))
63
+ toast.error(err instanceof Error ? err.message : m.settings_ai_operationFailed())
65
64
  },
66
65
  })
67
66
 
68
67
  const handleSubmit = () => {
69
68
  if (!form.displayName.trim()) {
70
- toast.error(`${t("ai.customProviderName")} 不能为空`)
69
+ toast.error(`${m.settings_ai_customProviderName()} 不能为空`)
71
70
  return
72
71
  }
73
72
  if (!form.defaultModel.trim()) {
74
- toast.error(`${t("ai.customDefaultModel")} 不能为空`)
73
+ toast.error(`${m.settings_ai_customDefaultModel()} 不能为空`)
75
74
  return
76
75
  }
77
76
  mutation.mutate()
@@ -86,31 +85,31 @@ export function CreateCustomProviderDialog({
86
85
  <Dialog open={open} onOpenChange={onOpenChange}>
87
86
  <DialogContent className="sm:max-w-md">
88
87
  <DialogHeader>
89
- <DialogTitle>{t("ai.createCustomProvider")}</DialogTitle>
88
+ <DialogTitle>{m.settings_ai_createCustomProvider()}</DialogTitle>
90
89
  <DialogDescription>
91
- {t("ai.createCustomProviderDescription")}
90
+ {m.settings_ai_createCustomProviderDescription()}
92
91
  </DialogDescription>
93
92
  </DialogHeader>
94
93
 
95
94
  <div className="grid gap-4">
96
95
  <div className="grid gap-1.5">
97
- <Label>{t("ai.customProviderName")} <span className="text-red-500">*</span></Label>
96
+ <Label>{m.settings_ai_customProviderName()} <span className="text-red-500">*</span></Label>
98
97
  <Input
99
98
  value={form.displayName}
100
99
  onChange={(e) => update("displayName", e.target.value)}
101
- placeholder={t("ai.customProviderNamePlaceholder")}
100
+ placeholder={m.settings_ai_customProviderNamePlaceholder()}
102
101
  />
103
102
  </div>
104
103
  <div className="grid gap-1.5">
105
- <Label>{t("ai.customBaseUrl")}</Label>
104
+ <Label>{m.settings_ai_customBaseUrl()}</Label>
106
105
  <Input
107
106
  value={form.baseUrl}
108
107
  onChange={(e) => update("baseUrl", e.target.value)}
109
- placeholder={t("ai.customBaseUrlPlaceholder")}
108
+ placeholder={m.settings_ai_customBaseUrlPlaceholder()}
110
109
  />
111
110
  </div>
112
111
  <div className="grid gap-1.5">
113
- <Label>{t("ai.customApiKey")}</Label>
112
+ <Label>{m.settings_ai_customApiKey()}</Label>
114
113
  <Input
115
114
  type="password"
116
115
  value={form.apiKey}
@@ -119,11 +118,11 @@ export function CreateCustomProviderDialog({
119
118
  />
120
119
  </div>
121
120
  <div className="grid gap-1.5">
122
- <Label>{t("ai.customDefaultModel")} <span className="text-red-500">*</span></Label>
121
+ <Label>{m.settings_ai_customDefaultModel()} <span className="text-red-500">*</span></Label>
123
122
  <Input
124
123
  value={form.defaultModel}
125
124
  onChange={(e) => update("defaultModel", e.target.value)}
126
- placeholder={t("ai.customDefaultModelPlaceholder")}
125
+ placeholder={m.settings_ai_customDefaultModelPlaceholder()}
127
126
  />
128
127
  </div>
129
128
  </div>
@@ -136,7 +135,7 @@ export function CreateCustomProviderDialog({
136
135
  onClick={handleSubmit}
137
136
  disabled={mutation.isPending || !isValid}
138
137
  >
139
- {mutation.isPending ? t("ai.creatingProvider") : t("ai.createProvider")}
138
+ {mutation.isPending ? m.settings_ai_creatingProvider() : m.settings_ai_createProvider()}
140
139
  </Button>
141
140
  </DialogFooter>
142
141
  </DialogContent>
@@ -26,7 +26,23 @@ import { Badge } from "@/components/ui/badge"
26
26
  import { Switch } from "@/components/ui/switch"
27
27
  import { cn } from "@/lib/utils"
28
28
  import { ProviderLogo } from "./provider-logo"
29
- import { useTranslation } from "react-i18next"
29
+ import { m } from "@/paraglide/messages.js";
30
+
31
+ const TAG_LABELS: Record<string, () => string> = {
32
+ custom: m.settings_ai_tagLabels_custom,
33
+ flagship: m.settings_ai_tagLabels_flagship,
34
+ fast: m.settings_ai_tagLabels_fast,
35
+ recommended: m.settings_ai_tagLabels_recommended,
36
+ apiFetched: m.settings_ai_tagLabels_apiFetched,
37
+ };
38
+
39
+ const CAPABILITY_LABELS: Record<string, () => string> = {
40
+ text: m.settings_ai_capabilitiesMap_text,
41
+ vision: m.settings_ai_capabilitiesMap_vision,
42
+ tools: m.settings_ai_capabilitiesMap_tools,
43
+ reasoning: m.settings_ai_capabilitiesMap_reasoning,
44
+ audio: m.settings_ai_capabilitiesMap_audio,
45
+ };
30
46
 
31
47
  /** 自定义标签预设配色,未命中的 fallback 到 muted */
32
48
  const TAG_STYLES: Record<string, string> = {
@@ -99,9 +115,9 @@ function ModelIcon({
99
115
  return <ProviderLogo provider={provider} size={size} />
100
116
  }
101
117
 
102
- function formatPrice(price?: number, t?: (k: string) => string): string {
118
+ function formatPrice(price?: number): string {
103
119
  if (price === undefined || price === null) return "—"
104
- if (price === 0) return t ? t("ai.freePrice") : "Free"
120
+ if (price === 0) return m.settings_ai_freePrice()
105
121
  return `$${price}`
106
122
  }
107
123
 
@@ -124,7 +140,6 @@ export function ModelCard({
124
140
  }) {
125
141
  const tags = model.tags ?? []
126
142
  const caps = model.capabilities ?? []
127
- const { t } = useTranslation("settings")
128
143
 
129
144
  return (
130
145
  <div
@@ -138,7 +153,7 @@ export function ModelCard({
138
153
  ref={dragHandleRef}
139
154
  type="button"
140
155
  className="-ml-1 flex size-6 shrink-0 cursor-grab items-center justify-center text-muted-foreground hover:text-foreground active:cursor-grabbing"
141
- aria-label={t("ai.dragToSort")}
156
+ aria-label={m.settings_ai_dragToSort()}
142
157
  >
143
158
  <GripVertical className="size-4" />
144
159
  </button>
@@ -162,7 +177,7 @@ export function ModelCard({
162
177
  TAG_STYLES[tagKey] ?? "",
163
178
  )}
164
179
  >
165
- {t(`ai.tagLabels.${tagKey}`, { defaultValue: tag })}
180
+ {TAG_LABELS[tagKey]?.() ?? tag}
166
181
  </Badge>
167
182
  );
168
183
  })}
@@ -172,7 +187,7 @@ export function ModelCard({
172
187
  variant="secondary"
173
188
  className="h-5 shrink-0 px-1.5 text-[10px]"
174
189
  >
175
- {t(`ai.capabilitiesMap.${c}`) ?? c}
190
+ {CAPABILITY_LABELS[c]?.() ?? c}
176
191
  </Badge>
177
192
  ))}
178
193
  </div>
@@ -186,17 +201,17 @@ export function ModelCard({
186
201
  )}
187
202
  <span className="inline-flex items-center gap-0.5">
188
203
  <Coins className="size-3" />
189
- {formatPrice(model.inputPrice, t)} / {formatPrice(model.outputPrice, t)}
204
+ {formatPrice(model.inputPrice)} / {formatPrice(model.outputPrice)}
190
205
  </span>
191
206
  {!!model.contextWindow && (
192
- <span>{t("ai.contextWindowK", { k: Math.round(model.contextWindow / 1000) })}</span>
207
+ <span>{m.settings_ai_contextWindowK({ k: Math.round(model.contextWindow / 1000) })}</span>
193
208
  )}
194
209
  </div>
195
210
  </div>
196
211
  <Switch
197
212
  checked={active}
198
213
  onCheckedChange={(next) => onToggle(model.id, next)}
199
- aria-label={t("ai.toggleModel", { name: model.displayName })}
214
+ aria-label={m.settings_ai_toggleModel({ name: model.displayName })}
200
215
  />
201
216
  </div>
202
217
  )
@@ -17,7 +17,6 @@
17
17
 
18
18
  import { useMemo, useState } from "react"
19
19
  import { useMutation } from "@tanstack/react-query"
20
- import { useTranslation } from "react-i18next"
21
20
  import { toast } from '@/components/ui/sonner'
22
21
  import { DragDropProvider, type DragEndEvent } from "@dnd-kit/react"
23
22
  import { useSortable } from "@dnd-kit/react/sortable"
@@ -36,6 +35,16 @@ import { cn } from "@/lib/utils"
36
35
  import { ModelCard } from "./model-card"
37
36
  import { CreateCustomModelDialog } from "./create-custom-model-dialog"
38
37
  import { refreshModelsFn } from "@/server/serverFns/ai/providers"
38
+ import { m } from "@/paraglide/messages.js";
39
+
40
+ const TAB_LABELS: Record<string, () => string> = {
41
+ all: m.settings_ai_tabs_all,
42
+ text: m.settings_ai_tabs_text,
43
+ reasoning: m.settings_ai_tabs_reasoning,
44
+ vision: m.settings_ai_tabs_vision,
45
+ tools: m.settings_ai_tabs_tools,
46
+ video: m.settings_ai_tabs_video,
47
+ };
39
48
 
40
49
  function arrayMove<T>(arr: T[], from: number, to: number): T[] {
41
50
  const copy = [...arr]
@@ -120,7 +129,6 @@ export function ModelManager({
120
129
  const [activeTab, setActiveTab] = useState<ModelTab>("all")
121
130
  const [search, setSearch] = useState("")
122
131
  const [createOpen, setCreateOpen] = useState(false)
123
- const { t } = useTranslation("settings")
124
132
 
125
133
  const allModels = useMemo(
126
134
  () => dedupeById([...globalModels, ...customModels]),
@@ -157,7 +165,7 @@ export function ModelManager({
157
165
  onChanged?.()
158
166
  },
159
167
  onError: (err) =>
160
- toast.error(err instanceof Error ? err.message : t("ai.fetchFailed")),
168
+ toast.error(err instanceof Error ? err.message : m.settings_ai_fetchFailed()),
161
169
  })
162
170
 
163
171
  function toggle(id: string, next: boolean) {
@@ -210,9 +218,9 @@ export function ModelManager({
210
218
  <div className="space-y-4">
211
219
  <div className="flex flex-wrap items-center gap-2">
212
220
  <div className="text-sm text-muted-foreground">
213
- {t("ai.totalModels", { count: allModels.length })}
221
+ {m.settings_ai_totalModels({ count: allModels.length })}
214
222
  {customModels.length > 0 && (
215
- <span className="text-[11px]">{t("ai.includesCustom", { count: customModels.length })}</span>
223
+ <span className="text-[11px]">{m.settings_ai_includesCustom({ count: customModels.length })}</span>
216
224
  )}
217
225
  </div>
218
226
  <div className="relative ml-auto">
@@ -220,7 +228,7 @@ export function ModelManager({
220
228
  <Input
221
229
  value={search}
222
230
  onChange={(e) => setSearch(e.target.value)}
223
- placeholder={t("ai.searchModels")}
231
+ placeholder={m.settings_ai_searchModels()}
224
232
  className="h-9 w-56 pl-9"
225
233
  />
226
234
  </div>
@@ -235,11 +243,11 @@ export function ModelManager({
235
243
  ) : (
236
244
  <RefreshCw className="size-4" data-icon="inline-start" />
237
245
  )}
238
- {t("ai.fetchModels")}
246
+ {m.settings_ai_fetchModels()}
239
247
  </Button>
240
248
  <Button size="sm" onClick={() => setCreateOpen(true)}>
241
249
  <Plus className="size-4" data-icon="inline-start" />
242
- {t("ai.createModel")}
250
+ {m.settings_ai_createModel()}
243
251
  </Button>
244
252
  </div>
245
253
 
@@ -259,7 +267,7 @@ export function ModelManager({
259
267
  : "border-transparent text-muted-foreground hover:text-foreground",
260
268
  )}
261
269
  >
262
- {t(`ai.tabs.${tTab.value}`)}
270
+ {TAB_LABELS[tTab.value]?.() ?? tTab.value}
263
271
  <span className="ml-1 text-[11px] text-muted-foreground">
264
272
  {count}
265
273
  </span>
@@ -271,18 +279,18 @@ export function ModelManager({
271
279
  <div className="space-y-2">
272
280
  <div className="flex items-center justify-between">
273
281
  <div className="flex items-center gap-2">
274
- <h4 className="text-sm font-medium">{t("ai.enabled")}</h4>
282
+ <h4 className="text-sm font-medium">{m.settings_ai_enabled()}</h4>
275
283
  <span className="text-xs text-muted-foreground">
276
284
  {enabledFiltered.length} / {filtered.length}
277
285
  </span>
278
286
  </div>
279
287
  <div className="flex items-center gap-2">
280
- <span className="text-xs text-muted-foreground">{t("ai.enableAll")}</span>
288
+ <span className="text-xs text-muted-foreground">{m.settings_ai_enableAll()}</span>
281
289
  <Switch
282
290
  checked={allEnabledInView}
283
291
  onCheckedChange={setAllEnabled}
284
292
  disabled={filtered.length === 0}
285
- aria-label={t("ai.toggleAllFiltered")}
293
+ aria-label={m.settings_ai_toggleAllFiltered()}
286
294
  />
287
295
  <Button
288
296
  variant="ghost"
@@ -292,15 +300,15 @@ export function ModelManager({
292
300
  disabled={enabledFiltered.length === 0}
293
301
  >
294
302
  <Power className="size-3.5" />
295
- {t("ai.disableAll")}
303
+ {m.settings_ai_disableAll()}
296
304
  </Button>
297
305
  </div>
298
306
  </div>
299
307
  {enabledFiltered.length === 0 ? (
300
308
  <p className="rounded-lg border border-dashed py-6 text-center text-xs text-muted-foreground">
301
309
  {search || activeTab !== "all"
302
- ? t("ai.noEnabledInFilter")
303
- : t("ai.noEnabledYet")}
310
+ ? m.settings_ai_noEnabledInFilter()
311
+ : m.settings_ai_noEnabledYet()}
304
312
  </p>
305
313
  ) : (
306
314
  <DragDropProvider onDragEnd={handleDragEnd}>
@@ -323,7 +331,7 @@ export function ModelManager({
323
331
  {disabledFiltered.length > 0 && (
324
332
  <div className="space-y-2">
325
333
  <div className="flex items-center gap-2">
326
- <h4 className="text-sm font-medium">{t("ai.disabled")}</h4>
334
+ <h4 className="text-sm font-medium">{m.settings_ai_disabled()}</h4>
327
335
  <span className="text-xs text-muted-foreground">
328
336
  {disabledFiltered.length}
329
337
  </span>
@@ -19,7 +19,6 @@
19
19
  import { useMutation } from "@tanstack/react-query"
20
20
  import { Link, useRouter } from "@tanstack/react-router"
21
21
  import { AlertTriangle, Check } from "lucide-react"
22
- import { useTranslation } from "react-i18next"
23
22
  import { toast } from '@/components/ui/sonner'
24
23
  import type { AiProviderMeta } from "@allbluecn/kernel"
25
24
  import { PROVIDER_BADGE_STYLES } from "@allbluecn/kernel"
@@ -28,6 +27,7 @@ import { Switch } from "@/components/ui/switch"
28
27
  import { cn } from "@/lib/utils"
29
28
  import { updateAiProviderFn } from "@/server/serverFns/ai/providers"
30
29
  import { ProviderIcon } from "./provider-icon"
30
+ import { m } from "@/paraglide/messages.js";
31
31
 
32
32
  export type ProviderCardData = {
33
33
  meta: AiProviderMeta
@@ -47,8 +47,6 @@ export function ProviderCard({ data }: { data: ProviderCardData }) {
47
47
  const isReady = config.enabled && (config.hasKey || meta.isLocal)
48
48
  const modelCount = config.models.length > 0 ? config.models.length : meta.models.length
49
49
  const router = useRouter()
50
- const { t } = useTranslation("settings")
51
-
52
50
  const toggleMutation = useMutation({
53
51
  mutationFn: (enabled: boolean) =>
54
52
  updateAiProviderFn({ data: { providerId: meta.providerId, enabled } }),
@@ -56,7 +54,7 @@ export function ProviderCard({ data }: { data: ProviderCardData }) {
56
54
  await router.invalidate()
57
55
  },
58
56
  onError: (err) =>
59
- toast.error(err instanceof Error ? err.message : t("ai.operationFailed")),
57
+ toast.error(err instanceof Error ? err.message : m.settings_ai_operationFailed()),
60
58
  })
61
59
 
62
60
  const badgeStyle = meta.badge
@@ -79,12 +77,12 @@ export function ProviderCard({ data }: { data: ProviderCardData }) {
79
77
  {isReady ? (
80
78
  <Badge variant="default" className="gap-1">
81
79
  <Check className="size-3" />
82
- {t("ai.providerEnabled")}
80
+ {m.settings_ai_providerEnabled()}
83
81
  </Badge>
84
82
  ) : isConfigured ? (
85
- <Badge variant="secondary">{t("ai.providerConfigured")}</Badge>
83
+ <Badge variant="secondary">{m.settings_ai_providerConfigured()}</Badge>
86
84
  ) : (
87
- <Badge variant="outline">{meta.isLocal ? t("ai.providerLocal") : t("ai.providerNotConfigured")}</Badge>
85
+ <Badge variant="outline">{meta.isLocal ? m.settings_ai_providerLocal() : m.settings_ai_providerNotConfigured()}</Badge>
88
86
  )}
89
87
  </div>
90
88
 
@@ -99,7 +97,7 @@ export function ProviderCard({ data }: { data: ProviderCardData }) {
99
97
  {!platformEnabled && (
100
98
  <AlertTriangle
101
99
  className="size-3.5 text-amber-500"
102
- aria-label={t("ai.platformDepreciated")}
100
+ aria-label={m.settings_ai_platformDepreciated()}
103
101
  />
104
102
  )}
105
103
  </div>
@@ -107,7 +105,7 @@ export function ProviderCard({ data }: { data: ProviderCardData }) {
107
105
  </div>
108
106
 
109
107
  <div className="mt-auto flex items-center justify-between text-xs text-muted-foreground">
110
- <span>{t("ai.modelCount", { count: modelCount })}</span>
108
+ <span>{m.settings_ai_modelCount({ count: modelCount })}</span>
111
109
  <div
112
110
  className="flex items-center gap-1.5"
113
111
  onClick={(e) => e.preventDefault()}
@@ -115,14 +113,14 @@ export function ProviderCard({ data }: { data: ProviderCardData }) {
115
113
  <Switch
116
114
  checked={config.enabled}
117
115
  onCheckedChange={(checked) => toggleMutation.mutate(checked)}
118
- aria-label={config.enabled ? t("ai.disable") : t("ai.enable")}
116
+ aria-label={config.enabled ? m.settings_ai_disable() : m.settings_ai_enable()}
119
117
  />
120
118
  </div>
121
119
  </div>
122
120
 
123
121
  {!platformEnabled && (
124
122
  <p className="rounded bg-amber-500/10 px-2 py-1 text-[10px] text-amber-700 dark:text-amber-400">
125
- {t("ai.platformDepreciatedNotice")}
123
+ {m.settings_ai_platformDepreciatedNotice()}
126
124
  </p>
127
125
  )}
128
126
  </Link>
@@ -31,7 +31,6 @@ import {
31
31
  Zap,
32
32
  } from "lucide-react"
33
33
  import { toast } from "@/components/ui/sonner"
34
- import { useTranslation } from "react-i18next"
35
34
  import type { AiModelMeta, AiProviderMeta } from "@allbluecn/kernel"
36
35
  import { Button } from "@/components/ui/button"
37
36
  import { Input } from "@/components/ui/input"
@@ -61,6 +60,7 @@ import {
61
60
  providerDetailSchema,
62
61
  type ProviderDetailValues,
63
62
  } from "./schemas/provider-detail"
63
+ import { m } from "@/paraglide/messages.js";
64
64
 
65
65
  export type ProviderDetail = Awaited<ReturnType<typeof getAiProviderFn>>
66
66
 
@@ -75,7 +75,6 @@ type PersistData = {
75
75
  type SaveState = "idle" | "saving" | "saved" | "error"
76
76
 
77
77
  export function ProviderDetailForm({ initial }: { initial: ProviderDetail }) {
78
- const { t } = useTranslation("settings")
79
78
  const router = useRouter()
80
79
  const meta = initial.meta as AiProviderMeta
81
80
  const initialConfig = initial.config
@@ -118,7 +117,7 @@ export function ProviderDetailForm({ initial }: { initial: ProviderDetail }) {
118
117
  onError: (err) => {
119
118
  setSaveState("error")
120
119
  toast.error(
121
- t("ai.saveFailedReason", { message: err instanceof Error ? err.message : t("ai.unknownError") }),
120
+ m.settings_ai_saveFailedReason({ message: err instanceof Error ? err.message : m.settings_ai_unknownError() }),
122
121
  )
123
122
  },
124
123
  })
@@ -151,12 +150,12 @@ export function ProviderDetailForm({ initial }: { initial: ProviderDetail }) {
151
150
  mutationFn: (providerId: string) =>
152
151
  deleteAiProviderConfigFn({ data: { providerId } }),
153
152
  onSuccess: () => {
154
- toast.success(t("ai.configDeleted"))
153
+ toast.success(m.settings_ai_configDeleted())
155
154
  router.navigate({ to: "/settings/ai" })
156
155
  },
157
156
  onError: (err) =>
158
157
  toast.error(
159
- t("ai.deleteFailedReason", { message: err instanceof Error ? err.message : t("ai.unknownError") }),
158
+ m.settings_ai_deleteFailedReason({ message: err instanceof Error ? err.message : m.settings_ai_unknownError() }),
160
159
  ),
161
160
  })
162
161
 
@@ -174,7 +173,7 @@ export function ProviderDetailForm({ initial }: { initial: ProviderDetail }) {
174
173
  else toast.error(result.message)
175
174
  },
176
175
  onError: (err) =>
177
- toast.error(t("ai.testFailedReason", { message: err instanceof Error ? err.message : t("ai.unknownError") })),
176
+ toast.error(m.settings_ai_testFailedReason({ message: err instanceof Error ? err.message : m.settings_ai_unknownError() })),
178
177
  })
179
178
 
180
179
  function handleApiKeyBlur() {
@@ -192,7 +191,7 @@ export function ProviderDetailForm({ initial }: { initial: ProviderDetail }) {
192
191
  <div className="space-y-6">
193
192
  <div className="flex items-center gap-2">
194
193
  <Button asChild variant="ghost" size="icon">
195
- <Link to="/settings/ai" aria-label={t("ai.back")}>
194
+ <Link to="/settings/ai" aria-label={m.settings_ai_back()}>
196
195
  <ArrowLeft className="size-4" />
197
196
  </Link>
198
197
  </Button>
@@ -204,8 +203,8 @@ export function ProviderDetailForm({ initial }: { initial: ProviderDetail }) {
204
203
  <div className="flex items-start gap-2 rounded-lg border border-amber-500/30 bg-amber-500/10 p-3 text-xs text-amber-700 dark:text-amber-400">
205
204
  <AlertTriangle className="mt-0.5 size-4 shrink-0" />
206
205
  <div>
207
- <p className="font-medium">{t("ai.platformDelistedTitle")}</p>
208
- <p>{t("ai.platformDelistedDesc")}</p>
206
+ <p className="font-medium">{m.settings_ai_platformDelistedTitle()}</p>
207
+ <p>{m.settings_ai_platformDelistedDesc()}</p>
209
208
  </div>
210
209
  </div>
211
210
  )}
@@ -221,10 +220,10 @@ export function ProviderDetailForm({ initial }: { initial: ProviderDetail }) {
221
220
  {meta.category === "recommended" && (
222
221
  <Badge variant="default" className="gap-1">
223
222
  <Sparkles className="size-3" />
224
- {t("ai.recommended")}
223
+ {m.settings_ai_recommended()}
225
224
  </Badge>
226
225
  )}
227
- {meta.isLocal && <Badge variant="secondary">{t("ai.providerLocal")}</Badge>}
226
+ {meta.isLocal && <Badge variant="secondary">{m.settings_ai_providerLocal()}</Badge>}
228
227
  <Badge
229
228
  variant={enabledValue ? "default" : "outline"}
230
229
  className={cn(
@@ -234,7 +233,7 @@ export function ProviderDetailForm({ initial }: { initial: ProviderDetail }) {
234
233
  : "text-muted-foreground",
235
234
  )}
236
235
  >
237
- {enabledValue ? t("ai.enabled") : t("ai.disabled")}
236
+ {enabledValue ? m.settings_ai_enabled() : m.settings_ai_disabled()}
238
237
  </Badge>
239
238
  </div>
240
239
  <p className="text-sm text-muted-foreground">{meta.description}</p>
@@ -247,7 +246,7 @@ export function ProviderDetailForm({ initial }: { initial: ProviderDetail }) {
247
246
  className="inline-flex items-center gap-1 text-primary hover:underline"
248
247
  >
249
248
  <ExternalLink className="size-3" />
250
- {t("ai.docs")}
249
+ {m.settings_ai_docs()}
251
250
  </a>
252
251
  )}
253
252
  {meta.keyUrl && !meta.isLocal && (
@@ -258,7 +257,7 @@ export function ProviderDetailForm({ initial }: { initial: ProviderDetail }) {
258
257
  className="inline-flex items-center gap-1 text-primary hover:underline"
259
258
  >
260
259
  <ExternalLink className="size-3" />
261
- {t("ai.getApiKey")}
260
+ {m.settings_ai_getApiKey()}
262
261
  </a>
263
262
  )}
264
263
  </div>
@@ -273,7 +272,7 @@ export function ProviderDetailForm({ initial }: { initial: ProviderDetail }) {
273
272
  field.handleChange(!!next)
274
273
  persistImmediate({ enabled: !!next })
275
274
  }}
276
- aria-label={t("ai.enableProvider")}
275
+ aria-label={m.settings_ai_enableProvider()}
277
276
  />
278
277
  </div>
279
278
  )}
@@ -281,7 +280,7 @@ export function ProviderDetailForm({ initial }: { initial: ProviderDetail }) {
281
280
  </div>
282
281
 
283
282
  <FieldSet>
284
- <FieldLegend>{t("ai.setupConfig")}</FieldLegend>
283
+ <FieldLegend>{m.settings_ai_setupConfig()}</FieldLegend>
285
284
 
286
285
  <FieldGroup>
287
286
  <ApiKeyField
@@ -311,9 +310,9 @@ export function ProviderDetailForm({ initial }: { initial: ProviderDetail }) {
311
310
  children={(field) => (
312
311
  <Field orientation="horizontal">
313
312
  <FieldContent>
314
- <FieldLabel>{t("ai.baseUrlLabel")}</FieldLabel>
313
+ <FieldLabel>{m.settings_ai_baseUrlLabel()}</FieldLabel>
315
314
  <FieldDescription className="text-xs space-y-1">
316
- {t("ai.baseUrlHint")}
315
+ {m.settings_ai_baseUrlHint()}
317
316
  {meta.defaultBaseUrl && (
318
317
  <code className="rounded bg-muted px-1.5 py-0.5">
319
318
  {meta.defaultBaseUrl}
@@ -337,9 +336,9 @@ export function ProviderDetailForm({ initial }: { initial: ProviderDetail }) {
337
336
  </FieldSet>
338
337
 
339
338
  <FieldSet className="mt-20">
340
- <FieldLegend>{t("ai.modelManagement")}</FieldLegend>
339
+ <FieldLegend>{m.settings_ai_modelManagement()}</FieldLegend>
341
340
  <FieldDescription className="text-xs">
342
- {t("ai.modelManagementDesc")}
341
+ {m.settings_ai_modelManagementDesc()}
343
342
  </FieldDescription>
344
343
  <ModelManager
345
344
  globalModels={meta.models}
@@ -374,7 +373,7 @@ export function ProviderDetailForm({ initial }: { initial: ProviderDetail }) {
374
373
  }}
375
374
  disabled={!initialConfig.hasKey && !initialConfig.enabled}
376
375
  >
377
- {t("ai.clearConfig")}
376
+ {m.settings_ai_clearConfig()}
378
377
  </Button>
379
378
  <Button
380
379
  variant="outline"
@@ -386,7 +385,7 @@ export function ProviderDetailForm({ initial }: { initial: ProviderDetail }) {
386
385
  ) : (
387
386
  <Zap className="size-4" data-icon="inline-start" />
388
387
  )}
389
- {t("ai.testConnection")}
388
+ {m.settings_ai_testConnection()}
390
389
  </Button>
391
390
  </div>
392
391
  </div>
@@ -394,12 +393,11 @@ export function ProviderDetailForm({ initial }: { initial: ProviderDetail }) {
394
393
  }
395
394
 
396
395
  function SaveStatusIndicator({ state }: { state: SaveState }) {
397
- const { t } = useTranslation("settings")
398
396
  if (state === "saving") {
399
397
  return (
400
398
  <span className="text-xs text-muted-foreground inline-flex items-center gap-1">
401
399
  <Loader2 className="size-3 animate-spin" />
402
- {t("ai.saving")}
400
+ {m.settings_ai_saving()}
403
401
  </span>
404
402
  )
405
403
  }
@@ -407,12 +405,12 @@ function SaveStatusIndicator({ state }: { state: SaveState }) {
407
405
  return (
408
406
  <span className="text-xs text-emerald-600 dark:text-emerald-400 inline-flex items-center gap-1">
409
407
  <Check className="size-3" />
410
- {t("ai.saved")}
408
+ {m.settings_ai_saved()}
411
409
  </span>
412
410
  )
413
411
  }
414
412
  if (state === "error") {
415
- return <span className="text-xs text-destructive">{t("ai.saveShort")}</span>
413
+ return <span className="text-xs text-destructive">{m.settings_ai_saveShort()}</span>
416
414
  }
417
415
  return null
418
416
  }