@agent-native/core 0.119.1 → 0.119.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (230) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +15 -0
  3. package/corpus/core/package.json +1 -1
  4. package/corpus/core/src/a2a/client.ts +4 -0
  5. package/corpus/core/src/agent/production-agent.ts +1 -0
  6. package/corpus/core/src/client/AssistantChat.tsx +11 -50
  7. package/corpus/core/src/client/ErrorBoundary.tsx +25 -19
  8. package/corpus/core/src/client/agent-page/AgentTabFrame.tsx +1 -1
  9. package/corpus/core/src/client/agent-page/AgentTabsPage.tsx +23 -0
  10. package/corpus/core/src/client/components/ui/message-scroller.tsx +1 -9
  11. package/corpus/core/src/client/resources/ResourceTree.tsx +3 -3
  12. package/corpus/core/src/client/resources/ResourcesPanel.tsx +64 -60
  13. package/corpus/core/src/client/settings/AccountSettingsCard.tsx +228 -0
  14. package/corpus/core/src/client/settings/SecretsSection.tsx +7 -5
  15. package/corpus/core/src/client/settings/SettingsPanel.tsx +67 -244
  16. package/corpus/core/src/client/settings/SettingsTabsPage.tsx +88 -21
  17. package/corpus/core/src/client/settings/agent-settings-search.ts +0 -2
  18. package/corpus/core/src/client/settings/index.ts +7 -0
  19. package/corpus/core/src/client/vite-dev-recovery-script.ts +18 -1
  20. package/corpus/core/src/db/client.ts +65 -15
  21. package/corpus/core/src/db/index.ts +2 -0
  22. package/corpus/core/src/localization/default-messages.ts +1 -0
  23. package/corpus/core/src/server/email.ts +33 -1
  24. package/corpus/core/src/styles/agent-native.css +23 -0
  25. package/corpus/core/src/templates/default/.agents/skills/frontend-design/SKILL.md +28 -0
  26. package/corpus/core/src/templates/default/app/routes/settings.tsx +2 -0
  27. package/corpus/core/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +28 -0
  28. package/corpus/core/src/vite/client.ts +76 -8
  29. package/corpus/templates/analytics/.agents/skills/frontend-design/SKILL.md +28 -0
  30. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +3 -1
  31. package/corpus/templates/analytics/app/components/layout/Layout.tsx +9 -13
  32. package/corpus/templates/analytics/app/components/layout/layout-route-policy.ts +2 -2
  33. package/corpus/templates/analytics/app/global.css +0 -5
  34. package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +0 -13
  35. package/corpus/templates/analytics/app/lib/sql-query.ts +15 -2
  36. package/corpus/templates/analytics/app/pages/Settings.tsx +2 -24
  37. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +6 -0
  38. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +4 -0
  39. package/corpus/templates/analytics/app/pages/settings/settings-search.ts +1 -1
  40. package/corpus/templates/analytics/changelog/2026-07-23-ask-analytics-is-better-centered-with-a-quieter-chat-rail-an.md +6 -0
  41. package/corpus/templates/analytics/changelog/2026-07-23-daily-dashboard-emails-load-read-heavy-panels-reliably.md +6 -0
  42. package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +2 -2
  43. package/corpus/templates/analytics/server/jobs/dashboard-report.ts +39 -5
  44. package/corpus/templates/analytics/server/lib/dashboard-report.ts +186 -62
  45. package/corpus/templates/analytics/server/lib/first-party-analytics.ts +3 -0
  46. package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +18 -2
  47. package/corpus/templates/analytics/shared/dashboard-report-timeouts.ts +3 -0
  48. package/corpus/templates/assets/.agents/skills/frontend-design/SKILL.md +28 -0
  49. package/corpus/templates/assets/app/components/layout/Layout.tsx +3 -4
  50. package/corpus/templates/assets/app/components/layout/Sidebar.tsx +1 -1
  51. package/corpus/templates/assets/app/global.css +0 -5
  52. package/corpus/templates/assets/app/hooks/use-navigation-state.ts +0 -22
  53. package/corpus/templates/assets/app/routes/settings.tsx +2 -0
  54. package/corpus/templates/assets/changelog/2026-07-23-create-and-chat-surfaces-are-better-centered-with-quieter-ch.md +6 -0
  55. package/corpus/templates/brain/.agents/skills/frontend-design/SKILL.md +28 -0
  56. package/corpus/templates/brain/app/components/layout/Layout.tsx +1 -1
  57. package/corpus/templates/brain/app/components/layout/Sidebar.tsx +1 -1
  58. package/corpus/templates/brain/app/global.css +0 -9
  59. package/corpus/templates/brain/app/hooks/use-navigation-state.ts +0 -12
  60. package/corpus/templates/brain/app/i18n-data.ts +1 -0
  61. package/corpus/templates/brain/app/lib/settings-navigation.ts +1 -1
  62. package/corpus/templates/brain/app/routes/settings.tsx +21 -22
  63. package/corpus/templates/brain/changelog/2026-07-23-ask-brain-is-better-centered-with-quieter-chat-history-and-a.md +6 -0
  64. package/corpus/templates/calendar/.agents/skills/frontend-design/SKILL.md +28 -0
  65. package/corpus/templates/calendar/app/pages/Settings.tsx +2 -0
  66. package/corpus/templates/chat/.agents/skills/frontend-design/SKILL.md +28 -0
  67. package/corpus/templates/chat/app/components/layout/Layout.tsx +1 -1
  68. package/corpus/templates/chat/app/components/layout/Sidebar.tsx +1 -1
  69. package/corpus/templates/chat/app/hooks/use-navigation-state.ts +0 -15
  70. package/corpus/templates/chat/app/routes/settings.tsx +2 -0
  71. package/corpus/templates/chat/changelog/2026-07-23-full-page-chat-is-better-centered-with-quieter-chat-history-.md +6 -0
  72. package/corpus/templates/clips/.agents/skills/frontend-design/SKILL.md +28 -0
  73. package/corpus/templates/clips/app/routes/_app.settings._index.tsx +2 -0
  74. package/corpus/templates/content/.agents/skills/frontend-design/SKILL.md +28 -0
  75. package/corpus/templates/content/app/routes/_app.settings.tsx +2 -0
  76. package/corpus/templates/design/.agents/skills/frontend-design/SKILL.md +28 -0
  77. package/corpus/templates/design/app/routes/settings.tsx +2 -0
  78. package/corpus/templates/dispatch/.agents/skills/frontend-design/SKILL.md +28 -0
  79. package/corpus/templates/dispatch/app/routes/settings.tsx +2 -0
  80. package/corpus/templates/dispatch/changelog/2026-07-23-quieter-progressive-disclosure.md +6 -0
  81. package/corpus/templates/forms/.agents/skills/frontend-design/SKILL.md +28 -0
  82. package/corpus/templates/forms/app/global.css +0 -5
  83. package/corpus/templates/forms/app/hooks/use-navigation-state.ts +0 -7
  84. package/corpus/templates/forms/app/root.tsx +1 -7
  85. package/corpus/templates/forms/app/routes/_app.settings.tsx +2 -0
  86. package/corpus/templates/forms/changelog/2026-07-23-ask-forms-is-better-centered-with-quieter-chat-history-and-a.md +6 -0
  87. package/corpus/templates/macros/.agents/skills/frontend-design/SKILL.md +28 -0
  88. package/corpus/templates/macros/app/routes/settings.tsx +2 -0
  89. package/corpus/templates/mail/.agents/skills/frontend-design/SKILL.md +28 -0
  90. package/corpus/templates/mail/app/pages/SettingsPage.tsx +3 -1
  91. package/corpus/templates/plan/.agents/skills/frontend-design/SKILL.md +28 -0
  92. package/corpus/templates/plan/app/components/layout/Layout.tsx +2 -2
  93. package/corpus/templates/plan/app/components/layout/Sidebar.tsx +1 -13
  94. package/corpus/templates/plan/app/hooks/use-navigation-state.ts +0 -4
  95. package/corpus/templates/plan/app/routes/settings.tsx +2 -0
  96. package/corpus/templates/plan/changelog/2026-07-23-ask-plan-is-now-a-clean-full-page-chat-surface-with-better-c.md +6 -0
  97. package/corpus/templates/slides/.agents/skills/frontend-design/SKILL.md +28 -0
  98. package/corpus/templates/slides/app/routes/settings.tsx +2 -0
  99. package/corpus/templates/tasks/.agents/skills/frontend-design/SKILL.md +28 -0
  100. package/corpus/toolkit/CHANGELOG.md +6 -0
  101. package/corpus/toolkit/package.json +1 -1
  102. package/corpus/toolkit/src/chat-history.css +2 -2
  103. package/corpus/toolkit/src/composer/PromptComposer.tsx +0 -31
  104. package/corpus/toolkit/src/composer/RealtimeVoiceMode.tsx +7 -2
  105. package/corpus/toolkit/src/styles.css +183 -36
  106. package/dist/a2a/client.d.ts +2 -0
  107. package/dist/a2a/client.d.ts.map +1 -1
  108. package/dist/a2a/client.js +2 -0
  109. package/dist/a2a/client.js.map +1 -1
  110. package/dist/agent/production-agent.d.ts.map +1 -1
  111. package/dist/agent/production-agent.js +1 -0
  112. package/dist/agent/production-agent.js.map +1 -1
  113. package/dist/client/AssistantChat.d.ts.map +1 -1
  114. package/dist/client/AssistantChat.js +11 -42
  115. package/dist/client/AssistantChat.js.map +1 -1
  116. package/dist/client/ErrorBoundary.d.ts.map +1 -1
  117. package/dist/client/ErrorBoundary.js +3 -2
  118. package/dist/client/ErrorBoundary.js.map +1 -1
  119. package/dist/client/agent-page/AgentTabFrame.js +1 -1
  120. package/dist/client/agent-page/AgentTabFrame.js.map +1 -1
  121. package/dist/client/agent-page/AgentTabsPage.d.ts.map +1 -1
  122. package/dist/client/agent-page/AgentTabsPage.js +13 -1
  123. package/dist/client/agent-page/AgentTabsPage.js.map +1 -1
  124. package/dist/client/components/ui/message-scroller.d.ts.map +1 -1
  125. package/dist/client/components/ui/message-scroller.js +2 -2
  126. package/dist/client/components/ui/message-scroller.js.map +1 -1
  127. package/dist/client/resources/ResourceTree.js +2 -2
  128. package/dist/client/resources/ResourceTree.js.map +1 -1
  129. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  130. package/dist/client/resources/ResourcesPanel.js +11 -11
  131. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  132. package/dist/client/settings/AccountSettingsCard.d.ts +9 -0
  133. package/dist/client/settings/AccountSettingsCard.d.ts.map +1 -0
  134. package/dist/client/settings/AccountSettingsCard.js +78 -0
  135. package/dist/client/settings/AccountSettingsCard.js.map +1 -0
  136. package/dist/client/settings/SecretsSection.d.ts.map +1 -1
  137. package/dist/client/settings/SecretsSection.js +2 -2
  138. package/dist/client/settings/SecretsSection.js.map +1 -1
  139. package/dist/client/settings/SettingsPanel.d.ts +3 -0
  140. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  141. package/dist/client/settings/SettingsPanel.js +25 -77
  142. package/dist/client/settings/SettingsPanel.js.map +1 -1
  143. package/dist/client/settings/SettingsTabsPage.d.ts +5 -1
  144. package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -1
  145. package/dist/client/settings/SettingsTabsPage.js +35 -9
  146. package/dist/client/settings/SettingsTabsPage.js.map +1 -1
  147. package/dist/client/settings/agent-settings-search.d.ts.map +1 -1
  148. package/dist/client/settings/agent-settings-search.js +0 -2
  149. package/dist/client/settings/agent-settings-search.js.map +1 -1
  150. package/dist/client/settings/index.d.ts +2 -1
  151. package/dist/client/settings/index.d.ts.map +1 -1
  152. package/dist/client/settings/index.js +2 -1
  153. package/dist/client/settings/index.js.map +1 -1
  154. package/dist/client/vite-dev-recovery-script.d.ts.map +1 -1
  155. package/dist/client/vite-dev-recovery-script.js +18 -1
  156. package/dist/client/vite-dev-recovery-script.js.map +1 -1
  157. package/dist/collab/awareness.d.ts +2 -2
  158. package/dist/collab/awareness.d.ts.map +1 -1
  159. package/dist/collab/routes.d.ts +1 -1
  160. package/dist/collab/struct-routes.d.ts +1 -1
  161. package/dist/db/client.d.ts +18 -8
  162. package/dist/db/client.d.ts.map +1 -1
  163. package/dist/db/client.js +34 -11
  164. package/dist/db/client.js.map +1 -1
  165. package/dist/db/index.d.ts +1 -1
  166. package/dist/db/index.d.ts.map +1 -1
  167. package/dist/db/index.js.map +1 -1
  168. package/dist/localization/default-messages.d.ts +1 -0
  169. package/dist/localization/default-messages.d.ts.map +1 -1
  170. package/dist/localization/default-messages.js +1 -0
  171. package/dist/localization/default-messages.js.map +1 -1
  172. package/dist/notifications/routes.d.ts +2 -2
  173. package/dist/observability/routes.d.ts +3 -3
  174. package/dist/progress/routes.d.ts +1 -1
  175. package/dist/provider-api/actions/custom-provider-registration.d.ts +7 -7
  176. package/dist/provider-api/actions/provider-api.d.ts +7 -7
  177. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  178. package/dist/resources/handlers.d.ts +1 -1
  179. package/dist/secrets/routes.d.ts +9 -9
  180. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  181. package/dist/server/email.d.ts +1 -0
  182. package/dist/server/email.d.ts.map +1 -1
  183. package/dist/server/email.js +29 -1
  184. package/dist/server/email.js.map +1 -1
  185. package/dist/server/realtime-token.d.ts +1 -1
  186. package/dist/styles/agent-native.css +23 -0
  187. package/dist/templates/chat/.agents/skills/frontend-design/SKILL.md +28 -0
  188. package/dist/templates/chat/app/components/layout/Layout.tsx +1 -1
  189. package/dist/templates/chat/app/components/layout/Sidebar.tsx +1 -1
  190. package/dist/templates/chat/app/hooks/use-navigation-state.ts +0 -15
  191. package/dist/templates/chat/app/routes/settings.tsx +2 -0
  192. package/dist/templates/chat/changelog/2026-07-23-full-page-chat-is-better-centered-with-quieter-chat-history-.md +6 -0
  193. package/dist/templates/default/.agents/skills/frontend-design/SKILL.md +28 -0
  194. package/dist/templates/default/app/routes/settings.tsx +2 -0
  195. package/dist/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +28 -0
  196. package/dist/vite/client.d.ts.map +1 -1
  197. package/dist/vite/client.js +68 -6
  198. package/dist/vite/client.js.map +1 -1
  199. package/package.json +2 -2
  200. package/src/a2a/client.ts +4 -0
  201. package/src/agent/production-agent.ts +1 -0
  202. package/src/client/AssistantChat.tsx +11 -50
  203. package/src/client/ErrorBoundary.tsx +25 -19
  204. package/src/client/agent-page/AgentTabFrame.tsx +1 -1
  205. package/src/client/agent-page/AgentTabsPage.tsx +23 -0
  206. package/src/client/components/ui/message-scroller.tsx +1 -9
  207. package/src/client/resources/ResourceTree.tsx +3 -3
  208. package/src/client/resources/ResourcesPanel.tsx +64 -60
  209. package/src/client/settings/AccountSettingsCard.tsx +228 -0
  210. package/src/client/settings/SecretsSection.tsx +7 -5
  211. package/src/client/settings/SettingsPanel.tsx +67 -244
  212. package/src/client/settings/SettingsTabsPage.tsx +88 -21
  213. package/src/client/settings/agent-settings-search.ts +0 -2
  214. package/src/client/settings/index.ts +7 -0
  215. package/src/client/vite-dev-recovery-script.ts +18 -1
  216. package/src/db/client.ts +65 -15
  217. package/src/db/index.ts +2 -0
  218. package/src/localization/default-messages.ts +1 -0
  219. package/src/server/email.ts +33 -1
  220. package/src/styles/agent-native.css +23 -0
  221. package/src/templates/chat/.agents/skills/frontend-design/SKILL.md +28 -0
  222. package/src/templates/chat/app/components/layout/Layout.tsx +1 -1
  223. package/src/templates/chat/app/components/layout/Sidebar.tsx +1 -1
  224. package/src/templates/chat/app/hooks/use-navigation-state.ts +0 -15
  225. package/src/templates/chat/app/routes/settings.tsx +2 -0
  226. package/src/templates/chat/changelog/2026-07-23-full-page-chat-is-better-centered-with-quieter-chat-history-.md +6 -0
  227. package/src/templates/default/.agents/skills/frontend-design/SKILL.md +28 -0
  228. package/src/templates/default/app/routes/settings.tsx +2 -0
  229. package/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +28 -0
  230. package/src/vite/client.ts +76 -8
@@ -1 +1 @@
1
- {"version":3,"file":"ErrorBoundary.d.ts","sourceRoot":"","sources":["../../src/client/ErrorBoundary.tsx"],"names":[],"mappings":"AAkWA,wBAAgB,aAAa,gCAI5B"}
1
+ {"version":3,"file":"ErrorBoundary.d.ts","sourceRoot":"","sources":["../../src/client/ErrorBoundary.tsx"],"names":[],"mappings":"AAwWA,wBAAgB,aAAa,gCAI5B"}
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useEffect, useState } from "react";
3
3
  import { isRouteErrorResponse, useInRouterContext, useRouteError, } from "react-router";
4
4
  import { DEFAULT_LOCALE, LOCALE_HYDRATION_GLOBAL, LOCALE_STORAGE_KEY, normalizeLocaleCode, } from "../localization/shared.js";
