@nextclaw/ui 0.14.0 → 0.14.1-beta.1

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 (194) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/dist/assets/{api-B50yVdT8.js → api-dQ6uQSZG.js} +3 -3
  3. package/dist/assets/channels-list-page-DfpjB8XB.js +8 -0
  4. package/dist/assets/chat-page-D3QaEqjs.js +105 -0
  5. package/dist/assets/config-split-page-CeFfbaqc.js +1 -0
  6. package/dist/assets/{confirm-dialog-DRSelLdI.js → confirm-dialog-C95Y4QPC.js} +1 -1
  7. package/dist/assets/desktop-update-config-CcK6jiEb.js +1 -0
  8. package/dist/assets/{dist-D19wiQwB.js → dist-DTGzeil6.js} +1 -1
  9. package/dist/assets/{dist-NZRV-BxD.js → dist-fGogBmPA.js} +1 -1
  10. package/dist/assets/doc-browser-CuBTcBEZ.js +1 -0
  11. package/dist/assets/doc-browser-DVHhEb96.js +1 -0
  12. package/dist/assets/{doc-browser-context-C8KPbj-p.js → doc-browser-context-BfMXwnrz.js} +1 -1
  13. package/dist/assets/{ellipsis-BYy8TP0A.js → ellipsis-D2F4KMiU.js} +1 -1
  14. package/dist/assets/{external-link-528k6MDD.js → external-link-CcgtBK26.js} +1 -1
  15. package/dist/assets/index-ByJCbQqr.css +1 -0
  16. package/dist/assets/index-DjXqiloY.js +103 -0
  17. package/dist/assets/mcp-marketplace-page-98-V__3u.js +1 -0
  18. package/dist/assets/mcp-marketplace-page-BNq_PNmO.js +40 -0
  19. package/dist/assets/model-config-page-aAUkZkSX.js +1 -0
  20. package/dist/assets/plus-1Rxl5FlV.js +1 -0
  21. package/dist/assets/provider-scoped-model-input-we4_Z4gP.js +1 -0
  22. package/dist/assets/providers-config-page-CtMkPSyu.js +1 -0
  23. package/dist/assets/{react-Dsotw5vM.js → react-CTqdhFMk.js} +1 -1
  24. package/dist/assets/remote-fQ7N_r8u.js +1 -0
  25. package/dist/assets/rotate-cw-CzfIeAJj.js +1 -0
  26. package/dist/assets/runtime-config-page-TD1UrTbG.js +1 -0
  27. package/dist/assets/{save-CHDnDTok.js → save-C9fKWfVB.js} +1 -1
  28. package/dist/assets/search-D5FQ5q0X.js +1 -0
  29. package/dist/assets/search-config-page-AMEJJNIS.js +1 -0
  30. package/dist/assets/secrets-config-page-CcgJnvBO.js +3 -0
  31. package/dist/assets/select-Cu5n0E-3.js +41 -0
  32. package/dist/assets/{tag-chip-Cr8GwpRE.js → tag-chip-C5aOtjxu.js} +1 -1
  33. package/dist/assets/use-config-D8TESeo6.js +1 -0
  34. package/dist/assets/x-1qETdQ70.js +1 -0
  35. package/dist/index.html +14 -27
  36. package/package.json +9 -9
  37. package/src/app/presenters/app.presenter.ts +2 -0
  38. package/src/features/account/components/account-panel.tsx +2 -2
  39. package/src/features/chat/components/conversation/__tests__/chat-conversation-panel.test.tsx +12 -63
  40. package/src/features/chat/components/conversation/chat-conversation-content.tsx +11 -50
  41. package/src/features/chat/components/conversation/chat-conversation-header-section.tsx +1 -0
  42. package/src/features/chat/components/conversation/chat-conversation-panel.tsx +15 -2
  43. package/src/features/chat/features/input/components/chat-input-bar.container.tsx +122 -85
  44. package/src/features/chat/features/input/hooks/use-chat-input-bar-query-state.ts +120 -0
  45. package/src/features/chat/features/input/hooks/use-chat-model-favorites.ts +87 -0
  46. package/src/features/chat/features/input/utils/__tests__/chat-input-bar.utils.test.ts +66 -41
  47. package/src/features/chat/features/input/utils/__tests__/ncp-chat-input-availability.utils.test.ts +1 -0
  48. package/src/features/chat/features/input/utils/chat-input-bar.utils.ts +22 -36
  49. package/src/features/chat/features/input/utils/chat-input-toolbar.utils.ts +80 -52
  50. package/src/features/chat/features/message/components/__tests__/chat-inline-panel-app-card.test.tsx +89 -0
  51. package/src/features/chat/features/message/components/__tests__/chat-message-list.container.test.tsx +9 -1
  52. package/src/features/chat/features/message/components/chat-inline-panel-app-card.tsx +115 -0
  53. package/src/features/chat/features/message/components/chat-message-list.container.tsx +4 -0
  54. package/src/features/chat/features/message/utils/__tests__/chat-message-file-operation.utils.test.ts +310 -0
  55. package/src/features/chat/features/message/utils/__tests__/chat-message-show-content-tool-card.utils.test.ts +119 -1
  56. package/src/features/chat/features/message/utils/__tests__/chat-message-test.utils.ts +43 -0
  57. package/src/features/chat/features/message/utils/__tests__/chat-message.utils.test.ts +1 -346
  58. package/src/features/chat/features/message/utils/chat-inline-panel-app-card.utils.ts +51 -0
  59. package/src/features/chat/features/message/utils/chat-message-show-content-tool-card.utils.ts +28 -5
  60. package/src/features/chat/features/message/utils/chat-message-tool-card.utils.ts +14 -9
  61. package/src/features/chat/features/message/utils/file-operation/diff.utils.ts +39 -36
  62. package/src/features/chat/features/message/utils/file-operation/line-builder.utils.ts +46 -38
  63. package/src/features/chat/features/message/utils/file-operation/parsed-block.utils.ts +18 -15
  64. package/src/features/chat/features/ncp/hooks/__tests__/use-ui-show-content-event.test.tsx +1 -0
  65. package/src/features/chat/features/ncp/utils/ncp-chat-query-derived.utils.ts +11 -3
  66. package/src/features/chat/features/session/components/session-header/__tests__/chat-session-header-actions.test.tsx +27 -0
  67. package/src/features/chat/features/session/components/session-header/__tests__/chat-session-project-badge.test.tsx +25 -25
  68. package/src/features/chat/features/session/components/session-header/chat-session-header-actions.tsx +19 -1
  69. package/src/features/chat/features/session/components/session-header/chat-session-metadata-dialog.tsx +46 -0
  70. package/src/features/chat/features/session/components/session-header/chat-session-project-badge.tsx +15 -2
  71. package/src/features/chat/features/session/hooks/__tests__/use-selected-session-context-window-indicator.test.tsx +63 -0
  72. package/src/features/chat/features/session/hooks/use-selected-session-context-window-indicator.ts +7 -10
  73. package/src/features/chat/features/session/utils/__tests__/ncp-session-adapter.utils.test.ts +8 -0
  74. package/src/features/chat/features/session/utils/ncp-session-adapter.utils.ts +2 -0
  75. package/src/features/chat/features/session-type/components/__tests__/chat-sidebar-create-menu.test.tsx +24 -0
  76. package/src/features/chat/features/session-type/components/chat-sidebar-create-menu.tsx +10 -1
  77. package/src/features/chat/features/session-type/hooks/use-chat-session-type-state.ts +1 -0
  78. package/src/features/chat/features/session-type/utils/chat-session-type.utils.ts +4 -0
  79. package/src/features/chat/features/welcome/components/__tests__/chat-conversation-welcome.test.tsx +193 -0
  80. package/src/features/chat/features/welcome/components/__tests__/chat-welcome.test.tsx +123 -0
  81. package/src/features/chat/features/welcome/components/chat-conversation-welcome.tsx +104 -0
  82. package/src/features/chat/features/welcome/components/chat-welcome-agent-picker.tsx +72 -0
  83. package/src/features/chat/features/welcome/components/chat-welcome-capability-grid.tsx +54 -0
  84. package/src/features/chat/features/welcome/components/chat-welcome-project-picker.tsx +132 -0
  85. package/src/features/chat/features/welcome/components/chat-welcome-session-type-picker.tsx +82 -0
  86. package/src/features/chat/features/welcome/components/chat-welcome.tsx +121 -0
  87. package/src/features/chat/features/welcome/utils/__tests__/chat-welcome-project-options.utils.test.ts +53 -0
  88. package/src/features/chat/features/welcome/utils/__tests__/chat-welcome-selection.utils.test.ts +63 -0
  89. package/src/features/chat/features/welcome/utils/__tests__/chat-welcome-visibility.utils.test.ts +34 -0
  90. package/src/features/chat/features/welcome/utils/chat-welcome-project-options.utils.ts +71 -0
  91. package/src/features/chat/features/welcome/utils/chat-welcome-selection.utils.ts +79 -0
  92. package/src/features/chat/features/welcome/utils/chat-welcome-visibility.utils.ts +17 -0
  93. package/src/features/chat/index.ts +1 -0
  94. package/src/features/chat/managers/__tests__/chat-input.manager.test.ts +93 -0
  95. package/src/features/chat/managers/__tests__/chat-run-snapshot.manager.test.ts +129 -0
  96. package/src/features/chat/managers/__tests__/chat-run.manager.test.ts +34 -0
  97. package/src/features/chat/managers/__tests__/chat-session-preference-sync.manager.test.ts +143 -1
  98. package/src/features/chat/managers/__tests__/chat-thread.manager.test.ts +30 -0
  99. package/src/features/chat/managers/__tests__/recent-selection.manager.test.ts +37 -14
  100. package/src/features/chat/managers/chat-draft-intent.manager.ts +46 -0
  101. package/src/features/chat/managers/chat-input.manager.ts +37 -15
  102. package/src/features/chat/managers/chat-run.manager.ts +3 -0
  103. package/src/features/chat/managers/chat-session-preference-sync.manager.ts +19 -2
  104. package/src/features/chat/managers/chat-thread.manager.ts +4 -0
  105. package/src/features/chat/managers/chat-ui.manager.ts +2 -6
  106. package/src/features/chat/managers/recent-selection.manager.ts +21 -67
  107. package/src/features/chat/pages/__tests__/ncp-chat-page.test.ts +47 -1
  108. package/src/features/chat/pages/ncp-chat-page.tsx +18 -0
  109. package/src/features/chat/stores/chat-input.store.ts +9 -1
  110. package/src/features/chat/stores/recent-selection.store.ts +85 -0
  111. package/src/features/chat/types/chat-input-bar.types.ts +5 -1
  112. package/src/features/marketplace/utils/marketplace-installed-cache.utils.ts +27 -23
  113. package/src/features/panel-apps/components/__tests__/panel-apps-list.test.tsx +137 -0
  114. package/src/features/panel-apps/components/panel-apps-list.tsx +119 -5
  115. package/src/features/panel-apps/index.ts +2 -0
  116. package/src/features/panel-apps/utils/panel-app-entry-match.utils.ts +17 -0
  117. package/src/features/settings/components/config/provider-form.tsx +284 -387
  118. package/src/features/settings/components/config/provider-status-badge.tsx +4 -4
  119. package/src/features/settings/components/config/secrets-config-form.tsx +11 -135
  120. package/src/features/settings/hooks/use-provider-auth-flow.ts +140 -0
  121. package/src/features/settings/pages/__tests__/model-config-page.test.tsx +16 -0
  122. package/src/features/settings/pages/secrets-config-page.tsx +2 -1
  123. package/src/features/settings/utils/__tests__/provider-form-support.utils.test.ts +60 -1
  124. package/src/features/settings/utils/__tests__/secrets-config-form.utils.test.ts +66 -0
  125. package/src/features/settings/utils/provider-form-context.utils.ts +131 -0
  126. package/src/features/settings/utils/provider-form-model.utils.ts +101 -0
  127. package/src/features/settings/utils/provider-form-support.utils.ts +102 -1
  128. package/src/features/settings/utils/secrets-config-form.utils.ts +139 -0
  129. package/src/features/system-status/components/config/runtime-agent-list-card.tsx +17 -11
  130. package/src/features/system-status/components/config/runtime-binding-list-card.tsx +14 -9
  131. package/src/features/system-status/components/config/runtime-config-editor.tsx +8 -5
  132. package/src/features/system-status/components/config/runtime-entry-list-card.tsx +14 -9
  133. package/src/features/system-status/components/config/runtime-settings-card.tsx +16 -7
  134. package/src/features/system-status/components/runtime-security-card.tsx +79 -25
  135. package/src/shared/components/common/__tests__/searchable-model-input.test.tsx +34 -0
  136. package/src/shared/components/common/provider-scoped-model-input.tsx +1 -0
  137. package/src/shared/components/common/searchable-model-input.tsx +102 -87
  138. package/src/shared/components/ui/README.md +7 -0
  139. package/src/shared/components/ui/popover.tsx +19 -3
  140. package/src/shared/components/ui/select.tsx +14 -4
  141. package/src/shared/hooks/use-infinite-scroll-loader.ts +14 -10
  142. package/src/shared/lib/api/chat-session-type.types.ts +7 -0
  143. package/src/shared/lib/api/index.ts +2 -0
  144. package/src/shared/lib/api/ncp-session.types.ts +1 -0
  145. package/src/shared/lib/api/preferences/preference.types.ts +22 -0
  146. package/src/shared/lib/api/preferences/preference.utils.ts +40 -0
  147. package/src/shared/lib/api/types.ts +3 -0
  148. package/src/shared/lib/i18n/locales/en-US/chat.json +20 -1
  149. package/src/shared/lib/i18n/locales/en-US/core.json +1 -0
  150. package/src/shared/lib/i18n/locales/en-US/doc-browser.json +10 -0
  151. package/src/shared/lib/i18n/locales/zh-CN/chat.json +20 -1
  152. package/src/shared/lib/i18n/locales/zh-CN/core.json +1 -0
  153. package/src/shared/lib/i18n/locales/zh-CN/doc-browser.json +10 -0
  154. package/dist/assets/app-presenter-provider-BI-ewLbO.js +0 -3
  155. package/dist/assets/arrow-left-BOCJyLbQ.js +0 -1
  156. package/dist/assets/book-open-Bd2Xbrrc.js +0 -1
  157. package/dist/assets/channels-list-page-moJkpxtU.js +0 -8
  158. package/dist/assets/chat-page-CO27cl4v.js +0 -105
  159. package/dist/assets/config-split-page-CsQ2rIdq.js +0 -1
  160. package/dist/assets/desktop-update-config-qa-SynOc.js +0 -1
  161. package/dist/assets/doc-browser-2ddUJCA0.js +0 -1
  162. package/dist/assets/doc-browser-BjHUczQb.js +0 -1
  163. package/dist/assets/es2015-BUIIKCNh.js +0 -41
  164. package/dist/assets/host-capabilities-9bB_998Z.js +0 -1
  165. package/dist/assets/index-CMNrRhnG.js +0 -101
  166. package/dist/assets/index-UTmTW1eU.css +0 -1
  167. package/dist/assets/key-round-D3vD9dj7.js +0 -1
  168. package/dist/assets/loader-circle-DV9TSRns.js +0 -1
  169. package/dist/assets/mcp-marketplace-page-CS5Lh3oA.js +0 -1
  170. package/dist/assets/mcp-marketplace-page-DEOMcWb0.js +0 -40
  171. package/dist/assets/model-config-page-BSc4o7pb.js +0 -1
  172. package/dist/assets/notice-card-qqlbsOoR.js +0 -1
  173. package/dist/assets/plus-Bf9qhPDO.js +0 -1
  174. package/dist/assets/popover-BnmPOXe3.js +0 -1
  175. package/dist/assets/provider-scoped-model-input-Ca56s475.js +0 -1
  176. package/dist/assets/providers-config-page-D8Kf4U3u.js +0 -1
  177. package/dist/assets/refresh-cw-Bmx4wc9P.js +0 -1
  178. package/dist/assets/remote-DNMEy_c4.js +0 -1
  179. package/dist/assets/rotate-cw-CL0sVBel.js +0 -1
  180. package/dist/assets/runtime-config-page-CUFtKr0U.js +0 -1
  181. package/dist/assets/search-D7L-TCH-.js +0 -1
  182. package/dist/assets/search-config-page-CA3RVAef.js +0 -1
  183. package/dist/assets/secrets-config-page-95yaH1fa.js +0 -3
  184. package/dist/assets/status-dot-Dm4h-bjn.js +0 -1
  185. package/dist/assets/tabs-CJvw5Lqp.js +0 -1
  186. package/dist/assets/tooltip-Bxzi6aDL.js +0 -1
  187. package/dist/assets/trash-2-CSfX-BvU.js +0 -1
  188. package/dist/assets/use-config-TzwzTgg0.js +0 -1
  189. package/dist/assets/x-fkIWvi07.js +0 -1
  190. package/src/features/chat/components/__tests__/chat-welcome.test.tsx +0 -45
  191. package/src/features/chat/components/chat-welcome.tsx +0 -102
  192. package/src/features/chat/features/input/hooks/__tests__/use-chat-input-bar-controller.test.tsx +0 -152
  193. package/src/features/chat/features/input/hooks/use-chat-input-bar-controller.ts +0 -142
  194. /package/dist/assets/{config-hints-Cl2XAhzV.js → config-hints-CTqBnCDp.js} +0 -0
