@nextclaw/ui 0.12.8 → 0.12.10

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 (227) hide show
  1. package/CHANGELOG.md +96 -0
  2. package/dist/assets/ChannelsList-M9FTK1Ak.js +8 -0
  3. package/dist/assets/DocBrowser-CH7-GxlL.js +1 -0
  4. package/dist/assets/{DocBrowser-BMxf9CIK.js → DocBrowser-DMfr0Oow.js} +1 -1
  5. package/dist/assets/{DocBrowserContext-Ce28gRXt.js → DocBrowserContext-BXydqby-.js} +1 -1
  6. package/dist/assets/{LogoBadge-o92MOA2L.js → LogoBadge-hO7tY7hE.js} +1 -1
  7. package/dist/assets/ModelConfig-CNIgLf0e.js +1 -0
  8. package/dist/assets/{ProviderScopedModelInput-CmTIzgI7.js → ProviderScopedModelInput-B3HWP4oz.js} +1 -1
  9. package/dist/assets/ProvidersList-CHjMnRhX.js +1 -0
  10. package/dist/assets/RuntimeConfig-psp8nMSG.js +1 -0
  11. package/dist/assets/SearchConfig-CSoKip1f.js +1 -0
  12. package/dist/assets/{SecretsConfig-Ba1RPJaG.js → SecretsConfig-MEt6MjuD.js} +2 -2
  13. package/dist/assets/SessionsConfig-DifCiXwR.js +2 -0
  14. package/dist/assets/{app-query-client-DniXoIN5.js → app-query-client-9jNewezV.js} +1 -1
  15. package/dist/assets/{book-open-DocgeQtR.js → book-open-DzdUViDm.js} +1 -1
  16. package/dist/assets/chat-page-CLp0UV0Y.js +58 -0
  17. package/dist/assets/chat-session-display-DsYHx0RZ.js +1 -0
  18. package/dist/assets/{chunk-JZWAC4HX-BvKvh1R8.js → chunk-JZWAC4HX-C5dEc8hV.js} +1 -1
  19. package/dist/assets/{client-CVqPF5ie.js → client-C-8fH7-c.js} +1 -1
  20. package/dist/assets/{config-Bop2oB18.js → config-CBScxsdV.js} +1 -1
  21. package/dist/assets/config-split-page-BUout_Ak.js +1 -0
  22. package/dist/assets/{createLucideIcon-DVv8taGY.js → createLucideIcon-dy5ie7Ox.js} +1 -1
  23. package/dist/assets/desktop-update-config-2BS6BMkW.js +1 -0
  24. package/dist/assets/{dist-DmAlInRu.js → dist-BruyLa92.js} +1 -1
  25. package/dist/assets/{dist-Da5Gm_pO.js → dist-Cy7_j6hA.js} +1 -1
  26. package/dist/assets/download-BD0ETkB-.js +1 -0
  27. package/dist/assets/{external-link-DFjw3x1B.js → external-link-kZSAO8nT.js} +1 -1
  28. package/dist/assets/{hash-DJtaCejM.js → hash-BHJC2Ovu.js} +1 -1
  29. package/dist/assets/i18n-CpTZLchQ.js +1 -0
  30. package/dist/assets/index-mW8W2FUu.css +1 -0
  31. package/dist/assets/index-zDZfXoI4.js +6 -0
  32. package/dist/assets/{infiniteQueryBehavior-DHSEQ3OH.js → infiniteQueryBehavior-CyER9hv0.js} +1 -1
  33. package/dist/assets/loader-circle-Bc2gCU33.js +1 -0
  34. package/dist/assets/{logos-DEFUIR12.js → logos-B7gRObP8.js} +1 -1
  35. package/dist/assets/marketplace-page-3qVMnF3d.js +1 -0
  36. package/dist/assets/marketplace-page-BhFIeQzI.js +49 -0
  37. package/dist/assets/mcp-marketplace-page-DYfteJ1D.js +40 -0
  38. package/dist/assets/{page-layout-Da3i3r6G.js → page-layout-0UcO9H9Z.js} +1 -1
  39. package/dist/assets/play-CKDjSQFL.js +1 -0
  40. package/dist/assets/plus-CG0QrVY_.js +1 -0
  41. package/dist/assets/{refresh-ccw-D6HkNtfz.js → refresh-ccw-COVhNHtN.js} +1 -1
  42. package/dist/assets/{refresh-cw-DRcvRrnc.js → refresh-cw-Bcv40SXy.js} +1 -1
  43. package/dist/assets/remote-access-page-CWHG-sug.js +1 -0
  44. package/dist/assets/{rotate-cw-BmDKfXtH.js → rotate-cw-oHMKJMC8.js} +1 -1
  45. package/dist/assets/{save-DHGmi2e9.js → save-EqJPOF0G.js} +1 -1
  46. package/dist/assets/search-BCAlB8nz.js +1 -0
  47. package/dist/assets/security-config-Slh0Mayz.js +1 -0
  48. package/dist/assets/select-CVz0t7MF.js +41 -0
  49. package/dist/assets/setting-row-CbVHAuQt.js +1 -0
  50. package/dist/assets/skeleton-D5rdKvzy.js +1 -0
  51. package/dist/assets/{status-dot-DurKKSwA.js → status-dot-DpPtVzQT.js} +1 -1
  52. package/dist/assets/{switch-0rmPBRKI.js → switch-CM29eCAR.js} +1 -1
  53. package/dist/assets/{tabs-custom-5JLVL6v8.js → tabs-custom-YcZUWn3o.js} +1 -1
  54. package/dist/assets/tag-chip-DMXdnLcj.js +1 -0
  55. package/dist/assets/{trash-2-C6caKPoz.js → trash-2-mJT6oWa2.js} +1 -1
  56. package/dist/assets/{use-infinite-scroll-loader-dwnaa_qi.js → use-infinite-scroll-loader-DJ1L81Dz.js} +1 -1
  57. package/dist/assets/{useConfirmDialog-mMeWD_yo.js → useConfirmDialog-BsVuqu1x.js} +1 -1
  58. package/dist/assets/{useMutation-BmxxvCNf.js → useMutation-CNcz2fgt.js} +1 -1
  59. package/dist/assets/x-Czwxm82I.js +1 -0
  60. package/dist/index.html +95 -21
  61. package/dist/manifest.webmanifest +30 -0
  62. package/dist/offline.html +102 -0
  63. package/dist/pwa-192.png +0 -0
  64. package/dist/pwa-512.png +0 -0
  65. package/dist/runtime-icons/claude.ico +0 -0
  66. package/dist/runtime-icons/codex-openai.svg +6 -0
  67. package/dist/runtime-icons/hermes-agent.png +0 -0
  68. package/dist/sw.js +80 -0
  69. package/index.html +73 -1
  70. package/package.json +5 -5
  71. package/public/manifest.webmanifest +30 -0
  72. package/public/offline.html +102 -0
  73. package/public/pwa-192.png +0 -0
  74. package/public/pwa-512.png +0 -0
  75. package/public/runtime-icons/claude.ico +0 -0
  76. package/public/runtime-icons/codex-openai.svg +6 -0
  77. package/public/runtime-icons/hermes-agent.png +0 -0
  78. package/public/sw.js +80 -0
  79. package/src/account/components/account-panel.tsx +217 -97
  80. package/src/account/managers/account.manager.ts +3 -2
  81. package/src/api/chat-session-type.types.ts +7 -0
  82. package/src/api/runtime-control.types.ts +8 -0
  83. package/src/api/server-path.ts +27 -4
  84. package/src/api/types.ts +25 -10
  85. package/src/app.tsx +227 -54
  86. package/src/components/agents/agent-dialogs.tsx +499 -0
  87. package/src/components/agents/agents-page.test.tsx +238 -0
  88. package/src/components/agents/agents-page.tsx +435 -0
  89. package/src/components/chat/ChatSidebar.test.tsx +43 -1
  90. package/src/components/chat/ChatSidebar.tsx +35 -35
  91. package/src/components/chat/adapters/chat-message.summary-truncation.test.ts +66 -0
  92. package/src/components/chat/adapters/file-operation/card.ts +9 -0
  93. package/src/components/chat/adapters/file-operation/diff.ts +14 -0
  94. package/src/components/chat/{ChatConversationPanel.test.tsx → chat-conversation-panel.test.tsx} +127 -206
  95. package/src/components/chat/chat-conversation-panel.tsx +482 -0
  96. package/src/components/chat/chat-page-shell.tsx +19 -13
  97. package/src/components/chat/chat-session-type-option-item.test.tsx +46 -0
  98. package/src/components/chat/chat-session-type-option-item.tsx +68 -0
  99. package/src/components/chat/chat-session-workspace-file-preview.test.tsx +178 -0
  100. package/src/components/chat/chat-session-workspace-file-preview.tsx +278 -0
  101. package/src/components/chat/chat-session-workspace-panel-nav.tsx +203 -0
  102. package/src/components/chat/chat-session-workspace-panel.tsx +318 -0
  103. package/src/components/chat/chat-sidebar-project-groups.tsx +11 -36
  104. package/src/components/chat/chat-sidebar-session-item.tsx +32 -2
  105. package/src/components/chat/containers/chat-message-list.container.test.tsx +49 -0
  106. package/src/components/chat/containers/chat-message-list.container.tsx +4 -0
  107. package/src/components/chat/managers/chat-session-list.manager.test.ts +12 -0
  108. package/src/components/chat/managers/chat-session-list.manager.ts +7 -0
  109. package/src/components/chat/ncp/__tests__/ncp-session-adapter.cancelled-tool.test.ts +77 -0
  110. package/src/components/chat/ncp/ncp-chat-page.tsx +9 -7
  111. package/src/components/chat/ncp/ncp-chat-thread.manager.ts +179 -41
  112. package/src/components/chat/ncp/ncp-session-adapter.test.ts +36 -1
  113. package/src/components/chat/ncp/ncp-session-adapter.ts +20 -0
  114. package/src/components/chat/ncp/page/ncp-chat-derived-state.ts +62 -13
  115. package/src/components/chat/ncp/tests/ncp-chat-thread.manager.test.ts +189 -0
  116. package/src/components/chat/presenter/chat-presenter-context.tsx +13 -2
  117. package/src/components/chat/session-header/chat-session-header-actions.test.tsx +26 -0
  118. package/src/components/chat/session-header/chat-session-header-actions.tsx +19 -1
  119. package/src/components/chat/stores/chat-input.store.ts +2 -1
  120. package/src/components/chat/stores/chat-thread.store.ts +27 -1
  121. package/src/components/chat/useChatSessionTypeState.ts +10 -1
  122. package/src/components/chat/workspace/chat-session-workspace-file-breadcrumbs.tsx +86 -0
  123. package/src/components/common/BrandHeader.tsx +3 -1
  124. package/src/components/common/session-context-icon.tsx +15 -2
  125. package/src/components/common/{TagInput.tsx → tag-input.tsx} +25 -17
  126. package/src/components/config/ChannelForm.test.tsx +89 -3
  127. package/src/components/config/ChannelForm.tsx +157 -188
  128. package/src/components/config/ChannelsList.test.tsx +163 -119
  129. package/src/components/config/ChannelsList.tsx +90 -101
  130. package/src/components/config/ProviderForm.tsx +108 -146
  131. package/src/components/config/ProvidersList.tsx +100 -123
  132. package/src/components/config/RuntimeConfig.tsx +141 -2
  133. package/src/components/config/SearchConfig.tsx +423 -393
  134. package/src/components/config/channel-form-fields-section.tsx +70 -37
  135. package/src/components/config/config-split-page.tsx +109 -0
  136. package/src/components/config/provider-enabled-field.tsx +17 -10
  137. package/src/components/config/runtime-control-card.test.tsx +56 -0
  138. package/src/components/config/runtime-control-card.tsx +25 -0
  139. package/src/components/config/runtime-presence-card.tsx +93 -79
  140. package/src/components/layout/AppLayout.tsx +25 -37
  141. package/src/components/layout/app-layout.test.tsx +46 -14
  142. package/src/components/layout/runtime-status-entry.test.tsx +157 -0
  143. package/src/components/layout/runtime-status-entry.tsx +143 -0
  144. package/src/components/marketplace/marketplace-detail-doc.ts +93 -0
  145. package/src/components/marketplace/marketplace-list-card.tsx +288 -0
  146. package/src/components/marketplace/marketplace-page-data.ts +129 -0
  147. package/src/components/marketplace/marketplace-page.test.tsx +339 -0
  148. package/src/components/marketplace/marketplace-page.tsx +596 -0
  149. package/src/components/marketplace/mcp/mcp-marketplace-card.tsx +128 -0
  150. package/src/components/marketplace/mcp/mcp-marketplace-dialogs.tsx +191 -0
  151. package/src/components/marketplace/mcp/mcp-marketplace-doc.ts +152 -0
  152. package/src/components/marketplace/mcp/mcp-marketplace-page.test.tsx +223 -0
  153. package/src/components/marketplace/mcp/mcp-marketplace-page.tsx +414 -0
  154. package/src/components/providers/ThemeProvider.tsx +5 -0
  155. package/src/components/remote/remote-access-page.test.tsx +105 -0
  156. package/src/components/remote/remote-access-page.tsx +248 -0
  157. package/src/components/ui/notice-card.tsx +129 -0
  158. package/src/components/ui/setting-row.tsx +51 -0
  159. package/src/components/ui/tag-chip.tsx +39 -0
  160. package/src/components/ui/textarea.tsx +19 -0
  161. package/src/hooks/server-path/use-server-path-read.ts +20 -0
  162. package/src/hooks/useConfig.ts +2 -1
  163. package/src/index.css +24 -0
  164. package/src/lib/app-resource-uri.test.ts +20 -0
  165. package/src/lib/app-resource-uri.ts +29 -0
  166. package/src/lib/chat-message.ts +14 -3
  167. package/src/lib/i18n.chat.ts +12 -1
  168. package/src/lib/i18n.pwa.ts +62 -0
  169. package/src/lib/i18n.remote.ts +1 -1
  170. package/src/lib/i18n.runtime-control.ts +31 -0
  171. package/src/lib/i18n.ts +7 -10
  172. package/src/lib/session-context.utils.test.ts +71 -0
  173. package/src/lib/session-context.utils.ts +28 -3
  174. package/src/lib/session-project/workspace-file-breadcrumb.test.ts +83 -0
  175. package/src/lib/session-project/workspace-file-breadcrumb.ts +188 -0
  176. package/src/pwa/components/pwa-install-entry.test.tsx +110 -0
  177. package/src/pwa/components/pwa-install-entry.tsx +205 -0
  178. package/src/pwa/managers/pwa-install.manager.test.ts +160 -0
  179. package/src/pwa/managers/pwa-install.manager.ts +232 -0
  180. package/src/pwa/managers/pwa-runtime.manager.ts +196 -0
  181. package/src/pwa/managers/pwa-shell-theme.manager.test.ts +30 -0
  182. package/src/pwa/managers/pwa-shell-theme.manager.ts +46 -0
  183. package/src/pwa/pwa-install-banner.storage.ts +55 -0
  184. package/src/pwa/pwa.types.ts +22 -0
  185. package/src/pwa/register-pwa.ts +14 -0
  186. package/src/pwa/stores/pwa.store.ts +17 -0
  187. package/src/vite-env.d.ts +9 -0
  188. package/dist/assets/ChannelsList-KIQIxluX.js +0 -8
  189. package/dist/assets/DocBrowser-CyDgAtO9.js +0 -1
  190. package/dist/assets/MarketplacePage-BySqkYDh.js +0 -49
  191. package/dist/assets/MarketplacePage-C0olZaek.js +0 -1
  192. package/dist/assets/McpMarketplacePage-DqKaiXO9.js +0 -40
  193. package/dist/assets/ModelConfig-IrmzoslW.js +0 -1
  194. package/dist/assets/ProvidersList-8_Kalfwl.js +0 -1
  195. package/dist/assets/RemoteAccessPage-CyQlSjPf.js +0 -1
  196. package/dist/assets/RuntimeConfig-Bk0uYBhf.js +0 -1
  197. package/dist/assets/SearchConfig-DNBR-UbE.js +0 -1
  198. package/dist/assets/SessionsConfig-Doqp5ghH.js +0 -2
  199. package/dist/assets/chat-page-Bph8M5zo.js +0 -58
  200. package/dist/assets/chat-session-display-CoN3Wmn-.js +0 -1
  201. package/dist/assets/config-layout-DmlGaay2.js +0 -1
  202. package/dist/assets/desktop-update-config-1KBrqLBC.js +0 -1
  203. package/dist/assets/i18n-CwHZ-9vt.js +0 -1
  204. package/dist/assets/index-DafCdM4F.css +0 -1
  205. package/dist/assets/index-DdksE6U3.js +0 -6
  206. package/dist/assets/loader-circle-PsSP0H9n.js +0 -1
  207. package/dist/assets/play-DBQbBxTA.js +0 -1
  208. package/dist/assets/plus-DUOVbsyQ.js +0 -1
  209. package/dist/assets/popover-C_mWOFzI.js +0 -1
  210. package/dist/assets/search-MChQRYR1.js +0 -1
  211. package/dist/assets/security-config-CbXfPZzr.js +0 -1
  212. package/dist/assets/select-Caud8QvU.js +0 -41
  213. package/dist/assets/skeleton-B-4vRq_Z.js +0 -1
  214. package/dist/assets/x-DuMhMATD.js +0 -1
  215. package/src/components/agents/AgentDialogs.tsx +0 -400
  216. package/src/components/agents/AgentsPage.test.tsx +0 -217
  217. package/src/components/agents/AgentsPage.tsx +0 -352
  218. package/src/components/chat/ChatConversationPanel.tsx +0 -256
  219. package/src/components/chat/chat-child-session-panel.tsx +0 -270
  220. package/src/components/config/config-layout.ts +0 -10
  221. package/src/components/marketplace/MarketplacePage.test.tsx +0 -322
  222. package/src/components/marketplace/MarketplacePage.tsx +0 -827
  223. package/src/components/marketplace/mcp/McpMarketplacePage.test.tsx +0 -208
  224. package/src/components/marketplace/mcp/McpMarketplacePage.tsx +0 -580
  225. package/src/components/remote/RemoteAccessPage.test.tsx +0 -103
  226. package/src/components/remote/RemoteAccessPage.tsx +0 -144
  227. /package/dist/assets/{config-hints-BZoDjXye.js → config-hints-BhTmc9P1.js} +0 -0