@@ -259,7 +259,8 @@ function ErrorScreen({ error }) {
259
259
  if (typeof console !== "undefined" && error) {
260
260
  console.error("[ErrorBoundary]", error);
261
261
  }
262
- return (_jsx("main", { className: "flex items-center justify-center min-h-screen p-4 bg-background text-foreground", children: _jsxs("div", { className: "flex flex-col items-center text-center max-w-md", children: [status && (_jsx("span", { className: "text-7xl font-bold tracking-tight text-muted-foreground/40", children: status })), _jsx("h1", { className: "mt-3 text-2xl font-semibold", children: title }), _jsx("p", { className: "mt-2 text-muted-foreground text-sm", children: details }), _jsxs("div", { className: "mt-6 flex flex-wrap justify-center gap-2", children: [_jsx("a", { href: appPath("/"), className: primaryActionClassName, children: copy.goHome }), _jsx("button", { type: "button", onClick: () => window.location.reload(), className: secondaryActionClassName, children: copy.reload }), _jsx(ErrorReportActions, { appName: "Agent Native", title: title, details: details, status: status, issueTitle: `Error screen: ${title}`, feedbackLabel: copy.sendFeedback, feedbackPlaceholder: copy.feedbackPlaceholder, githubLabel: copy.openGitHubIssue, feedbackClassName: "h-9", githubClassName: "h-9" })] }), stack && (_jsx("pre", { className: "mt-6 w-full text-start text-xs overflow-auto p-4 bg-muted rounded", children: _jsx("code", { children: stack }) }))] }) }));
262
+ const isNotFound = status === 404;
263
+ return (_jsx("main", { className: "flex items-center justify-center min-h-screen p-4 bg-background text-foreground", children: _jsxs("div", { className: "flex flex-col items-center text-center max-w-md", children: [status && (_jsx("span", { className: "text-7xl font-bold tracking-tight text-muted-foreground/40", children: status })), _jsx("h1", { className: "mt-3 text-2xl font-semibold", children: title }), _jsx("p", { className: "mt-2 text-muted-foreground text-sm", children: details }), _jsxs("div", { className: "mt-6 flex flex-wrap justify-center gap-2", children: [_jsx("a", { href: appPath("/"), className: primaryActionClassName, children: copy.goHome }), !isNotFound && (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", onClick: () => window.location.reload(), className: secondaryActionClassName, children: copy.reload }), _jsx(ErrorReportActions, { appName: "Agent Native", title: title, details: details, status: status, issueTitle: `Error screen: ${title}`, feedbackLabel: copy.sendFeedback, feedbackPlaceholder: copy.feedbackPlaceholder, githubLabel: copy.openGitHubIssue, feedbackClassName: "h-9", githubClassName: "h-9" })] }))] }), stack && (_jsx("pre", { className: "mt-6 w-full text-start text-xs overflow-auto p-4 bg-muted rounded", children: _jsx("code", { children: stack }) }))] }) }));
263
264
  }
264
265
  function RoutedErrorScreen() {
265
266
  return _jsx(ErrorScreen, { error: useRouteError() });
@@ -1 +1 @@
1
- {"version":3,"file":"ErrorBoundary.js","sourceRoot":"","sources":["../../src/client/ErrorBoundary.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useState } from \"react\";\nimport {\n isRouteErrorResponse,\n useInRouterContext,\n useRouteError,\n} from \"react-router\";\n\nimport {\n DEFAULT_LOCALE,\n LOCALE_HYDRATION_GLOBAL,\n LOCALE_STORAGE_KEY,\n normalizeLocaleCode,\n type LocaleCode,\n} from \"../localization/shared.js\";\nimport { appPath } from \"./api-path.js\";\nimport { ErrorReportActions } from \"./ErrorReportActions.js\";\nimport {\n isDynamicImportFailureMessage,\n recoverFromStaleChunkError,\n} from \"./route-chunk-recovery.js\";\n\nconst primaryActionClassName =\n \"inline-flex h-9 items-center gap-1.5 rounded-md bg-primary px-4 text-sm font-medium text-primary-foreground shadow-sm hover:bg-primary/90 cursor-pointer\";\nconst secondaryActionClassName =\n \"inline-flex h-9 cursor-pointer items-center gap-1.5 rounded-md border border-border bg-background px-4 text-sm font-medium text-foreground shadow-sm hover:bg-accent\";\n\nconst errorCopy: Record<\n LocaleCode,\n {\n loadingLatest: string;\n genericTitle: string;\n genericDetails: string;\n notFoundTitle: string;\n notFoundDetails: string;\n statusTitle: (status: number) => string;\n goHome: string;\n reload: string;\n sendFeedback: string;\n feedbackPlaceholder: string;\n openGitHubIssue: string;\n }\n> = {\n \"en-US\": {\n loadingLatest: \"Loading the latest version...\",\n genericTitle: \"Something went wrong\",\n genericDetails: \"An unexpected error occurred.\",\n notFoundTitle: \"Page not found\",\n notFoundDetails: \"We couldn't find this page.\",\n statusTitle: (status) => `${status} Error`,\n goHome: \"Go home\",\n reload: \"Reload\",\n sendFeedback: \"Send feedback\",\n feedbackPlaceholder: \"Describe what happened before this error appeared.\",\n openGitHubIssue: \"Open GitHub issue\",\n },\n \"zh-CN\": {\n loadingLatest: \"正在加载最新版本...\",\n genericTitle: \"出错了\",\n genericDetails: \"发生了意外错误。\",\n notFoundTitle: \"页面未找到\",\n notFoundDetails: \"我们找不到这个页面。\",\n statusTitle: (status) => `${status} 错误`,\n goHome: \"回到首页\",\n reload: \"重新加载\",\n sendFeedback: \"发送反馈\",\n feedbackPlaceholder: \"描述此错误出现前发生了什么。\",\n openGitHubIssue: \"打开 GitHub issue\",\n },\n \"zh-TW\": {\n loadingLatest: \"正在載入最新版本...\",\n genericTitle: \"發生錯誤\",\n genericDetails: \"發生未預期的錯誤。\",\n notFoundTitle: \"找不到頁面\",\n notFoundDetails: \"找不到這個頁面。\",\n statusTitle: (status) => `${status} 錯誤`,\n goHome: \"回首頁\",\n reload: \"重新載入\",\n sendFeedback: \"傳送意見回饋\",\n feedbackPlaceholder: \"描述此錯誤出現前發生了什麼。\",\n openGitHubIssue: \"開啟 GitHub issue\",\n },\n \"es-ES\": {\n loadingLatest: \"Cargando la versión más reciente...\",\n genericTitle: \"Algo salió mal\",\n genericDetails: \"Se produjo un error inesperado.\",\n notFoundTitle: \"Página no encontrada\",\n notFoundDetails: \"No pudimos encontrar esta página.\",\n statusTitle: (status) => `Error ${status}`,\n goHome: \"Ir al inicio\",\n reload: \"Recargar\",\n sendFeedback: \"Enviar comentarios\",\n feedbackPlaceholder:\n \"Describe qué pasó antes de que apareciera este error.\",\n openGitHubIssue: \"Abrir issue en GitHub\",\n },\n \"fr-FR\": {\n loadingLatest: \"Chargement de la dernière version...\",\n genericTitle: \"Un problème est survenu\",\n genericDetails: \"Une erreur inattendue s'est produite.\",\n notFoundTitle: \"Page introuvable\",\n notFoundDetails: \"Nous n'avons pas trouvé cette page.\",\n statusTitle: (status) => `Erreur ${status}`,\n goHome: \"Accueil\",\n reload: \"Recharger\",\n sendFeedback: \"Envoyer un retour\",\n feedbackPlaceholder: \"Décrivez ce qui s'est passé avant cette erreur.\",\n openGitHubIssue: \"Ouvrir une issue GitHub\",\n },\n \"de-DE\": {\n loadingLatest: \"Neueste Version wird geladen...\",\n genericTitle: \"Etwas ist schiefgelaufen\",\n genericDetails: \"Ein unerwarteter Fehler ist aufgetreten.\",\n notFoundTitle: \"Seite nicht gefunden\",\n notFoundDetails: \"Wir konnten diese Seite nicht finden.\",\n statusTitle: (status) => `Fehler ${status}`,\n goHome: \"Zur Startseite\",\n reload: \"Neu laden\",\n sendFeedback: \"Feedback senden\",\n feedbackPlaceholder: \"Beschreiben Sie, was vor diesem Fehler passiert ist.\",\n openGitHubIssue: \"GitHub-Issue öffnen\",\n },\n \"ja-JP\": {\n loadingLatest: \"最新バージョンを読み込み中...\",\n genericTitle: \"問題が発生しました\",\n genericDetails: \"予期しないエラーが発生しました。\",\n notFoundTitle: \"ページが見つかりません\",\n notFoundDetails: \"このページは見つかりませんでした。\",\n statusTitle: (status) => `${status} エラー`,\n goHome: \"ホームへ\",\n reload: \"再読み込み\",\n sendFeedback: \"フィードバックを送信\",\n feedbackPlaceholder: \"このエラーの直前に起きたことを説明してください。\",\n openGitHubIssue: \"GitHub issue を開く\",\n },\n \"ko-KR\": {\n loadingLatest: \"최신 버전을 불러오는 중...\",\n genericTitle: \"문제가 발생했습니다\",\n genericDetails: \"예기치 않은 오류가 발생했습니다.\",\n notFoundTitle: \"페이지를 찾을 수 없음\",\n notFoundDetails: \"이 페이지를 찾을 수 없습니다.\",\n statusTitle: (status) => `${status} 오류`,\n goHome: \"홈으로 이동\",\n reload: \"새로고침\",\n sendFeedback: \"피드백 보내기\",\n feedbackPlaceholder:\n \"이 오류가 나타나기 전에 무슨 일이 있었는지 적어 주세요.\",\n openGitHubIssue: \"GitHub issue 열기\",\n },\n \"pt-BR\": {\n loadingLatest: \"Carregando a versão mais recente...\",\n genericTitle: \"Algo deu errado\",\n genericDetails: \"Ocorreu um erro inesperado.\",\n notFoundTitle: \"Página não encontrada\",\n notFoundDetails: \"Não encontramos esta página.\",\n statusTitle: (status) => `Erro ${status}`,\n goHome: \"Ir para início\",\n reload: \"Recarregar\",\n sendFeedback: \"Enviar feedback\",\n feedbackPlaceholder: \"Descreva o que aconteceu antes deste erro aparecer.\",\n openGitHubIssue: \"Abrir issue no GitHub\",\n },\n \"hi-IN\": {\n loadingLatest: \"नवीनतम संस्करण लोड हो रहा है...\",\n genericTitle: \"कुछ गलत हो गया\",\n genericDetails: \"एक अनपेक्षित त्रुटि हुई।\",\n notFoundTitle: \"पेज नहीं मिला\",\n notFoundDetails: \"हमें यह पेज नहीं मिला।\",\n statusTitle: (status) => `${status} त्रुटि`,\n goHome: \"होम पर जाएं\",\n reload: \"रीलोड करें\",\n sendFeedback: \"फ़ीडबैक भेजें\",\n feedbackPlaceholder: \"इस त्रुटि से पहले क्या हुआ, उसका वर्णन करें।\",\n openGitHubIssue: \"GitHub issue खोलें\",\n },\n \"ar-SA\": {\n loadingLatest: \"جار تحميل أحدث إصدار...\",\n genericTitle: \"حدث خطأ ما\",\n genericDetails: \"حدث خطأ غير متوقع.\",\n notFoundTitle: \"الصفحة غير موجودة\",\n notFoundDetails: \"تعذر العثور على هذه الصفحة.\",\n statusTitle: (status) => `خطأ ${status}`,\n goHome: \"العودة للرئيسية\",\n reload: \"إعادة التحميل\",\n sendFeedback: \"إرسال الملاحظات\",\n feedbackPlaceholder: \"صف ما حدث قبل ظهور هذا الخطأ.\",\n openGitHubIssue: \"فتح مشكلة في GitHub\",\n },\n};\n\nfunction readErrorLocale(): LocaleCode {\n if (typeof window === \"undefined\") return DEFAULT_LOCALE;\n const hydrated = (window as any)[LOCALE_HYDRATION_GLOBAL]?.locale;\n const stored = window.localStorage?.getItem(LOCALE_STORAGE_KEY);\n return (\n normalizeLocaleCode(hydrated) ??\n normalizeLocaleCode(stored) ??\n DEFAULT_LOCALE\n );\n}\n\nfunction useErrorCopy() {\n const [locale, setLocale] = useState<LocaleCode>(readErrorLocale);\n useEffect(() => {\n setLocale(readErrorLocale());\n }, []);\n return errorCopy[locale] ?? errorCopy[DEFAULT_LOCALE];\n}\n\nfunction useApplyThemeClass() {\n useEffect(() => {\n const root = document.documentElement;\n if (root.classList.contains(\"dark\") || root.classList.contains(\"light\"))\n return;\n try {\n const stored = localStorage.getItem(\"theme\");\n if (stored === \"dark\") {\n root.classList.add(\"dark\");\n } else if (stored === \"light\") {\n root.classList.add(\"light\");\n } else if (window.matchMedia(\"(prefers-color-scheme: dark)\").matches) {\n root.classList.add(\"dark\");\n }\n } catch {}\n }, []);\n}\n\nfunction errorMessageOf(error: unknown): string {\n if (error instanceof Error) return error.message;\n return typeof error === \"string\" ? error : \"\";\n}\n\n/**\n * When a route renders against a stale lazy chunk after a deploy (the chunk's\n * hashed filename no longer exists), the import rejection surfaces here. Reload\n * once to fetch fresh assets instead of stranding the user on an error screen.\n * The reload is loop-guarded; if it cannot recover, fall back to the screen.\n */\nfunction useStaleChunkRecovery(error: unknown): boolean {\n const [recovering, setRecovering] = useState(() =>\n isDynamicImportFailureMessage(errorMessageOf(error)),\n );\n useEffect(() => {\n if (!isDynamicImportFailureMessage(errorMessageOf(error))) {\n setRecovering(false);\n return;\n }\n if (!recoverFromStaleChunkError(error)) setRecovering(false);\n }, [error]);\n return recovering;\n}\n\nfunction UpdatingScreen() {\n const copy = useErrorCopy();\n return (\n <main className=\"flex items-center justify-center min-h-screen p-4 bg-background text-foreground\">\n <p className=\"text-muted-foreground text-sm\">{copy.loadingLatest}</p>\n </main>\n );\n}\n\nfunction ErrorScreen({ error }: { error: unknown }) {\n const copy = useErrorCopy();\n const recovering = useStaleChunkRecovery(error);\n // While auto-recovering a stale chunk, show a neutral state and skip the\n // console.error below so the transient, self-healing failure does not get\n // reported as a hard error.\n if (recovering) return <UpdatingScreen />;\n\n let status: number | null = null;\n let title = copy.genericTitle;\n let details = copy.genericDetails;\n let stack: string | undefined;\n\n if (isRouteErrorResponse(error)) {\n status = error.status;\n if (error.status === 404) {\n title = copy.notFoundTitle;\n details = copy.notFoundDetails;\n } else {\n title = copy.statusTitle(error.status);\n details = error.statusText || details;\n }\n } else if (error instanceof Error) {\n // Always surface the underlying error message — a generic\n // \"An unexpected error occurred.\" in production tells users (and us)\n // nothing. The stack trace is still gated to dev so we don't leak\n // internals to end users.\n if (error.message) {\n details = error.message;\n }\n if (\n typeof process !== \"undefined\" &&\n process.env.NODE_ENV !== \"production\"\n ) {\n stack = error.stack;\n }\n } else if (typeof error === \"string\" && error) {\n details = error;\n }\n\n // Log to the console so the underlying failure is recoverable from\n // browser devtools / Sentry even when the UI hides the stack.\n if (typeof console !== \"undefined\" && error) {\n console.error(\"[ErrorBoundary]\", error);\n }\n\n return (\n <main className=\"flex items-center justify-center min-h-screen p-4 bg-background text-foreground\">\n <div className=\"flex flex-col items-center text-center max-w-md\">\n {status && (\n <span className=\"text-7xl font-bold tracking-tight text-muted-foreground/40\">\n {status}\n </span>\n )}\n <h1 className=\"mt-3 text-2xl font-semibold\">{title}</h1>\n <p className=\"mt-2 text-muted-foreground text-sm\">{details}</p>\n <div className=\"mt-6 flex flex-wrap justify-center gap-2\">\n <a href={appPath(\"/\")} className={primaryActionClassName}>\n {copy.goHome}\n </a>\n <button\n type=\"button\"\n onClick={() => window.location.reload()}\n className={secondaryActionClassName}\n >\n {copy.reload}\n </button>\n <ErrorReportActions\n appName=\"Agent Native\"\n title={title}\n details={details}\n status={status}\n issueTitle={`Error screen: ${title}`}\n feedbackLabel={copy.sendFeedback}\n feedbackPlaceholder={copy.feedbackPlaceholder}\n githubLabel={copy.openGitHubIssue}\n feedbackClassName=\"h-9\"\n githubClassName=\"h-9\"\n />\n </div>\n {stack && (\n <pre className=\"mt-6 w-full text-start text-xs overflow-auto p-4 bg-muted rounded\">\n <code>{stack}</code>\n </pre>\n )}\n </div>\n </main>\n );\n}\n\nfunction RoutedErrorScreen() {\n return <ErrorScreen error={useRouteError()} />;\n}\n\nexport function ErrorBoundary() {\n useApplyThemeClass();\n if (!useInRouterContext()) return <ErrorScreen error={undefined} />;\n return <RoutedErrorScreen />;\n}\n"]}
1
+ {"version":3,"file":"ErrorBoundary.js","sourceRoot":"","sources":["../../src/client/ErrorBoundary.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useState } from \"react\";\nimport {\n isRouteErrorResponse,\n useInRouterContext,\n useRouteError,\n} from \"react-router\";\n\nimport {\n DEFAULT_LOCALE,\n LOCALE_HYDRATION_GLOBAL,\n LOCALE_STORAGE_KEY,\n normalizeLocaleCode,\n type LocaleCode,\n} from \"../localization/shared.js\";\nimport { appPath } from \"./api-path.js\";\nimport { ErrorReportActions } from \"./ErrorReportActions.js\";\nimport {\n isDynamicImportFailureMessage,\n recoverFromStaleChunkError,\n} from \"./route-chunk-recovery.js\";\n\nconst primaryActionClassName =\n \"inline-flex h-9 items-center gap-1.5 rounded-md bg-primary px-4 text-sm font-medium text-primary-foreground shadow-sm hover:bg-primary/90 cursor-pointer\";\nconst secondaryActionClassName =\n \"inline-flex h-9 cursor-pointer items-center gap-1.5 rounded-md border border-border bg-background px-4 text-sm font-medium text-foreground shadow-sm hover:bg-accent\";\n\nconst errorCopy: Record<\n LocaleCode,\n {\n loadingLatest: string;\n genericTitle: string;\n genericDetails: string;\n notFoundTitle: string;\n notFoundDetails: string;\n statusTitle: (status: number) => string;\n goHome: string;\n reload: string;\n sendFeedback: string;\n feedbackPlaceholder: string;\n openGitHubIssue: string;\n }\n> = {\n \"en-US\": {\n loadingLatest: \"Loading the latest version...\",\n genericTitle: \"Something went wrong\",\n genericDetails: \"An unexpected error occurred.\",\n notFoundTitle: \"Page not found\",\n notFoundDetails: \"We couldn't find this page.\",\n statusTitle: (status) => `${status} Error`,\n goHome: \"Go home\",\n reload: \"Reload\",\n sendFeedback: \"Send feedback\",\n feedbackPlaceholder: \"Describe what happened before this error appeared.\",\n openGitHubIssue: \"Open GitHub issue\",\n },\n \"zh-CN\": {\n loadingLatest: \"正在加载最新版本...\",\n genericTitle: \"出错了\",\n genericDetails: \"发生了意外错误。\",\n notFoundTitle: \"页面未找到\",\n notFoundDetails: \"我们找不到这个页面。\",\n statusTitle: (status) => `${status} 错误`,\n goHome: \"回到首页\",\n reload: \"重新加载\",\n sendFeedback: \"发送反馈\",\n feedbackPlaceholder: \"描述此错误出现前发生了什么。\",\n openGitHubIssue: \"打开 GitHub issue\",\n },\n \"zh-TW\": {\n loadingLatest: \"正在載入最新版本...\",\n genericTitle: \"發生錯誤\",\n genericDetails: \"發生未預期的錯誤。\",\n notFoundTitle: \"找不到頁面\",\n notFoundDetails: \"找不到這個頁面。\",\n statusTitle: (status) => `${status} 錯誤`,\n goHome: \"回首頁\",\n reload: \"重新載入\",\n sendFeedback: \"傳送意見回饋\",\n feedbackPlaceholder: \"描述此錯誤出現前發生了什麼。\",\n openGitHubIssue: \"開啟 GitHub issue\",\n },\n \"es-ES\": {\n loadingLatest: \"Cargando la versión más reciente...\",\n genericTitle: \"Algo salió mal\",\n genericDetails: \"Se produjo un error inesperado.\",\n notFoundTitle: \"Página no encontrada\",\n notFoundDetails: \"No pudimos encontrar esta página.\",\n statusTitle: (status) => `Error ${status}`,\n goHome: \"Ir al inicio\",\n reload: \"Recargar\",\n sendFeedback: \"Enviar comentarios\",\n feedbackPlaceholder:\n \"Describe qué pasó antes de que apareciera este error.\",\n openGitHubIssue: \"Abrir issue en GitHub\",\n },\n \"fr-FR\": {\n loadingLatest: \"Chargement de la dernière version...\",\n genericTitle: \"Un problème est survenu\",\n genericDetails: \"Une erreur inattendue s'est produite.\",\n notFoundTitle: \"Page introuvable\",\n notFoundDetails: \"Nous n'avons pas trouvé cette page.\",\n statusTitle: (status) => `Erreur ${status}`,\n goHome: \"Accueil\",\n reload: \"Recharger\",\n sendFeedback: \"Envoyer un retour\",\n feedbackPlaceholder: \"Décrivez ce qui s'est passé avant cette erreur.\",\n openGitHubIssue: \"Ouvrir une issue GitHub\",\n },\n \"de-DE\": {\n loadingLatest: \"Neueste Version wird geladen...\",\n genericTitle: \"Etwas ist schiefgelaufen\",\n genericDetails: \"Ein unerwarteter Fehler ist aufgetreten.\",\n notFoundTitle: \"Seite nicht gefunden\",\n notFoundDetails: \"Wir konnten diese Seite nicht finden.\",\n statusTitle: (status) => `Fehler ${status}`,\n goHome: \"Zur Startseite\",\n reload: \"Neu laden\",\n sendFeedback: \"Feedback senden\",\n feedbackPlaceholder: \"Beschreiben Sie, was vor diesem Fehler passiert ist.\",\n openGitHubIssue: \"GitHub-Issue öffnen\",\n },\n \"ja-JP\": {\n loadingLatest: \"最新バージョンを読み込み中...\",\n genericTitle: \"問題が発生しました\",\n genericDetails: \"予期しないエラーが発生しました。\",\n notFoundTitle: \"ページが見つかりません\",\n notFoundDetails: \"このページは見つかりませんでした。\",\n statusTitle: (status) => `${status} エラー`,\n goHome: \"ホームへ\",\n reload: \"再読み込み\",\n sendFeedback: \"フィードバックを送信\",\n feedbackPlaceholder: \"このエラーの直前に起きたことを説明してください。\",\n openGitHubIssue: \"GitHub issue を開く\",\n },\n \"ko-KR\": {\n loadingLatest: \"최신 버전을 불러오는 중...\",\n genericTitle: \"문제가 발생했습니다\",\n genericDetails: \"예기치 않은 오류가 발생했습니다.\",\n notFoundTitle: \"페이지를 찾을 수 없음\",\n notFoundDetails: \"이 페이지를 찾을 수 없습니다.\",\n statusTitle: (status) => `${status} 오류`,\n goHome: \"홈으로 이동\",\n reload: \"새로고침\",\n sendFeedback: \"피드백 보내기\",\n feedbackPlaceholder:\n \"이 오류가 나타나기 전에 무슨 일이 있었는지 적어 주세요.\",\n openGitHubIssue: \"GitHub issue 열기\",\n },\n \"pt-BR\": {\n loadingLatest: \"Carregando a versão mais recente...\",\n genericTitle: \"Algo deu errado\",\n genericDetails: \"Ocorreu um erro inesperado.\",\n notFoundTitle: \"Página não encontrada\",\n notFoundDetails: \"Não encontramos esta página.\",\n statusTitle: (status) => `Erro ${status}`,\n goHome: \"Ir para início\",\n reload: \"Recarregar\",\n sendFeedback: \"Enviar feedback\",\n feedbackPlaceholder: \"Descreva o que aconteceu antes deste erro aparecer.\",\n openGitHubIssue: \"Abrir issue no GitHub\",\n },\n \"hi-IN\": {\n loadingLatest: \"नवीनतम संस्करण लोड हो रहा है...\",\n genericTitle: \"कुछ गलत हो गया\",\n genericDetails: \"एक अनपेक्षित त्रुटि हुई।\",\n notFoundTitle: \"पेज नहीं मिला\",\n notFoundDetails: \"हमें यह पेज नहीं मिला।\",\n statusTitle: (status) => `${status} त्रुटि`,\n goHome: \"होम पर जाएं\",\n reload: \"रीलोड करें\",\n sendFeedback: \"फ़ीडबैक भेजें\",\n feedbackPlaceholder: \"इस त्रुटि से पहले क्या हुआ, उसका वर्णन करें।\",\n openGitHubIssue: \"GitHub issue खोलें\",\n },\n \"ar-SA\": {\n loadingLatest: \"جار تحميل أحدث إصدار...\",\n genericTitle: \"حدث خطأ ما\",\n genericDetails: \"حدث خطأ غير متوقع.\",\n notFoundTitle: \"الصفحة غير موجودة\",\n notFoundDetails: \"تعذر العثور على هذه الصفحة.\",\n statusTitle: (status) => `خطأ ${status}`,\n goHome: \"العودة للرئيسية\",\n reload: \"إعادة التحميل\",\n sendFeedback: \"إرسال الملاحظات\",\n feedbackPlaceholder: \"صف ما حدث قبل ظهور هذا الخطأ.\",\n openGitHubIssue: \"فتح مشكلة في GitHub\",\n },\n};\n\nfunction readErrorLocale(): LocaleCode {\n if (typeof window === \"undefined\") return DEFAULT_LOCALE;\n const hydrated = (window as any)[LOCALE_HYDRATION_GLOBAL]?.locale;\n const stored = window.localStorage?.getItem(LOCALE_STORAGE_KEY);\n return (\n normalizeLocaleCode(hydrated) ??\n normalizeLocaleCode(stored) ??\n DEFAULT_LOCALE\n );\n}\n\nfunction useErrorCopy() {\n const [locale, setLocale] = useState<LocaleCode>(readErrorLocale);\n useEffect(() => {\n setLocale(readErrorLocale());\n }, []);\n return errorCopy[locale] ?? errorCopy[DEFAULT_LOCALE];\n}\n\nfunction useApplyThemeClass() {\n useEffect(() => {\n const root = document.documentElement;\n if (root.classList.contains(\"dark\") || root.classList.contains(\"light\"))\n return;\n try {\n const stored = localStorage.getItem(\"theme\");\n if (stored === \"dark\") {\n root.classList.add(\"dark\");\n } else if (stored === \"light\") {\n root.classList.add(\"light\");\n } else if (window.matchMedia(\"(prefers-color-scheme: dark)\").matches) {\n root.classList.add(\"dark\");\n }\n } catch {}\n }, []);\n}\n\nfunction errorMessageOf(error: unknown): string {\n if (error instanceof Error) return error.message;\n return typeof error === \"string\" ? error : \"\";\n}\n\n/**\n * When a route renders against a stale lazy chunk after a deploy (the chunk's\n * hashed filename no longer exists), the import rejection surfaces here. Reload\n * once to fetch fresh assets instead of stranding the user on an error screen.\n * The reload is loop-guarded; if it cannot recover, fall back to the screen.\n */\nfunction useStaleChunkRecovery(error: unknown): boolean {\n const [recovering, setRecovering] = useState(() =>\n isDynamicImportFailureMessage(errorMessageOf(error)),\n );\n useEffect(() => {\n if (!isDynamicImportFailureMessage(errorMessageOf(error))) {\n setRecovering(false);\n return;\n }\n if (!recoverFromStaleChunkError(error)) setRecovering(false);\n }, [error]);\n return recovering;\n}\n\nfunction UpdatingScreen() {\n const copy = useErrorCopy();\n return (\n <main className=\"flex items-center justify-center min-h-screen p-4 bg-background text-foreground\">\n <p className=\"text-muted-foreground text-sm\">{copy.loadingLatest}</p>\n </main>\n );\n}\n\nfunction ErrorScreen({ error }: { error: unknown }) {\n const copy = useErrorCopy();\n const recovering = useStaleChunkRecovery(error);\n // While auto-recovering a stale chunk, show a neutral state and skip the\n // console.error below so the transient, self-healing failure does not get\n // reported as a hard error.\n if (recovering) return <UpdatingScreen />;\n\n let status: number | null = null;\n let title = copy.genericTitle;\n let details = copy.genericDetails;\n let stack: string | undefined;\n\n if (isRouteErrorResponse(error)) {\n status = error.status;\n if (error.status === 404) {\n title = copy.notFoundTitle;\n details = copy.notFoundDetails;\n } else {\n title = copy.statusTitle(error.status);\n details = error.statusText || details;\n }\n } else if (error instanceof Error) {\n // Always surface the underlying error message — a generic\n // \"An unexpected error occurred.\" in production tells users (and us)\n // nothing. The stack trace is still gated to dev so we don't leak\n // internals to end users.\n if (error.message) {\n details = error.message;\n }\n if (\n typeof process !== \"undefined\" &&\n process.env.NODE_ENV !== \"production\"\n ) {\n stack = error.stack;\n }\n } else if (typeof error === \"string\" && error) {\n details = error;\n }\n\n // Log to the console so the underlying failure is recoverable from\n // browser devtools / Sentry even when the UI hides the stack.\n if (typeof console !== \"undefined\" && error) {\n console.error(\"[ErrorBoundary]\", error);\n }\n\n const isNotFound = status === 404;\n\n return (\n <main className=\"flex items-center justify-center min-h-screen p-4 bg-background text-foreground\">\n <div className=\"flex flex-col items-center text-center max-w-md\">\n {status && (\n <span className=\"text-7xl font-bold tracking-tight text-muted-foreground/40\">\n {status}\n </span>\n )}\n <h1 className=\"mt-3 text-2xl font-semibold\">{title}</h1>\n <p className=\"mt-2 text-muted-foreground text-sm\">{details}</p>\n <div className=\"mt-6 flex flex-wrap justify-center gap-2\">\n <a href={appPath(\"/\")} className={primaryActionClassName}>\n {copy.goHome}\n </a>\n {!isNotFound && (\n <>\n <button\n type=\"button\"\n onClick={() => window.location.reload()}\n className={secondaryActionClassName}\n >\n {copy.reload}\n </button>\n <ErrorReportActions\n appName=\"Agent Native\"\n title={title}\n details={details}\n status={status}\n issueTitle={`Error screen: ${title}`}\n feedbackLabel={copy.sendFeedback}\n feedbackPlaceholder={copy.feedbackPlaceholder}\n githubLabel={copy.openGitHubIssue}\n feedbackClassName=\"h-9\"\n githubClassName=\"h-9\"\n />\n </>\n )}\n </div>\n {stack && (\n <pre className=\"mt-6 w-full text-start text-xs overflow-auto p-4 bg-muted rounded\">\n <code>{stack}</code>\n </pre>\n )}\n </div>\n </main>\n );\n}\n\nfunction RoutedErrorScreen() {\n return <ErrorScreen error={useRouteError()} />;\n}\n\nexport function ErrorBoundary() {\n useApplyThemeClass();\n if (!useInRouterContext()) return <ErrorScreen error={undefined} />;\n return <RoutedErrorScreen />;\n}\n"]}
@@ -3,6 +3,6 @@ import { IconHelpCircle } from "@tabler/icons-react";
3
3
  import { cn } from "../utils.js";
4
4
  /** Shared settings surface for Manage agent page tabs. */
5
5
  export function AgentTabFrame({ title, description, helpHref, helpLabel, actions, children, className, }) {
6
- return (_jsxs("div", { className: cn("mx-auto flex w-full max-w-5xl flex-col gap-6", className), children: [_jsxs("header", { className: "flex flex-wrap items-start justify-between gap-4 border-b border-border/70 pb-5", children: [_jsxs("div", { className: "space-y-1", children: [_jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx("h2", { className: "text-xl font-semibold tracking-tight text-foreground", children: title }), helpHref && (_jsx("a", { href: helpHref, target: "_blank", rel: "noopener noreferrer", "aria-label": helpLabel ?? `Open ${title} documentation`, title: helpLabel ?? `Open ${title} documentation`, className: "inline-flex size-6 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent/50 hover:text-foreground", children: _jsx(IconHelpCircle, { className: "size-4" }) }))] }), _jsx("p", { className: "max-w-2xl text-sm leading-relaxed text-muted-foreground", children: description })] }), actions] }), _jsx("div", { className: "min-w-0", children: children })] }));
6
+ return (_jsxs("div", { className: cn("mx-auto flex w-full max-w-5xl flex-col gap-6", className), children: [_jsxs("header", { className: "flex flex-wrap items-start justify-between gap-4 pb-5", children: [_jsxs("div", { className: "space-y-1", children: [_jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx("h2", { className: "text-xl font-semibold tracking-tight text-foreground", children: title }), helpHref && (_jsx("a", { href: helpHref, target: "_blank", rel: "noopener noreferrer", "aria-label": helpLabel ?? `Open ${title} documentation`, title: helpLabel ?? `Open ${title} documentation`, className: "inline-flex size-6 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent/50 hover:text-foreground", children: _jsx(IconHelpCircle, { className: "size-4" }) }))] }), _jsx("p", { className: "max-w-2xl text-sm leading-relaxed text-muted-foreground", children: description })] }), actions] }), _jsx("div", { className: "min-w-0", children: children })] }));
7
7
  }
8
8
  //# sourceMappingURL=AgentTabFrame.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AgentTabFrame.js","sourceRoot":"","sources":["../../../src/client/agent-page/AgentTabFrame.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGrD,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAYjC,0DAA0D;AAC1D,MAAM,UAAU,aAAa,CAAC,EAC5B,KAAK,EACL,WAAW,EACX,QAAQ,EACR,SAAS,EACT,OAAO,EACP,QAAQ,EACR,SAAS,GACU;IACnB,OAAO,CACL,eACE,SAAS,EAAE,EAAE,CAAC,8CAA8C,EAAE,SAAS,CAAC,aAExE,kBAAQ,SAAS,EAAC,iFAAiF,aACjG,eAAK,SAAS,EAAC,WAAW,aACxB,eAAK,SAAS,EAAC,2BAA2B,aACxC,aAAI,SAAS,EAAC,sDAAsD,YACjE,KAAK,GACH,EACJ,QAAQ,IAAI,CACX,YACE,IAAI,EAAE,QAAQ,EACd,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,qBAAqB,gBACb,SAAS,IAAI,QAAQ,KAAK,gBAAgB,EACtD,KAAK,EAAE,SAAS,IAAI,QAAQ,KAAK,gBAAgB,EACjD,SAAS,EAAC,qJAAqJ,YAE/J,KAAC,cAAc,IAAC,SAAS,EAAC,QAAQ,GAAG,GACnC,CACL,IACG,EACN,YAAG,SAAS,EAAC,yDAAyD,YACnE,WAAW,GACV,IACA,EACL,OAAO,IACD,EACT,cAAK,SAAS,EAAC,SAAS,YAAE,QAAQ,GAAO,IACrC,CACP,CAAC;AACJ,CAAC","sourcesContent":["import { IconHelpCircle } from \"@tabler/icons-react\";\nimport type { ReactNode } from \"react\";\n\nimport { cn } from \"../utils.js\";\n\ninterface AgentTabFrameProps {\n title: string;\n description: string;\n helpHref?: string;\n helpLabel?: string;\n actions?: ReactNode;\n children: ReactNode;\n className?: string;\n}\n\n/** Shared settings surface for Manage agent page tabs. */\nexport function AgentTabFrame({\n title,\n description,\n helpHref,\n helpLabel,\n actions,\n children,\n className,\n}: AgentTabFrameProps) {\n return (\n <div\n className={cn(\"mx-auto flex w-full max-w-5xl flex-col gap-6\", className)}\n >\n <header className=\"flex flex-wrap items-start justify-between gap-4 border-b border-border/70 pb-5\">\n <div className=\"space-y-1\">\n <div className=\"flex items-center gap-1.5\">\n <h2 className=\"text-xl font-semibold tracking-tight text-foreground\">\n {title}\n </h2>\n {helpHref && (\n <a\n href={helpHref}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={helpLabel ?? `Open ${title} documentation`}\n title={helpLabel ?? `Open ${title} documentation`}\n className=\"inline-flex size-6 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent/50 hover:text-foreground\"\n >\n <IconHelpCircle className=\"size-4\" />\n </a>\n )}\n </div>\n <p className=\"max-w-2xl text-sm leading-relaxed text-muted-foreground\">\n {description}\n </p>\n </div>\n {actions}\n </header>\n <div className=\"min-w-0\">{children}</div>\n </div>\n );\n}\n"]}
1
+ {"version":3,"file":"AgentTabFrame.js","sourceRoot":"","sources":["../../../src/client/agent-page/AgentTabFrame.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGrD,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAYjC,0DAA0D;AAC1D,MAAM,UAAU,aAAa,CAAC,EAC5B,KAAK,EACL,WAAW,EACX,QAAQ,EACR,SAAS,EACT,OAAO,EACP,QAAQ,EACR,SAAS,GACU;IACnB,OAAO,CACL,eACE,SAAS,EAAE,EAAE,CAAC,8CAA8C,EAAE,SAAS,CAAC,aAExE,kBAAQ,SAAS,EAAC,uDAAuD,aACvE,eAAK,SAAS,EAAC,WAAW,aACxB,eAAK,SAAS,EAAC,2BAA2B,aACxC,aAAI,SAAS,EAAC,sDAAsD,YACjE,KAAK,GACH,EACJ,QAAQ,IAAI,CACX,YACE,IAAI,EAAE,QAAQ,EACd,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,qBAAqB,gBACb,SAAS,IAAI,QAAQ,KAAK,gBAAgB,EACtD,KAAK,EAAE,SAAS,IAAI,QAAQ,KAAK,gBAAgB,EACjD,SAAS,EAAC,qJAAqJ,YAE/J,KAAC,cAAc,IAAC,SAAS,EAAC,QAAQ,GAAG,GACnC,CACL,IACG,EACN,YAAG,SAAS,EAAC,yDAAyD,YACnE,WAAW,GACV,IACA,EACL,OAAO,IACD,EACT,cAAK,SAAS,EAAC,SAAS,YAAE,QAAQ,GAAO,IACrC,CACP,CAAC;AACJ,CAAC","sourcesContent":["import { IconHelpCircle } from \"@tabler/icons-react\";\nimport type { ReactNode } from \"react\";\n\nimport { cn } from \"../utils.js\";\n\ninterface AgentTabFrameProps {\n title: string;\n description: string;\n helpHref?: string;\n helpLabel?: string;\n actions?: ReactNode;\n children: ReactNode;\n className?: string;\n}\n\n/** Shared settings surface for Manage agent page tabs. */\nexport function AgentTabFrame({\n title,\n description,\n helpHref,\n helpLabel,\n actions,\n children,\n className,\n}: AgentTabFrameProps) {\n return (\n <div\n className={cn(\"mx-auto flex w-full max-w-5xl flex-col gap-6\", className)}\n >\n <header className=\"flex flex-wrap items-start justify-between gap-4 pb-5\">\n <div className=\"space-y-1\">\n <div className=\"flex items-center gap-1.5\">\n <h2 className=\"text-xl font-semibold tracking-tight text-foreground\">\n {title}\n </h2>\n {helpHref && (\n <a\n href={helpHref}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={helpLabel ?? `Open ${title} documentation`}\n title={helpLabel ?? `Open ${title} documentation`}\n className=\"inline-flex size-6 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent/50 hover:text-foreground\"\n >\n <IconHelpCircle className=\"size-4\" />\n </a>\n )}\n </div>\n <p className=\"max-w-2xl text-sm leading-relaxed text-muted-foreground\">\n {description}\n </p>\n </div>\n {actions}\n </header>\n <div className=\"min-w-0\">{children}</div>\n </div>\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"AgentTabsPage.d.ts","sourceRoot":"","sources":["../../../src/client/agent-page/AgentTabsPage.tsx"],"names":[],"mappings":"AAeA,OAAO,EASL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAkBf,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAQnE,OAAO,KAAK,EAEV,eAAe,EAChB,MAAM,iCAAiC,CAAC;AAIzC,OAAO,KAAK,EAAkB,iBAAiB,EAAE,MAAM,YAAY,CAAC;AA6EpE,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CASjE,CAAC;AAufF,MAAM,WAAW,wBAAyB,SAAQ,iBAAiB;IACjE,YAAY,EAAE,SAAS,CAAC;CACzB;AAED,MAAM,MAAM,wBAAwB,GAAG,CACrC,OAAO,EAAE,wBAAwB,KAC9B,eAAe,CAAC;AAErB,MAAM,WAAW,kBAAkB;IACjC;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,eAAe,EAAE,CAAC;IAC9B,iFAAiF;IACjF,iBAAiB,CAAC,EAAE,wBAAwB,EAAE,CAAC;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAED,wBAAgB,aAAa,CAAC,EAC5B,OAAO,EACP,SAAc,EACd,iBAAsB,EACtB,UAAoB,EACpB,SAAS,EACT,YAAmB,EACnB,iBAA4B,EAC5B,UAAe,EACf,KAAK,EACL,aAAa,GACd,EAAE,kBAAkB,+BAwapB"}
1
+ {"version":3,"file":"AgentTabsPage.d.ts","sourceRoot":"","sources":["../../../src/client/agent-page/AgentTabsPage.tsx"],"names":[],"mappings":"AAgBA,OAAO,EASL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAkBf,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAanE,OAAO,KAAK,EAEV,eAAe,EAChB,MAAM,iCAAiC,CAAC;AAIzC,OAAO,KAAK,EAAkB,iBAAiB,EAAE,MAAM,YAAY,CAAC;AA6EpE,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CASjE,CAAC;AAufF,MAAM,WAAW,wBAAyB,SAAQ,iBAAiB;IACjE,YAAY,EAAE,SAAS,CAAC;CACzB;AAED,MAAM,MAAM,wBAAwB,GAAG,CACrC,OAAO,EAAE,wBAAwB,KAC9B,eAAe,CAAC;AAErB,MAAM,WAAW,kBAAkB;IACjC;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,eAAe,EAAE,CAAC;IAC9B,iFAAiF;IACjF,iBAAiB,CAAC,EAAE,wBAAwB,EAAE,CAAC;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAED,wBAAgB,aAAa,CAAC,EAC5B,OAAO,EACP,SAAc,EACd,iBAAsB,EACtB,UAAoB,EACpB,SAAS,EACT,YAAmB,EACnB,iBAA4B,EAC5B,UAAe,EACf,KAAK,EACL,aAAa,GACd,EAAE,kBAAkB,+BAybpB"}
@@ -1,5 +1,5 @@
1
1
  import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { IconBook2, IconChecklist, IconClock, IconExternalLink, IconFolder, IconHistory, IconHierarchy2, IconNotes, IconPlugConnected, IconTopologyRing2, IconSearch, IconShieldLock, IconX, } from "@tabler/icons-react";
2
+ import { IconBook2, IconChecklist, IconClock, IconExternalLink, IconFolder, IconHistory, IconHierarchy2, IconNotes, IconPlugConnected, IconTopologyRing2, IconSearch, IconSettings, IconShieldLock, IconX, } from "@tabler/icons-react";
3
3
  import { lazy, Suspense, useCallback, useEffect, useMemo, useRef, useState, } from "react";
4
4
  import { MCP_CONNECT_GUIDES, MCP_CONNECT_MCP_URL_TEMPLATE, MCP_STATIC_TOKEN_FALLBACK, interpolateMcpConnectTemplate, } from "../../shared/mcp-connect-content.js";
5
5
  import { appPath } from "../api-path.js";
@@ -11,6 +11,8 @@ import { McpIntegrationDialog,
11
11
  } from "../resources/McpIntegrationDialog.js";
12
12
  import { McpServerDetail } from "../resources/McpServerDetail.js";
13
13
  import { useCreateMcpServer, useDeleteMcpServer, useMcpServers, } from "../resources/use-mcp-servers.js";
14
+ import { AGENT_SETTINGS_SECTIONS, buildSectionSearchEntries, } from "../settings/agent-settings-search.js";
15
+ import { AgentSettingsContent } from "../settings/SettingsPanel.js";
14
16
  import { cn } from "../utils.js";
15
17
  import { AgentEmptyState } from "./AgentEmptyState.js";
16
18
  import { AgentTabFrame } from "./AgentTabFrame.js";
@@ -240,6 +242,7 @@ function AccessTab({ appName: appNameProp, }) {
240
242
  : "text-muted-foreground hover:bg-accent/50 hover:text-foreground"), children: item.label }, item.id))) }), guide && templateValues && (_jsxs("div", { className: "space-y-3 pt-1", role: "tabpanel", children: [guide.steps?.length ? (_jsx("ol", { className: "list-decimal space-y-2 ps-5 text-xs leading-relaxed text-muted-foreground", children: guide.steps.map((step) => (_jsx("li", { children: interpolateMcpConnectTemplate(step, templateValues) }, step))) })) : null, guide.intro && (_jsx("p", { className: "text-xs text-muted-foreground", children: interpolateMcpConnectTemplate(guide.intro, templateValues) })), guide.commandTemplate && (_jsx(CopyField, { label: "Command", value: interpolateMcpConnectTemplate(guide.commandTemplate, templateValues) })), guide.configTemplate && (_jsx(CopyField, { label: "MCP config", value: interpolateMcpConnectTemplate(guide.configTemplate, templateValues) })), guide.action?.kind === "link" && guide.action.href && (_jsxs("a", { href: guide.action.href, target: "_blank", rel: "noopener noreferrer", className: "inline-flex cursor-pointer items-center gap-1.5 rounded-md border border-border bg-background px-3 py-1.5 text-xs font-medium text-foreground hover:bg-accent", children: [guide.action.label, _jsx(IconExternalLink, { className: "size-3.5" })] })), guide.note && (_jsx("p", { className: "text-xs leading-relaxed text-muted-foreground", children: interpolateMcpConnectTemplate(guide.note, templateValues) }))] }))] }), _jsxs("section", { className: "border-t border-border/70 pt-6", children: [_jsx("h3", { className: "text-sm font-semibold text-foreground", children: MCP_STATIC_TOKEN_FALLBACK.title }), _jsxs("p", { className: "mt-1 text-xs leading-relaxed text-muted-foreground", children: [MCP_STATIC_TOKEN_FALLBACK.state, ". Open the connect page to create a token for clients that cannot complete OAuth."] }), _jsxs("a", { href: urls.connectUrl, className: "mt-3 inline-flex cursor-pointer items-center gap-1.5 rounded-md border border-border bg-background px-3 py-1.5 text-xs font-medium text-foreground hover:bg-accent", children: ["Open full connect page", _jsx(IconExternalLink, { className: "size-3.5" })] })] })] })) : (_jsx(TabLoading, {})) }) }));