@@ -0,0 +1,22 @@
1
+ export type PreferenceJsonValue =
2
+ | null
3
+ | boolean
4
+ | number
5
+ | string
6
+ | PreferenceJsonValue[]
7
+ | { [key: string]: PreferenceJsonValue };
8
+
9
+ export type PreferenceEntryView = {
10
+ key: string;
11
+ value: PreferenceJsonValue | null;
12
+ updatedAt?: string;
13
+ };
14
+
15
+ export type PreferenceUpdateRequest = {
16
+ value: PreferenceJsonValue;
17
+ };
18
+
19
+ export type PreferenceDeleteResult = {
20
+ key: string;
21
+ deleted: boolean;
22
+ };
@@ -0,0 +1,40 @@
1
+ import { api } from '@/shared/lib/api/managers/client.manager';
2
+ import type {
3
+ PreferenceDeleteResult,
4
+ PreferenceEntryView,
5
+ PreferenceJsonValue,
6
+ } from '@/shared/lib/api/preferences/preference.types';
7
+
8
+ function encodePreferenceKey(key: string): string {
9
+ return encodeURIComponent(key);
10
+ }
11
+
12
+ export async function fetchPreference(key: string): Promise<PreferenceEntryView> {
13
+ const response = await api.get<PreferenceEntryView>(`/api/preferences/${encodePreferenceKey(key)}`);
14
+ if (!response.ok) {
15
+ throw new Error(response.error.message);
16
+ }
17
+ return response.data;
18
+ }
19
+
20
+ export async function updatePreference(
21
+ key: string,
22
+ value: PreferenceJsonValue,
23
+ ): Promise<PreferenceEntryView> {
24
+ const response = await api.put<PreferenceEntryView>(
25
+ `/api/preferences/${encodePreferenceKey(key)}`,
26
+ { value },
27
+ );
28
+ if (!response.ok) {
29
+ throw new Error(response.error.message);
30
+ }
31
+ return response.data;
32
+ }
33
+
34
+ export async function deletePreference(key: string): Promise<PreferenceDeleteResult> {
35
+ const response = await api.delete<PreferenceDeleteResult>(`/api/preferences/${encodePreferenceKey(key)}`);
36
+ if (!response.ok) {
37
+ throw new Error(response.error.message);
38
+ }
39
+ return response.data;
40
+ }
@@ -256,6 +256,7 @@ export type AgentProfileView = {
256
256
  runtimeConfig?: Record<string, unknown>;
257
257
  engine?: string;
258
258
  engineConfig?: Record<string, unknown>;
259
+ thinkingDefault?: ThinkingLevel;
259
260
  contextTokens?: number;
260
261
  maxToolIterations?: number;
261
262
  builtIn?: boolean;
@@ -447,6 +448,7 @@ export type RuntimeConfigUpdate = {
447
448
  contextTokens?: number;
448
449
  engine?: string;
449
450
  engineConfig?: Record<string, unknown>;
451
+ thinkingDefault?: ThinkingLevel;
450
452
  };
451
453
  runtimes?: {
452
454
  entries?: Record<string, RuntimeEntryView> | null;
@@ -520,6 +522,7 @@ export type ConfigView = {
520
522
  workspace?: string;
521
523
  engine?: string;
522
524
  engineConfig?: Record<string, unknown>;
525
+ thinkingDefault?: ThinkingLevel;
523
526
  contextTokens?: number;
524
527
  maxToolIterations?: number;
525
528
  };
@@ -73,8 +73,13 @@
73
73
  "chatSkillScopeProject": "Project",
74
74
  "chatSkillScopeWorkspace": "Workspace",
75
75
  "chatPickerRecent": "Recent",
76
+ "chatPickerFavoriteModels": "Favorites",
76
77
  "chatPickerRecentModels": "Recent",
77
78
  "chatPickerAllModels": "All models",
79
+ "chatModelSearchPlaceholder": "Search models",
80
+ "chatModelSearchEmpty": "No matching models",
81
+ "chatFavoriteModel": "Add to favorites",
82
+ "chatUnfavoriteModel": "Remove from favorites",
78
83
  "chatPickerAllSkills": "All skills",
79
84
  "chatSend": "Send",
80
85
  "chatStop": "Stop",
@@ -101,6 +106,9 @@
101
106
  "chatDeleteSession": "Delete Session",
102
107
  "chatDeleteSessionConfirm": "Delete the current session?",
103
108
  "chatSessionMoreActions": "More actions",
109
+ "chatSessionViewMetadata": "View Metadata",
110
+ "chatSessionMetadataDialogTitle": "Session Metadata",
111
+ "chatSessionMetadataDialogDescription": "Raw metadata stored on the current session.",
104
112
  "chatSessionSetProject": "Set Project Directory",
105
113
  "chatSessionClearProject": "Clear Project Directory",
106
114
  "chatSessionProjectDialogTitle": "Set Project Directory",
@@ -129,6 +137,7 @@
129
137
  "chatToolStatusFailed": "Failed",
130
138
  "chatToolStatusCancelled": "Cancelled",
131
139
  "chatShowContentAction": "Show content",
140
+ "chatPanelCardExpand": "Expand to side panel",
132
141
  "chatReasoning": "Reasoning",
133
142
  "chatImageAttachment": "Image attachment",
134
143
  "chatFileAttachment": "File attachment",
@@ -162,13 +171,23 @@
162
171
  "chatSidebarOlder": "Older",
163
172
  "chatSidebarProjectViewEmpty": "No project conversations yet",
164
173
  "chatWelcomeTitle": "Hello, how can I help you?",
165
- "chatWelcomeSubtitle": "Start a new task or select an existing conversation",
174
+ "chatWelcomeSubtitle": "Describe the goal, choose the project context, and let NextClaw take it from there.",
175
+ "chatWelcomeProjectPickerLabel": "Choose working directory",
176
+ "chatWelcomeProjectPickerPlaceholder": "Choose working directory",
177
+ "chatWelcomeProjectDefaultBadge": "Default",
178
+ "chatWelcomeProjectRecentTitle": "Recent projects",
179
+ "chatWelcomeProjectNoRecent": "No recent projects yet",
180
+ "chatWelcomeProjectOpenFolder": "Open folder",
181
+ "chatWelcomeSessionTypePickerLabel": "Choose session type",
166
182
  "chatWelcomeCapability1Title": "Smart Conversations",
167
183
  "chatWelcomeCapability1Desc": "Multi-turn context conversations with multiple AI models",
184
+ "chatWelcomeCapability1Prompt": "Help me understand this project and propose the next three concrete things we should build.",
168
185
  "chatWelcomeCapability2Title": "Skill Extensions",
169
186
  "chatWelcomeCapability2Desc": "Extend Agent capabilities by installing skills",
187
+ "chatWelcomeCapability2Prompt": "Review the skills that would be useful for this project and recommend which ones I should enable first.",
170
188
  "chatWelcomeCapability3Title": "Scheduled Tasks",
171
189
  "chatWelcomeCapability3Desc": "Set up scheduled automated tasks",
190
+ "chatWelcomeCapability3Prompt": "Help me design a scheduled automation for this project, including the trigger, message, and safety checks.",
172
191
  "chatSkillsPickerTitle": "Skills",
173
192
  "chatSkillsPickerEmpty": "No skills installed",
174
193
  "chatSkillsPickerSearchPlaceholder": "Search skills",
@@ -49,6 +49,7 @@
49
49
  "modelName": "Model",
50
50
  "modelPickerNoOptions": "No model options available",
51
51
  "modelPickerUseCustom": "Use custom model: {value}",
52
+ "modelPickerToggleOptions": "Toggle model options",
52
53
  "modelInputCustomHint": "If the model is not listed, type a custom model ID directly.",
53
54
  "modelIdentifierHelp": "Default model identifier used by the agent. Use provider-prefixed format. Examples: openai/gpt-5.1 · anthropic/claude-opus-4-1 · deepseek/deepseek-chat · minimax/MiniMax-M2.5 · openrouter/openai/gpt-5.3-codex.",
54
55
  "maxToolIterations": "Max Tool Iterations",
@@ -22,6 +22,16 @@
22
22
  "panelAppsLoading": "Loading panel apps...",
23
23
  "panelAppsLoadFailed": "Failed to load panel apps",
24
24
  "panelAppsEmpty": "No panel apps yet",
25
+ "panelAppsEmptyTitle": "Create your first panel app",
26
+ "panelAppsEmptyDescription": "Panel apps are lightweight tools that open beside chat, such as dashboards, forms, calculators, and temporary workbenches.",
27
+ "panelAppsEmptyAskTitle": "Ask NextClaw to generate one",
28
+ "panelAppsEmptyAskDescription": "Start with a ready-made prompt that creates a sample local tool for this panel.",
29
+ "panelAppsEmptyAskAction": "Create sample panel app",
30
+ "panelAppsExamplePrompt": "Create a sample NextClaw Panel App for me: a personal task board. Put it in the NextClaw panels folder as a single *.panel.html file. Include adding tasks, toggling completion, filtering, and local state persistence. After creating it, tell me to refresh Panel Apps and open it. Do not ask follow-up questions first.",
31
+ "panelAppsEmptyFileTitle": "Add it to the panels folder",
32
+ "panelAppsEmptyFileDescription": "You can also add a *.panel.html file, or a *.panel folder with panel-app.json.",
33
+ "panelAppsPanelsPath": "Panels folder",
34
+ "panelAppsEmptyFiltered": "No panel apps in this view",
25
35
  "panelAppsRefresh": "Refresh panel apps",
26
36
  "panelAppsRefreshCurrent": "Refresh current panel app",
27
37
  "panelAppsSortLabel": "Sort",
@@ -73,8 +73,13 @@
73
73
  "chatSkillScopeProject": "项目",
74
74
  "chatSkillScopeWorkspace": "工作区",
75
75
  "chatPickerRecent": "最近使用",
76
+ "chatPickerFavoriteModels": "收藏模型",
76
77
  "chatPickerRecentModels": "最近选择",
77
78
  "chatPickerAllModels": "全部模型",
79
+ "chatModelSearchPlaceholder": "搜索模型",
80
+ "chatModelSearchEmpty": "没有匹配的模型",
81
+ "chatFavoriteModel": "收藏模型",
82
+ "chatUnfavoriteModel": "取消收藏",
78
83
  "chatPickerAllSkills": "全部技能",
79
84
  "chatSend": "发送",
80
85
  "chatStop": "停止",
@@ -101,6 +106,9 @@
101
106
  "chatDeleteSession": "删除会话",
102
107
  "chatDeleteSessionConfirm": "确认删除当前会话?",
103
108
  "chatSessionMoreActions": "更多操作",
109
+ "chatSessionViewMetadata": "查看元数据",
110
+ "chatSessionMetadataDialogTitle": "会话元数据",
111
+ "chatSessionMetadataDialogDescription": "当前会话保存的原始元数据。",
104
112
  "chatSessionSetProject": "设置项目目录",
105
113
  "chatSessionClearProject": "清除项目目录",
106
114
  "chatSessionProjectDialogTitle": "设置项目目录",
@@ -129,6 +137,7 @@
129
137
  "chatToolStatusFailed": "失败",
130
138
  "chatToolStatusCancelled": "已取消",
131
139
  "chatShowContentAction": "展示内容",
140
+ "chatPanelCardExpand": "展开到侧栏",
132
141
  "chatReasoning": "推理过程",
133
142
  "chatImageAttachment": "图片附件",
134
143
  "chatFileAttachment": "文件附件",
@@ -162,13 +171,23 @@
162
171
  "chatSidebarOlder": "更早",
163
172
  "chatSidebarProjectViewEmpty": "还没有绑定项目的会话",
164
173
  "chatWelcomeTitle": "你好,有什么可以帮你的吗?",
165
- "chatWelcomeSubtitle": "开始一个新任务或选择已有对话",
174
+ "chatWelcomeSubtitle": "描述目标,选择项目上下文,让 NextClaw 接住这次任务。",
175
+ "chatWelcomeProjectPickerLabel": "选择工作目录",
176
+ "chatWelcomeProjectPickerPlaceholder": "选择工作目录",
177
+ "chatWelcomeProjectDefaultBadge": "默认",
178
+ "chatWelcomeProjectRecentTitle": "最近项目",
179
+ "chatWelcomeProjectNoRecent": "暂无最近项目",
180
+ "chatWelcomeProjectOpenFolder": "打开文件夹",
181
+ "chatWelcomeSessionTypePickerLabel": "选择会话类型",
166
182
  "chatWelcomeCapability1Title": "智能对话",
167
183
  "chatWelcomeCapability1Desc": "多轮上下文对话,支持多种 AI 模型",
184
+ "chatWelcomeCapability1Prompt": "帮我理解当前项目,并给出接下来最值得推进的三个具体建设方向。",
168
185
  "chatWelcomeCapability2Title": "技能扩展",
169
186
  "chatWelcomeCapability2Desc": "通过安装技能扩展 Agent 能力",
187
+ "chatWelcomeCapability2Prompt": "帮我看看这个项目适合启用哪些技能,并推荐我优先配置哪些能力。",
170
188
  "chatWelcomeCapability3Title": "定时任务",
171
189
  "chatWelcomeCapability3Desc": "设置定时执行的自动化任务",
190
+ "chatWelcomeCapability3Prompt": "帮我设计一个适合当前项目的定时自动化任务,包括触发条件、消息内容和安全检查。",
172
191
  "chatSkillsPickerTitle": "技能",
173
192
  "chatSkillsPickerEmpty": "暂无已安装技能",
174
193
  "chatSkillsPickerSearchPlaceholder": "搜索技能",
@@ -49,6 +49,7 @@
49
49
  "modelName": "模型",
50
50
  "modelPickerNoOptions": "暂无可选模型",
51
51
  "modelPickerUseCustom": "使用自定义模型:{value}",
52
+ "modelPickerToggleOptions": "展开或收起模型选项",
52
53
  "modelInputCustomHint": "如果列表里没有目标模型,可直接输入自定义模型 ID。",
53
54
  "modelIdentifierHelp": "智能体默认模型标识,使用带提供商前缀的格式。例如:openai/gpt-5.1、anthropic/claude-opus-4-1、deepseek/deepseek-chat、minimax/MiniMax-M2.5、openrouter/openai/gpt-5.3-codex。",
54
55
  "maxToolIterations": "最大工具迭代次数",
@@ -22,6 +22,16 @@
22
22
  "panelAppsLoading": "加载面板应用中...",
23
23
  "panelAppsLoadFailed": "面板应用加载失败",
24
24
  "panelAppsEmpty": "暂无面板应用",
25
+ "panelAppsEmptyTitle": "创建你的第一个面板应用",
26
+ "panelAppsEmptyDescription": "面板应用是在聊天旁边打开的轻量工具,适合仪表盘、表单、计算器和临时工作台。",
27
+ "panelAppsEmptyAskTitle": "让 NextClaw 帮你生成",
28
+ "panelAppsEmptyAskDescription": "从一段现成提示词开始,让 NextClaw 直接创建一个可打开的示例小工具。",
29
+ "panelAppsEmptyAskAction": "生成示例面板应用",
30
+ "panelAppsExamplePrompt": "请直接为我创建一个示例 NextClaw Panel App:个人任务看板。请把它放到 NextClaw panels 目录,使用单文件 *.panel.html,包含任务添加、完成状态切换、筛选和本地状态保存。创建完成后告诉我刷新 Panel Apps 并打开它。不要先问我问题。",
31
+ "panelAppsEmptyFileTitle": "放入 panels 目录",
32
+ "panelAppsEmptyFileDescription": "也可以添加 *.panel.html 文件,或带 panel-app.json 的 *.panel 目录。",
33
+ "panelAppsPanelsPath": "面板目录",
34
+ "panelAppsEmptyFiltered": "当前分类暂无面板应用",
25
35
  "panelAppsRefresh": "刷新面板应用",
26
36
  "panelAppsRefreshCurrent": "刷新当前面板应用",
27
37
  "panelAppsSortLabel": "排序",
@@ -1,3 +0,0 @@
1
- import{a as e,h as t,n,o as r,p as i,r as a,t as o,u as s,v as c}from"./react-Dsotw5vM.js";import{At as l,Ft as u,Ht as d,It as f,Lt as p,Mt as m,Nt as h,Ot as g,Pt as _,Ut as v,Vt as y,a as b,c as ee,ct as x,en as S,i as te,jt as ne,kt as re,l as ie,o as ae,pt as oe,r as se,s as ce,u as le,wt as C,zt as ue}from"./api-B50yVdT8.js";import{c as w}from"./dist-NZRV-BxD.js";import{a as de,i as fe,n as pe,o as me,r as he,s as ge,t as _e}from"./confirm-dialog-DRSelLdI.js";import{t as ve}from"./arrow-left-BOCJyLbQ.js";import{t as ye}from"./book-open-Bd2Xbrrc.js";import{i as be,n as xe,r as Se,t as Ce,u as we}from"./tooltip-Bxzi6aDL.js";import{t as Te}from"./key-round-D3vD9dj7.js";import{t as Ee}from"./loader-circle-DV9TSRns.js";import{t as De}from"./plus-Bf9qhPDO.js";import{t as Oe}from"./refresh-cw-Bmx4wc9P.js";import{t as ke}from"./trash-2-CSfX-BvU.js";import{t as Ae}from"./x-fkIWvi07.js";import{t as T}from"./notice-card-qqlbsOoR.js";import{t as je}from"./status-dot-Dm4h-bjn.js";import{t as Me}from"./host-capabilities-9bB_998Z.js";import{n as Ne,r as Pe,t as Fe}from"./popover-BnmPOXe3.js";import{i as E,r as Ie,t as Le}from"./tabs-CJvw5Lqp.js";import{a as D,c as Re,f as O,g as ze,h as k,i as Be,l as Ve,m as He,n as Ue,o as We,p as Ge,r as Ke,s as qe,u as Je}from"./doc-browser-context-C8KPbj-p.js";var Ye=`modulepreload`,Xe=function(e){return`/`+e},Ze={},Qe=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}r=o(t.map(t=>{if(t=Xe(t,n),t in Ze)return;Ze[t]=!0;let r=t.endsWith(`.css`),i=r?`[rel="stylesheet"]`:``;if(n)for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}else if(document.querySelector(`link[href="${t}"]${i}`))return;let o=document.createElement(`link`);if(o.rel=r?`stylesheet`:Ye,r||(o.as=`script`),o.crossOrigin=``,o.href=t,a&&o.setAttribute(`nonce`,a),document.head.appendChild(o),r)return new Promise((e,n)=>{o.addEventListener(`load`,e),o.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},A=c(t(),1),$e=`popstate`;function et(e={}){let{initialEntries:t=[`/`],initialIndex:n,v5Compat:r=!1}=e,i;i=t.map((e,t)=>u(e,typeof e==`string`?null:e.state,t===0?`default`:void 0));let a=c(n??i.length-1),o=`POP`,s=null;function c(e){return Math.min(Math.max(e,0),i.length-1)}function l(){return i[a]}function u(e,t=null,n){let r=it(i?l().pathname:`/`,e,t,n);return M(r.pathname.charAt(0)===`/`,`relative pathnames are not supported in memory history: ${JSON.stringify(e)}`),r}function d(e){return typeof e==`string`?e:N(e)}return{get index(){return a},get action(){return o},get location(){return l()},createHref:d,createURL(e){return new URL(d(e),`http://localhost`)},encodeLocation(e){let t=typeof e==`string`?P(e):e;return{pathname:t.pathname||``,search:t.search||``,hash:t.hash||``}},push(e,t){o=`PUSH`;let n=u(e,t);a+=1,i.splice(a,i.length,n),r&&s&&s({action:o,location:n,delta:1})},replace(e,t){o=`REPLACE`;let n=u(e,t);i[a]=n,r&&s&&s({action:o,location:n,delta:0})},go(e){o=`POP`;let t=c(a+e),n=i[t];a=t,s&&s({action:o,location:n,delta:e})},listen(e){return s=e,()=>{s=null}}}}function tt(e={}){function t(e,t){let{pathname:n,search:r,hash:i}=e.location;return it(``,{pathname:n,search:r,hash:i},t.state&&t.state.usr||null,t.state&&t.state.key||`default`)}function n(e,t){return typeof t==`string`?t:N(t)}return at(t,n,null,e)}function j(e,t){if(e===!1||e==null)throw Error(t)}function M(e,t){if(!e){typeof console<`u`&&console.warn(t);try{throw Error(t)}catch{}}}function nt(){return Math.random().toString(36).substring(2,10)}function rt(e,t){return{usr:e.state,key:e.key,idx:t}}function it(e,t,n=null,r){return{pathname:typeof e==`string`?e:e.pathname,search:``,hash:``,...typeof t==`string`?P(t):t,state:n,key:t&&t.key||r||nt()}}function N({pathname:e=`/`,search:t=``,hash:n=``}){return t&&t!==`?`&&(e+=t.charAt(0)===`?`?t:`?`+t),n&&n!==`#`&&(e+=n.charAt(0)===`#`?n:`#`+n),e}function P(e){let t={};if(e){let n=e.indexOf(`#`);n>=0&&(t.hash=e.substring(n),e=e.substring(0,n));let r=e.indexOf(`?`);r>=0&&(t.search=e.substring(r),e=e.substring(0,r)),e&&(t.pathname=e)}return t}function at(e,t,n,r={}){let{window:i=document.defaultView,v5Compat:a=!1}=r,o=i.history,s=`POP`,c=null,l=u();l??(l=0,o.replaceState({...o.state,idx:l},``));function u(){return(o.state||{idx:null}).idx}function d(){s=`POP`;let e=u(),t=e==null?null:e-l;l=e,c&&c({action:s,location:h.location,delta:t})}function f(e,t){s=`PUSH`;let r=it(h.location,e,t);n&&n(r,e),l=u()+1;let d=rt(r,l),f=h.createHref(r);try{o.pushState(d,``,f)}catch(e){if(e instanceof DOMException&&e.name===`DataCloneError`)throw e;i.location.assign(f)}a&&c&&c({action:s,location:h.location,delta:1})}function p(e,t){s=`REPLACE`;let r=it(h.location,e,t);n&&n(r,e),l=u();let i=rt(r,l),d=h.createHref(r);o.replaceState(i,``,d),a&&c&&c({action:s,location:h.location,delta:0})}function m(e){return ot(e)}let h={get action(){return s},get location(){return e(i,o)},listen(e){if(c)throw Error(`A history only accepts one active listener`);return i.addEventListener($e,d),c=e,()=>{i.removeEventListener($e,d),c=null}},createHref(e){return t(i,e)},createURL:m,encodeLocation(e){let t=m(e);return{pathname:t.pathname,search:t.search,hash:t.hash}},push:f,replace:p,go(e){return o.go(e)}};return h}function ot(e,t=!1){let n=`http://localhost`;typeof window<`u`&&(n=window.location.origin===`null`?window.location.href:window.location.origin),j(n,`No window.location.(origin|href) available to create URL`);let r=typeof e==`string`?e:N(e);return r=r.replace(/ $/,`%20`),!t&&r.startsWith(`//`)&&(r=n+r),new URL(r,n)}function st(e,t,n=`/`){return ct(e,t,n,!1)}function ct(e,t,n,r){let i=F((typeof t==`string`?P(t):t).pathname||`/`,n);if(i==null)return null;let a=ut(e);ft(a);let o=null;for(let e=0;o==null&&e<a.length;++e){let t=Tt(i);o=St(a[e],t,r)}return o}function lt(e,t){let{route:n,pathname:r,params:i}=e;return{id:n.id,pathname:r,params:i,data:t[n.id],loaderData:t[n.id],handle:n.handle}}function ut(e,t=[],n=[],r=``,i=!1){let a=(e,a,o=i,s)=>{let c={relativePath:s===void 0?e.path||``:s,caseSensitive:e.caseSensitive===!0,childrenIndex:a,route:e};if(c.relativePath.startsWith(`/`)){if(!c.relativePath.startsWith(r)&&o)return;j(c.relativePath.startsWith(r),`Absolute route path "${c.relativePath}" nested under path "${r}" is not valid. An absolute child route path must start with the combined path of all its parent routes.`),c.relativePath=c.relativePath.slice(r.length)}let l=I([r,c.relativePath]),u=n.concat(c);e.children&&e.children.length>0&&(j(e.index!==!0,`Index routes must not have child routes. Please remove all child routes from route path "${l}".`),ut(e.children,t,u,l,o)),!(e.path==null&&!e.index)&&t.push({path:l,score:bt(l,e.index),routesMeta:u})};return e.forEach((e,t)=>{if(e.path===``||!e.path?.includes(`?`))a(e,t);else for(let n of dt(e.path))a(e,t,!0,n)}),t}function dt(e){let t=e.split(`/`);if(t.length===0)return[];let[n,...r]=t,i=n.endsWith(`?`),a=n.replace(/\?$/,``);if(r.length===0)return i?[a,``]:[a];let o=dt(r.join(`/`)),s=[];return s.push(...o.map(e=>e===``?a:[a,e].join(`/`))),i&&s.push(...o),s.map(t=>e.startsWith(`/`)&&t===``?`/`:t)}function ft(e){e.sort((e,t)=>e.score===t.score?xt(e.routesMeta.map(e=>e.childrenIndex),t.routesMeta.map(e=>e.childrenIndex)):t.score-e.score)}var pt=/^:[\w-]+$/,mt=3,ht=2,gt=1,_t=10,vt=-2,yt=e=>e===`*`;function bt(e,t){let n=e.split(`/`),r=n.length;return n.some(yt)&&(r+=vt),t&&(r+=ht),n.filter(e=>!yt(e)).reduce((e,t)=>e+(pt.test(t)?mt:t===``?gt:_t),r)}function xt(e,t){return e.length===t.length&&e.slice(0,-1).every((e,n)=>e===t[n])?e[e.length-1]-t[t.length-1]:0}function St(e,t,n=!1){let{routesMeta:r}=e,i={},a=`/`,o=[];for(let e=0;e<r.length;++e){let s=r[e],c=e===r.length-1,l=a===`/`?t:t.slice(a.length)||`/`,u=Ct({path:s.relativePath,caseSensitive:s.caseSensitive,end:c},l),d=s.route;if(!u&&c&&n&&!r[r.length-1].route.index&&(u=Ct({path:s.relativePath,caseSensitive:s.caseSensitive,end:!1},l)),!u)return null;Object.assign(i,u.params),o.push({params:i,pathname:I([a,u.pathname]),pathnameBase:Nt(I([a,u.pathnameBase])),route:d}),u.pathnameBase!==`/`&&(a=I([a,u.pathnameBase]))}return o}function Ct(e,t){typeof e==`string`&&(e={path:e,caseSensitive:!1,end:!0});let[n,r]=wt(e.path,e.caseSensitive,e.end),i=t.match(n);if(!i)return null;let a=i[0],o=a.replace(/(.)\/+$/,`$1`),s=i.slice(1);return{params:r.reduce((e,{paramName:t,isOptional:n},r)=>{if(t===`*`){let e=s[r]||``;o=a.slice(0,a.length-e.length).replace(/(.)\/+$/,`$1`)}let i=s[r];return n&&!i?e[t]=void 0:e[t]=(i||``).replace(/%2F/g,`/`),e},{}),pathname:a,pathnameBase:o,pattern:e}}function wt(e,t=!1,n=!0){M(e===`*`||!e.endsWith(`*`)||e.endsWith(`/*`),`Route path "${e}" will be treated as if it were "${e.replace(/\*$/,`/*`)}" because the \`*\` character must always follow a \`/\` in the pattern. To get rid of this warning, please change the route path to "${e.replace(/\*$/,`/*`)}".`);let r=[],i=`^`+e.replace(/\/*\*?$/,``).replace(/^\/*/,`/`).replace(/[\\.*+^${}|()[\]]/g,`\\$&`).replace(/\/:([\w-]+)(\?)?/g,(e,t,n)=>(r.push({paramName:t,isOptional:n!=null}),n?`/?([^\\/]+)?`:`/([^\\/]+)`)).replace(/\/([\w-]+)\?(\/|$)/g,`(/$1)?$2`);return e.endsWith(`*`)?(r.push({paramName:`*`}),i+=e===`*`||e===`/*`?`(.*)$`:`(?:\\/(.+)|\\/*)$`):n?i+=`\\/*$`:e!==``&&e!==`/`&&(i+=`(?:(?=\\/|$))`),[new RegExp(i,t?void 0:`i`),r]}function Tt(e){try{return e.split(`/`).map(e=>decodeURIComponent(e).replace(/\//g,`%2F`)).join(`/`)}catch(t){return M(!1,`The URL path "${e}" could not be decoded because it is a malformed URL segment. This is probably due to a bad percent encoding (${t}).`),e}}function F(e,t){if(t===`/`)return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let n=t.endsWith(`/`)?t.length-1:t.length,r=e.charAt(n);return r&&r!==`/`?null:e.slice(n)||`/`}var Et=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i;function Dt(e,t=`/`){let{pathname:n,search:r=``,hash:i=``}=typeof e==`string`?P(e):e,a;return n?(n=n.replace(/\/\/+/g,`/`),a=n.startsWith(`/`)?Ot(n.substring(1),`/`):Ot(n,t)):a=t,{pathname:a,search:Pt(r),hash:Ft(i)}}function Ot(e,t){let n=t.replace(/\/+$/,``).split(`/`);return e.split(`/`).forEach(e=>{e===`..`?n.length>1&&n.pop():e!==`.`&&n.push(e)}),n.length>1?n.join(`/`):`/`}function kt(e,t,n,r){return`Cannot include a '${e}' character in a manually specified \`to.${t}\` field [${JSON.stringify(r)}]. Please separate it out to the \`to.${n}\` field. Alternatively you may provide the full path as a string in <Link to="..."> and the router will parse it for you.`}function At(e){return e.filter((e,t)=>t===0||e.route.path&&e.route.path.length>0)}function jt(e){let t=At(e);return t.map((e,n)=>n===t.length-1?e.pathname:e.pathnameBase)}function Mt(e,t,n,r=!1){let i;typeof e==`string`?i=P(e):(i={...e},j(!i.pathname||!i.pathname.includes(`?`),kt(`?`,`pathname`,`search`,i)),j(!i.pathname||!i.pathname.includes(`#`),kt(`#`,`pathname`,`hash`,i)),j(!i.search||!i.search.includes(`#`),kt(`#`,`search`,`hash`,i)));let a=e===``||i.pathname===``,o=a?`/`:i.pathname,s;if(o==null)s=n;else{let e=t.length-1;if(!r&&o.startsWith(`..`)){let t=o.split(`/`);for(;t[0]===`..`;)t.shift(),--e;i.pathname=t.join(`/`)}s=e>=0?t[e]:`/`}let c=Dt(i,s),l=o&&o!==`/`&&o.endsWith(`/`),u=(a||o===`.`)&&n.endsWith(`/`);return!c.pathname.endsWith(`/`)&&(l||u)&&(c.pathname+=`/`),c}var I=e=>e.join(`/`).replace(/\/\/+/g,`/`),Nt=e=>e.replace(/\/+$/,``).replace(/^\/*/,`/`),Pt=e=>!e||e===`?`?``:e.startsWith(`?`)?e:`?`+e,Ft=e=>!e||e===`#`?``:e.startsWith(`#`)?e:`#`+e,It=class{constructor(e,t,n,r=!1){this.status=e,this.statusText=t||``,this.internal=r,n instanceof Error?(this.data=n.toString(),this.error=n):this.data=n}};function Lt(e){return e!=null&&typeof e.status==`number`&&typeof e.statusText==`string`&&typeof e.internal==`boolean`&&`data`in e}function Rt(e){return e.map(e=>e.route.path).filter(Boolean).join(`/`).replace(/\/\/*/g,`/`)||`/`}var zt=typeof window<`u`&&window.document!==void 0&&window.document.createElement!==void 0;function Bt(e,t){let n=e;if(typeof n!=`string`||!Et.test(n))return{absoluteURL:void 0,isExternal:!1,to:n};let r=n,i=!1;if(zt)try{let e=new URL(window.location.href),r=n.startsWith(`//`)?new URL(e.protocol+n):new URL(n),a=F(r.pathname,t);r.origin===e.origin&&a!=null?n=a+r.search+r.hash:i=!0}catch{M(!1,`<Link to="${n}"> contains an invalid URL which will probably break when clicked - please update to a valid URL path.`)}return{absoluteURL:r,isExternal:i,to:n}}Object.getOwnPropertyNames(Object.prototype).sort().join(`\0`);var Vt=[`POST`,`PUT`,`PATCH`,`DELETE`];new Set(Vt);var Ht=[`GET`,...Vt];new Set(Ht);var L=A.createContext(null);L.displayName=`DataRouter`;var Ut=A.createContext(null);Ut.displayName=`DataRouterState`;var Wt=A.createContext(!1),Gt=A.createContext({isTransitioning:!1});Gt.displayName=`ViewTransition`;var Kt=A.createContext(new Map);Kt.displayName=`Fetchers`;var qt=A.createContext(null);qt.displayName=`Await`;var R=A.createContext(null);R.displayName=`Navigation`;var Jt=A.createContext(null);Jt.displayName=`Location`;var z=A.createContext({outlet:null,matches:[],isDataRoute:!1});z.displayName=`Route`;var Yt=A.createContext(null);Yt.displayName=`RouteError`;var Xt=`REACT_ROUTER_ERROR`,Zt=`REDIRECT`,Qt=`ROUTE_ERROR_RESPONSE`;function $t(e){if(e.startsWith(`${Xt}:${Zt}:{`))try{let t=JSON.parse(e.slice(28));if(typeof t==`object`&&t&&typeof t.status==`number`&&typeof t.statusText==`string`&&typeof t.location==`string`&&typeof t.reloadDocument==`boolean`&&typeof t.replace==`boolean`)return t}catch{}}function en(e){if(e.startsWith(`${Xt}:${Qt}:{`))try{let t=JSON.parse(e.slice(40));if(typeof t==`object`&&t&&typeof t.status==`number`&&typeof t.statusText==`string`)return new It(t.status,t.statusText,t.data)}catch{}}function tn(e,{relative:t}={}){j(B(),`useHref() may be used only in the context of a <Router> component.`);let{basename:n,navigator:r}=A.useContext(R),{hash:i,pathname:a,search:o}=cn(e,{relative:t}),s=a;return n!==`/`&&(s=a===`/`?n:I([n,a])),r.createHref({pathname:s,search:o,hash:i})}function B(){return A.useContext(Jt)!=null}function V(){return j(B(),`useLocation() may be used only in the context of a <Router> component.`),A.useContext(Jt).location}var nn=`You should call navigate() in a React.useEffect(), not when your component is first rendered.`;function rn(e){A.useContext(R).static||A.useLayoutEffect(e)}function an(){let{isDataRoute:e}=A.useContext(z);return e?Dn():on()}function on(){j(B(),`useNavigate() may be used only in the context of a <Router> component.`);let e=A.useContext(L),{basename:t,navigator:n}=A.useContext(R),{matches:r}=A.useContext(z),{pathname:i}=V(),a=JSON.stringify(jt(r)),o=A.useRef(!1);return rn(()=>{o.current=!0}),A.useCallback((r,s={})=>{if(M(o.current,nn),!o.current)return;if(typeof r==`number`){n.go(r);return}let c=Mt(r,JSON.parse(a),i,s.relative===`path`);e==null&&t!==`/`&&(c.pathname=c.pathname===`/`?t:I([t,c.pathname])),(s.replace?n.replace:n.push)(c,s.state,s)},[t,n,a,i,e])}A.createContext(null);function sn(){let{matches:e}=A.useContext(z),t=e[e.length-1];return t?t.params:{}}function cn(e,{relative:t}={}){let{matches:n}=A.useContext(z),{pathname:r}=V(),i=JSON.stringify(jt(n));return A.useMemo(()=>Mt(e,JSON.parse(i),r,t===`path`),[e,i,r,t])}function ln(e,t){return un(e,t)}function un(e,t,n,r,i){j(B(),`useRoutes() may be used only in the context of a <Router> component.`);let{navigator:a}=A.useContext(R),{matches:o}=A.useContext(z),s=o[o.length-1],c=s?s.params:{},l=s?s.pathname:`/`,u=s?s.pathnameBase:`/`,d=s&&s.route;{let e=d&&d.path||``;kn(l,!d||e.endsWith(`*`)||e.endsWith(`*?`),`You rendered descendant <Routes> (or called \`useRoutes()\`) at "${l}" (under <Route path="${e}">) but the parent route path has no trailing "*". This means if you navigate deeper, the parent won't match anymore and therefore the child routes will never render.
2
-
3
- Please change the parent <Route path="${e}"> to <Route path="${e===`/`?`*`:`${e}/*`}">.`)}let f=V(),p;if(t){let e=typeof t==`string`?P(t):t;j(u===`/`||e.pathname?.startsWith(u),`When overriding the location using \`<Routes location>\` or \`useRoutes(routes, location)\`, the location pathname must begin with the portion of the URL pathname that was matched by all parent routes. The current pathname base is "${u}" but pathname "${e.pathname}" was given in the \`location\` prop.`),p=e}else p=f;let m=p.pathname||`/`,h=m;if(u!==`/`){let e=u.replace(/^\//,``).split(`/`);h=`/`+m.replace(/^\//,``).split(`/`).slice(e.length).join(`/`)}let g=st(e,{pathname:h});M(d||g!=null,`No routes matched location "${p.pathname}${p.search}${p.hash}" `),M(g==null||g[g.length-1].route.element!==void 0||g[g.length-1].route.Component!==void 0||g[g.length-1].route.lazy!==void 0,`Matched leaf route at location "${p.pathname}${p.search}${p.hash}" does not have an element or Component. This means it will render an <Outlet /> with a null value by default resulting in an "empty" page.`);let _=_n(g&&g.map(e=>Object.assign({},e,{params:Object.assign({},c,e.params),pathname:I([u,a.encodeLocation?a.encodeLocation(e.pathname.replace(/\?/g,`%3F`).replace(/#/g,`%23`)).pathname:e.pathname]),pathnameBase:e.pathnameBase===`/`?u:I([u,a.encodeLocation?a.encodeLocation(e.pathnameBase.replace(/\?/g,`%3F`).replace(/#/g,`%23`)).pathname:e.pathnameBase])})),o,n,r,i);return t&&_?A.createElement(Jt.Provider,{value:{location:{pathname:`/`,search:``,hash:``,state:null,key:`default`,...p},navigationType:`POP`}},_):_}function dn(){let e=En(),t=Lt(e)?`${e.status} ${e.statusText}`:e instanceof Error?e.message:JSON.stringify(e),n=e instanceof Error?e.stack:null,r=`rgba(200,200,200, 0.5)`,i={padding:`0.5rem`,backgroundColor:r},a={padding:`2px 4px`,backgroundColor:r},o=null;return console.error(`Error handled by React Router default ErrorBoundary:`,e),o=A.createElement(A.Fragment,null,A.createElement(`p`,null,`💿 Hey developer 👋`),A.createElement(`p`,null,`You can provide a way better UX than this when your app throws errors by providing your own `,A.createElement(`code`,{style:a},`ErrorBoundary`),` or`,` `,A.createElement(`code`,{style:a},`errorElement`),` prop on your route.`)),A.createElement(A.Fragment,null,A.createElement(`h2`,null,`Unexpected Application Error!`),A.createElement(`h3`,{style:{fontStyle:`italic`}},t),n?A.createElement(`pre`,{style:i},n):null,o)}var fn=A.createElement(dn,null),pn=class extends A.Component{constructor(e){super(e),this.state={location:e.location,revalidation:e.revalidation,error:e.error}}static getDerivedStateFromError(e){return{error:e}}static getDerivedStateFromProps(e,t){return t.location!==e.location||t.revalidation!==`idle`&&e.revalidation===`idle`?{error:e.error,location:e.location,revalidation:e.revalidation}:{error:e.error===void 0?t.error:e.error,location:t.location,revalidation:e.revalidation||t.revalidation}}componentDidCatch(e,t){this.props.onError?this.props.onError(e,t):console.error(`React Router caught the following error during render`,e)}render(){let e=this.state.error;if(this.context&&typeof e==`object`&&e&&`digest`in e&&typeof e.digest==`string`){let t=en(e.digest);t&&(e=t)}let t=e===void 0?this.props.children:A.createElement(z.Provider,{value:this.props.routeContext},A.createElement(Yt.Provider,{value:e,children:this.props.component}));return this.context?A.createElement(hn,{error:e},t):t}};pn.contextType=Wt;var mn=new WeakMap;function hn({children:e,error:t}){let{basename:n}=A.useContext(R);if(typeof t==`object`&&t&&`digest`in t&&typeof t.digest==`string`){let e=$t(t.digest);if(e){let r=mn.get(t);if(r)throw r;let i=Bt(e.location,n);if(zt&&!mn.get(t))if(i.isExternal||e.reloadDocument)window.location.href=i.absoluteURL||i.to;else{let n=Promise.resolve().then(()=>window.__reactRouterDataRouter.navigate(i.to,{replace:e.replace}));throw mn.set(t,n),n}return A.createElement(`meta`,{httpEquiv:`refresh`,content:`0;url=${i.absoluteURL||i.to}`})}}return e}function gn({routeContext:e,match:t,children:n}){let r=A.useContext(L);return r&&r.static&&r.staticContext&&(t.route.errorElement||t.route.ErrorBoundary)&&(r.staticContext._deepestRenderedBoundaryId=t.route.id),A.createElement(z.Provider,{value:e},n)}function _n(e,t=[],n=null,r=null,i=null){if(e==null){if(!n)return null;if(n.errors)e=n.matches;else if(t.length===0&&!n.initialized&&n.matches.length>0)e=n.matches;else return null}let a=e,o=n?.errors;if(o!=null){let e=a.findIndex(e=>e.route.id&&o?.[e.route.id]!==void 0);j(e>=0,`Could not find a matching route for errors on route IDs: ${Object.keys(o).join(`,`)}`),a=a.slice(0,Math.min(a.length,e+1))}let s=!1,c=-1;if(n)for(let e=0;e<a.length;e++){let t=a[e];if((t.route.HydrateFallback||t.route.hydrateFallbackElement)&&(c=e),t.route.id){let{loaderData:e,errors:r}=n,i=t.route.loader&&!e.hasOwnProperty(t.route.id)&&(!r||r[t.route.id]===void 0);if(t.route.lazy||i){s=!0,a=c>=0?a.slice(0,c+1):[a[0]];break}}}let l=n&&r?(e,t)=>{r(e,{location:n.location,params:n.matches?.[0]?.params??{},unstable_pattern:Rt(n.matches),errorInfo:t})}:void 0;return a.reduceRight((e,r,i)=>{let u,d=!1,f=null,p=null;n&&(u=o&&r.route.id?o[r.route.id]:void 0,f=r.route.errorElement||fn,s&&(c<0&&i===0?(kn(`route-fallback`,!1,"No `HydrateFallback` element provided to render during initial hydration"),d=!0,p=null):c===i&&(d=!0,p=r.route.hydrateFallbackElement||null)));let m=t.concat(a.slice(0,i+1)),h=()=>{let t;return t=u?f:d?p:r.route.Component?A.createElement(r.route.Component,null):r.route.element?r.route.element:e,A.createElement(gn,{match:r,routeContext:{outlet:e,matches:m,isDataRoute:n!=null},children:t})};return n&&(r.route.ErrorBoundary||r.route.errorElement||i===0)?A.createElement(pn,{location:n.location,revalidation:n.revalidation,component:f,error:u,children:h(),routeContext:{outlet:null,matches:m,isDataRoute:!0},onError:l}):h()},null)}function vn(e){return`${e} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}function yn(e){let t=A.useContext(L);return j(t,vn(e)),t}function bn(e){let t=A.useContext(Ut);return j(t,vn(e)),t}function xn(e){let t=A.useContext(z);return j(t,vn(e)),t}function Sn(e){let t=xn(e),n=t.matches[t.matches.length-1];return j(n.route.id,`${e} can only be used on routes that contain a unique "id"`),n.route.id}function Cn(){return Sn(`useRouteId`)}function wn(){return bn(`useNavigation`).navigation}function Tn(){let{matches:e,loaderData:t}=bn(`useMatches`);return A.useMemo(()=>e.map(e=>lt(e,t)),[e,t])}function En(){let e=A.useContext(Yt),t=bn(`useRouteError`),n=Sn(`useRouteError`);return e===void 0?t.errors?.[n]:e}function Dn(){let{router:e}=yn(`useNavigate`),t=Sn(`useNavigate`),n=A.useRef(!1);return rn(()=>{n.current=!0}),A.useCallback(async(r,i={})=>{M(n.current,nn),n.current&&(typeof r==`number`?await e.navigate(r):await e.navigate(r,{fromRouteId:t,...i}))},[e,t])}var On={};function kn(e,t,n){!t&&!On[e]&&(On[e]=!0,M(!1,n))}A.useOptimistic,A.memo(An);function An({routes:e,future:t,state:n,onError:r}){return un(e,void 0,n,r,t)}function jn({basename:e,children:t,initialEntries:n,initialIndex:r,unstable_useTransitions:i}){let a=A.useRef();a.current??=et({initialEntries:n,initialIndex:r,v5Compat:!0});let o=a.current,[s,c]=A.useState({action:o.action,location:o.location}),l=A.useCallback(e=>{i===!1?c(e):A.startTransition(()=>c(e))},[i]);return A.useLayoutEffect(()=>o.listen(l),[o,l]),A.createElement(Pn,{basename:e,children:t,location:s.location,navigationType:s.action,navigator:o,unstable_useTransitions:i})}function Mn({to:e,replace:t,state:n,relative:r}){j(B(),`<Navigate> may be used only in the context of a <Router> component.`);let{static:i}=A.useContext(R);M(!i,`<Navigate> must not be used on the initial render in a <StaticRouter>. This is a no-op, but you should modify your code so the <Navigate> is only ever rendered in response to some user interaction or state change.`);let{matches:a}=A.useContext(z),{pathname:o}=V(),s=an(),c=Mt(e,jt(a),o,r===`path`),l=JSON.stringify(c);return A.useEffect(()=>{s(JSON.parse(l),{replace:t,state:n,relative:r})},[s,l,r,t,n]),null}function Nn(e){j(!1,`A <Route> is only ever to be used as the child of <Routes> element, never rendered directly. Please wrap your <Route> in a <Routes>.`)}function Pn({basename:e=`/`,children:t=null,location:n,navigationType:r=`POP`,navigator:i,static:a=!1,unstable_useTransitions:o}){j(!B(),`You cannot render a <Router> inside another <Router>. You should never have more than one in your app.`);let s=e.replace(/^\/*/,`/`),c=A.useMemo(()=>({basename:s,navigator:i,static:a,unstable_useTransitions:o,future:{}}),[s,i,a,o]);typeof n==`string`&&(n=P(n));let{pathname:l=`/`,search:u=``,hash:d=``,state:f=null,key:p=`default`}=n,m=A.useMemo(()=>{let e=F(l,s);return e==null?null:{location:{pathname:e,search:u,hash:d,state:f,key:p},navigationType:r}},[s,l,u,d,f,p,r]);return M(m!=null,`<Router basename="${s}"> is not able to match the URL "${l}${u}${d}" because it does not start with the basename, so the <Router> won't render anything.`),m==null?null:A.createElement(R.Provider,{value:c},A.createElement(Jt.Provider,{children:t,value:m}))}function Fn({children:e,location:t}){return ln(In(e),t)}A.Component;function In(e,t=[]){let n=[];return A.Children.forEach(e,(e,r)=>{if(!A.isValidElement(e))return;let i=[...t,r];if(e.type===A.Fragment){n.push.apply(n,In(e.props.children,i));return}j(e.type===Nn,`[${typeof e.type==`string`?e.type:e.type.name}] is not a <Route> component. All component children of <Routes> must be a <Route> or <React.Fragment>`),j(!e.props.index||!e.props.children,`An index route cannot have child routes.`);let a={id:e.props.id||i.join(`-`),caseSensitive:e.props.caseSensitive,element:e.props.element,Component:e.props.Component,index:e.props.index,path:e.props.path,middleware:e.props.middleware,loader:e.props.loader,action:e.props.action,hydrateFallbackElement:e.props.hydrateFallbackElement,HydrateFallback:e.props.HydrateFallback,errorElement:e.props.errorElement,ErrorBoundary:e.props.ErrorBoundary,hasErrorBoundary:e.props.hasErrorBoundary===!0||e.props.ErrorBoundary!=null||e.props.errorElement!=null,shouldRevalidate:e.props.shouldRevalidate,handle:e.props.handle,lazy:e.props.lazy};e.props.children&&(a.children=In(e.props.children,i)),n.push(a)}),n}var Ln=`get`,Rn=`application/x-www-form-urlencoded`;function zn(e){return typeof HTMLElement<`u`&&e instanceof HTMLElement}function Bn(e){return zn(e)&&e.tagName.toLowerCase()===`button`}function Vn(e){return zn(e)&&e.tagName.toLowerCase()===`form`}function Hn(e){return zn(e)&&e.tagName.toLowerCase()===`input`}function Un(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function Wn(e,t){return e.button===0&&(!t||t===`_self`)&&!Un(e)}var Gn=null;function Kn(){if(Gn===null)try{new FormData(document.createElement(`form`),0),Gn=!1}catch{Gn=!0}return Gn}var qn=new Set([`application/x-www-form-urlencoded`,`multipart/form-data`,`text/plain`]);function Jn(e){return e!=null&&!qn.has(e)?(M(!1,`"${e}" is not a valid \`encType\` for \`<Form>\`/\`<fetcher.Form>\` and will default to "${Rn}"`),null):e}function Yn(e,t){let n,r,i,a,o;if(Vn(e)){let o=e.getAttribute(`action`);r=o?F(o,t):null,n=e.getAttribute(`method`)||Ln,i=Jn(e.getAttribute(`enctype`))||Rn,a=new FormData(e)}else if(Bn(e)||Hn(e)&&(e.type===`submit`||e.type===`image`)){let o=e.form;if(o==null)throw Error(`Cannot submit a <button> or <input type="submit"> without a <form>`);let s=e.getAttribute(`formaction`)||o.getAttribute(`action`);if(r=s?F(s,t):null,n=e.getAttribute(`formmethod`)||o.getAttribute(`method`)||Ln,i=Jn(e.getAttribute(`formenctype`))||Jn(o.getAttribute(`enctype`))||Rn,a=new FormData(o,e),!Kn()){let{name:t,type:n,value:r}=e;if(n===`image`){let e=t?`${t}.`:``;a.append(`${e}x`,`0`),a.append(`${e}y`,`0`)}else t&&a.append(t,r)}}else if(zn(e))throw Error(`Cannot submit element that is not <form>, <button>, or <input type="submit|image">`);else n=Ln,r=null,i=Rn,o=e;return a&&i===`text/plain`&&(o=a,a=void 0),{action:r,method:n.toLowerCase(),encType:i,formData:a,body:o}}Object.getOwnPropertyNames(Object.prototype).sort().join(`\0`);var Xn={"&":`\\u0026`,">":`\\u003e`,"<":`\\u003c`,"\u2028":`\\u2028`,"\u2029":`\\u2029`},Zn=/[&><\u2028\u2029]/g;function Qn(e){return e.replace(Zn,e=>Xn[e])}function $n(e,t){if(e===!1||e==null)throw Error(t)}function er(e,t,n,r){let i=typeof e==`string`?new URL(e,typeof window>`u`?`server://singlefetch/`:window.location.origin):e;return n?i.pathname.endsWith(`/`)?i.pathname=`${i.pathname}_.${r}`:i.pathname=`${i.pathname}.${r}`:i.pathname===`/`?i.pathname=`_root.${r}`:t&&F(i.pathname,t)===`/`?i.pathname=`${t.replace(/\/$/,``)}/_root.${r}`:i.pathname=`${i.pathname.replace(/\/$/,``)}.${r}`,i}async function tr(e,t){if(e.id in t)return t[e.id];try{let n=await Qe(()=>import(e.module),[]);return t[e.id]=n,n}catch(t){return console.error(`Error loading route module \`${e.module}\`, reloading page...`),console.error(t),window.__reactRouterContext&&window.__reactRouterContext.isSpaMode,window.location.reload(),new Promise(()=>{})}}function nr(e){return e!=null&&typeof e.page==`string`}function rr(e){return e==null?!1:e.href==null?e.rel===`preload`&&typeof e.imageSrcSet==`string`&&typeof e.imageSizes==`string`:typeof e.rel==`string`&&typeof e.href==`string`}async function ir(e,t,n){return lr((await Promise.all(e.map(async e=>{let r=t.routes[e.route.id];if(r){let e=await tr(r,n);return e.links?e.links():[]}return[]}))).flat(1).filter(rr).filter(e=>e.rel===`stylesheet`||e.rel===`preload`).map(e=>e.rel===`stylesheet`?{...e,rel:`prefetch`,as:`style`}:{...e,rel:`prefetch`}))}function ar(e,t,n,r,i,a){let o=(e,t)=>n[t]?e.route.id!==n[t].route.id:!0,s=(e,t)=>n[t].pathname!==e.pathname||n[t].route.path?.endsWith(`*`)&&n[t].params[`*`]!==e.params[`*`];return a===`assets`?t.filter((e,t)=>o(e,t)||s(e,t)):a===`data`?t.filter((t,a)=>{let c=r.routes[t.route.id];if(!c||!c.hasLoader)return!1;if(o(t,a)||s(t,a))return!0;if(t.route.shouldRevalidate){let r=t.route.shouldRevalidate({currentUrl:new URL(i.pathname+i.search+i.hash,window.origin),currentParams:n[0]?.params||{},nextUrl:new URL(e,window.origin),nextParams:t.params,defaultShouldRevalidate:!0});if(typeof r==`boolean`)return r}return!0}):[]}function or(e,t,{includeHydrateFallback:n}={}){return sr(e.map(e=>{let r=t.routes[e.route.id];if(!r)return[];let i=[r.module];return r.clientActionModule&&(i=i.concat(r.clientActionModule)),r.clientLoaderModule&&(i=i.concat(r.clientLoaderModule)),n&&r.hydrateFallbackModule&&(i=i.concat(r.hydrateFallbackModule)),r.imports&&(i=i.concat(r.imports)),i}).flat(1))}function sr(e){return[...new Set(e)]}function cr(e){let t={},n=Object.keys(e).sort();for(let r of n)t[r]=e[r];return t}function lr(e,t){let n=new Set,r=new Set(t);return e.reduce((e,i)=>{if(t&&!nr(i)&&i.as===`script`&&i.href&&r.has(i.href))return e;let a=JSON.stringify(cr(i));return n.has(a)||(n.add(a),e.push({key:a,link:i})),e},[])}function ur(){let e=A.useContext(L);return $n(e,`You must render this element inside a <DataRouterContext.Provider> element`),e}function dr(){let e=A.useContext(Ut);return $n(e,`You must render this element inside a <DataRouterStateContext.Provider> element`),e}var fr=A.createContext(void 0);fr.displayName=`FrameworkContext`;function pr(){let e=A.useContext(fr);return $n(e,`You must render this element inside a <HydratedRouter> element`),e}function mr(e,t){let n=A.useContext(fr),[r,i]=A.useState(!1),[a,o]=A.useState(!1),{onFocus:s,onBlur:c,onMouseEnter:l,onMouseLeave:u,onTouchStart:d}=t,f=A.useRef(null);A.useEffect(()=>{if(e===`render`&&o(!0),e===`viewport`){let e=new IntersectionObserver(e=>{e.forEach(e=>{o(e.isIntersecting)})},{threshold:.5});return f.current&&e.observe(f.current),()=>{e.disconnect()}}},[e]),A.useEffect(()=>{if(r){let e=setTimeout(()=>{o(!0)},100);return()=>{clearTimeout(e)}}},[r]);let p=()=>{i(!0)},m=()=>{i(!1),o(!1)};return n?e===`intent`?[a,f,{onFocus:hr(s,p),onBlur:hr(c,m),onMouseEnter:hr(l,p),onMouseLeave:hr(u,m),onTouchStart:hr(d,p)}]:[a,f,{}]:[!1,f,{}]}function hr(e,t){return n=>{e&&e(n),n.defaultPrevented||t(n)}}function gr({page:e,...t}){let{router:n}=ur(),r=A.useMemo(()=>st(n.routes,e,n.basename),[n.routes,e,n.basename]);return r?A.createElement(vr,{page:e,matches:r,...t}):null}function _r(e){let{manifest:t,routeModules:n}=pr(),[r,i]=A.useState([]);return A.useEffect(()=>{let r=!1;return ir(e,t,n).then(e=>{r||i(e)}),()=>{r=!0}},[e,t,n]),r}function vr({page:e,matches:t,...n}){let r=V(),{future:i,manifest:a,routeModules:o}=pr(),{basename:s}=ur(),{loaderData:c,matches:l}=dr(),u=A.useMemo(()=>ar(e,t,l,a,r,`data`),[e,t,l,a,r]),d=A.useMemo(()=>ar(e,t,l,a,r,`assets`),[e,t,l,a,r]),f=A.useMemo(()=>{if(e===r.pathname+r.search+r.hash)return[];let n=new Set,l=!1;if(t.forEach(e=>{let t=a.routes[e.route.id];!t||!t.hasLoader||(!u.some(t=>t.route.id===e.route.id)&&e.route.id in c&&o[e.route.id]?.shouldRevalidate||t.hasClientLoader?l=!0:n.add(e.route.id))}),n.size===0)return[];let d=er(e,s,i.unstable_trailingSlashAwareDataRequests,`data`);return l&&n.size>0&&d.searchParams.set(`_routes`,t.filter(e=>n.has(e.route.id)).map(e=>e.route.id).join(`,`)),[d.pathname+d.search]},[s,i.unstable_trailingSlashAwareDataRequests,c,r,a,u,t,e,o]),p=A.useMemo(()=>or(d,a),[d,a]),m=_r(d);return A.createElement(A.Fragment,null,f.map(e=>A.createElement(`link`,{key:e,rel:`prefetch`,as:`fetch`,href:e,...n})),p.map(e=>A.createElement(`link`,{key:e,rel:`modulepreload`,href:e,...n})),m.map(({key:e,link:t})=>A.createElement(`link`,{key:e,nonce:n.nonce,...t,crossOrigin:t.crossOrigin??n.crossOrigin})))}function yr(...e){return t=>{e.forEach(e=>{typeof e==`function`?e(t):e!=null&&(e.current=t)})}}A.Component;var br=typeof window<`u`&&window.document!==void 0&&window.document.createElement!==void 0;try{br&&(window.__reactRouterVersion=`7.13.0`)}catch{}function xr({basename:e,children:t,unstable_useTransitions:n,window:r}){let i=A.useRef();i.current??=tt({window:r,v5Compat:!0});let a=i.current,[o,s]=A.useState({action:a.action,location:a.location}),c=A.useCallback(e=>{n===!1?s(e):A.startTransition(()=>s(e))},[n]);return A.useLayoutEffect(()=>a.listen(c),[a,c]),A.createElement(Pn,{basename:e,children:t,location:o.location,navigationType:o.action,navigator:a,unstable_useTransitions:n})}function Sr({basename:e,children:t,history:n,unstable_useTransitions:r}){let[i,a]=A.useState({action:n.action,location:n.location}),o=A.useCallback(e=>{r===!1?a(e):A.startTransition(()=>a(e))},[r]);return A.useLayoutEffect(()=>n.listen(o),[n,o]),A.createElement(Pn,{basename:e,children:t,location:i.location,navigationType:i.action,navigator:n,unstable_useTransitions:r})}Sr.displayName=`unstable_HistoryRouter`;var Cr=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,wr=A.forwardRef(function({onClick:e,discover:t=`render`,prefetch:n=`none`,relative:r,reloadDocument:i,replace:a,state:o,target:s,to:c,preventScrollReset:l,viewTransition:u,unstable_defaultShouldRevalidate:d,...f},p){let{basename:m,unstable_useTransitions:h}=A.useContext(R),g=typeof c==`string`&&Cr.test(c),_=Bt(c,m);c=_.to;let v=tn(c,{relative:r}),[y,b,ee]=mr(n,f),x=jr(c,{replace:a,state:o,target:s,preventScrollReset:l,relative:r,viewTransition:u,unstable_defaultShouldRevalidate:d,unstable_useTransitions:h});function S(t){e&&e(t),t.defaultPrevented||x(t)}let te=A.createElement(`a`,{...f,...ee,href:_.absoluteURL||v,onClick:_.isExternal||i?e:S,ref:yr(p,b),target:s,"data-discover":!g&&t===`render`?`true`:void 0});return y&&!g?A.createElement(A.Fragment,null,te,A.createElement(gr,{page:v})):te});wr.displayName=`Link`;var Tr=A.forwardRef(function({"aria-current":e=`page`,caseSensitive:t=!1,className:n=``,end:r=!1,style:i,to:a,viewTransition:o,children:s,...c},l){let u=cn(a,{relative:c.relative}),d=V(),f=A.useContext(Ut),{navigator:p,basename:m}=A.useContext(R),h=f!=null&&Vr(u)&&o===!0,g=p.encodeLocation?p.encodeLocation(u).pathname:u.pathname,_=d.pathname,v=f&&f.navigation&&f.navigation.location?f.navigation.location.pathname:null;t||(_=_.toLowerCase(),v=v?v.toLowerCase():null,g=g.toLowerCase()),v&&m&&(v=F(v,m)||v);let y=g!==`/`&&g.endsWith(`/`)?g.length-1:g.length,b=_===g||!r&&_.startsWith(g)&&_.charAt(y)===`/`,ee=v!=null&&(v===g||!r&&v.startsWith(g)&&v.charAt(g.length)===`/`),x={isActive:b,isPending:ee,isTransitioning:h},S=b?e:void 0,te;te=typeof n==`function`?n(x):[n,b?`active`:null,ee?`pending`:null,h?`transitioning`:null].filter(Boolean).join(` `);let ne=typeof i==`function`?i(x):i;return A.createElement(wr,{...c,"aria-current":S,className:te,ref:l,style:ne,to:a,viewTransition:o},typeof s==`function`?s(x):s)});Tr.displayName=`NavLink`;var Er=A.forwardRef(({discover:e=`render`,fetcherKey:t,navigate:n,reloadDocument:r,replace:i,state:a,method:o=Ln,action:s,onSubmit:c,relative:l,preventScrollReset:u,viewTransition:d,unstable_defaultShouldRevalidate:f,...p},m)=>{let{unstable_useTransitions:h}=A.useContext(R),g=Pr(),_=Fr(s,{relative:l}),v=o.toLowerCase()===`get`?`get`:`post`,y=typeof s==`string`&&Cr.test(s);return A.createElement(`form`,{ref:m,method:v,action:_,onSubmit:r?c:e=>{if(c&&c(e),e.defaultPrevented)return;e.preventDefault();let r=e.nativeEvent.submitter,s=r?.getAttribute(`formmethod`)||o,p=()=>g(r||e.currentTarget,{fetcherKey:t,method:s,navigate:n,replace:i,state:a,relative:l,preventScrollReset:u,viewTransition:d,unstable_defaultShouldRevalidate:f});h&&n!==!1?A.startTransition(()=>p()):p()},...p,"data-discover":!y&&e===`render`?`true`:void 0})});Er.displayName=`Form`;function Dr({getKey:e,storageKey:t,...n}){let r=A.useContext(fr),{basename:i}=A.useContext(R),a=V(),o=Tn();zr({getKey:e,storageKey:t});let s=A.useMemo(()=>{if(!r||!e)return null;let t=Rr(a,o,i,e);return t===a.key?null:t},[]);if(!r||r.isSpaMode)return null;let c=((e,t)=>{if(!window.history.state||!window.history.state.key){let e=Math.random().toString(32).slice(2);window.history.replaceState({key:e},``)}try{let n=JSON.parse(sessionStorage.getItem(e)||`{}`)[t||window.history.state.key];typeof n==`number`&&window.scrollTo(0,n)}catch(t){console.error(t),sessionStorage.removeItem(e)}}).toString();return A.createElement(`script`,{...n,suppressHydrationWarning:!0,dangerouslySetInnerHTML:{__html:`(${c})(${Qn(JSON.stringify(t||Ir))}, ${Qn(JSON.stringify(s))})`}})}Dr.displayName=`ScrollRestoration`;function Or(e){return`${e} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}function kr(e){let t=A.useContext(L);return j(t,Or(e)),t}function Ar(e){let t=A.useContext(Ut);return j(t,Or(e)),t}function jr(e,{target:t,replace:n,state:r,preventScrollReset:i,relative:a,viewTransition:o,unstable_defaultShouldRevalidate:s,unstable_useTransitions:c}={}){let l=an(),u=V(),d=cn(e,{relative:a});return A.useCallback(f=>{if(Wn(f,t)){f.preventDefault();let t=n===void 0?N(u)===N(d):n,p=()=>l(e,{replace:t,state:r,preventScrollReset:i,relative:a,viewTransition:o,unstable_defaultShouldRevalidate:s});c?A.startTransition(()=>p()):p()}},[u,l,d,n,r,t,e,i,a,o,s,c])}var Mr=0,Nr=()=>`__${String(++Mr)}__`;function Pr(){let{router:e}=kr(`useSubmit`),{basename:t}=A.useContext(R),n=Cn(),r=e.fetch,i=e.navigate;return A.useCallback(async(e,a={})=>{let{action:o,method:s,encType:c,formData:l,body:u}=Yn(e,t);a.navigate===!1?await r(a.fetcherKey||Nr(),n,a.action||o,{unstable_defaultShouldRevalidate:a.unstable_defaultShouldRevalidate,preventScrollReset:a.preventScrollReset,formData:l,body:u,formMethod:a.method||s,formEncType:a.encType||c,flushSync:a.flushSync}):await i(a.action||o,{unstable_defaultShouldRevalidate:a.unstable_defaultShouldRevalidate,preventScrollReset:a.preventScrollReset,formData:l,body:u,formMethod:a.method||s,formEncType:a.encType||c,replace:a.replace,state:a.state,fromRouteId:n,flushSync:a.flushSync,viewTransition:a.viewTransition})},[r,i,t,n])}function Fr(e,{relative:t}={}){let{basename:n}=A.useContext(R),r=A.useContext(z);j(r,`useFormAction must be used inside a RouteContext`);let[i]=r.matches.slice(-1),a={...cn(e||`.`,{relative:t})},o=V();if(e==null){a.search=o.search;let e=new URLSearchParams(a.search),t=e.getAll(`index`);if(t.some(e=>e===``)){e.delete(`index`),t.filter(e=>e).forEach(t=>e.append(`index`,t));let n=e.toString();a.search=n?`?${n}`:``}}return(!e||e===`.`)&&i.route.index&&(a.search=a.search?a.search.replace(/^\?/,`?index&`):`?index`),n!==`/`&&(a.pathname=a.pathname===`/`?n:I([n,a.pathname])),N(a)}var Ir=`react-router-scroll-positions`,Lr={};function Rr(e,t,n,r){let i=null;return r&&(i=r(n===`/`?e:{...e,pathname:F(e.pathname,n)||e.pathname},t)),i??=e.key,i}function zr({getKey:e,storageKey:t}={}){let{router:n}=kr(`useScrollRestoration`),{restoreScrollPosition:r,preventScrollReset:i}=Ar(`useScrollRestoration`),{basename:a}=A.useContext(R),o=V(),s=Tn(),c=wn();A.useEffect(()=>(window.history.scrollRestoration=`manual`,()=>{window.history.scrollRestoration=`auto`}),[]),Br(A.useCallback(()=>{if(c.state===`idle`){let t=Rr(o,s,a,e);Lr[t]=window.scrollY}try{sessionStorage.setItem(t||Ir,JSON.stringify(Lr))}catch(e){M(!1,`Failed to save scroll positions in sessionStorage, <ScrollRestoration /> will not work properly (${e}).`)}window.history.scrollRestoration=`auto`},[c.state,e,a,o,s,t])),typeof document<`u`&&(A.useLayoutEffect(()=>{try{let e=sessionStorage.getItem(t||Ir);e&&(Lr=JSON.parse(e))}catch{}},[t]),A.useLayoutEffect(()=>{let t=n?.enableScrollRestoration(Lr,()=>window.scrollY,e?(t,n)=>Rr(t,n,a,e):void 0);return()=>t&&t()},[n,a,e]),A.useLayoutEffect(()=>{if(r!==!1){if(typeof r==`number`){window.scrollTo(0,r);return}try{if(o.hash){let e=document.getElementById(decodeURIComponent(o.hash.slice(1)));if(e){e.scrollIntoView();return}}}catch{M(!1,`"${o.hash.slice(1)}" is not a decodable element ID. The view will not scroll to it.`)}i!==!0&&window.scrollTo(0,0)}},[o,r,i]))}function Br(e,t){let{capture:n}=t||{};A.useEffect(()=>{let t=n==null?void 0:{capture:n};return window.addEventListener(`pagehide`,e,t),()=>{window.removeEventListener(`pagehide`,e,t)}},[e,n])}function Vr(e,{relative:t}={}){let n=A.useContext(Gt);j(n!=null,"`useViewTransitionState` must be used within `react-router-dom`'s `RouterProvider`. Did you accidentally import `RouterProvider` from `react-router`?");let{basename:r}=kr(`useViewTransitionState`),i=cn(e,{relative:t});if(!n.isTransitioning)return!1;let a=F(n.currentLocation.pathname,r)||n.currentLocation.pathname,o=F(n.nextLocation.pathname,r)||n.nextLocation.pathname;return Ct(i.pathname,o)!=null||Ct(i.pathname,a)!=null}var Hr=w(`AppWindow`,[[`rect`,{x:`2`,y:`4`,width:`20`,height:`16`,rx:`2`,key:`izxlao`}],[`path`,{d:`M10 4v4`,key:`pp8u80`}],[`path`,{d:`M2 8h20`,key:`d11cs7`}],[`path`,{d:`M6 4v4`,key:`1svtjw`}]]),Ur=w(`BrainCircuit`,[[`path`,{d:`M12 5a3 3 0 1 0-5.997.125 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588A4 4 0 1 0 12 18Z`,key:`l5xja`}],[`path`,{d:`M9 13a4.5 4.5 0 0 0 3-4`,key:`10igwf`}],[`path`,{d:`M6.003 5.125A3 3 0 0 0 6.401 6.5`,key:`105sqy`}],[`path`,{d:`M3.477 10.896a4 4 0 0 1 .585-.396`,key:`ql3yin`}],[`path`,{d:`M6 18a4 4 0 0 1-1.967-.516`,key:`2e4loj`}],[`path`,{d:`M12 13h4`,key:`1ku699`}],[`path`,{d:`M12 18h6a2 2 0 0 1 2 2v1`,key:`105ag5`}],[`path`,{d:`M12 8h8`,key:`1lhi5i`}],[`path`,{d:`M16 8V5a2 2 0 0 1 2-2`,key:`u6izg6`}],[`circle`,{cx:`16`,cy:`13`,r:`.5`,key:`ry7gng`}],[`circle`,{cx:`18`,cy:`3`,r:`.5`,key:`1aiba7`}],[`circle`,{cx:`20`,cy:`21`,r:`.5`,key:`yhc1fs`}],[`circle`,{cx:`20`,cy:`8`,r:`.5`,key:`1e43v0`}]]),Wr=w(`CircleCheck`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`m9 12 2 2 4-4`,key:`dzmm74`}]]),Gr=w(`CircleDashed`,[[`path`,{d:`M10.1 2.182a10 10 0 0 1 3.8 0`,key:`5ilxe3`}],[`path`,{d:`M13.9 21.818a10 10 0 0 1-3.8 0`,key:`11zvb9`}],[`path`,{d:`M17.609 3.721a10 10 0 0 1 2.69 2.7`,key:`1iw5b2`}],[`path`,{d:`M2.182 13.9a10 10 0 0 1 0-3.8`,key:`c0bmvh`}],[`path`,{d:`M20.279 17.609a10 10 0 0 1-2.7 2.69`,key:`1ruxm7`}],[`path`,{d:`M21.818 10.1a10 10 0 0 1 0 3.8`,key:`qkgqxc`}],[`path`,{d:`M3.721 6.391a10 10 0 0 1 2.7-2.69`,key:`1mcia2`}],[`path`,{d:`M6.391 20.279a10 10 0 0 1-2.69-2.7`,key:`1fvljs`}]]),Kr=w(`CircleHelp`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3`,key:`1u773s`}],[`path`,{d:`M12 17h.01`,key:`p32p05`}]]),qr=w(`CirclePause`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`line`,{x1:`10`,x2:`10`,y1:`15`,y2:`9`,key:`c1nkhi`}],[`line`,{x1:`14`,x2:`14`,y1:`15`,y2:`9`,key:`h65svq`}]]),Jr=w(`EllipsisVertical`,[[`circle`,{cx:`12`,cy:`12`,r:`1`,key:`41hilf`}],[`circle`,{cx:`12`,cy:`5`,r:`1`,key:`gxeob9`}],[`circle`,{cx:`12`,cy:`19`,r:`1`,key:`lyex9k`}]]),Yr=w(`Grid3x3`,[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}],[`path`,{d:`M3 9h18`,key:`1pudct`}],[`path`,{d:`M3 15h18`,key:`5xshup`}],[`path`,{d:`M9 3v18`,key:`fh3hqa`}],[`path`,{d:`M15 3v18`,key:`14nvp0`}]]),Xr=w(`Laptop`,[[`path`,{d:`M20 16V7a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v9m16 0H4m16 0 1.28 2.55a1 1 0 0 1-.9 1.45H3.62a1 1 0 0 1-.9-1.45L4 16`,key:`tarvll`}]]),Zr=w(`LogOut`,[[`path`,{d:`M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4`,key:`1uf3rs`}],[`polyline`,{points:`16 17 21 12 16 7`,key:`1gabdz`}],[`line`,{x1:`21`,x2:`9`,y1:`12`,y2:`12`,key:`1uyos4`}]]),Qr=w(`Radar`,[[`path`,{d:`M19.07 4.93A10 10 0 0 0 6.99 3.34`,key:`z3du51`}],[`path`,{d:`M4 6h.01`,key:`oypzma`}],[`path`,{d:`M2.29 9.62A10 10 0 1 0 21.31 8.35`,key:`qzzz0`}],[`path`,{d:`M16.24 7.76A6 6 0 1 0 8.23 16.67`,key:`1yjesh`}],[`path`,{d:`M12 18h.01`,key:`mhygvu`}],[`path`,{d:`M17.99 11.66A6 6 0 0 1 15.77 16.67`,key:`1u2y91`}],[`circle`,{cx:`12`,cy:`12`,r:`2`,key:`1c9p78`}],[`path`,{d:`m13.41 10.59 5.66-5.66`,key:`mhq4k0`}]]),$r=w(`RefreshCcw`,[[`path`,{d:`M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8`,key:`14sxne`}],[`path`,{d:`M3 3v5h5`,key:`1xhq8a`}],[`path`,{d:`M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16`,key:`1hlbsb`}],[`path`,{d:`M16 16h5v5`,key:`ccwih5`}]]),ei=w(`Server`,[[`rect`,{width:`20`,height:`8`,x:`2`,y:`2`,rx:`2`,ry:`2`,key:`ngkwjq`}],[`rect`,{width:`20`,height:`8`,x:`2`,y:`14`,rx:`2`,ry:`2`,key:`iecqi9`}],[`line`,{x1:`6`,x2:`6.01`,y1:`6`,y2:`6`,key:`16zg32`}],[`line`,{x1:`6`,x2:`6.01`,y1:`18`,y2:`18`,key:`nzw8ys`}]]),ti=w(`ShieldAlert`,[[`path`,{d:`M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z`,key:`oel41y`}],[`path`,{d:`M12 8v4`,key:`1got3b`}],[`path`,{d:`M12 16h.01`,key:`1drbdi`}]]),ni=w(`ShieldCheck`,[[`path`,{d:`M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z`,key:`oel41y`}],[`path`,{d:`m9 12 2 2 4-4`,key:`dzmm74`}]]),ri=w(`SquareArrowOutUpRight`,[[`path`,{d:`M21 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h6`,key:`y09zxi`}],[`path`,{d:`m21 3-9 9`,key:`mpx6sq`}],[`path`,{d:`M15 3h6v6`,key:`1q9fwt`}]]),ii=w(`Star`,[[`path`,{d:`M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z`,key:`r04s7s`}]]),ai=w(`TriangleAlert`,[[`path`,{d:`m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3`,key:`wmoenq`}],[`path`,{d:`M12 9v4`,key:`juzpu7`}],[`path`,{d:`M12 17h.01`,key:`p32p05`}]]),oi=w(`Unplug`,[[`path`,{d:`m19 5 3-3`,key:`yk6iyv`}],[`path`,{d:`m2 22 3-3`,key:`19mgm9`}],[`path`,{d:`M6.3 20.3a2.4 2.4 0 0 0 3.4 0L12 18l-6-6-2.3 2.3a2.4 2.4 0 0 0 0 3.4Z`,key:`goz73y`}],[`path`,{d:`M7.5 13.5 10 11`,key:`7xgeeb`}],[`path`,{d:`M10.5 16.5 13 14`,key:`10btkg`}],[`path`,{d:`m12 6 6 6 2.3-2.3a2.4 2.4 0 0 0 0-3.4l-2.6-2.6a2.4 2.4 0 0 0-3.4 0Z`,key:`1snsnr`}]]),si=w(`Wrench`,[[`path`,{d:`M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z`,key:`cbrjhi`}]]);function ci(){return v({queryKey:ui,queryFn:b,staleTime:5e3,refetchOnWindowFocus:!0})}var H=i();function U(e){let{label:t,muted:n,value:r}=e;return(0,H.jsxs)(`div`,{className:`flex items-start justify-between gap-4 py-2 text-sm`,children:[(0,H.jsx)(`span`,{className:`text-gray-500`,children:t}),(0,H.jsx)(`span`,{className:n?`text-right text-gray-500`:`text-right text-gray-900`,children:r==null||r===``?`-`:String(r)})]})}function li(){let e=us(),t=ci(),r=t.data,i=K(e=>e.actionLabel),o=(0,A.useMemo)(()=>xi(r),[r]),s=!!i,c=r?.runtime?.deviceName?.trim()||r?.settings.deviceName?.trim()||a(`remoteDeviceNameAuto`),u=!!(r?.account.loggedIn&&hi(r)),{hero:d,issueHint:f}=o;return(0,A.useEffect)(()=>{e.remoteAccessManager.syncStatus(r)},[e,r]),t.isLoading&&!r?(0,H.jsx)(`div`,{className:`p-8 text-gray-400`,children:a(`remoteLoading`)}):(0,H.jsxs)(_,{className:`space-y-6`,children:[(0,H.jsx)(h,{title:a(`remotePageTitle`),description:a(`remotePageDescription`)}),(0,H.jsxs)(`div`,{className:`grid gap-6 xl:grid-cols-[1.2fr_0.8fr]`,children:[(0,H.jsxs)(g,{children:[(0,H.jsxs)(ne,{className:`space-y-4`,children:[(0,H.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[(0,H.jsx)(m,{children:d.title}),(0,H.jsx)(je,{status:d.badgeStatus,label:d.badgeLabel})]}),(0,H.jsx)(l,{children:d.description})]}),(0,H.jsxs)(re,{className:`space-y-5`,children:[(0,H.jsxs)(T,{tone:`neutral`,children:[(0,H.jsx)(U,{label:a(`remoteSignedInAccount`),value:r?.account.email}),(0,H.jsx)(U,{label:a(`remoteDeviceName`),value:c}),(0,H.jsx)(U,{label:a(`remoteConnectionStatus`),value:d.badgeLabel}),(0,H.jsx)(U,{label:a(`remoteLastConnectedAt`),value:r?.runtime?.lastConnectedAt?n(r.runtime.lastConnectedAt):`-`,muted:!0})]}),(0,H.jsxs)(`div`,{className:`flex flex-wrap gap-3`,children:[o.primaryAction?(0,H.jsxs)(p,{onClick:()=>{if(o.primaryAction?.kind===`reauthorize`){e.remoteAccessManager.reauthorizeRemoteAccess(r);return}if(o.primaryAction?.kind===`repair`){e.remoteAccessManager.repairRemoteAccess(r);return}e.remoteAccessManager.enableRemoteAccess(r)},disabled:s,children:[o.primaryAction.showRefreshIcon?(0,H.jsx)($r,{className:`mr-2 h-4 w-4`}):null,i||o.primaryAction.label]}):null,(0,H.jsxs)(p,{variant:`outline`,onClick:()=>void e.accountManager.openNextClawWeb(),disabled:s||!u,children:[(0,H.jsx)(ri,{className:`mr-2 h-4 w-4`}),a(`remoteOpenDeviceList`)]}),r?.settings.enabled?(0,H.jsx)(p,{variant:`outline`,onClick:()=>void e.remoteAccessManager.disableRemoteAccess(r),disabled:s,children:a(`remoteDisable`)}):null]}),o.shouldShowIssueHint&&f?(0,H.jsx)(T,{tone:`warning`,title:f.title,description:f.body}):null,(0,H.jsx)(`p`,{className:`text-xs text-gray-500`,children:a(`remoteOpenWebHint`)})]})]}),(0,H.jsxs)(g,{children:[(0,H.jsxs)(ne,{children:[(0,H.jsxs)(m,{className:`flex items-center gap-2`,children:[(0,H.jsx)(Xr,{className:`h-4 w-4 text-primary`}),a(`remoteDeviceSectionTitle`)]}),(0,H.jsx)(l,{children:a(`remoteDeviceSectionDescription`)})]}),(0,H.jsxs)(re,{className:`space-y-5`,children:[(0,H.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,H.jsx)(je,{status:r?.account.loggedIn?`ready`:`inactive`,label:r?.account.loggedIn?a(`remoteAccountConnected`):a(`remoteAccountNotConnected`)}),(0,H.jsx)(je,{status:r?.settings.enabled?`active`:`inactive`,label:r?.settings.enabled?a(`remoteEnabled`):a(`remoteStateDisabled`)}),(0,H.jsx)(je,{status:r?.service.running?`active`:`inactive`,label:r?.service.running?a(`remoteServiceRunning`):a(`remoteServiceStopped`)})]}),(0,H.jsxs)(T,{tone:`neutral`,children:[(0,H.jsx)(U,{label:a(`remoteDeviceName`),value:c}),(0,H.jsx)(U,{label:a(`remoteConnectionStatus`),value:d.badgeLabel}),(0,H.jsx)(U,{label:a(`remoteLastConnectedAt`),value:r?.runtime?.lastConnectedAt?n(r.runtime.lastConnectedAt):`-`,muted:!0})]}),(0,H.jsx)(T,{tone:`neutral`,borderStyle:`dashed`,description:r?.account.loggedIn?a(`remoteOpenWebHint`):a(`remoteStatusNeedsSignInDescription`),className:`text-sm`})]})]})]})]})}var ui=[`remote-status`],di=`https://platform.nextclaw.io`,fi=`https://nextclaw-platform-console.pages.dev`,W=async()=>await ue.fetchQuery({queryKey:ui,queryFn:b,staleTime:5e3}),G=async()=>(await ue.invalidateQueries({queryKey:ui}),await W()),pi=(e,t)=>t?.trim()||e?.settings.platformApiBase?.trim()||e?.account.apiBase?.trim()||void 0;function mi(e){let t=e?.trim();if(!t)return;let n;try{n=new URL(t)}catch{return}if(n.hostname===`platform.nextclaw.io`||n.hostname===`nextclaw-platform-console.pages.dev`)return n.origin;if(n.hostname===`ai-gateway-api.nextclaw.io`)return di;if(n.hostname.includes(`nextclaw-provider-gateway-api`)&&n.hostname.endsWith(`.workers.dev`))return fi}var hi=e=>mi(e?.account.apiBase)||mi(e?.settings.platformApiBase)||mi(e?.platformBase)||mi(e?.account.platformBase)||void 0,K=o(e=>({enabled:!1,deviceName:``,platformApiBase:``,advancedOpen:!1,draftTouched:!1,actionLabel:null,doctor:null,setEnabled:t=>e({enabled:t,draftTouched:!0}),setDeviceName:t=>e({deviceName:t,draftTouched:!0}),setPlatformApiBase:t=>e({platformApiBase:t,draftTouched:!0}),setAdvancedOpen:t=>e({advancedOpen:t}),hydrateDraft:({enabled:t,deviceName:n,platformApiBase:r})=>e({enabled:t,deviceName:n,platformApiBase:r,draftTouched:!1}),beginAction:t=>e({actionLabel:t}),finishAction:()=>e({actionLabel:null}),setDoctor:t=>e({doctor:t})})),gi=class{constructor(e){this.params=e,this.syncStatus=e=>{if(!e)return;let t=K.getState();t.draftTouched||t.actionLabel||this.hydrateDraftFromStatus(e)},this.setEnabled=e=>{K.getState().setEnabled(e)},this.setDeviceName=e=>{K.getState().setDeviceName(e)},this.setPlatformApiBase=e=>{K.getState().setPlatformApiBase(e)},this.setAdvancedOpen=e=>{K.getState().setAdvancedOpen(e)},this.enableRemoteAccess=async e=>{let t=e??await G(),n=K.getState(),r=await this.ensureRemoteAccount(t,n.platformApiBase);await this.applyEnabledState(!0,r)},this.disableRemoteAccess=async e=>{let t=e??await G();await this.applyEnabledState(!1,t)},this.repairRemoteAccess=async e=>{let t=e??await G(),n=(await this.ensureRemoteAccount(t)).service.running?`restart`:`start`;await this.runManagedAction({actionLabel:a(n===`restart`?`remoteActionRestarting`:`remoteActionStarting`),job:async()=>{await se(n);let e=await G();this.hydrateDraftFromStatus(e)},successMessage:a(`remoteServiceRecovered`)})},this.reauthorizeRemoteAccess=async e=>{let t=e??await G(),n=await this.params.accountManager.startBrowserSignInAndWait({status:t,apiBase:K.getState().platformApiBase});await this.repairRemoteAccess(n)},this.saveAdvancedSettings=async e=>{let t=e??await G(),n=K.getState();await this.runManagedAction({actionLabel:a(`remoteActionSavingAdvanced`),job:async()=>{await le({enabled:n.enabled,deviceName:n.deviceName.trim(),platformApiBase:n.platformApiBase.trim()});let e=await G();this.hydrateDraftFromStatus(e)},successMessage:t.settings.enabled===n.enabled?a(`remoteSettingsSaved`):a(`remoteAdvancedSaved`)})},this.runDoctor=async()=>{await this.runManagedAction({actionLabel:a(`remoteDoctorRunning`),job:async()=>{let e=await te();K.getState().setDoctor(e)},successMessage:a(`remoteDoctorCompleted`)})},this.startService=async()=>{await this.runServiceAction(`start`,a(`remoteActionStarting`))},this.restartService=async()=>{await this.runServiceAction(`restart`,a(`remoteActionRestarting`))},this.stopService=async()=>{await this.runServiceAction(`stop`,a(`remoteActionStopping`))},this.applyEnabledState=async(e,t)=>{let n=K.getState();await this.runManagedAction({actionLabel:a(e?`remoteActionEnabling`:`remoteActionDisabling`),job:async()=>{await le({enabled:e,deviceName:n.deviceName.trim(),platformApiBase:n.platformApiBase.trim()});let r=await G();this.hydrateDraftFromStatus(r),e?await se(r.service.running?`restart`:`start`):t.service.running&&await se(`restart`);let i=await G();this.hydrateDraftFromStatus(i)},successMessage:a(e?`remoteEnabledReady`:`remoteDisabledDone`)})},this.ensureRemoteAccount=async(e,t)=>e.account.loggedIn?e:await this.params.accountManager.ensureSignedIn({apiBase:t,status:e}),this.runServiceAction=async(e,t)=>{await this.runManagedAction({actionLabel:t,job:async()=>{let t=await se(e),n=await G();this.hydrateDraftFromStatus(n),y.success(t.message)}})},this.hydrateDraftFromStatus=e=>{K.getState().hydrateDraft({enabled:e.settings.enabled,deviceName:e.settings.deviceName,platformApiBase:e.settings.platformApiBase})},this.runManagedAction=async e=>{let{actionLabel:t,job:n,successMessage:r}=e;K.getState().beginAction(t);try{await n(),r&&y.success(r)}catch(e){let t=e instanceof Error?e.message:a(`error`);throw y.error(t),e}finally{K.getState().finishAction()}}}},_i=[/invalid or expired token/i,/missing bearer token/i,/token expired/i,/token is invalid/i,/run "nextclaw login"/i,/browser sign-in again/i];function vi(e){return e?.runtime?.lastError?.trim()||``}function yi(e){let t=a(`remoteStatusIssueDetailGeneric`),n=vi(e);return n?`${t} (${n})`:t}function bi(e){if(!e?.settings.enabled)return!1;let t=vi(e);return _i.some(e=>e.test(t))}function xi(e){return bi(e)?{hero:{badgeStatus:`warning`,badgeLabel:a(`remoteStateReauthorizationRequired`),title:a(`remoteStatusReauthorizationTitle`),description:a(`remoteStatusReauthorizationDescription`)},primaryAction:{kind:`reauthorize`,label:a(`remoteReauthorizeNow`),showRefreshIcon:!1},issueHint:{title:a(`remoteStatusRecoveryTitle`),body:a(`remoteStatusReauthorizationHint`)},shouldShowIssueHint:!0,requiresReauthorization:!0}:e?.account.loggedIn?e.settings.enabled?e.service.running?e.runtime?.state===`connected`?{hero:{badgeStatus:`ready`,badgeLabel:a(`statusReady`),title:a(`remoteStatusReadyTitle`),description:a(`remoteStatusReadyDescription`)},primaryAction:{kind:`repair`,label:a(`remoteReconnectNow`),showRefreshIcon:!0},issueHint:null,shouldShowIssueHint:!1,requiresReauthorization:!1}:e.runtime?.state===`connecting`?{hero:{badgeStatus:`active`,badgeLabel:a(`connecting`),title:a(`remoteStatusConnectingTitle`),description:a(`remoteStatusConnectingDescription`)},primaryAction:{kind:`repair`,label:a(`remoteReconnectNow`),showRefreshIcon:!0},issueHint:null,shouldShowIssueHint:!1,requiresReauthorization:!1}:{hero:{badgeStatus:`warning`,badgeLabel:a(`remoteStateDisconnected`),title:a(`remoteStatusIssueTitle`),description:a(`remoteStatusIssueDescription`)},primaryAction:{kind:`repair`,label:a(`remoteReconnectNow`),showRefreshIcon:!0},issueHint:{title:a(`remoteStatusRecoveryTitle`),body:yi(e)},shouldShowIssueHint:!!(e.settings.enabled&&e.account.loggedIn),requiresReauthorization:!1}:{hero:{badgeStatus:`warning`,badgeLabel:a(`remoteServiceStopped`),title:a(`remoteStatusNeedsServiceTitle`),description:a(`remoteStatusNeedsServiceDescription`)},primaryAction:{kind:`repair`,label:a(`remoteReconnectNow`),showRefreshIcon:!0},issueHint:{title:a(`remoteStatusRecoveryTitle`),body:a(`remoteStatusIssueDetailServiceStopped`)},shouldShowIssueHint:!0,requiresReauthorization:!1}:{hero:{badgeStatus:`inactive`,badgeLabel:a(`statusInactive`),title:a(`remoteStatusNeedsEnable`),description:a(`remoteStatusNeedsEnableDescription`)},primaryAction:{kind:`enable`,label:a(`remoteEnableNow`),showRefreshIcon:!1},issueHint:null,shouldShowIssueHint:!1,requiresReauthorization:!1}:{hero:{badgeStatus:`setup`,badgeLabel:a(`statusSetup`),title:a(`remoteStatusNeedsSignIn`),description:a(`remoteStatusNeedsSignInDescription`)},primaryAction:{kind:`sign-in-enable`,label:a(`remoteSignInAndEnable`),showRefreshIcon:!1},issueHint:null,shouldShowIssueHint:!1,requiresReauthorization:!1}}var q=o(e=>({panelOpen:!1,authSessionId:null,authVerificationUri:null,authExpiresAt:null,authStatusMessage:``,authPollIntervalMs:1500,openPanel:()=>e({panelOpen:!0}),closePanel:()=>e({panelOpen:!1}),beginBrowserAuth:({sessionId:t,verificationUri:n,expiresAt:r,intervalMs:i,statusMessage:a})=>e({panelOpen:!0,authSessionId:t,authVerificationUri:n,authExpiresAt:r,authPollIntervalMs:i,authStatusMessage:a}),updateBrowserAuth:({statusMessage:t,intervalMs:n})=>e(e=>({authStatusMessage:t??e.authStatusMessage,authPollIntervalMs:n??e.authPollIntervalMs})),clearBrowserAuth:()=>e({authSessionId:null,authVerificationUri:null,authExpiresAt:null,authStatusMessage:``,authPollIntervalMs:1500}),setAuthStatusMessage:t=>e({authStatusMessage:t})}));function Si({label:e,value:t}){return(0,H.jsxs)(`div`,{className:`flex items-start justify-between gap-4 py-2 text-sm`,children:[(0,H.jsx)(`span`,{className:`text-gray-500`,children:e}),(0,H.jsx)(`span`,{className:`text-right text-gray-900`,children:t?.trim()||`-`})]})}function Ci(e){let{email:t,username:n,role:r,canSubmitUsername:i,savingUsername:o,usernameDraft:s,onUsernameDraftChange:c,onSubmitUsername:l,onOpenDeviceList:d,onLogout:m}=e;return(0,H.jsxs)(`div`,{className:`space-y-4`,children:[(0,H.jsx)(T,{tone:`success`,title:a(`accountPanelSignedInTitle`),description:a(`accountPanelSignedInDescription`)}),(0,H.jsxs)(T,{tone:`neutral`,children:[(0,H.jsx)(Si,{label:a(`remoteAccountEmail`),value:t}),(0,H.jsx)(Si,{label:a(`remoteAccountUsername`),value:n}),(0,H.jsx)(Si,{label:a(`remoteAccountRole`),value:r})]}),n?(0,H.jsx)(`p`,{className:`text-xs text-gray-500`,children:a(`remoteAccountUsernameLockedHelp`)}):(0,H.jsxs)(T,{tone:`warning`,title:a(`remoteAccountUsernameRequiredTitle`),description:a(`remoteAccountUsernameRequiredDescription`),children:[(0,H.jsxs)(`div`,{className:`mt-4 space-y-2`,children:[(0,H.jsx)(u,{htmlFor:`account-panel-username`,children:a(`remoteAccountUsername`)}),(0,H.jsx)(f,{id:`account-panel-username`,value:s,onChange:e=>c(e.target.value),placeholder:a(`remoteAccountUsernamePlaceholder`),autoCapitalize:`none`,autoCorrect:`off`,spellCheck:!1})]}),(0,H.jsx)(`div`,{className:`mt-4 flex flex-wrap gap-3`,children:(0,H.jsx)(p,{disabled:!i,onClick:()=>void l(),children:a(o?`remoteAccountUsernameSaving`:`remoteAccountUsernameSave`)})})]}),(0,H.jsxs)(`div`,{className:`flex flex-wrap gap-3`,children:[(0,H.jsxs)(p,{onClick:()=>void d(),children:[(0,H.jsx)(ri,{className:`mr-2 h-4 w-4`}),a(`remoteOpenDeviceList`)]}),(0,H.jsxs)(p,{variant:`outline`,onClick:()=>void m(),children:[(0,H.jsx)(Zr,{className:`mr-2 h-4 w-4`}),a(`remoteLogout`)]})]})]})}function wi(e){let{authSessionId:t,authExpiresAt:r,authStatusMessage:i,authVerificationUri:o,onStartBrowserSignIn:s,onResumeBrowserSignIn:c}=e;return(0,H.jsxs)(`div`,{className:`space-y-4`,children:[(0,H.jsx)(T,{tone:`neutral`,title:a(`accountPanelSignedOutTitle`),description:a(`accountPanelSignedOutDescription`),children:t?(0,H.jsxs)(`div`,{className:`mt-3 border-t border-white/80 pt-3`,children:[(0,H.jsx)(Si,{label:a(`remoteBrowserAuthSession`),value:t}),(0,H.jsx)(Si,{label:a(`remoteBrowserAuthExpiresAt`),value:r?n(r):`-`})]}):null}),i?(0,H.jsx)(`p`,{className:`text-sm text-gray-600`,children:i}):null,(0,H.jsxs)(`div`,{className:`flex flex-wrap gap-3`,children:[(0,H.jsx)(p,{onClick:()=>void s(),children:a(t?`remoteBrowserAuthActionRetry`:`remoteBrowserAuthAction`)}),o?(0,H.jsx)(p,{variant:`outline`,onClick:()=>void c(),children:a(`remoteBrowserAuthResume`)}):null]})]})}function Ti(){let e=us(),t=ci(),n=q(e=>e.panelOpen),r=q(e=>e.authSessionId),i=q(e=>e.authVerificationUri),o=q(e=>e.authExpiresAt),s=q(e=>e.authStatusMessage),c=t.data,[l,u]=(0,A.useState)(``),[d,f]=(0,A.useState)(!1);(0,A.useEffect)(()=>{e.accountManager.syncRemoteStatus(c)},[e,c]);let p=!d&&l.trim().length>0&&!c?.account.username;return(0,H.jsx)(pe,{open:n,onOpenChange:t=>t?e.accountManager.openAccountPanel():e.accountManager.closeAccountPanel(),children:(0,H.jsxs)(he,{className:`max-w-xl`,children:[(0,H.jsxs)(me,{children:[(0,H.jsxs)(ge,{className:`flex items-center gap-2`,children:[(0,H.jsx)(Te,{className:`h-5 w-5 text-primary`}),a(`accountPanelTitle`)]}),(0,H.jsx)(fe,{children:a(`accountPanelDescription`)})]}),c?.account.loggedIn?(0,H.jsx)(Ci,{email:c.account.email,username:c.account.username,role:c.account.role,canSubmitUsername:p,savingUsername:d,usernameDraft:l,onUsernameDraftChange:u,onSubmitUsername:async()=>{f(!0);try{await e.accountManager.updateUsername(l)}finally{f(!1)}},onOpenDeviceList:()=>e.accountManager.openNextClawWeb(`/account`),onLogout:()=>e.accountManager.logout()}):(0,H.jsx)(wi,{authSessionId:r,authExpiresAt:o,authStatusMessage:s,authVerificationUri:i,onStartBrowserSignIn:()=>e.accountManager.startBrowserSignIn(),onResumeBrowserSignIn:()=>e.accountManager.resumeBrowserSignIn()})]})})}function Ei({username:e}){let t=oe(),[n,r]=(0,A.useState)(e??``),[i,o]=(0,A.useState)(``),s=n.trim().length>0&&i.length>0&&!t.isPending;return(0,H.jsx)(`main`,{className:`flex min-h-screen items-center justify-center bg-secondary px-6 py-10`,children:(0,H.jsxs)(g,{hover:!1,className:`w-full max-w-md shadow-card-hover`,children:[(0,H.jsxs)(ne,{children:[(0,H.jsx)(`p`,{className:`text-xs font-semibold uppercase tracking-[0.24em] text-gray-500`,children:a(`authBrand`)}),(0,H.jsx)(m,{className:`text-2xl`,children:a(`authLoginTitle`)}),(0,H.jsx)(l,{children:a(`authLoginDescription`)})]}),(0,H.jsx)(re,{children:(0,H.jsxs)(`form`,{className:`space-y-4`,onSubmit:e=>{e?.preventDefault(),s&&t.mutate({username:n.trim(),password:i})},children:[(0,H.jsxs)(`div`,{className:`space-y-2`,children:[(0,H.jsx)(`label`,{className:`text-sm font-medium text-gray-800`,children:a(`authUsername`)}),(0,H.jsx)(f,{value:n,onChange:e=>r(e.target.value),placeholder:a(`authUsernamePlaceholder`),autoFocus:!0})]}),(0,H.jsxs)(`div`,{className:`space-y-2`,children:[(0,H.jsx)(`label`,{className:`text-sm font-medium text-gray-800`,children:a(`authPassword`)}),(0,H.jsx)(f,{type:`password`,value:i,onChange:e=>o(e.target.value),placeholder:a(`authPasswordPlaceholder`)})]}),(0,H.jsx)(p,{type:`submit`,className:`w-full`,disabled:!s,children:t.isPending?a(`authLoggingIn`):a(`authLoginAction`)})]})})]})})}var Di=class{constructor(){this.authPollTimerId=null,this.browserSignInCompletion=null,this.openAccountPanel=()=>{q.getState().openPanel()},this.closeAccountPanel=()=>{q.getState().closePanel()},this.syncRemoteStatus=e=>{e?.account.loggedIn&&(this.clearPollTimer(),this.resolveBrowserSignIn(e),q.getState().clearBrowserAuth())},this.ensureSignedIn=async e=>{let t=e?.status??await W();return t.account.loggedIn?t:(this.openAccountPanel(),await this.startBrowserSignInAndWait({apiBase:e?.apiBase,status:t}))},this.startBrowserSignInAndWait=async e=>{let t=this.createBrowserSignInCompletion();return await this.startBrowserSignIn(e),await t},this.startBrowserSignIn=async e=>{try{let t=e?.apiBase,n=await ee({apiBase:pi(e?.status??await W(),t)});q.getState().beginBrowserAuth({sessionId:n.sessionId,verificationUri:n.verificationUri,expiresAt:n.expiresAt,intervalMs:n.intervalMs,statusMessage:a(`remoteBrowserAuthWaiting`)}),(await Me.openExternalUrl(n.verificationUri)).opened||q.getState().setAuthStatusMessage(a(`remoteBrowserAuthPopupBlocked`)),this.scheduleBrowserAuthPoll()}catch(e){let t=e instanceof Error?e.message:a(`remoteBrowserAuthStartFailed`);this.rejectBrowserSignIn(e),y.error(`${a(`remoteBrowserAuthStartFailed`)}: ${t}`)}},this.resumeBrowserSignIn=async()=>{let e=q.getState().authVerificationUri;e&&await Me.openExternalUrl(e)},this.logout=async()=>{try{await ae(),this.rejectBrowserSignIn(Error(`Signed out before browser sign-in completed.`)),q.getState().clearBrowserAuth(),await G(),y.success(a(`remoteLogoutSuccess`))}catch(e){let t=e instanceof Error?e.message:a(`remoteLogoutFailed`);y.error(`${a(`remoteLogoutFailed`)}: ${t}`)}},this.updateUsername=async e=>{try{await ie({username:e.trim()}),await G(),y.success(a(`remoteAccountUsernameSetSuccess`))}catch(e){let t=e instanceof Error?e.message:a(`remoteAccountUsernameSetFailed`);y.error(`${a(`remoteAccountUsernameSetFailed`)}: ${t}`)}},this.openNextClawWeb=async(e=`/`)=>{let t=hi(await W());if(!t){y.error(a(`remoteOpenWebUnavailable`));return}let n=new URL(e,`${t.replace(/\/+$/,``)}/`).toString();await Me.openExternalUrl(n)},this.scheduleBrowserAuthPoll=()=>{this.clearPollTimer();let{authSessionId:e,authPollIntervalMs:t}=q.getState();e&&(this.authPollTimerId=window.setTimeout(async()=>{await this.pollBrowserSignIn()},t))},this.pollBrowserSignIn=async()=>{let e=q.getState();if(e.authSessionId)try{let t=await W(),n=await ce({sessionId:e.authSessionId,apiBase:pi(t)});if(n.status===`pending`){q.getState().updateBrowserAuth({statusMessage:a(`remoteBrowserAuthWaiting`),intervalMs:n.nextPollMs??1500}),this.scheduleBrowserAuthPoll();return}if(n.status===`expired`){this.clearPollTimer(),this.rejectBrowserSignIn(Error(n.message||a(`remoteBrowserAuthExpired`))),q.getState().clearBrowserAuth(),y.error(n.message||a(`remoteBrowserAuthExpired`));return}q.getState().setAuthStatusMessage(a(`remoteBrowserAuthCompleted`));let r=await G();this.clearPollTimer(),this.resolveBrowserSignIn(r),q.getState().clearBrowserAuth(),y.success(a(`remoteLoginSuccess`))}catch(e){this.clearPollTimer(),this.rejectBrowserSignIn(e),q.getState().clearBrowserAuth();let t=e instanceof Error?e.message:a(`remoteBrowserAuthPollFailed`);y.error(`${a(`remoteBrowserAuthPollFailed`)}: ${t}`)}},this.clearPollTimer=()=>{this.authPollTimerId!==null&&(window.clearTimeout(this.authPollTimerId),this.authPollTimerId=null)},this.createBrowserSignInCompletion=()=>(this.rejectBrowserSignIn(Error(`Browser sign-in was replaced by a newer request.`)),new Promise((e,t)=>{this.browserSignInCompletion={resolve:e,reject:t}})),this.resolveBrowserSignIn=e=>{let t=this.browserSignInCompletion;t&&(this.browserSignInCompletion=null,t.resolve(e))},this.rejectBrowserSignIn=e=>{let t=this.browserSignInCompletion;t&&(this.browserSignInCompletion=null,t.reject(e instanceof Error?e:Error(String(e))))},this.getBrowserAuthSummary=()=>{let e=q.getState();return{sessionId:e.authSessionId,expiresAt:e.authExpiresAt?n(e.authExpiresAt):`-`}}}};function Oi({deletePending:e,entry:t,favoritePending:n,onDelete:r,onOpen:i,onToggleFavorite:o}){let[s,c]=(0,A.useState)(!1),[l,u]=(0,A.useState)(!1),d=t.favorite?a(`panelAppsUnfavorite`):a(`panelAppsFavorite`),f=t.lastOpenedAt?`${a(`panelAppsLastOpened`)} ${Ai(t.lastOpenedAt)}`:`${a(`panelAppsUpdated`)} ${Ai(t.updatedAt)}`,p=e=>{e.stopPropagation(),o()},m=()=>{c(!1),u(!0)};return(0,H.jsxs)(`div`,{className:`group w-full min-w-0 rounded-lg border border-gray-200 bg-white px-2.5 py-2.5 transition-colors hover:border-amber-200 hover:bg-amber-50/50`,children:[(0,H.jsxs)(`div`,{className:`flex min-w-0 items-start gap-2`,children:[(0,H.jsxs)(`button`,{type:`button`,onClick:i,className:`min-w-0 flex-1 text-left`,children:[(0,H.jsxs)(`span`,{className:`flex min-w-0 items-center gap-2`,children:[(0,H.jsx)(`span`,{className:`flex h-7 w-7 shrink-0 items-center justify-center rounded-md bg-amber-50 text-base text-amber-700`,children:(0,H.jsx)(ji,{icon:t.icon,title:t.title})}),(0,H.jsx)(`span`,{className:`block min-w-0 flex-1 truncate text-sm font-medium text-gray-900`,children:t.title})]}),t.description?(0,H.jsx)(`span`,{className:`mt-1.5 block truncate text-xs leading-5 text-gray-600`,children:t.description}):null,(0,H.jsx)(`span`,{className:`mt-0.5 block truncate text-[11px] leading-4 text-gray-400`,children:f})]}),(0,H.jsxs)(`div`,{className:`flex shrink-0 items-center gap-1`,children:[(0,H.jsx)(`button`,{type:`button`,onClick:p,disabled:n,className:`rounded-md p-1.5 text-gray-400 transition-colors hover:bg-white hover:text-amber-500 disabled:opacity-50`,title:d,"aria-label":d,children:(0,H.jsx)(ii,{className:t.favorite?`h-4 w-4 fill-amber-400 text-amber-500`:`h-4 w-4`})}),(0,H.jsxs)(Fe,{open:s,onOpenChange:c,children:[(0,H.jsx)(Pe,{asChild:!0,children:(0,H.jsx)(`button`,{type:`button`,className:`rounded-md p-1.5 text-gray-400 transition-colors hover:bg-white hover:text-gray-700`,"aria-label":a(`panelAppsMoreActions`),disabled:e,children:(0,H.jsx)(Jr,{className:`h-4 w-4`})})}),(0,H.jsx)(Ne,{align:`end`,className:`w-48 rounded-xl p-1.5`,children:(0,H.jsx)(ki,{destructive:!0,disabled:e,icon:ke,label:a(`panelAppsDelete`),onClick:m})})]})]})]}),(0,H.jsx)(_e,{open:l,onOpenChange:u,title:a(`panelAppsDeleteConfirmTitle`),description:`${a(`panelAppsDeleteConfirmDescription`)} ${t.fileName}`,confirmLabel:a(`delete`),variant:`destructive`,onConfirm:r,onCancel:()=>void 0})]})}function ki({destructive:e=!1,disabled:t=!1,icon:n,label:r,onClick:i}){return(0,H.jsxs)(`button`,{type:`button`,className:s(`flex w-full items-center gap-2 rounded-lg px-2.5 py-2 text-left text-sm transition-colors disabled:cursor-not-allowed disabled:opacity-50`,e?`text-destructive hover:bg-destructive/10`:`text-gray-700 hover:bg-gray-100`),disabled:t,onClick:i,children:[(0,H.jsx)(n,{className:`h-4 w-4 shrink-0`}),(0,H.jsx)(`span`,{children:r})]})}function Ai(t){let n=new Date(t);if(Number.isNaN(n.getTime()))return t;let i=r(e()),a=new Date;return n.toDateString()===a.toDateString()?new Intl.DateTimeFormat(i,{hour:`2-digit`,minute:`2-digit`}).format(n):n.getFullYear()===a.getFullYear()?new Intl.DateTimeFormat(i,{month:`numeric`,day:`numeric`}).format(n):new Intl.DateTimeFormat(i,{year:`2-digit`,month:`numeric`,day:`numeric`}).format(n)}function ji({icon:e,title:t}){return e?Mi(e)?(0,H.jsx)(`img`,{src:e,alt:``,"aria-hidden":`true`,className:`h-5 w-5 rounded-sm object-contain`,title:t}):(0,H.jsx)(`span`,{className:`max-w-6 truncate text-center leading-none`,children:e}):(0,H.jsx)(Hr,{className:`h-4 w-4`})}function Mi(e){return e.startsWith(`data:image/`)||e.startsWith(`http://`)||e.startsWith(`https://`)||e.startsWith(`/`)}var Ni=[`panel-apps`];function Pi(){return v({queryKey:Ni,queryFn:()=>x.panelApps.listPanelApps(),staleTime:0})}function Fi(){let e=S();return d({mutationFn:({id:e,preferences:t})=>x.panelApps.updatePanelAppPreferences(e,t),onSuccess:()=>{e.invalidateQueries({queryKey:Ni})}})}function Ii(){let e=S();return d({mutationFn:e=>x.panelApps.recordPanelAppOpened(e),onSuccess:()=>{e.invalidateQueries({queryKey:Ni})}})}function Li(){let e=S();return d({mutationFn:e=>x.panelApps.grantClient(e),onSuccess:()=>{e.invalidateQueries({queryKey:Ni})}})}function Ri(){let e=S();return d({mutationFn:e=>x.panelApps.deletePanelApp(e),onSuccess:()=>{e.invalidateQueries({queryKey:Ni})}})}function zi(e,t){return t===`favorites`?Bi(e.filter(e=>e.favorite),`smart`):Bi(t===`recent-open`?e.filter(e=>e.lastOpenedAt):e,t)}function Bi(e,t){return[...e].sort((e,n)=>Vi(e,n,t))}function Vi(e,t,n){return n===`recent-open`?Gi(e.lastOpenedAt,t.lastOpenedAt)||Hi(e,t):n===`updated`?Gi(e.updatedAt,t.updatedAt)||Hi(e,t):n===`name`?Hi(e,t):Ui(e,t)||Number(t.favorite)-Number(e.favorite)||Hi(e,t)}function Hi(e,t){return e.title.localeCompare(t.title)}function Ui(e,t){return Wi(t)-Wi(e)}function Wi(e){return Math.max(new Date(e.lastOpenedAt??0).getTime(),new Date(e.createdAt).getTime(),new Date(e.updatedAt).getTime())}function Gi(e,t){return new Date(t??0).getTime()-new Date(e??0).getTime()}function Ki({headerContent:e,onOpenPanelApp:t}){let n=Pi(),r=Ri(),i=Fi(),o=Ii(),s=Li(),c=us(),[l,u]=(0,A.useState)(`smart`),d=(0,A.useMemo)(()=>zi(n.data?.entries??[],l),[n.data?.entries,l]),f=async e=>{if(await p(e))try{t(await o.mutateAsync(e.id))}catch{t(e)}},p=async e=>!e.clientDeclared||e.clientGranted?!0:await c.serviceActionAuthorizationManager.requestAuthorization({panelAppId:e.appId,actions:[{actionId:`nextclaw.client`,actionTitle:a(`panelAppsClientGrantTitle`),actionDescription:a(`panelAppsClientGrantDescription`),risk:`dangerous`}]})?(await s.mutateAsync(e.appId),!0):!1,m=e=>{i.mutate({id:e.id,preferences:{favorite:!e.favorite}})},h=e=>{r.mutate(e.id)};return n.isLoading?(0,H.jsx)(`div`,{className:`flex h-full items-center justify-center text-sm text-gray-500`,children:a(`panelAppsLoading`)}):n.isError?(0,H.jsx)(`div`,{className:`p-4 text-sm text-rose-600`,children:n.error instanceof Error?n.error.message:a(`panelAppsLoadFailed`)}):(0,H.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col bg-white`,children:[(0,H.jsxs)(`div`,{className:`flex items-center justify-between gap-2 border-b border-gray-100 px-4 py-3`,children:[(0,H.jsxs)(`div`,{className:`flex min-w-0 items-center gap-1.5`,children:[e??(0,H.jsx)(`div`,{className:`truncate text-sm font-semibold text-gray-900`,children:a(`panelAppsTitle`)}),n.data?.panelsPath?(0,H.jsx)(Se,{delayDuration:250,children:(0,H.jsxs)(Ce,{children:[(0,H.jsx)(be,{asChild:!0,children:(0,H.jsx)(`button`,{type:`button`,className:`rounded p-0.5 text-gray-400 transition-colors hover:bg-gray-100 hover:text-gray-700`,"aria-label":a(`panelAppsTitle`),children:(0,H.jsx)(Kr,{className:`h-3.5 w-3.5`})})}),(0,H.jsx)(xe,{side:`bottom`,className:`max-w-[320px] break-all font-mono text-xs`,children:n.data.panelsPath})]})}):null]}),(0,H.jsx)(`button`,{type:`button`,onClick:()=>void n.refetch(),className:`rounded-md p-1.5 text-gray-500 transition-colors hover:bg-gray-100 hover:text-gray-800`,title:a(`panelAppsRefresh`),"aria-label":a(`panelAppsRefresh`),children:(0,H.jsx)(Oe,{className:`h-3.5 w-3.5`})})]}),(0,H.jsx)(`div`,{className:`border-b border-gray-100 px-3 py-2`,children:(0,H.jsx)(Le,{value:l,onValueChange:e=>u(e),children:(0,H.jsxs)(Ie,{className:`grid h-auto w-full grid-cols-5 rounded-lg bg-gray-100/70 p-0.5`,children:[(0,H.jsx)(E,{value:`smart`,className:`px-2 py-1 text-xs`,children:a(`panelAppsSortSmart`)}),(0,H.jsx)(E,{value:`favorites`,className:`px-2 py-1 text-xs`,children:a(`panelAppsFavorites`)}),(0,H.jsx)(E,{value:`recent-open`,className:`px-2 py-1 text-xs`,children:a(`panelAppsSortRecentOpen`)}),(0,H.jsx)(E,{value:`updated`,className:`px-2 py-1 text-xs`,children:a(`panelAppsSortUpdated`)}),(0,H.jsx)(E,{value:`name`,className:`px-2 py-1 text-xs`,children:a(`panelAppsSortName`)})]})})}),d.length===0?(0,H.jsx)(`div`,{className:`flex flex-1 items-center justify-center px-6 text-center text-sm text-gray-500`,children:a(`panelAppsEmpty`)}):(0,H.jsx)(`div`,{className:`custom-scrollbar min-h-0 flex-1 overflow-y-auto p-3`,children:(0,H.jsx)(`div`,{className:`space-y-1.5`,children:d.map(e=>(0,H.jsx)(Oi,{entry:e,deletePending:r.isPending,favoritePending:i.isPending,onDelete:()=>h(e),onOpen:()=>void f(e),onToggleFavorite:()=>m(e)},e.id))})})]})}var qi=class{constructor(e){this.authorizationManager=e,this.handleIframeMessage=({event:e,iframe:t,iframeInstanceId:n,tab:r})=>{this.isBridgeRequest(e.data)&&(!t?.contentWindow||e.source!==t.contentWindow||this.handleBridgeRequest({event:e,iframe:t,iframeInstanceId:n,tab:r},e.data))},this.handleBridgeRequest=async(e,t)=>{try{let n=this.getBridgeContext(t),r=await this.dispatchRequest(n,t);this.postResponse(e,{type:`nextclaw:panel-app-service-actions:response`,requestId:t.requestId,ok:!0,data:r})}catch(n){this.postResponse(e,{type:`nextclaw:panel-app-service-actions:response`,requestId:t.requestId,ok:!1,error:this.toBridgeError(n)})}},this.dispatchRequest=async(e,t)=>{switch(t.method){case`list`:return await x.serviceApps.listServiceActions({bridgeSessionToken:e.token});case`requestGrant`:return await this.confirmAndGrant(e,this.requireActionId(t));case`revokeGrant`:return await x.serviceApps.revokeServiceAction(this.requireActionId(t),{bridgeSessionToken:e.token});case`invoke`:return await this.invokeWithAuthorization(e,t);case`agent.send`:return await this.sendAgentMessageWithAuthorization(e,t);case`agent.generateObject`:return await this.generateAgentObjectWithAuthorization(e,t);default:throw Error(`Unsupported panel bridge method: ${String(t.method)}`)}},this.invokeWithAuthorization=async(e,t)=>{let n=this.requireActionId(t);try{return await x.serviceApps.invokeServiceAction(n,this.readOptionalRecord(t.payload?.input),{bridgeSessionToken:e.token})}catch(r){if(!(r instanceof C)||r.code!==`AUTHORIZATION_REQUIRED`)throw r;return await this.confirmAndGrant(e,n,this.readOptionalRecord(t.payload?.input)),await x.serviceApps.invokeServiceAction(n,this.readOptionalRecord(t.payload?.input),{bridgeSessionToken:e.token})}},this.sendAgentMessageWithAuthorization=async(e,t)=>{try{return await x.panelApps.sendAgentMessage(this.readAgentSendRequest(t),{bridgeSessionToken:e.token})}catch(n){if(!(n instanceof C)||n.code!==`AUTHORIZATION_REQUIRED`)throw n;return await this.confirmAndGrantAgentCapability(e,`agent:send`),await x.panelApps.sendAgentMessage(this.readAgentSendRequest(t),{bridgeSessionToken:e.token})}},this.generateAgentObjectWithAuthorization=async(e,t)=>{try{return await x.panelApps.generateAgentObject(this.readGenerateObjectRequest(t),{bridgeSessionToken:e.token})}catch(n){if(!(n instanceof C)||n.code!==`AUTHORIZATION_REQUIRED`)throw n;return await this.confirmAndGrantAgentCapability(e,`agent:generateObject`),await x.panelApps.generateAgentObject(this.readGenerateObjectRequest(t),{bridgeSessionToken:e.token})}},this.confirmAndGrantAgentCapability=async(e,t)=>{if(!await this.authorizationManager.requestAuthorization({panelAppId:e.appId,actions:[{actionId:t,actionTitle:t===`agent:send`?`Send agent message`:`Generate object`,actionDescription:t===`agent:send`?`Send a message to a NextClaw Agent session.`:`Send context to a NextClaw Agent session and receive a structured object.`,risk:`write`}]}))throw new C({code:`AUTHORIZATION_REJECTED`,message:`Permission rejected for ${t}.`});return await x.panelApps.grantAgentCapability(t,{bridgeSessionToken:e.token})},this.confirmAndGrant=async(e,t,n)=>{let r=await this.listGrantCandidateActions(e,t);if(!await this.authorizationManager.requestAuthorization({panelAppId:e.appId,actions:r.map(e=>({actionId:e.id,actionTitle:e.title,actionDescription:e.description,risk:e.risk})),inputPreview:this.createInputPreview(n)}))throw new C({code:`AUTHORIZATION_REJECTED`,message:`Permission rejected for ${t}.`});let i=await x.serviceApps.grantServiceActions(r.map(e=>e.id),{bridgeSessionToken:e.token}),a=i.grants.find(e=>e.actionId===t)??i.grants[0];if(!a)throw Error(`No permission grant returned for ${t}.`);return a},this.listGrantCandidateActions=async(e,t)=>{let n=await x.serviceApps.listServiceActions({bridgeSessionToken:e.token}),r=n.actions.find(e=>e.id===t);if(r&&r.grantState!==`not-granted`)return[r];let i=n.actions.filter(e=>e.grantState===`not-granted`),a=[...i.filter(e=>e.id===t),...i.filter(e=>e.id!==t)];return a.length>0?a:[{appId:r?.appId??t.split(`.`)[0]??t,description:r?.description,id:t,name:r?.name??t,risk:r?.risk??`dangerous`,title:r?.title}]},this.createInputPreview=e=>{if(!(!e||Object.keys(e).length===0))try{let t=JSON.stringify(e,null,2);return t.length>500?`${t.slice(0,500)}...`:t}catch{return`[unserializable input]`}},this.getBridgeContext=e=>({appId:e.appId,token:e.runtimeToken}),this.requireActionId=e=>{let t=e.payload?.actionId?.trim();if(!t)throw Error(`Panel bridge actionId is required.`);return t},this.readOptionalRecord=e=>{if(e!==void 0)return this.requireRecord(e,`input`)},this.readAgentSendRequest=e=>({payload:this.requireRecord(e.payload?.request,`agent.send request`)}),this.readGenerateObjectRequest=e=>({input:this.requireRecord(e.payload?.input,`generateObject input`)}),this.requireRecord=(e,t)=>{if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`${t} is required.`);return e},this.postResponse=(e,t)=>{e.iframe?.contentWindow?.postMessage(t,`*`)},this.toBridgeError=e=>e instanceof C?{code:e.code,message:e.message,details:e.details}:{message:e instanceof Error?e.message:String(e)},this.isBridgeRequest=e=>{if(!e||typeof e!=`object`)return!1;let t=e;return t.type===`nextclaw:panel-app-service-actions:request`&&typeof t.requestId==`string`&&typeof t.runtimeToken==`string`&&typeof t.appId==`string`&&(t.method===`invoke`||t.method===`agent.send`||t.method===`agent.generateObject`||t.method===`list`||t.method===`requestGrant`||t.method===`revokeGrant`)}}};function Ji(){return`service-action-auth-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,10)}`}var Yi=o((e,t)=>({pending:null,requestAuthorization:async n=>await new Promise(r=>{t().pending?.resolve(!1),e({pending:{id:Ji(),...n,resolve:r}})}),resolveAuthorization:n=>{let{pending:r}=t();r&&(r.resolve(n),e({pending:null}))}}));function Xi(){let e=Yi(e=>e.pending),t=Yi(e=>e.resolveAuthorization);return(0,H.jsx)(pe,{open:!!e,onOpenChange:e=>{e||t(!1)},children:(0,H.jsxs)(he,{className:`[&>:last-child]:hidden`,children:[(0,H.jsxs)(me,{children:[(0,H.jsxs)(ge,{className:`flex items-center gap-2`,children:[(0,H.jsx)(ti,{className:`h-4 w-4 text-amber-600`}),a(`serviceActionAuthorizationTitle`)]}),(0,H.jsx)(fe,{children:a(`serviceActionAuthorizationDescription`)})]}),e?(0,H.jsxs)(`div`,{className:`space-y-3 rounded-md border border-gray-100 bg-gray-50 p-3 text-sm`,children:[(0,H.jsx)(Qi,{label:a(`serviceActionAuthorizationSource`),value:e.panelAppId}),(0,H.jsxs)(`div`,{className:`space-y-2`,children:[(0,H.jsx)(`div`,{className:`text-xs font-medium text-gray-500`,children:a(`serviceActionAuthorizationActions`)}),(0,H.jsx)(`div`,{className:`max-h-64 space-y-2 overflow-auto`,children:e.actions.map(e=>(0,H.jsx)(Zi,{action:e},e.actionId))})]}),e.inputPreview?(0,H.jsx)(Qi,{label:a(`serviceActionAuthorizationInput`),value:e.inputPreview}):null]}):null,(0,H.jsxs)(de,{className:`gap-2 sm:gap-0`,children:[(0,H.jsx)(p,{type:`button`,variant:`outline`,onClick:()=>t(!1),children:a(`serviceActionAuthorizationReject`)}),(0,H.jsx)(p,{type:`button`,onClick:()=>t(!0),children:a(`serviceActionAuthorizationAllow`)})]})]})})}function Zi({action:e}){return(0,H.jsxs)(`div`,{className:`space-y-1 rounded border border-gray-200 bg-white px-3 py-2`,children:[(0,H.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,H.jsx)(`div`,{className:`min-w-0 break-words text-xs font-medium text-gray-900`,children:e.actionTitle??e.actionId}),(0,H.jsx)(`div`,{className:`shrink-0 rounded bg-amber-50 px-1.5 py-0.5 text-[11px] font-medium text-amber-700`,children:e.risk??`dangerous`})]}),(0,H.jsx)(`div`,{className:`break-words text-[11px] text-gray-500`,children:e.actionId}),e.actionDescription?(0,H.jsx)(`div`,{className:`break-words text-xs text-gray-600`,children:e.actionDescription}):null]})}function Qi({label:e,value:t}){return(0,H.jsxs)(`div`,{className:`grid grid-cols-[5rem_minmax(0,1fr)] gap-3`,children:[(0,H.jsx)(`div`,{className:`text-xs font-medium text-gray-500`,children:e}),(0,H.jsx)(`div`,{className:`min-w-0 break-words text-xs text-gray-900`,children:t})]})}var $i=class{constructor(){this.requestAuthorization=async e=>await Yi.getState().requestAuthorization(e)}},ea=[`service-apps`],ta=[`service-actions`],na=[`service-action-grants`];function ra(){return v({queryKey:ea,queryFn:()=>x.serviceApps.listServiceApps()})}function ia(){return v({queryKey:ta,queryFn:()=>x.serviceApps.listServiceActions()})}function aa(){return v({queryKey:na,queryFn:()=>x.serviceApps.listServiceActionGrants()})}function oa(){let e=S();return d({mutationFn:e=>x.serviceApps.restartServiceApp(e),onSuccess:async()=>{await Promise.all([e.invalidateQueries({queryKey:ea}),e.invalidateQueries({queryKey:ta})])}})}function sa(){let e=S();return d({mutationFn:e=>x.serviceApps.deleteServiceApp(e),onSuccess:async()=>{await Promise.all([e.invalidateQueries({queryKey:ea}),e.invalidateQueries({queryKey:ta}),e.invalidateQueries({queryKey:na})])}})}function ca(){let e=S();return d({mutationFn:e=>x.serviceApps.discoverServiceAppActions(e),onSuccess:async()=>{await e.invalidateQueries({queryKey:ea})}})}function la(){let e=S();return d({mutationFn:e=>x.serviceApps.revokeServiceActionGrant(e),onSuccess:async()=>{await Promise.all([e.invalidateQueries({queryKey:ta}),e.invalidateQueries({queryKey:na})])}})}function ua({headerContent:e}){let t=ra(),n=ia(),r=aa(),i=sa(),o=oa(),s=ca(),c=la(),[l,u]=(0,A.useState)({}),d=()=>{t.refetch(),n.refetch(),r.refetch()};if(t.isLoading||n.isLoading||r.isLoading)return(0,H.jsx)(`div`,{className:`flex h-full items-center justify-center text-sm text-gray-500`,children:a(`serviceAppsLoading`)});if(t.isError||n.isError||r.isError){let e=t.error??n.error??r.error;return(0,H.jsx)(`div`,{className:`p-4 text-sm text-rose-600`,children:e instanceof Error?e.message:a(`serviceAppsLoadFailed`)})}let f=t.data?.entries??[],p=n.data?.actions??[],m=r.data?.grants??[],h=e=>{s.mutateAsync(e).then(t=>{u(n=>({...n,[e]:t.actions}))})};return(0,H.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col bg-white`,children:[(0,H.jsxs)(`div`,{className:`flex items-center justify-between gap-2 border-b border-gray-100 px-4 py-3`,children:[(0,H.jsx)(`div`,{className:`flex min-w-0 items-center gap-2`,children:e??(0,H.jsxs)(H.Fragment,{children:[(0,H.jsx)(ei,{className:`h-4 w-4 text-primary`}),(0,H.jsx)(`div`,{className:`truncate text-sm font-semibold text-gray-900`,children:a(`serviceAppsTitle`)})]})}),(0,H.jsx)(Se,{delayDuration:250,children:(0,H.jsx)(ma,{icon:Oe,label:a(`serviceAppsRefresh`),onClick:d})})]}),f.length===0?(0,H.jsx)(`div`,{className:`flex flex-1 items-center justify-center px-6 text-center text-sm text-gray-500`,children:a(`serviceAppsEmpty`)}):(0,H.jsx)(`div`,{className:`custom-scrollbar min-h-0 flex-1 overflow-y-auto p-3`,children:(0,H.jsx)(`div`,{className:`space-y-3`,children:f.map(e=>(0,H.jsx)(da,{app:e,actions:l[e.id]??p.filter(t=>t.appId===e.id),grants:m,deletePending:i.isPending,isDiscovering:s.isPending,onDiscover:h,onDelete:e=>void i.mutate(e),onRestart:e=>void o.mutate(e),onRevoke:e=>void c.mutate({actionId:e.actionId,caller:e.caller})},e.id))})})]})}function da({app:e,actions:t,grants:n,deletePending:r,isDiscovering:i,onDiscover:o,onDelete:s,onRestart:c,onRevoke:l}){let[u,d]=(0,A.useState)(!1),[f,p]=(0,A.useState)(!1),m=e.status!==`starting`&&e.status!==`stopped`,h=e.status===`running`||e.status===`failed`,g=()=>{d(!1),p(!0)};return(0,H.jsx)(Se,{delayDuration:250,children:(0,H.jsxs)(`section`,{className:`rounded-lg border border-gray-200 bg-white p-3`,children:[(0,H.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,H.jsxs)(`div`,{className:`min-w-0`,children:[(0,H.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,H.jsx)(`div`,{className:`truncate text-sm font-semibold text-gray-900`,children:e.title}),(0,H.jsx)(fa,{status:e.status})]}),e.description?(0,H.jsx)(`div`,{className:`mt-1 line-clamp-2 text-xs text-gray-500`,children:e.description}):null,e.lastError?(0,H.jsx)(`div`,{className:`mt-2 rounded bg-rose-50 px-2 py-1 text-xs text-rose-700`,children:e.lastError}):null]}),(0,H.jsxs)(`div`,{className:`flex shrink-0 items-center gap-1`,children:[(0,H.jsx)(ma,{disabled:i||!m,icon:Qr,label:a(`serviceAppsDiscoverActions`),tooltip:a(`serviceAppsDiscoverActionsHint`),onClick:()=>o(e.id)}),(0,H.jsx)(ma,{disabled:!h,icon:oi,label:a(`serviceAppsDisconnectRuntime`),tooltip:a(`serviceAppsDisconnectRuntimeHint`),onClick:()=>c(e.id)}),(0,H.jsxs)(Fe,{open:u,onOpenChange:d,children:[(0,H.jsxs)(Ce,{children:[(0,H.jsx)(be,{asChild:!0,children:(0,H.jsx)(Pe,{asChild:!0,children:(0,H.jsx)(`button`,{type:`button`,className:`rounded-md p-1.5 text-gray-500 transition-colors hover:bg-gray-100 hover:text-gray-800 disabled:opacity-50`,"aria-label":a(`serviceAppsMoreActions`),disabled:r,children:(0,H.jsx)(Jr,{className:`h-3.5 w-3.5`})})})}),(0,H.jsx)(xe,{side:`bottom`,className:`text-xs`,children:a(`serviceAppsMoreActions`)})]}),(0,H.jsx)(Ne,{align:`end`,className:`w-48 rounded-xl p-1.5`,children:(0,H.jsx)(ha,{destructive:!0,disabled:r,icon:ke,label:a(`serviceAppsDelete`),onClick:g})})]})]})]}),(0,H.jsx)(ga,{app:e}),(0,H.jsx)(`div`,{className:`mt-3 space-y-1`,children:t.map(e=>(0,H.jsx)(va,{action:e,grants:n.filter(t=>t.actionId===e.id),onRevoke:l},e.id))}),(0,H.jsx)(_e,{open:f,onOpenChange:p,title:a(`serviceAppsDeleteConfirmTitle`),description:`${a(`serviceAppsDeleteConfirmDescription`)} ${e.title}`,confirmLabel:a(`delete`),variant:`destructive`,onConfirm:()=>s(e.id),onCancel:()=>void 0})]})})}function fa({status:e}){let t=pa(e),n=t.icon;return(0,H.jsxs)(Ce,{children:[(0,H.jsx)(be,{asChild:!0,children:(0,H.jsxs)(`span`,{className:s(`inline-flex shrink-0 items-center gap-1 rounded px-1.5 py-0.5 text-[11px] font-medium`,t.className),"aria-label":t.label,children:[(0,H.jsx)(n,{className:s(`h-3 w-3`,t.iconClassName)}),(0,H.jsx)(`span`,{children:t.label})]})}),(0,H.jsx)(xe,{side:`bottom`,className:`text-xs`,children:t.tooltip})]})}function pa(e){switch(e){case`running`:return{className:`bg-emerald-50 text-emerald-700`,icon:Wr,label:a(`serviceAppsStatus_running`),tooltip:a(`serviceAppsStatusHint_running`)};case`starting`:return{className:`bg-blue-50 text-blue-700`,icon:Ee,iconClassName:`animate-spin`,label:a(`serviceAppsStatus_starting`),tooltip:a(`serviceAppsStatusHint_starting`)};case`failed`:return{className:`bg-rose-50 text-rose-700`,icon:ai,label:a(`serviceAppsStatus_failed`),tooltip:a(`serviceAppsStatusHint_failed`)};case`stopped`:return{className:`bg-gray-100 text-gray-600`,icon:qr,label:a(`serviceAppsStatus_stopped`),tooltip:a(`serviceAppsStatusHint_stopped`)};default:return{className:`bg-slate-100 text-slate-600`,icon:Gr,label:a(`serviceAppsStatus_idle`),tooltip:a(`serviceAppsStatusHint_idle`)}}}function ma({disabled:e=!1,icon:t,label:n,tooltip:r=n,onClick:i}){return(0,H.jsxs)(Ce,{children:[(0,H.jsx)(be,{asChild:!0,children:(0,H.jsx)(`button`,{type:`button`,onClick:i,disabled:e,className:`rounded-md p-1.5 text-gray-500 transition-colors hover:bg-gray-100 hover:text-gray-800 disabled:cursor-not-allowed disabled:text-gray-300 disabled:opacity-60 disabled:hover:bg-transparent`,"aria-label":n,children:(0,H.jsx)(t,{className:`h-3.5 w-3.5`})})}),(0,H.jsx)(xe,{side:`bottom`,className:`max-w-56 text-xs`,children:r})]})}function ha({destructive:e=!1,disabled:t=!1,icon:n,label:r,onClick:i}){return(0,H.jsxs)(`button`,{type:`button`,className:s(`flex w-full items-center gap-2 rounded-lg px-2.5 py-2 text-left text-sm transition-colors disabled:cursor-not-allowed disabled:opacity-50`,e?`text-destructive hover:bg-destructive/10`:`text-gray-700 hover:bg-gray-100`),disabled:t,onClick:i,children:[(0,H.jsx)(n,{className:`h-4 w-4 shrink-0`}),(0,H.jsx)(`span`,{children:r})]})}function ga({app:e}){let t=[e.command,...e.args??[]].filter(e=>!!e?.trim()).join(` `),n=[{label:a(`serviceAppsCommand`),value:t},{label:a(`serviceAppsCwd`),value:e.cwd},{label:a(`serviceAppsManifest`),value:e.manifestPath},{label:a(`serviceAppsLastStarted`),value:e.lastStartedAt},{label:a(`serviceAppsLastReady`),value:e.lastReadyAt},{label:a(`serviceAppsLastFailed`),value:e.lastFailedAt}].filter(e=>e.value);return n.length===0?null:(0,H.jsx)(`dl`,{className:`mt-3 grid grid-cols-[4.5rem_minmax(0,1fr)] gap-x-2 gap-y-1 border-t border-gray-100 pt-2 text-[11px]`,children:n.map(e=>(0,H.jsx)(_a,{label:e.label,value:e.value},e.label))})}function _a({label:e,value:t}){return(0,H.jsxs)(H.Fragment,{children:[(0,H.jsx)(`dt`,{className:`text-gray-400`,children:e}),(0,H.jsx)(`dd`,{className:`min-w-0 truncate font-mono text-gray-500`,title:t,children:t})]})}function va({action:e,grants:t,onRevoke:n}){return(0,H.jsxs)(`div`,{className:`rounded bg-gray-50 px-2 py-1.5`,children:[(0,H.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,H.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[(0,H.jsx)(si,{className:`h-3.5 w-3.5 shrink-0 text-gray-400`}),(0,H.jsxs)(`div`,{className:`min-w-0`,children:[(0,H.jsx)(`div`,{className:`truncate text-xs font-medium text-gray-800`,children:e.title??e.name}),e.description?(0,H.jsx)(`div`,{className:`truncate text-[11px] text-gray-500`,children:e.description}):null]})]}),(0,H.jsxs)(`div`,{className:`flex shrink-0 items-center gap-1`,children:[e.runtimeState?(0,H.jsx)(`span`,{className:`rounded bg-white px-1.5 py-0.5 text-[11px] text-gray-600`,children:a(`serviceAppsRuntimeState_${e.runtimeState}`)}):null,(0,H.jsx)(`span`,{className:`rounded bg-white px-1.5 py-0.5 text-[11px] text-gray-600`,children:e.risk})]})]}),t.map(e=>(0,H.jsxs)(`div`,{className:`mt-1 flex items-center justify-between gap-2 pl-5`,children:[(0,H.jsxs)(`div`,{className:`flex min-w-0 items-center gap-1.5 text-[11px] text-gray-500`,children:[(0,H.jsx)(ni,{className:`h-3 w-3 shrink-0 text-emerald-500`}),(0,H.jsxs)(`span`,{className:`truncate`,children:[a(`serviceAppsGrantedTo`),` `,e.caller.appId]})]}),(0,H.jsx)(`button`,{type:`button`,onClick:()=>n(e),className:`rounded-md p-1 text-gray-400 transition-colors hover:bg-white hover:text-rose-600`,title:a(`serviceAppsRevokeGrant`),"aria-label":a(`serviceAppsRevokeGrant`),children:(0,H.jsx)(ke,{className:`h-3 w-3`})})]},`${e.caller.surface}:${e.caller.appId}:${e.actionId}`))]})}function ya({activeTab:e,onActiveTabChange:t,onOpenPanelApp:n}){let r=(0,H.jsx)(Le,{value:e,onValueChange:e=>t(e),children:(0,H.jsxs)(Ie,{className:`grid h-auto w-[min(340px,100%)] grid-cols-2 rounded-lg bg-gray-100/70 p-0.5`,children:[(0,H.jsxs)(E,{value:`panel-apps`,className:`gap-1.5 px-2 py-1.5 text-xs`,children:[(0,H.jsx)(Hr,{className:`h-3.5 w-3.5`}),a(`panelAppsTitle`)]}),(0,H.jsxs)(E,{value:`service-apps`,className:`gap-1.5 px-2 py-1.5 text-xs`,children:[(0,H.jsx)(ei,{className:`h-3.5 w-3.5`}),a(`serviceAppsTitle`)]})]})});return(0,H.jsx)(`div`,{className:`h-full min-h-0 bg-white`,children:e===`panel-apps`?(0,H.jsx)(Ki,{headerContent:r,onOpenPanelApp:n}):(0,H.jsx)(ua,{headerContent:r})})}function ba({appTitle:e,onOpenApps:t,onRefresh:n}){return(0,H.jsxs)(`div`,{className:`flex items-center justify-between gap-2 px-3.5 py-2 bg-white border-b border-gray-100 shrink-0`,children:[(0,H.jsx)(`button`,{type:`button`,onClick:t,className:`inline-flex shrink-0 items-center rounded-md p-1.5 text-gray-600 transition-colors hover:bg-gray-100 hover:text-gray-900`,title:a(`appsTitle`),"aria-label":a(`appsTitle`),children:(0,H.jsx)(ve,{className:`h-3.5 w-3.5`})}),(0,H.jsx)(`span`,{className:`min-w-0 flex-1 truncate text-xs font-medium text-gray-600`,title:e,children:e}),(0,H.jsx)(`button`,{type:`button`,onClick:n,className:`rounded-md p-1.5 text-gray-500 transition-colors hover:bg-gray-100 hover:text-gray-800`,title:a(`panelAppsRefreshCurrent`),"aria-label":a(`panelAppsRefreshCurrent`),children:(0,H.jsx)(Oe,{className:`h-3.5 w-3.5`})})]})}function xa(e){return e.split(`/`).map(e=>e.trim()).filter(e=>e.length>0)}function J(e){let t=e.trim();try{let e=new URL(t);return{authority:e.hostname,pathSegments:xa(e.pathname),pathname:e.pathname,raw:t,scheme:e.protocol.replace(/:$/,``).toLowerCase(),searchParams:e.searchParams}}catch{return{authority:``,pathSegments:xa(t),pathname:t,raw:t,scheme:``,searchParams:new URLSearchParams}}}var Sa=class{constructor(e,t){this.routeDefinitions=e,this.options=t,this.resolve=e=>{let t=J(e);return this.findDefinition(t).resolve(t)},this.normalize=e=>this.options.getNormalizedUri(this.resolve(e)),this.areEquivalent=(e,t)=>this.findDefinition(J(e)).areEquivalent?.(e,t)??this.normalize(e)===this.normalize(t),this.findDefinition=e=>{let t=this.routeDefinitions.find(t=>t.match(e));if(!t)throw Error(`Unsupported resource URI: ${e.raw}`);return t}}},Ca=`home`,wa=`nextclaw://new-tab`,Ta=`apps`,Y=`nextclaw://apps`,Ea=`${Y}?tab=service-apps`,Da=`panel-app`,Oa=`panel-apps`;function ka(e){return e===`panel-apps`||e===`service-apps`}function Aa(e=Oa){return e===Oa?Y:Ea}function ja(e){try{let t=new URL(e).searchParams.get(`tab`);return ka(t)?t:Oa}catch{return Oa}}function Ma(e){return Aa(ja(e))}function Na(e){return`nextclaw://panel-app/${encodeURIComponent(e)}`}function Pa(e){return e.startsWith(`data:image/`)||e.startsWith(`http://`)||e.startsWith(`https://`)||e.startsWith(`/`)}function Fa(e){let t=e.icon?.trim();if(t)return Pa(t)?{type:`url`,url:t}:{type:`text`,value:t}}function Ia(e){return{dedupeKey:`panel-app:${e.id}`,dockIcon:Fa(e),historyPolicy:`managed`,kind:Da,resourceUri:Na(e.id),title:e.title,url:e.contentPath}}function La(e,t){return e===t||e.startsWith(`${t}?`)||e.startsWith(`${t}/`)}function Ra(e){let t=e.pathSegments.join(`/`);return ze(t?`/${t}`:`/`,`docs`)}function za(e){let t=e.filter(e=>e.trim().length>0).map(e=>encodeURIComponent(decodeURIComponent(e))).join(`/`);return t?`nextclaw://docs/${t}`:`nextclaw://docs`}function Ba(e){let t=k(e),n=t.startsWith(`/`)?t:(()=>{try{return new URL(e).pathname}catch{return``}})();return n?za(n.split(`/`)):`nextclaw://docs`}function X(e){if(e.scheme===`nextclaw`&&e.authority===`panel-app`)return e.pathSegments[0]??``;let[t,n,r,i]=e.pathSegments;return t===`api`&&n===`panel-apps`&&r!==void 0&&r.length>0&&i===`content`?r:``}function Va(e){return X(e).length>0}function Ha(e){let t=X(e);return t?`/api/panel-apps/${encodeURIComponent(decodeURIComponent(t))}/content`:`nextclaw://panel-app`}function Ua(e){let t=X(e);return t?`nextclaw://panel-app/${encodeURIComponent(decodeURIComponent(t))}`:`nextclaw://panel-app`}function Wa(e,t){let n=J(e),r=J(t),i=X(n),a=X(r);return i.length>0&&a.length>0?decodeURIComponent(i)===decodeURIComponent(a):e===t}var Z=[{defaultUrl:()=>wa,id:`home`,kind:Ca,match:e=>e.raw===wa,resolve:()=>({historyPolicy:`managed`,kind:Ca,resourceUri:wa,title:a(`docBrowserHomeTitle`),url:wa}),areEquivalent:(e,t)=>e===t},{defaultUrl:O,id:`docs-url`,kind:`docs`,match:e=>He(e.raw),resolve:e=>{let t=ze(e.raw,`docs`);return{historyPolicy:`managed`,kind:`docs`,resourceUri:Ba(t),title:a(`docBrowserHelp`),url:t}},areEquivalent:(e,t)=>k(e)===k(t)},{defaultUrl:O,id:`nextclaw-docs`,kind:`docs`,match:e=>e.scheme===`nextclaw`&&e.authority===`docs`,resolve:e=>{let t=Ra(e);return{historyPolicy:`managed`,kind:`docs`,resourceUri:za(e.pathSegments),title:a(`docBrowserHelp`),url:t}},areEquivalent:(e,t)=>k(e)===k(t)},{defaultUrl:()=>Y,id:`apps`,kind:Ta,match:e=>La(e.raw,Y),resolve:e=>{let t=Ma(e.raw);return{dedupeKey:`apps`,historyPolicy:`managed`,kind:Ta,resourceUri:t,title:a(t===`nextclaw://apps`?`appsTitle`:`serviceAppsTitle`),url:t}},areEquivalent:(e,t)=>Ma(e)===Ma(t)},{defaultUrl:()=>`nextclaw://panel-app`,id:`panel-app`,kind:Da,match:e=>e.scheme===`nextclaw`&&e.authority===`panel-app`||Va(e),resolve:e=>{let t=Ha(e),n=X(e);return{dedupeKey:n?`panel-app:${decodeURIComponent(n)}`:void 0,historyPolicy:`managed`,kind:Da,resourceUri:Ua(e),title:a(`panelAppsTitle`),url:t}},areEquivalent:Wa},{defaultUrl:()=>`about:blank`,id:`content`,kind:`content`,match:()=>!0,resolve:e=>({historyPolicy:`managed`,kind:`content`,resourceUri:e.raw||`about:blank`,title:Ge(e.raw,`content`,`Detail`),url:e.raw||`about:blank`}),areEquivalent:(e,t)=>e===t}],Ga=Z.map(e=>({areEquivalent:e.areEquivalent,id:e.id,match:e.match,resolve:e.resolve}));function Ka(){return[{id:`apps`,label:a(`appsTitle`),target:{type:`right-panel-resource`,uri:Y}},{id:`service-apps`,label:a(`serviceAppsTitle`),target:{type:`right-panel-resource`,uri:Ea}},{id:`docs`,label:a(`docBrowserHelp`),target:{options:{newTab:!0},type:`right-panel-resource`,uri:O()}},{id:`skill-marketplace`,label:a(`marketplaceSkillsPageTitle`),target:{path:`/marketplace/skills`,type:`app-route`}}]}var qa={apps:{accentClassName:`bg-emerald-50 text-emerald-700`,hoverAccentClassName:`group-hover:bg-emerald-100`,icon:(0,H.jsx)(we,{className:`h-5 w-5`})},"service-apps":{accentClassName:`bg-sky-50 text-sky-700`,hoverAccentClassName:`group-hover:bg-sky-100`,icon:(0,H.jsx)(Yr,{className:`h-5 w-5`})},docs:{accentClassName:`bg-amber-50 text-amber-700`,hoverAccentClassName:`group-hover:bg-amber-100`,icon:(0,H.jsx)(ye,{className:`h-5 w-5`})},"skill-marketplace":{accentClassName:`bg-rose-50 text-rose-700`,hoverAccentClassName:`group-hover:bg-rose-100`,icon:(0,H.jsx)(Ur,{className:`h-5 w-5`})}};function Ja(e){return qa[e.id]??{accentClassName:`bg-gray-50 text-gray-700`,hoverAccentClassName:`group-hover:bg-gray-100`,icon:(0,H.jsx)(we,{className:`h-5 w-5`})}}function Ya({open:e}){let t=an(),n=Ka(),r=n=>{if(n.type===`app-route`){t(n.path);return}e(n.uri,n.options)};return(0,H.jsx)(`div`,{className:`h-full overflow-auto bg-background px-4 py-5`,children:(0,H.jsx)(`div`,{className:`mx-auto w-full max-w-[520px]`,children:(0,H.jsx)(`div`,{className:`grid grid-cols-[repeat(auto-fit,minmax(76px,1fr))] gap-x-2 gap-y-4`,children:n.map(e=>{let t=Ja(e);return(0,H.jsxs)(`button`,{type:`button`,onClick:()=>r(e.target),className:`group flex min-h-[68px] flex-col items-center gap-1.5 rounded-md px-1.5 py-1.5 text-center focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring`,children:[(0,H.jsx)(`span`,{className:s(`flex h-10 w-10 shrink-0 items-center justify-center rounded-md transition-colors`,t.accentClassName,t.hoverAccentClassName),children:t.icon}),(0,H.jsx)(`span`,{className:`line-clamp-2 min-w-0 max-w-full text-xs font-medium leading-snug text-gray-700 transition-colors group-hover:text-gray-900`,children:e.label})]},e.id)})})})})}function Xa(e){return e&&He(e)?`docs`:`content`}var Za=class{constructor(){this.resourceUriResolver=new Sa(Ga,{getNormalizedUri:e=>e.resourceUri??e.url}),this.resolve=e=>this.resourceUriResolver.resolve(e),this.normalize=e=>this.resourceUriResolver.normalize(e),this.areEquivalent=(e,t)=>this.resourceUriResolver.areEquivalent(e,t),this.resolveOpenTarget=e=>{let{activeTab:t,kind:n,url:r}=e,i=this.resolveRouteDefinition(r,n,t),a=r?.trim()||(!n&&t&&t.kind!==`docs`?t.currentUrl:i.defaultUrl());return i.resolve(J(a))},this.areUrlsEquivalent=(e,t,n,r)=>n===r?this.resolveRouteDefinition(e,n).areEquivalent?.(e,t)??this.areEquivalent(e,t):!1,this.usesManagedHistory=e=>this.resolveRouteDefinition(e.currentUrl,e.kind).resolve(J(e.currentUrl)).historyPolicy===`managed`,this.resolveRouteDefinition=(e,t,n)=>{let r=t??(e?void 0:n?.kind),i=r?Z.find(e=>e.kind===r):void 0;if(i)return i;let a=e?J(e):null,o=a?Z.find(e=>e.match(a)):void 0;if(o)return o;let s=t??n?.kind??Xa(e);return Z.find(e=>e.kind===s)??Z[Z.length-1]}}},Qa=Ta,$a=Da,eo=`panel-apps`,to=[`allow-scripts`,`allow-forms`,`allow-modals`,`allow-popups`,`allow-popups-to-escape-sandbox`,`allow-downloads`,`allow-pointer-lock`,`allow-presentation`].join(` `);function no(e){return e===`panel-apps`||e===`service-apps`}function ro(e=eo){return e===eo?Y:Ea}function io(e){try{let t=new URL(e).searchParams.get(`tab`);return no(t)?t:eo}catch{return eo}}function ao(e){e.open(ro(),{kind:Qa,title:a(`appsTitle`),dedupeKey:`apps`})}var oo={[Ca]:{getTitle:()=>a(`docBrowserHomeTitle`),renderContent:({open:e})=>(0,H.jsx)(Ya,{open:e})},[Qa]:{getTitle:()=>a(`appsTitle`),renderIcon:()=>(0,H.jsx)(we,{className:`w-4 h-4 text-primary shrink-0`}),renderContent:({currentUrl:e,open:t,openTarget:n})=>(0,H.jsx)(ya,{activeTab:io(e),onActiveTabChange:e=>t(ro(e),{activate:!1,kind:Qa,title:a(`appsTitle`),dedupeKey:`apps`}),onOpenPanelApp:e=>n(Ia(e))})},[$a]:{getIframeSandbox:()=>to,getTitle:e=>e.title||a(`panelAppsTitle`),onIframeMessage:e=>ss().panelAppBridgeManager.handleIframeMessage(e),renderIcon:()=>(0,H.jsx)(Hr,{className:`w-4 h-4 text-primary shrink-0`}),renderToolbar:({open:e,refreshIframe:t,tab:n})=>(0,H.jsx)(ba,{appTitle:n.title||a(`panelAppsTitle`),onOpenApps:()=>ao({open:e}),onRefresh:t})}},so=`nextclaw://docs`;function co(){return[{builtIn:!0,icon:{type:`builtin`,name:`apps`},id:`apps`,label:a(`appsTitle`),removable:!1,target:{type:`right-panel-resource`,uri:Y}},{builtIn:!0,icon:{type:`builtin`,name:`service-apps`},id:`service-apps`,label:a(`serviceAppsTitle`),removable:!1,target:{type:`right-panel-resource`,uri:Ea}},{builtIn:!0,icon:{type:`builtin`,name:`docs`},id:`docs`,label:a(`docBrowserHelp`),removable:!1,target:{type:`right-panel-resource`,uri:so}},{builtIn:!0,icon:{type:`builtin`,name:`new-tab`},id:`new-tab`,label:a(`docBrowserHomeTitle`),removable:!1,target:{type:`right-panel-resource`,uri:wa}}]}var lo=[`apps`,`docs`,`new-tab`,`panel-app`,`service-apps`];function uo(e){return!!e&&typeof e==`object`}function fo(e){return lo.includes(e)}function po(e){return!uo(e)||typeof e.type!=`string`?null:e.type===`builtin`&&fo(e.name)?{type:`builtin`,name:e.name}:e.type===`url`&&typeof e.url==`string`&&e.url.trim().length>0?{type:`url`,url:e.url.trim()}:e.type===`text`&&typeof e.value==`string`&&e.value.trim().length>0?{type:`text`,value:e.value.trim()}:null}function mo(e){if(!uo(e)||typeof e.id!=`string`||e.id.trim().length===0||typeof e.label!=`string`||e.label.trim().length===0||typeof e.createdAt!=`string`||e.createdAt.trim().length===0||!uo(e.target)||e.target.type!==`right-panel-resource`||typeof e.target.uri!=`string`||e.target.uri.trim().length===0)return null;let t=po(e.icon);return t?{createdAt:e.createdAt,icon:t,id:e.id.trim(),label:e.label.trim(),target:{type:`right-panel-resource`,uri:e.target.uri.trim()}}:null}function ho(e){if(!Array.isArray(e))return[];let t=new Map;return e.forEach(e=>{let n=mo(e);n&&t.set(n.id,n)}),Array.from(t.values())}function go(e,t){return{createdAt:t,icon:e.icon,id:e.id,label:e.label,target:e.target}}function _o(e){return{builtIn:!1,icon:e.icon,id:e.id,label:e.label,removable:!0,target:e.target}}function vo(e,t){let n=new Set(e.map(e=>e.id)),r=new Set(e.map(e=>e.target.uri)),i=t.filter(e=>!n.has(e.id)&&!r.has(e.target.uri)).map(_o);return[...e,...i]}var yo=`nextclaw.side-dock.state`,bo=1;function xo(e){return!!e&&typeof e==`object`}var So=o()(Re(e=>({pinnedItems:[],setPinnedItems:t=>e({pinnedItems:ho(t)})}),{name:yo,version:bo,storage:qe(()=>window.localStorage),partialize:e=>({pinnedItems:e.pinnedItems}),merge:(e,t)=>{let n=xo(e)?ho(e.pinnedItems):[];return{...t,pinnedItems:n}}})),Co={apps:we,docs:ye,"new-tab":De,"panel-app":Hr,"service-apps":Hr},wo=/^\p{Extended_Pictographic}(?:\uFE0F|\uFE0E)?(?:\u200D\p{Extended_Pictographic}(?:\uFE0F|\uFE0E)?)*$/u;function To(e){return wo.test(e.trim())}function Eo({icon:e}){if(e.type===`url`)return(0,H.jsx)(`img`,{src:e.url,alt:``,className:`h-5 w-5 rounded object-cover`});if(e.type===`text`)return To(e.value)?(0,H.jsx)(`span`,{className:`flex h-7 w-7 items-center justify-center text-[20px] leading-none`,"aria-hidden":`true`,children:e.value}):(0,H.jsx)(`span`,{className:`max-w-7 truncate text-center text-[13px] font-semibold leading-none`,"aria-hidden":`true`,children:e.value});let t=Co[e.name];return(0,H.jsx)(t,{className:`h-5 w-5`,"aria-hidden":`true`})}function Do({active:e,item:t,onOpen:n,onUnpin:r}){let{label:i}=t;return(0,H.jsxs)(Ce,{children:[(0,H.jsxs)(`div`,{className:`group relative`,children:[(0,H.jsx)(be,{asChild:!0,children:(0,H.jsx)(`button`,{type:`button`,"aria-label":i,title:i,"data-side-dock-item-id":t.id,onClick:()=>n(t),className:s(`flex h-10 w-10 shrink-0 items-center justify-center rounded-lg text-muted-foreground transition-colors`,`hover:bg-primary/10 hover:text-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring`,e?`bg-primary/10 text-primary`:`bg-transparent`),children:(0,H.jsx)(Eo,{icon:t.icon})})}),t.removable?(0,H.jsx)(`button`,{type:`button`,"aria-label":a(`sideDockUnpinItem`),title:a(`sideDockUnpinItem`),onClick:e=>{e.stopPropagation(),r(t)},className:`absolute -right-1 -top-1 hidden h-4 w-4 items-center justify-center rounded-full bg-background text-muted-foreground shadow-sm ring-1 ring-border/70 transition-colors hover:bg-muted hover:text-foreground group-hover:flex focus-visible:flex focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring`,children:(0,H.jsx)(Ae,{className:`h-3 w-3`,"aria-hidden":`true`})}):null]}),(0,H.jsx)(xe,{side:`left`,children:i})]})}function Oo(e){return e?.trim()??``}function ko(e,t,n,r=!1){if(!t||!n)return!1;let i=Oo(e.target.uri),a=Oo(n.resourceUri);return a&&a===i||Oo(n.currentUrl)===i?!0:r?!1:e.id===`docs`&&n.kind===`docs`}function Ao(e,t){if(!t)return!1;let n=Oo(t.resourceUri),r=Oo(t.currentUrl);return e.some(e=>{let t=Oo(e.target.uri);return t===n||t===r})}function jo({manager:e}){let t=So(e=>e.pinnedItems),{currentTab:n,isOpen:r}=Ue(),i=vo(co(),t),a=Ao(i,n);return(0,H.jsx)(Se,{delayDuration:250,children:(0,H.jsx)(`aside`,{"data-testid":`side-dock`,className:`z-30 flex h-full w-14 shrink-0 flex-col items-center gap-1 border-l border-border/60 bg-background/95 px-2 py-3`,children:i.map(t=>(0,H.jsx)(Do,{active:ko(t,r,n,a),item:t,onOpen:e.openItem,onUnpin:t=>e.unpinItem(t.id)},t.id))})})}var Mo=`pinned`,No=new Set([`apps`,`docs`,`new-tab`,`panel-app`,`service-apps`]);function Q(e){return e.trim()}function Po(e){let t=0;return Array.from(Q(e)).forEach(e=>{t=t*31+e.charCodeAt(0)>>>0}),`${Mo}-${Q(e).replace(/[^a-zA-Z0-9]+/g,`-`).replace(/^-+|-+$/g,``).toLowerCase()||`resource`}-${t.toString(36)}`}function Fo(e){return e?.type===`builtin`&&No.has(e.name)?{type:`builtin`,name:e.name}:e?.type===`url`&&e.url.trim().length>0?{type:`url`,url:e.url.trim()}:e?.type===`text`&&e.value.trim().length>0?{type:`text`,value:e.value.trim()}:null}function Io(e){return e.kind===`docs`?`docs`:e.kind===`home`?`new-tab`:e.kind===`apps`?e.resourceUri?.includes(`service-apps`)?`service-apps`:`apps`:e.kind===`panel-app`?`panel-app`:`apps`}var Lo=class{constructor(e){this.docBrowserManager=e,this.getItems=()=>vo(co(),So.getState().pinnedItems),this.openItem=e=>{e.target.type===`right-panel-resource`&&this.docBrowserManager.open(e.target.uri,{dockIcon:e.icon,title:e.label})},this.getDockState=e=>{let t=this.getTabResourceUri(e);if(!t)return{canDock:!1,isDocked:!1,removable:!1};let n=this.findItemByUri(t);return{canDock:!0,isDocked:!!n,removable:n?.removable===!0}},this.pinTab=(e,t=new Date().toISOString())=>{let n=this.getTabResourceUri(e);!e||!n||this.findItemByUri(n)||this.pinItem({builtIn:!1,icon:Fo(e.dockIcon)??{type:`builtin`,name:Io(e)},id:Po(n),label:e.title.trim()||n,removable:!0,target:{type:`right-panel-resource`,uri:n}},t)},this.unpinTab=e=>{let t=this.getTabResourceUri(e),n=t?this.findItemByUri(t):void 0;n?.removable&&this.unpinItem(n.id)},this.pinItem=(e,t=new Date().toISOString())=>{if(!e.removable)return;let n=Q(e.target.uri);this.setPinnedItems(r=>r.some(t=>t.id===e.id||Q(t.target.uri)===n)?r:[...r,go({...e,target:{...e.target,uri:n}},t)])},this.unpinItem=e=>{this.setPinnedItems(t=>t.filter(t=>t.id!==e))},this.reorderPinnedItems=e=>{this.setPinnedItems(t=>{let n=new Map(t.map(e=>[e.id,e])),r=e.map(e=>n.get(e)).filter(e=>e!==void 0),i=new Set(r.map(e=>e.id)),a=t.filter(e=>!i.has(e.id));return[...r,...a]})},this.setPinnedItems=e=>{let{pinnedItems:t,setPinnedItems:n}=So.getState();n(e(t))},this.getTabResourceUri=e=>{let t=e?.resourceUri??e?.currentUrl,n=t?Q(t):``;return n.length>0?n:null},this.findItemByUri=e=>{let t=Q(e);return this.getItems().find(e=>Q(e.target.uri)===t)}}},Ro=class{constructor(){this.resolveOpenTarget=e=>{let{activeTab:t,kind:n,url:r}=e,i=n??(r?void 0:t?.kind)??(r&&He(r)?`docs`:`home`),o=r?.trim()||(!n&&t&&t.kind!==`docs`?t.currentUrl:i===`home`?`nextclaw://new-tab`:i===`docs`?O():`about:blank`),s=i===`docs`?ze(o,`docs`):o;return{historyPolicy:`managed`,kind:i,title:i===`home`?a(`docBrowserHomeTitle`):Ge(s,i,i===`docs`?a(`docBrowserHelp`):`Detail`),url:s}},this.areUrlsEquivalent=(e,t,n,r)=>n===r?n===`docs`?k(e)===k(t):e===t:!1,this.usesManagedHistory=e=>e.currentUrl!==Ve}};function zo(e){return e.index>0&&e.entries.length>0}function Bo(e){return e.index>=0&&e.index<e.entries.length-1}function Vo(e,t,n=Object.is){let r=Wo(e),i=e.entries[r];if(i&&n(i,t))return{entries:e.entries,index:r};let a=[...e.entries.slice(0,r+1),t];return{entries:a,index:a.length-1}}function Ho(e,t){let n=Wo(e),r=t===`back`?n-1:n+1,i=e.entries[r];return i?{history:{entries:e.entries,index:r},entry:i}:null}function Uo(e,t,n){let r=Wo(e),i=e.entries.filter(t);if(i.length===0)return n===void 0?{entries:[],index:0}:{entries:[n],index:0};let a=e.entries.slice(0,r+1).filter(t);return{entries:i,index:Math.min(Math.max(0,a.length-1),i.length-1)}}function Wo(e){return e.entries.length===0?0:Number.isInteger(e.index)?Math.min(Math.max(0,e.index),e.entries.length-1):e.entries.length-1}var Go=new Ro;function Ko(e,t,n){return{...e,tabs:e.tabs.map(e=>e.id===t?n(e):e)}}function qo(e,t){return Ko(e,e.activeTabId,t)}function Jo(e,t){let n=[...e.history.slice(0,e.historyIndex+1),t];return{history:n,historyIndex:n.length-1}}function Yo(e,t,n){let r=t.resourceUri??t.url,i=n.resourceUri??n.url;return t.tabId===n.tabId&&t.kind===n.kind&&e.areUrlsEquivalent(r,i,t.kind,n.kind)}function Xo(e,t){return{kind:t.kind,resourceUri:t.resourceUri??t.url,tabId:e,url:t.url}}function $(e,t,n){let r=Vo({entries:t.activeHistory,index:t.activeHistoryIndex},n,(t,n)=>Yo(e,t,n));return{...t,activeHistory:[...r.entries],activeHistoryIndex:r.index}}function Zo(e,t,n){for(let r=t.history.length-1;r>=0;--r)if(e.areUrlsEquivalent(t.history[r],n,t.kind,t.kind))return r;return-1}function Qo(e,t,n){let r=t.tabs.find(e=>e.id===n.tabId);if(!r)return t;let i=n.resourceUri??n.url,a=e.resolveOpenTarget({activeTab:r,kind:n.kind,url:i}),o=Zo(e,r,a.url),s=n.resourceUri!==void 0&&n.resourceUri===r.resourceUri;return Ko({...t,activeTabId:r.id,isOpen:!0},r.id,e=>({...e,currentUrl:a.url,dedupeKey:a.dedupeKey,dockIcon:a.dockIcon??e.dockIcon,historyIndex:o>=0?o:e.historyIndex,kind:a.kind,resourceUri:a.resourceUri??a.url,title:s?e.title:a.title}))}function $o(e,t,n,r,i){let a={...t,title:r?.title||n.title||t.title,kind:n.kind,resourceUri:n.resourceUri??n.url,dockIcon:r?.dockIcon??n.dockIcon,dedupeKey:i};return e.areUrlsEquivalent(t.currentUrl,n.url,t.kind,n.kind)?a:{...a,currentUrl:n.url,...Jo(t,n.url),navVersion:t.navVersion+1}}function es(e,t){return!e.isOpen&&e.tabs.length===1&&t?.kind===`home`&&t.currentUrl===`nextclaw://new-tab`}function ts(e,t,n,r){let{activate:i,dedupeKey:a,newTab:o,title:s}=r??{},c=a?.trim()||n.dedupeKey,l=t.tabs.find(e=>e.id===t.activeTabId)??t.tabs[0],u=c?t.tabs.find(e=>e.dedupeKey===c):void 0;if(u){let a=Ko(t,u.id,t=>$o(e,t,n,r,c)),o=i!==!1,s=o?u.id:t.activeTabId,l={...a,activeTabId:s,isOpen:!0};return o||u.id===t.activeTabId?$(e,l,Xo(u.id,n)):l}if(o||c||!l||l.kind!==n.kind){let i=We(n.url,n.kind,s??n.title,c,n.resourceUri??n.url,r?.dockIcon??n.dockIcon);return es(t,l)?{...t,isOpen:!0,tabs:[i],activeTabId:i.id,activeHistory:[D(i)],activeHistoryIndex:0}:$(e,{...t,isOpen:!0,tabs:[...t.tabs,i],activeTabId:i.id},D(i))}return $(e,{...qo(t,t=>$o(e,t,n,r,c)),isOpen:!0},Xo(t.activeTabId,n))}function ns(e,t,n,r){let i=t.tabs.find(e=>e.id===t.activeTabId)??t.tabs[0];return ts(e,t,e.resolveOpenTarget({activeTab:i,kind:r?.kind,url:n}),r)}var rs=class{constructor(e=Go){this.routeResolver=e,this.setSnapshot=e=>{Ke.getState().setSnapshot(e)},this.open=(e,t)=>{this.setSnapshot(n=>ns(this.routeResolver,n,e,t))},this.openTarget=(e,t)=>{this.setSnapshot(n=>ts(this.routeResolver,n,e,{...t,dedupeKey:t?.dedupeKey??e.dedupeKey,kind:t?.kind??e.kind,title:t?.title??e.title}))},this.openNewTab=()=>{this.open(void 0,{kind:Je,newTab:!0})},this.close=()=>{this.setSnapshot(e=>({...e,isOpen:!1}))},this.toggleMode=()=>{this.setSnapshot(e=>({...e,mode:e.mode===`floating`?`docked`:`floating`}))},this.navigate=e=>{this.setSnapshot(t=>{if(!t.tabs.length){let e=We(O(),`docs`,`Docs`);return{...t,tabs:[e],activeTabId:e.id,isOpen:!0}}let n=qo(t,t=>{if(!this.routeResolver.usesManagedHistory(t))return t;let n=this.routeResolver.resolveOpenTarget({activeTab:t,url:e});return this.routeResolver.areUrlsEquivalent(t.currentUrl,n.url,t.kind,n.kind)?t:{...t,currentUrl:n.url,dedupeKey:n.dedupeKey,dockIcon:n.dockIcon,...Jo(t,n.url),kind:n.kind,navVersion:t.navVersion+1,resourceUri:n.resourceUri??n.url,title:n.title}}),r=n.tabs.find(e=>e.id===n.activeTabId);return r?$(this.routeResolver,n,D(r)):n})},this.syncUrl=e=>{this.setSnapshot(t=>{if(!t.tabs.length){let e=We(O(),`docs`,`Docs`);return{...t,tabs:[e],activeTabId:e.id}}let n=qo(t,t=>{if(!this.routeResolver.usesManagedHistory(t))return t;let n=this.routeResolver.resolveOpenTarget({activeTab:t,kind:t.kind,url:e});return this.routeResolver.areUrlsEquivalent(t.currentUrl,n.url,t.kind,n.kind)?t:{...t,currentUrl:n.url,dedupeKey:n.dedupeKey,dockIcon:n.dockIcon,...Jo(t,n.url),kind:n.kind,resourceUri:n.resourceUri??n.url,title:n.title}}),r=n.tabs.find(e=>e.id===n.activeTabId);return r?$(this.routeResolver,n,D(r)):n})},this.goBack=()=>{this.setSnapshot(e=>{let t=Ho({entries:e.activeHistory,index:e.activeHistoryIndex},`back`);return t?Qo(this.routeResolver,{...e,activeHistory:[...t.history.entries],activeHistoryIndex:t.history.index},t.entry):e})},this.goForward=()=>{this.setSnapshot(e=>{let t=Ho({entries:e.activeHistory,index:e.activeHistoryIndex},`forward`);return t?Qo(this.routeResolver,{...e,activeHistory:[...t.history.entries],activeHistoryIndex:t.history.index},t.entry):e})},this.closeTab=e=>{this.setSnapshot(t=>{if(t.tabs.length<=1)return{...Be(),isOpen:!1};let n=t.tabs.findIndex(t=>t.id===e);if(n<0)return t;let r=t.tabs.filter(t=>t.id!==e),i=t.activeTabId===e?r[Math.max(0,n-1)]?.id??r[0].id:t.activeTabId,a={...t,tabs:r,activeTabId:i},o=r.find(e=>e.id===i)??r[0],s=Uo({entries:a.activeHistory,index:a.activeHistoryIndex},t=>t.tabId!==e,D(o)),c={...a,activeHistory:[...s.entries],activeHistoryIndex:s.index};return t.activeTabId===e?$(this.routeResolver,c,D(o)):c})},this.setActiveTab=e=>{this.setSnapshot(t=>{if(!t.tabs.some(t=>t.id===e))return t;let n=t.tabs.find(t=>t.id===e);return n?$(this.routeResolver,{...t,activeTabId:e,isOpen:!0},D(n)):t})}}},is=class{constructor(){this.accountManager=new Di,this.rightPanelResourceRouteResolver=new Za,this.docBrowserManager=new rs(this.rightPanelResourceRouteResolver),this.sideDockManager=new Lo(this.docBrowserManager),this.serviceActionAuthorizationManager=new $i,this.panelAppBridgeManager=new qi(this.serviceActionAuthorizationManager),this.remoteAccessManager=new gi({accountManager:this.accountManager})}},as=null;function os(){return as??=new is,as}function ss(){return os()}var cs=(0,A.createContext)(null);function ls({children:e}){let t=(0,A.useMemo)(()=>os(),[]);return(0,H.jsx)(cs.Provider,{value:t,children:e})}function us(){let e=(0,A.useContext)(cs);if(!e)throw Error(`useAppPresenter must be used inside AppPresenterProvider`);return e}export{ai as A,Mn as B,W as C,li as D,hi as E,Ur as F,sn as G,Fn as H,xr as I,Qe as K,wr as L,$r as M,Jr as N,ci as O,Wr as P,jn as R,ui as S,pi as T,V as U,Nn as V,an as W,Ti as _,Bo as a,gi as b,Ho as c,oo as d,ao as f,Ei as g,Xi as h,zo as i,ni as j,si as k,jo as l,Ia as m,us as n,Uo as o,Na as p,ss as r,Vo as s,ls as t,So as u,xi as v,G as w,K as x,bi as y,Tr as z};
@@ -1 +0,0 @@
1
- import{c as e}from"./dist-NZRV-BxD.js";var t=e(`ArrowLeft`,[[`path`,{d:`m12 19-7-7 7-7`,key:`1l729n`}],[`path`,{d:`M19 12H5`,key:`x3x0zl`}]]);export{t};
@@ -1 +0,0 @@
1
- import{c as e}from"./dist-NZRV-BxD.js";var t=e(`BookOpen`,[[`path`,{d:`M12 7v14`,key:`1akyts`}],[`path`,{d:`M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z`,key:`ruj8y`}]]);export{t};