package/src/app.tsx CHANGED
@@ -1,71 +1,234 @@
1
- import { lazy, Suspense } from 'react';
2
- import { QueryClientProvider } from '@tanstack/react-query';
3
- import { AccountPanel } from '@/account/components/account-panel';
4
- import { appQueryClient } from '@/app-query-client';
5
- import { LoginPage } from '@/components/auth/login-page';
6
- import { AppLayout } from '@/components/layout/AppLayout';
7
- import { isTransientAuthStatusBootstrapError, useAuthStatus } from '@/hooks/use-auth';
8
- import { useRealtimeQueryBridge } from '@/hooks/use-realtime-query-bridge';
9
- import { AppPresenterProvider } from '@/presenter/app-presenter-context';
10
- import { Toaster } from 'sonner';
11
- import { Routes, Route, Navigate } from 'react-router-dom';
1
+ import { lazy, Suspense } from "react";
2
+ import { QueryClientProvider } from "@tanstack/react-query";
3
+ import { AccountPanel } from "@/account/components/account-panel";
4
+ import { appQueryClient } from "@/app-query-client";
5
+ import { LoginPage } from "@/components/auth/login-page";
6
+ import { AppLayout } from "@/components/layout/AppLayout";
7
+ import {
8
+ isTransientAuthStatusBootstrapError,
9
+ useAuthStatus,
10
+ } from "@/hooks/use-auth";
11
+ import { useRealtimeQueryBridge } from "@/hooks/use-realtime-query-bridge";
12
+ import { AppPresenterProvider } from "@/presenter/app-presenter-context";
13
+ import {
14
+ PwaInstallBanner,
15
+ PwaUpdateBanner,
16
+ } from "@/pwa/components/pwa-install-entry";
17
+ import { startNextClawPwa } from "@/pwa/register-pwa";
18
+ import { Toaster } from "sonner";
19
+ import { Routes, Route, Navigate } from "react-router-dom";
20
+ import { useEffect } from "react";
12
21
 