241
243
  }
242
244
  export function AgentTabsPage({ appName, extraTabs = [], extraTabFactories = [], defaultTab = "files", className, enableSearch = true, searchPlaceholder = "Search", hiddenTabs = [], value, onValueChange, }) {
245
+ const t = useT();
243
246
  const { data: org } = useOrg();
244
247
  const canManageOrg = !org?.orgId || org.role === "owner" || org.role === "admin";
245
248
  const scope = "user";
@@ -333,6 +336,15 @@ export function AgentTabsPage({ appName, extraTabs = [], extraTabFactories = [],
333
336
  keywords: "scheduled automations recurring",
334
337
  content: (_jsx(Suspense, { fallback: _jsx(TabLoading, {}), children: _jsx(AgentJobsTab, { scope: scope, canManageOrg: canManageOrg }) })),
335
338
  },
339
+ {
340
+ id: "settings",
341
+ label: t("settings.agentTitle"),
342
+ icon: IconSettings,
343
+ group: "agent",
344
+ keywords: "agent settings model llm api keys limits voice automations",
345
+ searchEntries: buildSectionSearchEntries(AGENT_SETTINGS_SECTIONS),
346
+ content: (_jsx(AgentTabFrame, { title: t("settings.agentTitle"), description: t("settings.agentDescription"), children: _jsx(AgentSettingsContent, {}) })),
347
+ },
336
348
  {
337
349
  id: "access",
338
350
  label: "Access",
@@ -1 +1 @@
1
- {"version":3,"file":"AgentTabsPage.js","sourceRoot":"","sources":["../../../src/client/agent-page/AgentTabsPage.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n IconBook2,\n IconChecklist,\n IconClock,\n IconExternalLink,\n IconFolder,\n IconHistory,\n IconHierarchy2,\n IconNotes,\n IconPlugConnected,\n IconTopologyRing2,\n IconSearch,\n IconShieldLock,\n IconX,\n} from \"@tabler/icons-react\";\nimport {\n lazy,\n Suspense,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ComponentType,\n type ReactNode,\n} from \"react\";\n\nimport {\n MCP_CONNECT_GUIDES,\n MCP_CONNECT_MCP_URL_TEMPLATE,\n MCP_STATIC_TOKEN_FALLBACK,\n interpolateMcpConnectTemplate,\n type McpConnectTemplateValues,\n} from \"../../shared/mcp-connect-content.js\";\nimport { appPath } from \"../api-path.js\";\nimport { useT } from \"../i18n.js\";\nimport { useOrg } from \"../org/hooks.js\";\nimport {\n McpIntegrationDialog,\n // The dialog is intentionally reused here so the Agent page remains a thin\n // host for the existing MCP management flow.\n} from \"../resources/McpIntegrationDialog.js\";\nimport { McpServerDetail } from \"../resources/McpServerDetail.js\";\nimport type { ResourceView } from \"../resources/ResourcesPanel.js\";\nimport {\n useCreateMcpServer,\n useDeleteMcpServer,\n useMcpServers,\n type McpServer,\n type McpServerScope,\n} from \"../resources/use-mcp-servers.js\";\nimport type {\n SettingsSearchEntry,\n SettingsTabItem,\n} from \"../settings/SettingsTabsPage.js\";\nimport { cn } from \"../utils.js\";\nimport { AgentEmptyState } from \"./AgentEmptyState.js\";\nimport { AgentTabFrame } from \"./AgentTabFrame.js\";\nimport type { AgentPageScope, AgentPageTabProps } from \"./types.js\";\n\nconst AgentContextTab = lazy(() =>\n import(\"./AgentContextTab.js\").then((module) => ({\n default: module.AgentContextTab,\n })),\n);\nconst AgentJobsTab = lazy(() =>\n import(\"./AgentJobsTab.js\").then((module) => ({\n default: module.AgentJobsTab,\n })),\n);\nconst ResourcesPanel = lazy(() =>\n import(\"../resources/ResourcesPanel.js\").then((module) => ({\n default: module.ResourcesPanel,\n })),\n);\n\ntype SettingsTabIcon = ComponentType<{ className?: string }>;\n\nfunction normalizeTabId(value?: string | null): string | null {\n const normalized = value\n ?.replace(/^#/, \"\")\n .trim()\n .toLowerCase()\n .replace(/[\"']/g, \"\")\n .replace(/[\\s_]+/g, \"-\");\n return normalized || null;\n}\n\nfunction resolveTabId(\n tabs: SettingsTabItem[],\n value?: string | null,\n): string | null {\n const normalized = normalizeTabId(value);\n if (!normalized) return null;\n if (normalized === \"context\" && tabs.some((tab) => tab.id === \"snapshots\")) {\n return \"snapshots\";\n }\n if (tabs.some((tab) => tab.id === normalized)) return normalized;\n const section = normalized.split(\":\", 1)[0];\n const owner = tabs.find((tab) =>\n tab.searchEntries?.some(\n (entry) => normalizeTabId(entry.hash ?? entry.id) === section,\n ),\n );\n return owner?.id ?? null;\n}\n\nfunction updateTabHash(tabId: string) {\n if (typeof window === \"undefined\") return;\n const hash = tabId === \"files\" ? \"\" : `#${encodeURIComponent(tabId)}`;\n window.history.pushState(\n null,\n \"\",\n `${window.location.pathname}${window.location.search}${hash}`,\n );\n}\n\nfunction TabLoading() {\n return (\n <div className=\"space-y-3\" aria-busy=\"true\">\n <div className=\"h-5 w-36 animate-pulse rounded bg-muted\" />\n <div className=\"h-20 animate-pulse rounded-lg border border-border bg-muted/30\" />\n <div className=\"h-20 animate-pulse rounded-lg border border-border bg-muted/30\" />\n </div>\n );\n}\n\nfunction EmptySlot({ label }: { label: string }) {\n return (\n <div className=\"flex min-h-[220px] items-center justify-center rounded-lg border border-dashed border-border/70 bg-muted/10\">\n <span className=\"sr-only\">{label}</span>\n </div>\n );\n}\n\nexport const AGENT_RESOURCE_DOCS_HREF: Record<ResourceView, string> = {\n files: \"https://agent-native.com/docs/agent-resources#resources-tab\",\n instructions: \"https://agent-native.com/docs/agent-resources#agents-md\",\n agents: \"https://agent-native.com/docs/agent-resources#custom-agents\",\n memory: \"https://agent-native.com/docs/agent-resources#memory\",\n skills: \"https://agent-native.com/docs/skills-guide\",\n learnings: \"https://agent-native.com/docs/agent-resources#memory\",\n \"remote-agents\":\n \"https://agent-native.com/docs/agent-resources#remote-vs-custom-agents\",\n};\n\nconst RESOURCE_TAB_COPY: Record<\n ResourceView,\n { titleKey: string; descriptionKey: string }\n> = {\n files: {\n titleKey: \"agentResources.files.title\",\n descriptionKey: \"agentResources.files.description\",\n },\n instructions: {\n titleKey: \"agentResources.instructions.title\",\n descriptionKey: \"agentResources.instructions.description\",\n },\n agents: {\n titleKey: \"agentResources.agents.title\",\n descriptionKey: \"agentResources.agents.description\",\n },\n memory: {\n titleKey: \"agentResources.memory.title\",\n descriptionKey: \"agentResources.memory.description\",\n },\n skills: {\n titleKey: \"agentResources.skills.title\",\n descriptionKey: \"agentResources.skills.description\",\n },\n learnings: {\n titleKey: \"agentResources.learnings.title\",\n descriptionKey: \"agentResources.learnings.description\",\n },\n \"remote-agents\": {\n titleKey: \"agentResources.remoteAgents.title\",\n descriptionKey: \"agentResources.remoteAgents.description\",\n },\n};\n\nfunction AgentResourceTab({\n scope,\n view,\n}: AgentPageTabProps & { view: ResourceView }) {\n const t = useT();\n const copy = RESOURCE_TAB_COPY[view];\n const title = t(copy.titleKey);\n return (\n <AgentTabFrame\n title={title}\n description={t(copy.descriptionKey)}\n helpHref={AGENT_RESOURCE_DOCS_HREF[view]}\n helpLabel={t(\"agentResources.openDocs\", { section: title })}\n >\n <div className=\"min-h-[480px]\">\n <ResourcesPanel\n key={`${scope}-${view}`}\n showMcpServers={false}\n resourceFilter={view}\n resourceTreeVariant={view === \"files\" ? \"tree\" : \"collection\"}\n scope=\"personal\"\n />\n </div>\n </AgentTabFrame>\n );\n}\n\nfunction ServerStatus({ server }: { server: McpServer }) {\n if (server.status.state === \"connected\") {\n return (\n <span className=\"text-[11px] text-emerald-600 dark:text-emerald-400\">\n Connected · {server.status.toolCount} tools\n </span>\n );\n }\n if (server.status.state === \"error\") {\n return (\n <span className=\"truncate text-[11px] text-destructive\">\n Connection error\n </span>\n );\n }\n return (\n <span className=\"text-[11px] text-muted-foreground\">Status unknown</span>\n );\n}\n\nfunction ConnectionsTab({ canManageOrg = false }: AgentPageTabProps) {\n const t = useT();\n const serversQuery = useMcpServers();\n const createServer = useCreateMcpServer();\n const deleteServer = useDeleteMcpServer();\n const [dialogOpen, setDialogOpen] = useState(false);\n const [selectedServer, setSelectedServer] = useState<McpServer | null>(null);\n const [deleteTarget, setDeleteTarget] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n const data = serversQuery.data;\n const hasOrg = Boolean(data?.orgId);\n const canCreateOrgMcp = hasOrg && canManageOrg;\n\n const onCreateMcpServer = useCallback(\n async (args: {\n scope: McpServerScope;\n name: string;\n url: string;\n headers?: Record<string, string>;\n description?: string;\n }) => {\n if (args.scope === \"org\" && !canCreateOrgMcp) {\n throw new Error(\n \"Only organization admins can add organization MCP servers.\",\n );\n }\n return createServer.mutateAsync(args);\n },\n [canCreateOrgMcp, createServer],\n );\n\n const removeServer = async (server: McpServer) => {\n const key = `${server.scope}:${server.id}`;\n if (deleteTarget !== key) {\n setDeleteTarget(key);\n return;\n }\n setError(null);\n try {\n await deleteServer.mutateAsync({ id: server.id, scope: server.scope });\n if (\n selectedServer?.id === server.id &&\n selectedServer.scope === server.scope\n ) {\n setSelectedServer(null);\n }\n setDeleteTarget(null);\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : String(cause));\n }\n };\n\n const renderServer = (server: McpServer) => {\n const key = `${server.scope}:${server.id}`;\n const canDelete = server.scope === \"user\" || canManageOrg;\n const selected =\n selectedServer?.id === server.id && selectedServer.scope === server.scope;\n return (\n <div\n key={key}\n className={cn(\n \"group/connection-row py-4 transition-colors first:pt-5 last:pb-5\",\n selected && \"bg-accent/20\",\n )}\n >\n <div className=\"flex items-start gap-3\">\n <button\n type=\"button\"\n onClick={() => setSelectedServer(selected ? null : server)}\n className=\"min-w-0 flex-1 cursor-pointer text-start\"\n >\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"truncate text-sm font-medium text-foreground\">\n {server.name}\n </span>\n </div>\n <code className=\"mt-1 block truncate text-[11px] text-muted-foreground\">\n {server.url}\n </code>\n <div className=\"mt-2 flex items-center gap-2\">\n <ServerStatus server={server} />\n {server.description && (\n <span className=\"truncate text-[11px] text-muted-foreground/70\">\n {server.description}\n </span>\n )}\n </div>\n </button>\n {canDelete && (\n <button\n type=\"button\"\n onClick={() => void removeServer(server)}\n disabled={deleteServer.isPending}\n className={cn(\n \"cursor-pointer rounded-md px-2 py-1 text-[11px] font-medium text-muted-foreground hover:bg-destructive/10 hover:text-destructive\",\n deleteTarget === key && \"bg-destructive/10 text-destructive\",\n )}\n >\n {deleteTarget === key ? \"Confirm\" : \"Delete\"}\n </button>\n )}\n </div>\n {selected && (\n <div className=\"mt-3 border-t border-border/70 pt-3\">\n <McpServerDetail server={server} />\n </div>\n )}\n </div>\n );\n };\n\n return (\n <AgentTabFrame\n title=\"Connections\"\n description=\"Tools and services this agent can reach, grouped by where they are configured.\"\n actions={\n <button\n type=\"button\"\n onClick={() => {\n setError(null);\n setDialogOpen(true);\n }}\n className=\"cursor-pointer rounded-md bg-primary px-3 py-1.5 text-xs font-medium text-primary-foreground hover:bg-primary/90\"\n >\n {t(\"mcpIntegrations.connect\")}\n </button>\n }\n >\n <section className=\"space-y-4\">\n {error && (\n <p className=\"rounded-md border border-destructive/20 bg-destructive/5 px-3 py-2 text-xs text-destructive\">\n {error}\n </p>\n )}\n {serversQuery.isLoading ? (\n <TabLoading />\n ) : serversQuery.isError ? (\n <p className=\"rounded-md border border-destructive/20 bg-destructive/5 px-3 py-2 text-xs text-destructive\">\n Could not load MCP servers.\n </p>\n ) : (\n <div className=\"space-y-6\">\n {[\n { label: \"Personal\", servers: data?.user ?? [] },\n { label: \"Organization\", servers: data?.org ?? [] },\n ].map((section) => (\n <section key={section.label} className=\"space-y-2\">\n <h2 className=\"text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground/70\">\n {section.label}\n </h2>\n {section.servers.length > 0 ? (\n <div className=\"divide-y divide-border/60 border-y border-border/60\">\n {section.servers.map(renderServer)}\n </div>\n ) : (\n <AgentEmptyState\n icon={IconPlugConnected}\n title={`No ${section.label.toLowerCase()} connections yet`}\n description={\n section.label === \"Personal\"\n ? \"Connect a service to give the agent access to it.\"\n : \"Organization connections shared with this workspace will appear here.\"\n }\n />\n )}\n </section>\n ))}\n </div>\n )}\n <McpIntegrationDialog\n open={dialogOpen}\n onOpenChange={setDialogOpen}\n defaultScope=\"user\"\n canCreateOrgMcp={canCreateOrgMcp}\n hasOrg={hasOrg}\n onCreateMcpServer={onCreateMcpServer}\n />\n </section>\n </AgentTabFrame>\n );\n}\n\ninterface AccessUrls {\n appName: string;\n appUrl: string;\n mcpUrl: string;\n connectUrl: string;\n agentCardUrl: string;\n}\n\nfunction CopyField({ label, value }: { label: string; value: string }) {\n const [copied, setCopied] = useState(false);\n const copy = async () => {\n try {\n await navigator.clipboard.writeText(value);\n setCopied(true);\n window.setTimeout(() => setCopied(false), 1600);\n } catch {\n setCopied(false);\n }\n };\n return (\n <div className=\"flex min-w-0 items-center gap-2 rounded-md border border-border bg-muted/20 p-2\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-[10px] font-semibold uppercase tracking-wide text-muted-foreground/70\">\n {label}\n </div>\n <code className=\"mt-1 block truncate text-xs text-foreground\">\n {value}\n </code>\n </div>\n <button\n type=\"button\"\n onClick={() => void copy()}\n className=\"shrink-0 cursor-pointer rounded-md border border-border bg-background px-2.5 py-1.5 text-[11px] font-medium text-foreground hover:bg-accent\"\n >\n {copied ? \"Copied\" : \"Copy\"}\n </button>\n </div>\n );\n}\n\nfunction AccessTab({\n appName: appNameProp,\n}: AgentPageTabProps & { appName?: string }) {\n const [urls, setUrls] = useState<AccessUrls | null>(null);\n const [agentCardAvailable, setAgentCardAvailable] = useState(false);\n const [activeGuide, setActiveGuide] = useState(MCP_CONNECT_GUIDES[0]?.id);\n\n useEffect(() => {\n const origin = window.location.origin;\n const baseUrl = new URL(appPath(\"/\"), origin).toString().replace(/\\/$/, \"\");\n const hostname = window.location.hostname || \"app\";\n const metaSiteName = document\n .querySelector('meta[property=\"og:site_name\"]')\n ?.getAttribute(\"content\")\n ?.trim();\n const hostnameGuess =\n hostname !== \"localhost\" && hostname !== \"127.0.0.1\"\n ? hostname.split(\".\")[0]\n : \"\";\n const appName =\n appNameProp?.trim() || metaSiteName || hostnameGuess || \"this app\";\n const templateValues = {\n appName,\n appUrl: baseUrl,\n mcpUrl: \"\",\n serverId: `agent-native-${hostname}`,\n } satisfies McpConnectTemplateValues;\n setUrls({\n appName,\n appUrl: baseUrl,\n mcpUrl: interpolateMcpConnectTemplate(\n MCP_CONNECT_MCP_URL_TEMPLATE,\n templateValues,\n ),\n connectUrl: new URL(appPath(\"/mcp/connect\"), origin).toString(),\n agentCardUrl: new URL(\n appPath(\"/.well-known/agent-card.json\"),\n origin,\n ).toString(),\n });\n }, [appNameProp]);\n\n useEffect(() => {\n if (!urls) return;\n let cancelled = false;\n fetch(urls.agentCardUrl)\n .then((response) => {\n if (!cancelled) setAgentCardAvailable(response.ok);\n })\n .catch(() => {\n if (!cancelled) setAgentCardAvailable(false);\n });\n return () => {\n cancelled = true;\n };\n }, [urls]);\n\n const templateValues: McpConnectTemplateValues | null = urls\n ? {\n appName: urls.appName,\n appUrl: urls.appUrl,\n mcpUrl: urls.mcpUrl,\n serverId: `agent-native-${window.location.hostname || \"app\"}`,\n }\n : null;\n const guide =\n MCP_CONNECT_GUIDES.find((item) => item.id === activeGuide) ??\n MCP_CONNECT_GUIDES[0];\n\n return (\n <AgentTabFrame\n title=\"Access\"\n description=\"Choose which external clients can talk to this app's agent.\"\n >\n <div className=\"space-y-6\">\n {urls ? (\n <>\n <CopyField label=\"MCP URL\" value={urls.mcpUrl} />\n {agentCardAvailable && (\n <CopyField label=\"A2A agent card\" value={urls.agentCardUrl} />\n )}\n <section className=\"space-y-3 border-t border-border/70 pt-6\">\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">\n Client setup\n </h3>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n These instructions are also available on the full connect\n page.\n </p>\n </div>\n <div\n className=\"flex gap-1 overflow-x-auto border-b border-border pb-2\"\n role=\"tablist\"\n aria-label=\"Choose your AI assistant\"\n >\n {MCP_CONNECT_GUIDES.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={item.id === guide?.id}\n onClick={() => setActiveGuide(item.id)}\n className={cn(\n \"shrink-0 cursor-pointer rounded-md px-2.5 py-1.5 text-xs font-medium\",\n item.id === guide?.id\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:bg-accent/50 hover:text-foreground\",\n )}\n >\n {item.label}\n </button>\n ))}\n </div>\n {guide && templateValues && (\n <div className=\"space-y-3 pt-1\" role=\"tabpanel\">\n {guide.steps?.length ? (\n <ol className=\"list-decimal space-y-2 ps-5 text-xs leading-relaxed text-muted-foreground\">\n {guide.steps.map((step) => (\n <li key={step}>\n {interpolateMcpConnectTemplate(step, templateValues)}\n </li>\n ))}\n </ol>\n ) : null}\n {guide.intro && (\n <p className=\"text-xs text-muted-foreground\">\n {interpolateMcpConnectTemplate(\n guide.intro,\n templateValues,\n )}\n </p>\n )}\n {guide.commandTemplate && (\n <CopyField\n label=\"Command\"\n value={interpolateMcpConnectTemplate(\n guide.commandTemplate,\n templateValues,\n )}\n />\n )}\n {guide.configTemplate && (\n <CopyField\n label=\"MCP config\"\n value={interpolateMcpConnectTemplate(\n guide.configTemplate,\n templateValues,\n )}\n />\n )}\n {guide.action?.kind === \"link\" && guide.action.href && (\n <a\n href={guide.action.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex cursor-pointer items-center gap-1.5 rounded-md border border-border bg-background px-3 py-1.5 text-xs font-medium text-foreground hover:bg-accent\"\n >\n {guide.action.label}\n <IconExternalLink className=\"size-3.5\" />\n </a>\n )}\n {guide.note && (\n <p className=\"text-xs leading-relaxed text-muted-foreground\">\n {interpolateMcpConnectTemplate(\n guide.note,\n templateValues,\n )}\n </p>\n )}\n </div>\n )}\n </section>\n <section className=\"border-t border-border/70 pt-6\">\n <h3 className=\"text-sm font-semibold text-foreground\">\n {MCP_STATIC_TOKEN_FALLBACK.title}\n </h3>\n <p className=\"mt-1 text-xs leading-relaxed text-muted-foreground\">\n {MCP_STATIC_TOKEN_FALLBACK.state}. Open the connect page to\n create a token for clients that cannot complete OAuth.\n </p>\n <a\n href={urls.connectUrl}\n className=\"mt-3 inline-flex cursor-pointer items-center gap-1.5 rounded-md border border-border bg-background px-3 py-1.5 text-xs font-medium text-foreground hover:bg-accent\"\n >\n Open full connect page\n <IconExternalLink className=\"size-3.5\" />\n </a>\n </section>\n </>\n ) : (\n <TabLoading />\n )}\n </div>\n </AgentTabFrame>\n );\n}\n\nexport interface AgentPageExtraTabContext extends AgentPageTabProps {\n scopeControl: ReactNode;\n}\n\nexport type AgentPageExtraTabFactory = (\n context: AgentPageExtraTabContext,\n) => SettingsTabItem;\n\nexport interface AgentTabsPageProps {\n /**\n * Human-readable app name used in the Access tab's connect instructions\n * (e.g. \"name it Mail\"). Falls back to the `og:site_name` meta tag, then a\n * hostname-derived guess — never `document.title`, which this page owns.\n */\n appName?: string;\n extraTabs?: SettingsTabItem[];\n /** Scoped app-specific tabs that receive the current Manage agent page scope. */\n extraTabFactories?: AgentPageExtraTabFactory[];\n defaultTab?: string;\n className?: string;\n /** Whether to render the Agent page search box. Defaults to true. */\n enableSearch?: boolean;\n searchPlaceholder?: string;\n hiddenTabs?: string[];\n value?: string;\n onValueChange?: (tabId: string) => void;\n}\n\nexport function AgentTabsPage({\n appName,\n extraTabs = [],\n extraTabFactories = [],\n defaultTab = \"files\",\n className,\n enableSearch = true,\n searchPlaceholder = \"Search\",\n hiddenTabs = [],\n value,\n onValueChange,\n}: AgentTabsPageProps) {\n const { data: org } = useOrg();\n const canManageOrg =\n !org?.orgId || org.role === \"owner\" || org.role === \"admin\";\n const scope: AgentPageScope = \"user\";\n const rootRef = useRef<HTMLDivElement | null>(null);\n const searchRef = useRef<HTMLInputElement | null>(null);\n const [query, setQuery] = useState(\"\");\n const normalizedHiddenTabs = useMemo(\n () => new Set(hiddenTabs.map((tab) => normalizeTabId(tab)).filter(Boolean)),\n [hiddenTabs],\n );\n const scopeControl: ReactNode = null;\n const scopedExtraTabs = useMemo(\n () =>\n extraTabFactories.map((factory) =>\n factory({ scope, canManageOrg, scopeControl }),\n ),\n [canManageOrg, extraTabFactories, scope, scopeControl],\n );\n\n const tabs = useMemo<SettingsTabItem[]>(\n () => [\n {\n id: \"files\",\n label: \"Files\",\n icon: IconFolder,\n group: \"resources\",\n keywords: \"workspace plain files documents uploads\",\n content: (\n <Suspense fallback={<TabLoading />}>\n <AgentResourceTab scope={scope} view=\"files\" />\n </Suspense>\n ),\n },\n {\n id: \"instructions\",\n label: \"Instructions\",\n icon: IconChecklist,\n group: \"resources\",\n keywords: \"agents md rules preferences guidance\",\n content: (\n <Suspense fallback={<TabLoading />}>\n <AgentResourceTab scope={scope} view=\"instructions\" />\n </Suspense>\n ),\n },\n {\n id: \"agents\",\n label: \"Agents\",\n icon: IconHierarchy2,\n group: \"resources\",\n keywords: \"custom sub agents delegate profiles\",\n content: (\n <Suspense fallback={<TabLoading />}>\n <AgentResourceTab scope={scope} view=\"agents\" />\n </Suspense>\n ),\n },\n {\n id: \"memory\",\n label: \"Memory\",\n icon: IconNotes,\n group: \"resources\",\n keywords: \"long term notes memory index recall\",\n content: (\n <Suspense fallback={<TabLoading />}>\n <AgentResourceTab scope={scope} view=\"memory\" />\n </Suspense>\n ),\n },\n {\n id: \"skills\",\n label: \"Skills\",\n icon: IconBook2,\n group: \"resources\",\n keywords: \"abilities reusable instructions workflows\",\n content: (\n <Suspense fallback={<TabLoading />}>\n <AgentResourceTab scope={scope} view=\"skills\" />\n </Suspense>\n ),\n },\n {\n id: \"learnings\",\n label: \"Learnings\",\n icon: IconHistory,\n group: \"resources\",\n keywords: \"corrections patterns knowledge feedback\",\n content: (\n <Suspense fallback={<TabLoading />}>\n <AgentResourceTab scope={scope} view=\"learnings\" />\n </Suspense>\n ),\n },\n {\n id: \"remote-agents\",\n label: \"Remote agents\",\n icon: IconTopologyRing2,\n group: \"resources\",\n keywords: \"a2a connected remote agents delegation\",\n content: (\n <Suspense fallback={<TabLoading />}>\n <AgentResourceTab scope={scope} view=\"remote-agents\" />\n </Suspense>\n ),\n },\n {\n id: \"snapshots\",\n label: \"Snapshots\",\n icon: IconHistory,\n group: \"agent\",\n keywords: \"context recent loads provenance tokens\",\n content: (\n <Suspense fallback={<TabLoading />}>\n <AgentContextTab scope={scope} canManageOrg={canManageOrg} />\n </Suspense>\n ),\n },\n {\n id: \"connections\",\n label: \"Connections\",\n icon: IconPlugConnected,\n group: \"agent\",\n keywords: \"mcp servers tools integrations\",\n searchEntries: [\n { id: \"mcp-servers\", label: \"MCP servers\", keywords: \"tools\" },\n ],\n content: <ConnectionsTab scope={scope} canManageOrg={canManageOrg} />,\n },\n {\n id: \"jobs\",\n label: \"Jobs\",\n icon: IconClock,\n group: \"agent\",\n keywords: \"scheduled automations recurring\",\n content: (\n <Suspense fallback={<TabLoading />}>\n <AgentJobsTab scope={scope} canManageOrg={canManageOrg} />\n </Suspense>\n ),\n },\n {\n id: \"access\",\n label: \"Access\",\n icon: IconShieldLock,\n group: \"agent\",\n keywords: \"external clients oauth a2a exposure\",\n searchEntries: [\n {\n id: \"mcp-connect\",\n label: \"External client setup\",\n keywords: \"oauth connect\",\n },\n {\n id: \"a2a-agent-card\",\n label: \"A2A agent card\",\n keywords: \"agent card\",\n },\n ],\n content: (\n <AccessTab\n scope={scope}\n canManageOrg={canManageOrg}\n appName={appName}\n />\n ),\n },\n ...extraTabs,\n ...scopedExtraTabs,\n ],\n [appName, canManageOrg, extraTabs, scope, scopedExtraTabs],\n );\n const visibleTabs = useMemo(\n () => tabs.filter((tab) => !normalizedHiddenTabs.has(tab.id)),\n [normalizedHiddenTabs, tabs],\n );\n const fallbackTab = visibleTabs.some((tab) => tab.id === defaultTab)\n ? defaultTab\n : (visibleTabs[0]?.id ?? \"context\");\n const [internalTab, setInternalTab] = useState(() => {\n if (typeof window === \"undefined\") return fallbackTab;\n return resolveTabId(visibleTabs, window.location.hash) ?? fallbackTab;\n });\n const isControlled = value !== undefined;\n const activeTab = isControlled ? value : internalTab;\n const selectedTab =\n visibleTabs.find((tab) => tab.id === activeTab) ?? visibleTabs[0];\n const tabGroups = useMemo(() => {\n const groups: Array<{ id: string; tabs: SettingsTabItem[] }> = [];\n for (const tab of visibleTabs) {\n const groupId = tab.group ?? \"agent\";\n const previous = groups.at(-1);\n if (previous?.id === groupId) previous.tabs.push(tab);\n else groups.push({ id: groupId, tabs: [tab] });\n }\n return groups;\n }, [visibleTabs]);\n\n useEffect(() => {\n if (!isControlled && !visibleTabs.some((tab) => tab.id === internalTab)) {\n setInternalTab(fallbackTab);\n }\n }, [fallbackTab, internalTab, isControlled, visibleTabs]);\n\n useEffect(() => {\n if (isControlled) return;\n const onHashChange = () => {\n const next = resolveTabId(visibleTabs, window.location.hash);\n if (next) setInternalTab(next);\n };\n window.addEventListener(\"hashchange\", onHashChange);\n return () => window.removeEventListener(\"hashchange\", onHashChange);\n }, [isControlled, visibleTabs]);\n\n const changeTab = useCallback(\n (tabId: string) => {\n if (!isControlled) setInternalTab(tabId);\n onValueChange?.(tabId);\n },\n [isControlled, onValueChange],\n );\n\n const searchIndex = useMemo(() => {\n const entries: Array<\n SettingsSearchEntry & { tabId: string; haystack: string }\n > = [];\n for (const tab of visibleTabs) {\n entries.push({\n id: `tab:${tab.id}`,\n label: tab.label,\n keywords: tab.keywords,\n tabId: tab.id,\n haystack: `${tab.label} ${tab.keywords ?? \"\"}`.toLowerCase(),\n });\n for (const entry of tab.searchEntries ?? []) {\n entries.push({\n ...entry,\n tabId: entry.tabId ?? tab.id,\n haystack:\n `${entry.label} ${entry.keywords ?? \"\"} ${entry.description ?? \"\"} ${tab.label}`.toLowerCase(),\n });\n }\n }\n return entries;\n }, [visibleTabs]);\n const results = useMemo(() => {\n const terms = query.trim().toLowerCase().split(/\\s+/).filter(Boolean);\n if (!terms.length) return [];\n return searchIndex\n .filter((entry) => terms.every((term) => entry.haystack.includes(term)))\n .sort((a, b) => a.label.localeCompare(b.label));\n }, [query, searchIndex]);\n\n const selectSearchResult = useCallback(\n (entry: (typeof searchIndex)[number]) => {\n changeTab(entry.tabId);\n setQuery(\"\");\n if (isControlled || typeof window === \"undefined\") return;\n if (entry.hash) {\n window.history.pushState(\n null,\n \"\",\n `${window.location.pathname}${window.location.search}#${entry.hash.replace(/^#/, \"\")}`,\n );\n window.dispatchEvent(new Event(\"hashchange\"));\n } else {\n updateTabHash(entry.tabId);\n }\n },\n [changeTab, isControlled],\n );\n\n return (\n <div\n ref={rootRef}\n className={cn(\n \"flex h-full min-h-0 w-full flex-col overflow-hidden bg-background\",\n className,\n )}\n >\n <div className=\"flex min-h-0 flex-1 flex-col sm:flex-row\">\n <div className=\"flex shrink-0 flex-col gap-2 bg-background p-2 sm:min-h-0 sm:w-56 sm:overflow-y-auto sm:p-3\">\n {enableSearch ? (\n <div className=\"relative sm:mb-1\">\n <IconSearch className=\"pointer-events-none absolute start-2.5 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground\" />\n <input\n ref={searchRef}\n type=\"search\"\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === \"Escape\") setQuery(\"\");\n if (event.key === \"Enter\" && results[0]) {\n event.preventDefault();\n selectSearchResult(results[0]);\n }\n }}\n placeholder={searchPlaceholder}\n aria-label={searchPlaceholder}\n className=\"h-8 w-full rounded-md border border-border bg-background ps-8 pe-7 text-[13px] text-foreground outline-none transition-colors placeholder:text-muted-foreground focus:border-foreground/30 focus:ring-2 focus:ring-accent/40\"\n />\n {query && (\n <button\n type=\"button\"\n onClick={() => setQuery(\"\")}\n aria-label=\"Clear search\"\n className=\"absolute end-1.5 top-1/2 flex size-5 -translate-y-1/2 cursor-pointer items-center justify-center rounded text-muted-foreground hover:bg-accent/60 hover:text-foreground\"\n >\n <IconX className=\"size-3.5\" />\n </button>\n )}\n </div>\n ) : null}\n {query.trim() ? (\n <div\n role=\"listbox\"\n aria-label=\"Agent search results\"\n className=\"flex flex-col gap-0.5\"\n >\n {results.length === 0 ? (\n <p className=\"px-2 py-6 text-center text-xs text-muted-foreground\">\n No matching items\n </p>\n ) : (\n results.map((entry) => (\n <button\n key={entry.id}\n type=\"button\"\n role=\"option\"\n onClick={() => selectSearchResult(entry)}\n className=\"flex cursor-pointer items-start gap-2 rounded-md px-2.5 py-2 text-start text-sm text-foreground hover:bg-accent/60\"\n >\n <span className=\"flex min-w-0 flex-col\">\n <span className=\"truncate font-medium\">\n {entry.label}\n </span>\n <span className=\"truncate text-[11px] text-muted-foreground\">\n {entry.description ?? entry.tabId}\n </span>\n </span>\n </button>\n ))\n )}\n </div>\n ) : (\n <nav\n aria-label=\"Agent sections\"\n role=\"tablist\"\n className=\"flex gap-1 overflow-x-auto sm:flex-col sm:overflow-x-visible\"\n >\n {tabGroups.map((group, groupIndex) => (\n <div\n key={group.id}\n className={cn(\n \"contents sm:block\",\n groupIndex > 0 &&\n \"sm:mt-2 sm:border-t sm:border-border/60 sm:pt-2\",\n )}\n >\n {group.id === \"resources\" && (\n <div className=\"hidden px-2.5 pb-1 pt-1 text-[10px] font-semibold uppercase tracking-[0.16em] text-muted-foreground/50 sm:block\">\n Agent resources\n </div>\n )}\n {group.id === \"agent\" && (\n <div className=\"hidden px-2.5 pb-1 pt-1 text-[10px] font-semibold uppercase tracking-[0.16em] text-muted-foreground/50 sm:block\">\n Agent operations\n </div>\n )}\n <div className=\"contents sm:flex sm:flex-col sm:gap-1\">\n {group.tabs.map((tab) => {\n const Icon = tab.icon as SettingsTabIcon | undefined;\n const selected = tab.id === selectedTab?.id;\n return (\n <button\n key={tab.id}\n type=\"button\"\n id={`agent-tab-${tab.id}`}\n role=\"tab\"\n aria-selected={selected}\n aria-controls={`agent-tabpanel-${tab.id}`}\n onClick={() => {\n changeTab(tab.id);\n if (!isControlled) updateTabHash(tab.id);\n }}\n className={cn(\n \"flex min-h-9 shrink-0 cursor-pointer items-center gap-2 rounded-md px-3 py-2 text-start text-sm font-medium transition-colors sm:w-full\",\n selected\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:bg-accent/50 hover:text-foreground\",\n )}\n >\n {Icon ? (\n <Icon\n className={cn(\n \"size-4 shrink-0\",\n selected\n ? \"text-foreground\"\n : \"text-muted-foreground\",\n )}\n />\n ) : null}\n <span className=\"truncate\">{tab.label}</span>\n </button>\n );\n })}\n </div>\n </div>\n ))}\n </nav>\n )}\n </div>\n <div\n id={`agent-tabpanel-${selectedTab?.id ?? \"context\"}`}\n role=\"tabpanel\"\n aria-labelledby={`agent-tab-${selectedTab?.id ?? \"context\"}`}\n className=\"min-h-0 min-w-0 flex-1 overflow-y-auto p-4 sm:p-6\"\n >\n {selectedTab?.content ?? <EmptySlot label=\"Agent section\" />}\n </div>\n </div>\n </div>\n );\n}\n"]}
1
+ {"version":3,"file":"AgentTabsPage.js","sourceRoot":"","sources":["../../../src/client/agent-page/AgentTabsPage.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n IconBook2,\n IconChecklist,\n IconClock,\n IconExternalLink,\n IconFolder,\n IconHistory,\n IconHierarchy2,\n IconNotes,\n IconPlugConnected,\n IconTopologyRing2,\n IconSearch,\n IconSettings,\n IconShieldLock,\n IconX,\n} from \"@tabler/icons-react\";\nimport {\n lazy,\n Suspense,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ComponentType,\n type ReactNode,\n} from \"react\";\n\nimport {\n MCP_CONNECT_GUIDES,\n MCP_CONNECT_MCP_URL_TEMPLATE,\n MCP_STATIC_TOKEN_FALLBACK,\n interpolateMcpConnectTemplate,\n type McpConnectTemplateValues,\n} from \"../../shared/mcp-connect-content.js\";\nimport { appPath } from \"../api-path.js\";\nimport { useT } from \"../i18n.js\";\nimport { useOrg } from \"../org/hooks.js\";\nimport {\n McpIntegrationDialog,\n // The dialog is intentionally reused here so the Agent page remains a thin\n // host for the existing MCP management flow.\n} from \"../resources/McpIntegrationDialog.js\";\nimport { McpServerDetail } from \"../resources/McpServerDetail.js\";\nimport type { ResourceView } from \"../resources/ResourcesPanel.js\";\nimport {\n useCreateMcpServer,\n useDeleteMcpServer,\n useMcpServers,\n type McpServer,\n type McpServerScope,\n} from \"../resources/use-mcp-servers.js\";\nimport {\n AGENT_SETTINGS_SECTIONS,\n buildSectionSearchEntries,\n} from \"../settings/agent-settings-search.js\";\nimport { AgentSettingsContent } from \"../settings/SettingsPanel.js\";\nimport type {\n SettingsSearchEntry,\n SettingsTabItem,\n} from \"../settings/SettingsTabsPage.js\";\nimport { cn } from \"../utils.js\";\nimport { AgentEmptyState } from \"./AgentEmptyState.js\";\nimport { AgentTabFrame } from \"./AgentTabFrame.js\";\nimport type { AgentPageScope, AgentPageTabProps } from \"./types.js\";\n\nconst AgentContextTab = lazy(() =>\n import(\"./AgentContextTab.js\").then((module) => ({\n default: module.AgentContextTab,\n })),\n);\nconst AgentJobsTab = lazy(() =>\n import(\"./AgentJobsTab.js\").then((module) => ({\n default: module.AgentJobsTab,\n })),\n);\nconst ResourcesPanel = lazy(() =>\n import(\"../resources/ResourcesPanel.js\").then((module) => ({\n default: module.ResourcesPanel,\n })),\n);\n\ntype SettingsTabIcon = ComponentType<{ className?: string }>;\n\nfunction normalizeTabId(value?: string | null): string | null {\n const normalized = value\n ?.replace(/^#/, \"\")\n .trim()\n .toLowerCase()\n .replace(/[\"']/g, \"\")\n .replace(/[\\s_]+/g, \"-\");\n return normalized || null;\n}\n\nfunction resolveTabId(\n tabs: SettingsTabItem[],\n value?: string | null,\n): string | null {\n const normalized = normalizeTabId(value);\n if (!normalized) return null;\n if (normalized === \"context\" && tabs.some((tab) => tab.id === \"snapshots\")) {\n return \"snapshots\";\n }\n if (tabs.some((tab) => tab.id === normalized)) return normalized;\n const section = normalized.split(\":\", 1)[0];\n const owner = tabs.find((tab) =>\n tab.searchEntries?.some(\n (entry) => normalizeTabId(entry.hash ?? entry.id) === section,\n ),\n );\n return owner?.id ?? null;\n}\n\nfunction updateTabHash(tabId: string) {\n if (typeof window === \"undefined\") return;\n const hash = tabId === \"files\" ? \"\" : `#${encodeURIComponent(tabId)}`;\n window.history.pushState(\n null,\n \"\",\n `${window.location.pathname}${window.location.search}${hash}`,\n );\n}\n\nfunction TabLoading() {\n return (\n <div className=\"space-y-3\" aria-busy=\"true\">\n <div className=\"h-5 w-36 animate-pulse rounded bg-muted\" />\n <div className=\"h-20 animate-pulse rounded-lg border border-border bg-muted/30\" />\n <div className=\"h-20 animate-pulse rounded-lg border border-border bg-muted/30\" />\n </div>\n );\n}\n\nfunction EmptySlot({ label }: { label: string }) {\n return (\n <div className=\"flex min-h-[220px] items-center justify-center rounded-lg border border-dashed border-border/70 bg-muted/10\">\n <span className=\"sr-only\">{label}</span>\n </div>\n );\n}\n\nexport const AGENT_RESOURCE_DOCS_HREF: Record<ResourceView, string> = {\n files: \"https://agent-native.com/docs/agent-resources#resources-tab\",\n instructions: \"https://agent-native.com/docs/agent-resources#agents-md\",\n agents: \"https://agent-native.com/docs/agent-resources#custom-agents\",\n memory: \"https://agent-native.com/docs/agent-resources#memory\",\n skills: \"https://agent-native.com/docs/skills-guide\",\n learnings: \"https://agent-native.com/docs/agent-resources#memory\",\n \"remote-agents\":\n \"https://agent-native.com/docs/agent-resources#remote-vs-custom-agents\",\n};\n\nconst RESOURCE_TAB_COPY: Record<\n ResourceView,\n { titleKey: string; descriptionKey: string }\n> = {\n files: {\n titleKey: \"agentResources.files.title\",\n descriptionKey: \"agentResources.files.description\",\n },\n instructions: {\n titleKey: \"agentResources.instructions.title\",\n descriptionKey: \"agentResources.instructions.description\",\n },\n agents: {\n titleKey: \"agentResources.agents.title\",\n descriptionKey: \"agentResources.agents.description\",\n },\n memory: {\n titleKey: \"agentResources.memory.title\",\n descriptionKey: \"agentResources.memory.description\",\n },\n skills: {\n titleKey: \"agentResources.skills.title\",\n descriptionKey: \"agentResources.skills.description\",\n },\n learnings: {\n titleKey: \"agentResources.learnings.title\",\n descriptionKey: \"agentResources.learnings.description\",\n },\n \"remote-agents\": {\n titleKey: \"agentResources.remoteAgents.title\",\n descriptionKey: \"agentResources.remoteAgents.description\",\n },\n};\n\nfunction AgentResourceTab({\n scope,\n view,\n}: AgentPageTabProps & { view: ResourceView }) {\n const t = useT();\n const copy = RESOURCE_TAB_COPY[view];\n const title = t(copy.titleKey);\n return (\n <AgentTabFrame\n title={title}\n description={t(copy.descriptionKey)}\n helpHref={AGENT_RESOURCE_DOCS_HREF[view]}\n helpLabel={t(\"agentResources.openDocs\", { section: title })}\n >\n <div className=\"min-h-[480px]\">\n <ResourcesPanel\n key={`${scope}-${view}`}\n showMcpServers={false}\n resourceFilter={view}\n resourceTreeVariant={view === \"files\" ? \"tree\" : \"collection\"}\n scope=\"personal\"\n />\n </div>\n </AgentTabFrame>\n );\n}\n\nfunction ServerStatus({ server }: { server: McpServer }) {\n if (server.status.state === \"connected\") {\n return (\n <span className=\"text-[11px] text-emerald-600 dark:text-emerald-400\">\n Connected · {server.status.toolCount} tools\n </span>\n );\n }\n if (server.status.state === \"error\") {\n return (\n <span className=\"truncate text-[11px] text-destructive\">\n Connection error\n </span>\n );\n }\n return (\n <span className=\"text-[11px] text-muted-foreground\">Status unknown</span>\n );\n}\n\nfunction ConnectionsTab({ canManageOrg = false }: AgentPageTabProps) {\n const t = useT();\n const serversQuery = useMcpServers();\n const createServer = useCreateMcpServer();\n const deleteServer = useDeleteMcpServer();\n const [dialogOpen, setDialogOpen] = useState(false);\n const [selectedServer, setSelectedServer] = useState<McpServer | null>(null);\n const [deleteTarget, setDeleteTarget] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n const data = serversQuery.data;\n const hasOrg = Boolean(data?.orgId);\n const canCreateOrgMcp = hasOrg && canManageOrg;\n\n const onCreateMcpServer = useCallback(\n async (args: {\n scope: McpServerScope;\n name: string;\n url: string;\n headers?: Record<string, string>;\n description?: string;\n }) => {\n if (args.scope === \"org\" && !canCreateOrgMcp) {\n throw new Error(\n \"Only organization admins can add organization MCP servers.\",\n );\n }\n return createServer.mutateAsync(args);\n },\n [canCreateOrgMcp, createServer],\n );\n\n const removeServer = async (server: McpServer) => {\n const key = `${server.scope}:${server.id}`;\n if (deleteTarget !== key) {\n setDeleteTarget(key);\n return;\n }\n setError(null);\n try {\n await deleteServer.mutateAsync({ id: server.id, scope: server.scope });\n if (\n selectedServer?.id === server.id &&\n selectedServer.scope === server.scope\n ) {\n setSelectedServer(null);\n }\n setDeleteTarget(null);\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : String(cause));\n }\n };\n\n const renderServer = (server: McpServer) => {\n const key = `${server.scope}:${server.id}`;\n const canDelete = server.scope === \"user\" || canManageOrg;\n const selected =\n selectedServer?.id === server.id && selectedServer.scope === server.scope;\n return (\n <div\n key={key}\n className={cn(\n \"group/connection-row py-4 transition-colors first:pt-5 last:pb-5\",\n selected && \"bg-accent/20\",\n )}\n >\n <div className=\"flex items-start gap-3\">\n <button\n type=\"button\"\n onClick={() => setSelectedServer(selected ? null : server)}\n className=\"min-w-0 flex-1 cursor-pointer text-start\"\n >\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"truncate text-sm font-medium text-foreground\">\n {server.name}\n </span>\n </div>\n <code className=\"mt-1 block truncate text-[11px] text-muted-foreground\">\n {server.url}\n </code>\n <div className=\"mt-2 flex items-center gap-2\">\n <ServerStatus server={server} />\n {server.description && (\n <span className=\"truncate text-[11px] text-muted-foreground/70\">\n {server.description}\n </span>\n )}\n </div>\n </button>\n {canDelete && (\n <button\n type=\"button\"\n onClick={() => void removeServer(server)}\n disabled={deleteServer.isPending}\n className={cn(\n \"cursor-pointer rounded-md px-2 py-1 text-[11px] font-medium text-muted-foreground hover:bg-destructive/10 hover:text-destructive\",\n deleteTarget === key && \"bg-destructive/10 text-destructive\",\n )}\n >\n {deleteTarget === key ? \"Confirm\" : \"Delete\"}\n </button>\n )}\n </div>\n {selected && (\n <div className=\"mt-3 border-t border-border/70 pt-3\">\n <McpServerDetail server={server} />\n </div>\n )}\n </div>\n );\n };\n\n return (\n <AgentTabFrame\n title=\"Connections\"\n description=\"Tools and services this agent can reach, grouped by where they are configured.\"\n actions={\n <button\n type=\"button\"\n onClick={() => {\n setError(null);\n setDialogOpen(true);\n }}\n className=\"cursor-pointer rounded-md bg-primary px-3 py-1.5 text-xs font-medium text-primary-foreground hover:bg-primary/90\"\n >\n {t(\"mcpIntegrations.connect\")}\n </button>\n }\n >\n <section className=\"space-y-4\">\n {error && (\n <p className=\"rounded-md border border-destructive/20 bg-destructive/5 px-3 py-2 text-xs text-destructive\">\n {error}\n </p>\n )}\n {serversQuery.isLoading ? (\n <TabLoading />\n ) : serversQuery.isError ? (\n <p className=\"rounded-md border border-destructive/20 bg-destructive/5 px-3 py-2 text-xs text-destructive\">\n Could not load MCP servers.\n </p>\n ) : (\n <div className=\"space-y-6\">\n {[\n { label: \"Personal\", servers: data?.user ?? [] },\n { label: \"Organization\", servers: data?.org ?? [] },\n ].map((section) => (\n <section key={section.label} className=\"space-y-2\">\n <h2 className=\"text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground/70\">\n {section.label}\n </h2>\n {section.servers.length > 0 ? (\n <div className=\"divide-y divide-border/60 border-y border-border/60\">\n {section.servers.map(renderServer)}\n </div>\n ) : (\n <AgentEmptyState\n icon={IconPlugConnected}\n title={`No ${section.label.toLowerCase()} connections yet`}\n description={\n section.label === \"Personal\"\n ? \"Connect a service to give the agent access to it.\"\n : \"Organization connections shared with this workspace will appear here.\"\n }\n />\n )}\n </section>\n ))}\n </div>\n )}\n <McpIntegrationDialog\n open={dialogOpen}\n onOpenChange={setDialogOpen}\n defaultScope=\"user\"\n canCreateOrgMcp={canCreateOrgMcp}\n hasOrg={hasOrg}\n onCreateMcpServer={onCreateMcpServer}\n />\n </section>\n </AgentTabFrame>\n );\n}\n\ninterface AccessUrls {\n appName: string;\n appUrl: string;\n mcpUrl: string;\n connectUrl: string;\n agentCardUrl: string;\n}\n\nfunction CopyField({ label, value }: { label: string; value: string }) {\n const [copied, setCopied] = useState(false);\n const copy = async () => {\n try {\n await navigator.clipboard.writeText(value);\n setCopied(true);\n window.setTimeout(() => setCopied(false), 1600);\n } catch {\n setCopied(false);\n }\n };\n return (\n <div className=\"flex min-w-0 items-center gap-2 rounded-md border border-border bg-muted/20 p-2\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-[10px] font-semibold uppercase tracking-wide text-muted-foreground/70\">\n {label}\n </div>\n <code className=\"mt-1 block truncate text-xs text-foreground\">\n {value}\n </code>\n </div>\n <button\n type=\"button\"\n onClick={() => void copy()}\n className=\"shrink-0 cursor-pointer rounded-md border border-border bg-background px-2.5 py-1.5 text-[11px] font-medium text-foreground hover:bg-accent\"\n >\n {copied ? \"Copied\" : \"Copy\"}\n </button>\n </div>\n );\n}\n\nfunction AccessTab({\n appName: appNameProp,\n}: AgentPageTabProps & { appName?: string }) {\n const [urls, setUrls] = useState<AccessUrls | null>(null);\n const [agentCardAvailable, setAgentCardAvailable] = useState(false);\n const [activeGuide, setActiveGuide] = useState(MCP_CONNECT_GUIDES[0]?.id);\n\n useEffect(() => {\n const origin = window.location.origin;\n const baseUrl = new URL(appPath(\"/\"), origin).toString().replace(/\\/$/, \"\");\n const hostname = window.location.hostname || \"app\";\n const metaSiteName = document\n .querySelector('meta[property=\"og:site_name\"]')\n ?.getAttribute(\"content\")\n ?.trim();\n const hostnameGuess =\n hostname !== \"localhost\" && hostname !== \"127.0.0.1\"\n ? hostname.split(\".\")[0]\n : \"\";\n const appName =\n appNameProp?.trim() || metaSiteName || hostnameGuess || \"this app\";\n const templateValues = {\n appName,\n appUrl: baseUrl,\n mcpUrl: \"\",\n serverId: `agent-native-${hostname}`,\n } satisfies McpConnectTemplateValues;\n setUrls({\n appName,\n appUrl: baseUrl,\n mcpUrl: interpolateMcpConnectTemplate(\n MCP_CONNECT_MCP_URL_TEMPLATE,\n templateValues,\n ),\n connectUrl: new URL(appPath(\"/mcp/connect\"), origin).toString(),\n agentCardUrl: new URL(\n appPath(\"/.well-known/agent-card.json\"),\n origin,\n ).toString(),\n });\n }, [appNameProp]);\n\n useEffect(() => {\n if (!urls) return;\n let cancelled = false;\n fetch(urls.agentCardUrl)\n .then((response) => {\n if (!cancelled) setAgentCardAvailable(response.ok);\n })\n .catch(() => {\n if (!cancelled) setAgentCardAvailable(false);\n });\n return () => {\n cancelled = true;\n };\n }, [urls]);\n\n const templateValues: McpConnectTemplateValues | null = urls\n ? {\n appName: urls.appName,\n appUrl: urls.appUrl,\n mcpUrl: urls.mcpUrl,\n serverId: `agent-native-${window.location.hostname || \"app\"}`,\n }\n : null;\n const guide =\n MCP_CONNECT_GUIDES.find((item) => item.id === activeGuide) ??\n MCP_CONNECT_GUIDES[0];\n\n return (\n <AgentTabFrame\n title=\"Access\"\n description=\"Choose which external clients can talk to this app's agent.\"\n >\n <div className=\"space-y-6\">\n {urls ? (\n <>\n <CopyField label=\"MCP URL\" value={urls.mcpUrl} />\n {agentCardAvailable && (\n <CopyField label=\"A2A agent card\" value={urls.agentCardUrl} />\n )}\n <section className=\"space-y-3 border-t border-border/70 pt-6\">\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">\n Client setup\n </h3>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n These instructions are also available on the full connect\n page.\n </p>\n </div>\n <div\n className=\"flex gap-1 overflow-x-auto border-b border-border pb-2\"\n role=\"tablist\"\n aria-label=\"Choose your AI assistant\"\n >\n {MCP_CONNECT_GUIDES.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={item.id === guide?.id}\n onClick={() => setActiveGuide(item.id)}\n className={cn(\n \"shrink-0 cursor-pointer rounded-md px-2.5 py-1.5 text-xs font-medium\",\n item.id === guide?.id\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:bg-accent/50 hover:text-foreground\",\n )}\n >\n {item.label}\n </button>\n ))}\n </div>\n {guide && templateValues && (\n <div className=\"space-y-3 pt-1\" role=\"tabpanel\">\n {guide.steps?.length ? (\n <ol className=\"list-decimal space-y-2 ps-5 text-xs leading-relaxed text-muted-foreground\">\n {guide.steps.map((step) => (\n <li key={step}>\n {interpolateMcpConnectTemplate(step, templateValues)}\n </li>\n ))}\n </ol>\n ) : null}\n {guide.intro && (\n <p className=\"text-xs text-muted-foreground\">\n {interpolateMcpConnectTemplate(\n guide.intro,\n templateValues,\n )}\n </p>\n )}\n {guide.commandTemplate && (\n <CopyField\n label=\"Command\"\n value={interpolateMcpConnectTemplate(\n guide.commandTemplate,\n templateValues,\n )}\n />\n )}\n {guide.configTemplate && (\n <CopyField\n label=\"MCP config\"\n value={interpolateMcpConnectTemplate(\n guide.configTemplate,\n templateValues,\n )}\n />\n )}\n {guide.action?.kind === \"link\" && guide.action.href && (\n <a\n href={guide.action.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex cursor-pointer items-center gap-1.5 rounded-md border border-border bg-background px-3 py-1.5 text-xs font-medium text-foreground hover:bg-accent\"\n >\n {guide.action.label}\n <IconExternalLink className=\"size-3.5\" />\n </a>\n )}\n {guide.note && (\n <p className=\"text-xs leading-relaxed text-muted-foreground\">\n {interpolateMcpConnectTemplate(\n guide.note,\n templateValues,\n )}\n </p>\n )}\n </div>\n )}\n </section>\n <section className=\"border-t border-border/70 pt-6\">\n <h3 className=\"text-sm font-semibold text-foreground\">\n {MCP_STATIC_TOKEN_FALLBACK.title}\n </h3>\n <p className=\"mt-1 text-xs leading-relaxed text-muted-foreground\">\n {MCP_STATIC_TOKEN_FALLBACK.state}. Open the connect page to\n create a token for clients that cannot complete OAuth.\n </p>\n <a\n href={urls.connectUrl}\n className=\"mt-3 inline-flex cursor-pointer items-center gap-1.5 rounded-md border border-border bg-background px-3 py-1.5 text-xs font-medium text-foreground hover:bg-accent\"\n >\n Open full connect page\n <IconExternalLink className=\"size-3.5\" />\n </a>\n </section>\n </>\n ) : (\n <TabLoading />\n )}\n </div>\n </AgentTabFrame>\n );\n}\n\nexport interface AgentPageExtraTabContext extends AgentPageTabProps {\n scopeControl: ReactNode;\n}\n\nexport type AgentPageExtraTabFactory = (\n context: AgentPageExtraTabContext,\n) => SettingsTabItem;\n\nexport interface AgentTabsPageProps {\n /**\n * Human-readable app name used in the Access tab's connect instructions\n * (e.g. \"name it Mail\"). Falls back to the `og:site_name` meta tag, then a\n * hostname-derived guess — never `document.title`, which this page owns.\n */\n appName?: string;\n extraTabs?: SettingsTabItem[];\n /** Scoped app-specific tabs that receive the current Manage agent page scope. */\n extraTabFactories?: AgentPageExtraTabFactory[];\n defaultTab?: string;\n className?: string;\n /** Whether to render the Agent page search box. Defaults to true. */\n enableSearch?: boolean;\n searchPlaceholder?: string;\n hiddenTabs?: string[];\n value?: string;\n onValueChange?: (tabId: string) => void;\n}\n\nexport function AgentTabsPage({\n appName,\n extraTabs = [],\n extraTabFactories = [],\n defaultTab = \"files\",\n className,\n enableSearch = true,\n searchPlaceholder = \"Search\",\n hiddenTabs = [],\n value,\n onValueChange,\n}: AgentTabsPageProps) {\n const t = useT();\n const { data: org } = useOrg();\n const canManageOrg =\n !org?.orgId || org.role === \"owner\" || org.role === \"admin\";\n const scope: AgentPageScope = \"user\";\n const rootRef = useRef<HTMLDivElement | null>(null);\n const searchRef = useRef<HTMLInputElement | null>(null);\n const [query, setQuery] = useState(\"\");\n const normalizedHiddenTabs = useMemo(\n () => new Set(hiddenTabs.map((tab) => normalizeTabId(tab)).filter(Boolean)),\n [hiddenTabs],\n );\n const scopeControl: ReactNode = null;\n const scopedExtraTabs = useMemo(\n () =>\n extraTabFactories.map((factory) =>\n factory({ scope, canManageOrg, scopeControl }),\n ),\n [canManageOrg, extraTabFactories, scope, scopeControl],\n );\n\n const tabs = useMemo<SettingsTabItem[]>(\n () => [\n {\n id: \"files\",\n label: \"Files\",\n icon: IconFolder,\n group: \"resources\",\n keywords: \"workspace plain files documents uploads\",\n content: (\n <Suspense fallback={<TabLoading />}>\n <AgentResourceTab scope={scope} view=\"files\" />\n </Suspense>\n ),\n },\n {\n id: \"instructions\",\n label: \"Instructions\",\n icon: IconChecklist,\n group: \"resources\",\n keywords: \"agents md rules preferences guidance\",\n content: (\n <Suspense fallback={<TabLoading />}>\n <AgentResourceTab scope={scope} view=\"instructions\" />\n </Suspense>\n ),\n },\n {\n id: \"agents\",\n label: \"Agents\",\n icon: IconHierarchy2,\n group: \"resources\",\n keywords: \"custom sub agents delegate profiles\",\n content: (\n <Suspense fallback={<TabLoading />}>\n <AgentResourceTab scope={scope} view=\"agents\" />\n </Suspense>\n ),\n },\n {\n id: \"memory\",\n label: \"Memory\",\n icon: IconNotes,\n group: \"resources\",\n keywords: \"long term notes memory index recall\",\n content: (\n <Suspense fallback={<TabLoading />}>\n <AgentResourceTab scope={scope} view=\"memory\" />\n </Suspense>\n ),\n },\n {\n id: \"skills\",\n label: \"Skills\",\n icon: IconBook2,\n group: \"resources\",\n keywords: \"abilities reusable instructions workflows\",\n content: (\n <Suspense fallback={<TabLoading />}>\n <AgentResourceTab scope={scope} view=\"skills\" />\n </Suspense>\n ),\n },\n {\n id: \"learnings\",\n label: \"Learnings\",\n icon: IconHistory,\n group: \"resources\",\n keywords: \"corrections patterns knowledge feedback\",\n content: (\n <Suspense fallback={<TabLoading />}>\n <AgentResourceTab scope={scope} view=\"learnings\" />\n </Suspense>\n ),\n },\n {\n id: \"remote-agents\",\n label: \"Remote agents\",\n icon: IconTopologyRing2,\n group: \"resources\",\n keywords: \"a2a connected remote agents delegation\",\n content: (\n <Suspense fallback={<TabLoading />}>\n <AgentResourceTab scope={scope} view=\"remote-agents\" />\n </Suspense>\n ),\n },\n {\n id: \"snapshots\",\n label: \"Snapshots\",\n icon: IconHistory,\n group: \"agent\",\n keywords: \"context recent loads provenance tokens\",\n content: (\n <Suspense fallback={<TabLoading />}>\n <AgentContextTab scope={scope} canManageOrg={canManageOrg} />\n </Suspense>\n ),\n },\n {\n id: \"connections\",\n label: \"Connections\",\n icon: IconPlugConnected,\n group: \"agent\",\n keywords: \"mcp servers tools integrations\",\n searchEntries: [\n { id: \"mcp-servers\", label: \"MCP servers\", keywords: \"tools\" },\n ],\n content: <ConnectionsTab scope={scope} canManageOrg={canManageOrg} />,\n },\n {\n id: \"jobs\",\n label: \"Jobs\",\n icon: IconClock,\n group: \"agent\",\n keywords: \"scheduled automations recurring\",\n content: (\n <Suspense fallback={<TabLoading />}>\n <AgentJobsTab scope={scope} canManageOrg={canManageOrg} />\n </Suspense>\n ),\n },\n {\n id: \"settings\",\n label: t(\"settings.agentTitle\"),\n icon: IconSettings,\n group: \"agent\",\n keywords: \"agent settings model llm api keys limits voice automations\",\n searchEntries: buildSectionSearchEntries(AGENT_SETTINGS_SECTIONS),\n content: (\n <AgentTabFrame\n title={t(\"settings.agentTitle\")}\n description={t(\"settings.agentDescription\")}\n >\n <AgentSettingsContent />\n </AgentTabFrame>\n ),\n },\n {\n id: \"access\",\n label: \"Access\",\n icon: IconShieldLock,\n group: \"agent\",\n keywords: \"external clients oauth a2a exposure\",\n searchEntries: [\n {\n id: \"mcp-connect\",\n label: \"External client setup\",\n keywords: \"oauth connect\",\n },\n {\n id: \"a2a-agent-card\",\n label: \"A2A agent card\",\n keywords: \"agent card\",\n },\n ],\n content: (\n <AccessTab\n scope={scope}\n canManageOrg={canManageOrg}\n appName={appName}\n />\n ),\n },\n ...extraTabs,\n ...scopedExtraTabs,\n ],\n [appName, canManageOrg, extraTabs, scope, scopedExtraTabs],\n );\n const visibleTabs = useMemo(\n () => tabs.filter((tab) => !normalizedHiddenTabs.has(tab.id)),\n [normalizedHiddenTabs, tabs],\n );\n const fallbackTab = visibleTabs.some((tab) => tab.id === defaultTab)\n ? defaultTab\n : (visibleTabs[0]?.id ?? \"context\");\n const [internalTab, setInternalTab] = useState(() => {\n if (typeof window === \"undefined\") return fallbackTab;\n return resolveTabId(visibleTabs, window.location.hash) ?? fallbackTab;\n });\n const isControlled = value !== undefined;\n const activeTab = isControlled ? value : internalTab;\n const selectedTab =\n visibleTabs.find((tab) => tab.id === activeTab) ?? visibleTabs[0];\n const tabGroups = useMemo(() => {\n const groups: Array<{ id: string; tabs: SettingsTabItem[] }> = [];\n for (const tab of visibleTabs) {\n const groupId = tab.group ?? \"agent\";\n const previous = groups.at(-1);\n if (previous?.id === groupId) previous.tabs.push(tab);\n else groups.push({ id: groupId, tabs: [tab] });\n }\n return groups;\n }, [visibleTabs]);\n\n useEffect(() => {\n if (!isControlled && !visibleTabs.some((tab) => tab.id === internalTab)) {\n setInternalTab(fallbackTab);\n }\n }, [fallbackTab, internalTab, isControlled, visibleTabs]);\n\n useEffect(() => {\n if (isControlled) return;\n const onHashChange = () => {\n const next = resolveTabId(visibleTabs, window.location.hash);\n if (next) setInternalTab(next);\n };\n window.addEventListener(\"hashchange\", onHashChange);\n return () => window.removeEventListener(\"hashchange\", onHashChange);\n }, [isControlled, visibleTabs]);\n\n const changeTab = useCallback(\n (tabId: string) => {\n if (!isControlled) setInternalTab(tabId);\n onValueChange?.(tabId);\n },\n [isControlled, onValueChange],\n );\n\n const searchIndex = useMemo(() => {\n const entries: Array<\n SettingsSearchEntry & { tabId: string; haystack: string }\n > = [];\n for (const tab of visibleTabs) {\n entries.push({\n id: `tab:${tab.id}`,\n label: tab.label,\n keywords: tab.keywords,\n tabId: tab.id,\n haystack: `${tab.label} ${tab.keywords ?? \"\"}`.toLowerCase(),\n });\n for (const entry of tab.searchEntries ?? []) {\n entries.push({\n ...entry,\n tabId: entry.tabId ?? tab.id,\n haystack:\n `${entry.label} ${entry.keywords ?? \"\"} ${entry.description ?? \"\"} ${tab.label}`.toLowerCase(),\n });\n }\n }\n return entries;\n }, [visibleTabs]);\n const results = useMemo(() => {\n const terms = query.trim().toLowerCase().split(/\\s+/).filter(Boolean);\n if (!terms.length) return [];\n return searchIndex\n .filter((entry) => terms.every((term) => entry.haystack.includes(term)))\n .sort((a, b) => a.label.localeCompare(b.label));\n }, [query, searchIndex]);\n\n const selectSearchResult = useCallback(\n (entry: (typeof searchIndex)[number]) => {\n changeTab(entry.tabId);\n setQuery(\"\");\n if (isControlled || typeof window === \"undefined\") return;\n if (entry.hash) {\n window.history.pushState(\n null,\n \"\",\n `${window.location.pathname}${window.location.search}#${entry.hash.replace(/^#/, \"\")}`,\n );\n window.dispatchEvent(new Event(\"hashchange\"));\n } else {\n updateTabHash(entry.tabId);\n }\n },\n [changeTab, isControlled],\n );\n\n return (\n <div\n ref={rootRef}\n className={cn(\n \"flex h-full min-h-0 w-full flex-col overflow-hidden bg-background\",\n className,\n )}\n >\n <div className=\"flex min-h-0 flex-1 flex-col sm:flex-row\">\n <div className=\"flex shrink-0 flex-col gap-2 bg-background p-2 sm:min-h-0 sm:w-56 sm:overflow-y-auto sm:p-3\">\n {enableSearch ? (\n <div className=\"relative sm:mb-1\">\n <IconSearch className=\"pointer-events-none absolute start-2.5 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground\" />\n <input\n ref={searchRef}\n type=\"search\"\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === \"Escape\") setQuery(\"\");\n if (event.key === \"Enter\" && results[0]) {\n event.preventDefault();\n selectSearchResult(results[0]);\n }\n }}\n placeholder={searchPlaceholder}\n aria-label={searchPlaceholder}\n className=\"h-8 w-full rounded-md border border-border bg-background ps-8 pe-7 text-[13px] text-foreground outline-none transition-colors placeholder:text-muted-foreground focus:border-foreground/30 focus:ring-2 focus:ring-accent/40\"\n />\n {query && (\n <button\n type=\"button\"\n onClick={() => setQuery(\"\")}\n aria-label=\"Clear search\"\n className=\"absolute end-1.5 top-1/2 flex size-5 -translate-y-1/2 cursor-pointer items-center justify-center rounded text-muted-foreground hover:bg-accent/60 hover:text-foreground\"\n >\n <IconX className=\"size-3.5\" />\n </button>\n )}\n </div>\n ) : null}\n {query.trim() ? (\n <div\n role=\"listbox\"\n aria-label=\"Agent search results\"\n className=\"flex flex-col gap-0.5\"\n >\n {results.length === 0 ? (\n <p className=\"px-2 py-6 text-center text-xs text-muted-foreground\">\n No matching items\n </p>\n ) : (\n results.map((entry) => (\n <button\n key={entry.id}\n type=\"button\"\n role=\"option\"\n onClick={() => selectSearchResult(entry)}\n className=\"flex cursor-pointer items-start gap-2 rounded-md px-2.5 py-2 text-start text-sm text-foreground hover:bg-accent/60\"\n >\n <span className=\"flex min-w-0 flex-col\">\n <span className=\"truncate font-medium\">\n {entry.label}\n </span>\n <span className=\"truncate text-[11px] text-muted-foreground\">\n {entry.description ?? entry.tabId}\n </span>\n </span>\n </button>\n ))\n )}\n </div>\n ) : (\n <nav\n aria-label=\"Agent sections\"\n role=\"tablist\"\n className=\"flex gap-1 overflow-x-auto sm:flex-col sm:overflow-x-visible\"\n >\n {tabGroups.map((group, groupIndex) => (\n <div\n key={group.id}\n className={cn(\n \"contents sm:block\",\n groupIndex > 0 &&\n \"sm:mt-2 sm:border-t sm:border-border/60 sm:pt-2\",\n )}\n >\n {group.id === \"resources\" && (\n <div className=\"hidden px-2.5 pb-1 pt-1 text-[10px] font-semibold uppercase tracking-[0.16em] text-muted-foreground/50 sm:block\">\n Agent resources\n </div>\n )}\n {group.id === \"agent\" && (\n <div className=\"hidden px-2.5 pb-1 pt-1 text-[10px] font-semibold uppercase tracking-[0.16em] text-muted-foreground/50 sm:block\">\n Agent operations\n </div>\n )}\n <div className=\"contents sm:flex sm:flex-col sm:gap-1\">\n {group.tabs.map((tab) => {\n const Icon = tab.icon as SettingsTabIcon | undefined;\n const selected = tab.id === selectedTab?.id;\n return (\n <button\n key={tab.id}\n type=\"button\"\n id={`agent-tab-${tab.id}`}\n role=\"tab\"\n aria-selected={selected}\n aria-controls={`agent-tabpanel-${tab.id}`}\n onClick={() => {\n changeTab(tab.id);\n if (!isControlled) updateTabHash(tab.id);\n }}\n className={cn(\n \"flex min-h-9 shrink-0 cursor-pointer items-center gap-2 rounded-md px-3 py-2 text-start text-sm font-medium transition-colors sm:w-full\",\n selected\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:bg-accent/50 hover:text-foreground\",\n )}\n >\n {Icon ? (\n <Icon\n className={cn(\n \"size-4 shrink-0\",\n selected\n ? \"text-foreground\"\n : \"text-muted-foreground\",\n )}\n />\n ) : null}\n <span className=\"truncate\">{tab.label}</span>\n </button>\n );\n })}\n </div>\n </div>\n ))}\n </nav>\n )}\n </div>\n <div\n id={`agent-tabpanel-${selectedTab?.id ?? \"context\"}`}\n role=\"tabpanel\"\n aria-labelledby={`agent-tab-${selectedTab?.id ?? \"context\"}`}\n className=\"min-h-0 min-w-0 flex-1 overflow-y-auto p-4 sm:p-6\"\n >\n {selectedTab?.content ?? <EmptySlot label=\"Agent section\" />}\n </div>\n </div>\n </div>\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"message-scroller.d.ts","sourceRoot":"","sources":["../../../../src/client/components/ui/message-scroller.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,IAAI,qBAAqB,EACxC,kBAAkB,EAClB,4BAA4B,EAC5B,4BAA4B,EAC5B,KAAK,oCAAoC,EACzC,KAAK,0BAA0B,EAC/B,KAAK,4BAA4B,EACjC,KAAK,yBAAyB,EAC9B,KAAK,8BAA8B,EACpC,MAAM,gCAAgC,CAAC;AAExC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,KAAK,4BAA4B,GAAG,KAAK,CAAC,cAAc,CACtD,OAAO,qBAAqB,CAAC,QAAQ,CACtC,CAAC;AACF,KAAK,wBAAwB,GAAG,KAAK,CAAC,cAAc,CAClD,OAAO,qBAAqB,CAAC,IAAI,CAClC,CAAC;AACF,KAAK,4BAA4B,GAAG,KAAK,CAAC,cAAc,CACtD,OAAO,qBAAqB,CAAC,QAAQ,CACtC,CAAC;AACF,KAAK,2BAA2B,GAAG,KAAK,CAAC,cAAc,CACrD,OAAO,qBAAqB,CAAC,OAAO,CACrC,CAAC;AACF,KAAK,wBAAwB,GAAG,KAAK,CAAC,cAAc,CAClD,OAAO,qBAAqB,CAAC,IAAI,CAClC,CAAC;AACF,KAAK,0BAA0B,GAAG,KAAK,CAAC,cAAc,CACpD,OAAO,qBAAqB,CAAC,MAAM,CACpC,CAAC;AAEF,iBAAS,uBAAuB,CAAC,KAAK,EAAE,4BAA4B,qBAEnE;AAED,iBAAS,eAAe,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,wBAAwB,qBAOzE;AAED,iBAAS,uBAAuB,CAAC,EAC/B,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,4BAA4B,qBAuB9B;AAED,iBAAS,sBAAsB,CAAC,EAC9B,SAAS,EACT,eAAe,EACf,GAAG,KAAK,EACT,EAAE,2BAA2B,qBAQ7B;AAED,iBAAS,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,qBAE3D;AAED,iBAAS,qBAAqB,CAAC,EAC7B,SAAS,EACT,QAAQ,EACR,MAAM,EACN,GAAG,KAAK,EACT,EAAE,0BAA0B,qBA2B5B;AAED,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,4BAA4B,EAC5B,4BAA4B,EAC5B,KAAK,oCAAoC,EACzC,KAAK,0BAA0B,EAC/B,KAAK,4BAA4B,EACjC,KAAK,yBAAyB,EAC9B,KAAK,8BAA8B,GACpC,CAAC"}
1
+ {"version":3,"file":"message-scroller.d.ts","sourceRoot":"","sources":["../../../../src/client/components/ui/message-scroller.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,IAAI,qBAAqB,EACxC,kBAAkB,EAClB,4BAA4B,EAC5B,4BAA4B,EAC5B,KAAK,oCAAoC,EACzC,KAAK,0BAA0B,EAC/B,KAAK,4BAA4B,EACjC,KAAK,yBAAyB,EAC9B,KAAK,8BAA8B,EACpC,MAAM,gCAAgC,CAAC;AAExC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,KAAK,4BAA4B,GAAG,KAAK,CAAC,cAAc,CACtD,OAAO,qBAAqB,CAAC,QAAQ,CACtC,CAAC;AACF,KAAK,wBAAwB,GAAG,KAAK,CAAC,cAAc,CAClD,OAAO,qBAAqB,CAAC,IAAI,CAClC,CAAC;AACF,KAAK,4BAA4B,GAAG,KAAK,CAAC,cAAc,CACtD,OAAO,qBAAqB,CAAC,QAAQ,CACtC,CAAC;AACF,KAAK,2BAA2B,GAAG,KAAK,CAAC,cAAc,CACrD,OAAO,qBAAqB,CAAC,OAAO,CACrC,CAAC;AACF,KAAK,wBAAwB,GAAG,KAAK,CAAC,cAAc,CAClD,OAAO,qBAAqB,CAAC,IAAI,CAClC,CAAC;AACF,KAAK,0BAA0B,GAAG,KAAK,CAAC,cAAc,CACpD,OAAO,qBAAqB,CAAC,MAAM,CACpC,CAAC;AAEF,iBAAS,uBAAuB,CAAC,KAAK,EAAE,4BAA4B,qBAEnE;AAED,iBAAS,eAAe,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,wBAAwB,qBAOzE;AAED,iBAAS,uBAAuB,CAAC,EAC/B,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,4BAA4B,qBAe9B;AAED,iBAAS,sBAAsB,CAAC,EAC9B,SAAS,EACT,eAAe,EACf,GAAG,KAAK,EACT,EAAE,2BAA2B,qBAQ7B;AAED,iBAAS,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,qBAE3D;AAED,iBAAS,qBAAqB,CAAC,EAC7B,SAAS,EACT,QAAQ,EACR,MAAM,EACN,GAAG,KAAK,EACT,EAAE,0BAA0B,qBA2B5B;AAED,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,4BAA4B,EAC5B,4BAA4B,EAC5B,KAAK,oCAAoC,EACzC,KAAK,0BAA0B,EAC/B,KAAK,4BAA4B,EACjC,KAAK,yBAAyB,EAC9B,KAAK,8BAA8B,GACpC,CAAC"}
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { MessageScroller as ShadcnMessageScroller, useMessageScroller, useMessageScrollerScrollable, useMessageScrollerVisibility, } from "@shadcn/react/message-scroller";
3
3
  import { IconChevronDown } from "@tabler/icons-react";
4
4
  import { cn } from "../../utils.js";
@@ -10,7 +10,7 @@ function MessageScroller({ className, ...props }) {
10
10
  }
11
11
  function MessageScrollerViewport({ className, children, ...props }) {
12
12
  const { start: hasContentAbove } = useMessageScrollerScrollable();
13
- return (_jsxs(ShadcnMessageScroller.Viewport, { className: cn("min-h-0 flex-1 overflow-y-auto overflow-x-hidden", className), ...props, children: [hasContentAbove && (_jsx("div", { "aria-hidden": "true", className: "pointer-events-none sticky top-0 z-10 h-0", "data-message-scroller-top-fade": true, children: _jsx("div", { className: "absolute inset-x-0 top-0 h-12 bg-gradient-to-b from-background via-background/90 to-transparent" }) })), children] }));
13
+ return (_jsx(ShadcnMessageScroller.Viewport, { className: cn("min-h-0 flex-1 overflow-y-auto overflow-x-hidden", hasContentAbove && "message-scroller-viewport--top-fade", className), ...props, children: children }));
14
14
  }
15
15
  function MessageScrollerContent({ className, spacerClassName, ...props }) {
16
16
  return (_jsx(ShadcnMessageScroller.Content, { className: cn("flex flex-col", className), spacerClassName: cn("shrink-0", spacerClassName), ...props }));