13
- const ModelConfigPage = lazy(async () => ({ default: (await import('@/components/config/ModelConfig')).ModelConfig }));
14
- const ChatPage = lazy(async () => ({ default: (await import('@/components/chat/chat-page')).ChatPage }));
15
- const SearchConfigPage = lazy(async () => ({ default: (await import('@/components/config/SearchConfig')).SearchConfig }));
16
- const ProvidersListPage = lazy(async () => ({ default: (await import('@/components/config/ProvidersList')).ProvidersList }));
17
- const ChannelsListPage = lazy(async () => ({ default: (await import('@/components/config/ChannelsList')).ChannelsList }));
18
- const RuntimeConfigPage = lazy(async () => ({ default: (await import('@/components/config/RuntimeConfig')).RuntimeConfig }));
19
- const DesktopUpdateConfigPage = lazy(async () => ({ default: (await import('@/components/config/desktop-update-config')).DesktopUpdateConfig }));
20
- const SecurityConfigPage = lazy(async () => ({ default: (await import('@/components/config/security-config')).SecurityConfig }));
21
- const SessionsConfigPage = lazy(async () => ({ default: (await import('@/components/config/SessionsConfig')).SessionsConfig }));
22
- const SecretsConfigPage = lazy(async () => ({ default: (await import('@/components/config/SecretsConfig')).SecretsConfig }));
23
- const RemoteAccessPage = lazy(async () => ({ default: (await import('@/components/remote/RemoteAccessPage')).RemoteAccessPage }));
24
- const MarketplacePage = lazy(async () => ({ default: (await import('@/components/marketplace/MarketplacePage')).MarketplacePage }));
25
- const McpMarketplacePage = lazy(async () => ({ default: (await import('@/components/marketplace/mcp/McpMarketplacePage')).McpMarketplacePage }));
22
+ const ModelConfigPage = lazy(async () => ({
23
+ default: (await import("@/components/config/ModelConfig")).ModelConfig,
24
+ }));
25
+ const ChatPage = lazy(async () => ({
26
+ default: (await import("@/components/chat/chat-page")).ChatPage,
27
+ }));
28
+ const SearchConfigPage = lazy(async () => ({
29
+ default: (await import("@/components/config/SearchConfig")).SearchConfig,
30
+ }));
31
+ const ProvidersListPage = lazy(async () => ({
32
+ default: (await import("@/components/config/ProvidersList")).ProvidersList,
33
+ }));
34
+ const ChannelsListPage = lazy(async () => ({
35
+ default: (await import("@/components/config/ChannelsList")).ChannelsList,
36
+ }));
37
+ const RuntimeConfigPage = lazy(async () => ({
38
+ default: (await import("@/components/config/RuntimeConfig")).RuntimeConfig,
39
+ }));
40
+ const DesktopUpdateConfigPage = lazy(async () => ({
41
+ default: (await import("@/components/config/desktop-update-config"))
42
+ .DesktopUpdateConfig,
43
+ }));
44
+ const SecurityConfigPage = lazy(async () => ({
45
+ default: (await import("@/components/config/security-config")).SecurityConfig,
46
+ }));
47
+ const SessionsConfigPage = lazy(async () => ({
48
+ default: (await import("@/components/config/SessionsConfig")).SessionsConfig,
49
+ }));
50
+ const SecretsConfigPage = lazy(async () => ({
51
+ default: (await import("@/components/config/SecretsConfig")).SecretsConfig,
52
+ }));
53
+ const RemoteAccessPage = lazy(async () => ({
54
+ default: (await import("@/components/remote/remote-access-page"))
55
+ .RemoteAccessPage,
56
+ }));
57
+ const MarketplacePage = lazy(async () => ({
58
+ default: (await import("@/components/marketplace/marketplace-page"))
59
+ .MarketplacePage,
60
+ }));
61
+ const McpMarketplacePage = lazy(async () => ({
62
+ default: (await import("@/components/marketplace/mcp/mcp-marketplace-page"))
63
+ .McpMarketplacePage,
64
+ }));
26
65
 
27
66
  function RouteFallback() {
28
- return <div className="h-full w-full animate-pulse rounded-2xl border border-border/40 bg-card/40" />;
67
+ return (
68
+ <div className="h-full w-full animate-pulse rounded-2xl border border-border/40 bg-card/40" />
69
+ );
29
70
  }
30
71
 
31
72
  function LazyRoute({ children }: { children: JSX.Element }) {
32
73
  return <Suspense fallback={<RouteFallback />}>{children}</Suspense>;
33
74
  }
34
75
 
76
+ function ProtectedRoutes() {
77
+ return (
78
+ <Routes>
79
+ <Route path="/chat/skills" element={<Navigate to="/skills" replace />} />
80
+ <Route path="/chat/cron" element={<Navigate to="/cron" replace />} />
81
+ <Route path="/chat/agents" element={<Navigate to="/agents" replace />} />
82
+ <Route
83
+ path="/chat/:sessionId?"
84
+ element={
85
+ <LazyRoute>
86
+ <ChatPage view="chat" />
87
+ </LazyRoute>
88
+ }
89
+ />
90
+ <Route
91
+ path="/agents"
92
+ element={
93
+ <LazyRoute>
94
+ <ChatPage view="agents" />
95
+ </LazyRoute>
96
+ }
97
+ />
98
+ <Route
99
+ path="/skills"
100
+ element={
101
+ <LazyRoute>
102
+ <ChatPage view="skills" />
103
+ </LazyRoute>
104
+ }
105
+ />
106
+ <Route
107
+ path="/cron"
108
+ element={
109
+ <LazyRoute>
110
+ <ChatPage view="cron" />
111
+ </LazyRoute>
112
+ }
113
+ />
114
+ <Route
115
+ path="/model"
116
+ element={
117
+ <LazyRoute>
118
+ <ModelConfigPage />
119
+ </LazyRoute>
120
+ }
121
+ />
122
+ <Route
123
+ path="/search"
124
+ element={
125
+ <LazyRoute>
126
+ <SearchConfigPage />
127
+ </LazyRoute>
128
+ }
129
+ />
130
+ <Route
131
+ path="/providers"
132
+ element={
133
+ <LazyRoute>
134
+ <ProvidersListPage />
135
+ </LazyRoute>
136
+ }
137
+ />
138
+ <Route
139
+ path="/channels"
140
+ element={
141
+ <LazyRoute>
142
+ <ChannelsListPage />
143
+ </LazyRoute>
144
+ }
145
+ />
146
+ <Route
147
+ path="/runtime"
148
+ element={
149
+ <LazyRoute>
150
+ <RuntimeConfigPage />
151
+ </LazyRoute>
152
+ }
153
+ />
154
+ <Route
155
+ path="/updates"
156
+ element={
157
+ <LazyRoute>
158
+ <DesktopUpdateConfigPage />
159
+ </LazyRoute>
160
+ }
161
+ />
162
+ <Route
163
+ path="/remote"
164
+ element={
165
+ <LazyRoute>
166
+ <RemoteAccessPage />
167
+ </LazyRoute>
168
+ }
169
+ />
170
+ <Route
171
+ path="/security"
172
+ element={
173
+ <LazyRoute>
174
+ <SecurityConfigPage />
175
+ </LazyRoute>
176
+ }
177
+ />
178
+ <Route
179
+ path="/sessions"
180
+ element={
181
+ <LazyRoute>
182
+ <SessionsConfigPage />
183
+ </LazyRoute>
184
+ }
185
+ />
186
+ <Route
187
+ path="/secrets"
188
+ element={
189
+ <LazyRoute>
190
+ <SecretsConfigPage />
191
+ </LazyRoute>
192
+ }
193
+ />
194
+ <Route path="/settings" element={<Navigate to="/model" replace />} />
195
+ <Route
196
+ path="/marketplace/skills"
197
+ element={<Navigate to="/skills" replace />}
198
+ />
199
+ <Route
200
+ path="/marketplace"
201
+ element={<Navigate to="/marketplace/plugins" replace />}
202
+ />
203
+ <Route
204
+ path="/marketplace/mcp"
205
+ element={
206
+ <LazyRoute>
207
+ <McpMarketplacePage />
208
+ </LazyRoute>
209
+ }
210
+ />
211
+ <Route
212
+ path="/marketplace/:type"
213
+ element={
214
+ <LazyRoute>
215
+ <MarketplacePage />
216
+ </LazyRoute>
217
+ }
218
+ />
219
+ <Route path="/" element={<Navigate to="/chat" replace />} />
220
+ <Route path="*" element={<Navigate to="/chat" replace />} />
221
+ </Routes>
222
+ );
223
+ }
224
+
35
225
  function ProtectedApp() {
36
226
  useRealtimeQueryBridge(appQueryClient);
37
227
 
38
228
  return (
39
229
  <AppPresenterProvider>
40
230
  <AppLayout>
41
- <div className="w-full h-full">
42
- <Routes>
43
- <Route path="/chat/skills" element={<Navigate to="/skills" replace />} />
44
- <Route path="/chat/cron" element={<Navigate to="/cron" replace />} />
45
- <Route path="/chat/agents" element={<Navigate to="/agents" replace />} />
46
- <Route path="/chat/:sessionId?" element={<LazyRoute><ChatPage view="chat" /></LazyRoute>} />
47
- <Route path="/agents" element={<LazyRoute><ChatPage view="agents" /></LazyRoute>} />
48
- <Route path="/skills" element={<LazyRoute><ChatPage view="skills" /></LazyRoute>} />
49
- <Route path="/cron" element={<LazyRoute><ChatPage view="cron" /></LazyRoute>} />
50
- <Route path="/model" element={<LazyRoute><ModelConfigPage /></LazyRoute>} />
51
- <Route path="/search" element={<LazyRoute><SearchConfigPage /></LazyRoute>} />
52
- <Route path="/providers" element={<LazyRoute><ProvidersListPage /></LazyRoute>} />
53
- <Route path="/channels" element={<LazyRoute><ChannelsListPage /></LazyRoute>} />
54
- <Route path="/runtime" element={<LazyRoute><RuntimeConfigPage /></LazyRoute>} />
55
- <Route path="/updates" element={<LazyRoute><DesktopUpdateConfigPage /></LazyRoute>} />
56
- <Route path="/remote" element={<LazyRoute><RemoteAccessPage /></LazyRoute>} />
57
- <Route path="/security" element={<LazyRoute><SecurityConfigPage /></LazyRoute>} />
58
- <Route path="/sessions" element={<LazyRoute><SessionsConfigPage /></LazyRoute>} />
59
- <Route path="/secrets" element={<LazyRoute><SecretsConfigPage /></LazyRoute>} />
60
- <Route path="/settings" element={<Navigate to="/model" replace />} />
61
- <Route path="/marketplace/skills" element={<Navigate to="/skills" replace />} />
62
- <Route path="/marketplace" element={<Navigate to="/marketplace/plugins" replace />} />
63
- <Route path="/marketplace/mcp" element={<LazyRoute><McpMarketplacePage /></LazyRoute>} />
64
- <Route path="/marketplace/:type" element={<LazyRoute><MarketplacePage /></LazyRoute>} />
65
- <Route path="/" element={<Navigate to="/chat" replace />} />
66
- <Route path="*" element={<Navigate to="/chat" replace />} />
67
- </Routes>
68
- </div>
231
+ <ProtectedRoutes />
69
232
  </AppLayout>
70
233
  <AccountPanel />
71
234
  </AppPresenterProvider>
@@ -77,7 +240,11 @@ function AuthGate() {
77
240
  const isTransientBootstrapFailure =
78
241
  authStatus.isError && isTransientAuthStatusBootstrapError(authStatus.error);
79
242
 
80
- if ((authStatus.isLoading && !authStatus.isError) || isTransientBootstrapFailure || authStatus.isError) {
243
+ if (
244
+ (authStatus.isLoading && !authStatus.isError) ||
245
+ isTransientBootstrapFailure ||
246
+ authStatus.isError
247
+ ) {
81
248
  return <ProtectedApp />;
82
249
  }
83
250
 
@@ -89,9 +256,15 @@ function AuthGate() {
89
256
  }
90
257
 
91
258
  export default function AppContent() {
259
+ useEffect(() => {
260
+ startNextClawPwa();
261
+ }, []);
262
+
92
263
  return (
93
264
  <QueryClientProvider client={appQueryClient}>
94
265
  <AuthGate />
266
+ <PwaInstallBanner />
267
+ <PwaUpdateBanner />
95
268
  <Toaster position="top-right" richColors />
96
269
  </QueryClientProvider>
97
270
  );