@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":"message-scroller.js","sourceRoot":"","sources":["../../../../src/client/components/ui/message-scroller.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,eAAe,IAAI,qBAAqB,EACxC,kBAAkB,EAClB,4BAA4B,EAC5B,4BAA4B,GAM7B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAGtD,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAqBpC,SAAS,uBAAuB,CAAC,KAAmC;IAClE,OAAO,KAAC,qBAAqB,CAAC,QAAQ,OAAK,KAAK,GAAI,CAAC;AACvD,CAAC;AAED,SAAS,eAAe,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAA4B;IACxE,OAAO,CACL,KAAC,qBAAqB,CAAC,IAAI,IACzB,SAAS,EAAE,EAAE,CAAC,uCAAuC,EAAE,SAAS,CAAC,KAC7D,KAAK,GACT,CACH,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAAC,EAC/B,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACqB;IAC7B,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,4BAA4B,EAAE,CAAC;IAElE,OAAO,CACL,MAAC,qBAAqB,CAAC,QAAQ,IAC7B,SAAS,EAAE,EAAE,CACX,kDAAkD,EAClD,SAAS,CACV,KACG,KAAK,aAER,eAAe,IAAI,CAClB,6BACc,MAAM,EAClB,SAAS,EAAC,2CAA2C,oDAGrD,cAAK,SAAS,EAAC,iGAAiG,GAAG,GAC/G,CACP,EACA,QAAQ,IACsB,CAClC,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAAC,EAC9B,SAAS,EACT,eAAe,EACf,GAAG,KAAK,EACoB;IAC5B,OAAO,CACL,KAAC,qBAAqB,CAAC,OAAO,IAC5B,SAAS,EAAE,EAAE,CAAC,eAAe,EAAE,SAAS,CAAC,EACzC,eAAe,EAAE,EAAE,CAAC,UAAU,EAAE,eAAe,CAAC,KAC5C,KAAK,GACT,CACH,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,KAA+B;IAC1D,OAAO,KAAC,qBAAqB,CAAC,IAAI,OAAK,KAAK,GAAI,CAAC;AACnD,CAAC;AAED,SAAS,qBAAqB,CAAC,EAC7B,SAAS,EACT,QAAQ,EACR,MAAM,EACN,GAAG,KAAK,EACmB;IAC3B,OAAO,CACL,KAAC,qBAAqB,CAAC,MAAM,IAC3B,MAAM,EACJ,MAAM;YACN,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAChB,cAAK,SAAS,EAAC,oCAAoC,YACjD,oBACM,WAAW,EACf,SAAS,EAAE,EAAE,CACX,oHAAoH,EACpH,4BAA4B,EAC5B,SAAS,EACT,WAAW,CAAC,SAA+B,CAC5C,gBACU,kBAAkB,YAE5B,QAAQ,IAAI,CACX,KAAC,eAAe,IAAC,SAAS,EAAC,mCAAmC,GAAG,CAClE,GACM,GACL,CACP,CAAC,KAEA,KAAK,GACT,CACH,CAAC;AACJ,CAAC;AAED,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,4BAA4B,EAC5B,4BAA4B,GAM7B,CAAC","sourcesContent":["import {\n MessageScroller as ShadcnMessageScroller,\n useMessageScroller,\n useMessageScrollerScrollable,\n useMessageScrollerVisibility,\n type MessageScrollerDefaultScrollPosition,\n type MessageScrollerScrollAlign,\n type MessageScrollerScrollOptions,\n type MessageScrollerScrollable,\n type MessageScrollerVisibilityState,\n} from \"@shadcn/react/message-scroller\";\nimport { IconChevronDown } from \"@tabler/icons-react\";\nimport * as React from \"react\";\n\nimport { cn } from \"../../utils.js\";\n\ntype MessageScrollerProviderProps = React.ComponentProps<\n typeof ShadcnMessageScroller.Provider\n>;\ntype MessageScrollerRootProps = React.ComponentProps<\n typeof ShadcnMessageScroller.Root\n>;\ntype MessageScrollerViewportProps = React.ComponentProps<\n typeof ShadcnMessageScroller.Viewport\n>;\ntype MessageScrollerContentProps = React.ComponentProps<\n typeof ShadcnMessageScroller.Content\n>;\ntype MessageScrollerItemProps = React.ComponentProps<\n typeof ShadcnMessageScroller.Item\n>;\ntype MessageScrollerButtonProps = React.ComponentProps<\n typeof ShadcnMessageScroller.Button\n>;\n\nfunction MessageScrollerProvider(props: MessageScrollerProviderProps) {\n return <ShadcnMessageScroller.Provider {...props} />;\n}\n\nfunction MessageScroller({ className, ...props }: MessageScrollerRootProps) {\n return (\n <ShadcnMessageScroller.Root\n className={cn(\"relative flex min-h-0 flex-1 flex-col\", className)}\n {...props}\n />\n );\n}\n\nfunction MessageScrollerViewport({\n className,\n children,\n ...props\n}: MessageScrollerViewportProps) {\n const { start: hasContentAbove } = useMessageScrollerScrollable();\n\n return (\n <ShadcnMessageScroller.Viewport\n className={cn(\n \"min-h-0 flex-1 overflow-y-auto overflow-x-hidden\",\n className,\n )}\n {...props}\n >\n {hasContentAbove && (\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none sticky top-0 z-10 h-0\"\n data-message-scroller-top-fade\n >\n <div className=\"absolute inset-x-0 top-0 h-12 bg-gradient-to-b from-background via-background/90 to-transparent\" />\n </div>\n )}\n {children}\n </ShadcnMessageScroller.Viewport>\n );\n}\n\nfunction MessageScrollerContent({\n className,\n spacerClassName,\n ...props\n}: MessageScrollerContentProps) {\n return (\n <ShadcnMessageScroller.Content\n className={cn(\"flex flex-col\", className)}\n spacerClassName={cn(\"shrink-0\", spacerClassName)}\n {...props}\n />\n );\n}\n\nfunction MessageScrollerItem(props: MessageScrollerItemProps) {\n return <ShadcnMessageScroller.Item {...props} />;\n}\n\nfunction MessageScrollerButton({\n className,\n children,\n render,\n ...props\n}: MessageScrollerButtonProps) {\n return (\n <ShadcnMessageScroller.Button\n render={\n render ??\n ((buttonProps) => (\n <div className=\"shrink-0 flex justify-center -mb-1\">\n <button\n {...buttonProps}\n className={cn(\n \"flex h-7 w-7 items-center justify-center rounded-full border border-border bg-background shadow-sm hover:bg-accent\",\n \"data-[active=false]:hidden\",\n className,\n buttonProps.className as string | undefined,\n )}\n aria-label=\"Scroll to bottom\"\n >\n {children ?? (\n <IconChevronDown className=\"h-3.5 w-3.5 text-muted-foreground\" />\n )}\n </button>\n </div>\n ))\n }\n {...props}\n />\n );\n}\n\nexport {\n MessageScroller,\n MessageScrollerButton,\n MessageScrollerContent,\n MessageScrollerItem,\n MessageScrollerProvider,\n MessageScrollerViewport,\n useMessageScroller,\n useMessageScrollerScrollable,\n useMessageScrollerVisibility,\n type MessageScrollerDefaultScrollPosition,\n type MessageScrollerScrollAlign,\n type MessageScrollerScrollOptions,\n type MessageScrollerScrollable,\n type MessageScrollerVisibilityState,\n};\n"]}
1
+ {"version":3,"file":"message-scroller.js","sourceRoot":"","sources":["../../../../src/client/components/ui/message-scroller.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,eAAe,IAAI,qBAAqB,EACxC,kBAAkB,EAClB,4BAA4B,EAC5B,4BAA4B,GAM7B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAGtD,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAqBpC,SAAS,uBAAuB,CAAC,KAAmC;IAClE,OAAO,KAAC,qBAAqB,CAAC,QAAQ,OAAK,KAAK,GAAI,CAAC;AACvD,CAAC;AAED,SAAS,eAAe,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAA4B;IACxE,OAAO,CACL,KAAC,qBAAqB,CAAC,IAAI,IACzB,SAAS,EAAE,EAAE,CAAC,uCAAuC,EAAE,SAAS,CAAC,KAC7D,KAAK,GACT,CACH,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAAC,EAC/B,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACqB;IAC7B,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,4BAA4B,EAAE,CAAC;IAElE,OAAO,CACL,KAAC,qBAAqB,CAAC,QAAQ,IAC7B,SAAS,EAAE,EAAE,CACX,kDAAkD,EAClD,eAAe,IAAI,qCAAqC,EACxD,SAAS,CACV,KACG,KAAK,YAER,QAAQ,GACsB,CAClC,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAAC,EAC9B,SAAS,EACT,eAAe,EACf,GAAG,KAAK,EACoB;IAC5B,OAAO,CACL,KAAC,qBAAqB,CAAC,OAAO,IAC5B,SAAS,EAAE,EAAE,CAAC,eAAe,EAAE,SAAS,CAAC,EACzC,eAAe,EAAE,EAAE,CAAC,UAAU,EAAE,eAAe,CAAC,KAC5C,KAAK,GACT,CACH,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,KAA+B;IAC1D,OAAO,KAAC,qBAAqB,CAAC,IAAI,OAAK,KAAK,GAAI,CAAC;AACnD,CAAC;AAED,SAAS,qBAAqB,CAAC,EAC7B,SAAS,EACT,QAAQ,EACR,MAAM,EACN,GAAG,KAAK,EACmB;IAC3B,OAAO,CACL,KAAC,qBAAqB,CAAC,MAAM,IAC3B,MAAM,EACJ,MAAM;YACN,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAChB,cAAK,SAAS,EAAC,oCAAoC,YACjD,oBACM,WAAW,EACf,SAAS,EAAE,EAAE,CACX,oHAAoH,EACpH,4BAA4B,EAC5B,SAAS,EACT,WAAW,CAAC,SAA+B,CAC5C,gBACU,kBAAkB,YAE5B,QAAQ,IAAI,CACX,KAAC,eAAe,IAAC,SAAS,EAAC,mCAAmC,GAAG,CAClE,GACM,GACL,CACP,CAAC,KAEA,KAAK,GACT,CACH,CAAC;AACJ,CAAC;AAED,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,4BAA4B,EAC5B,4BAA4B,GAM7B,CAAC","sourcesContent":["import {\n MessageScroller as ShadcnMessageScroller,\n useMessageScroller,\n useMessageScrollerScrollable,\n useMessageScrollerVisibility,\n type MessageScrollerDefaultScrollPosition,\n type MessageScrollerScrollAlign,\n type MessageScrollerScrollOptions,\n type MessageScrollerScrollable,\n type MessageScrollerVisibilityState,\n} from \"@shadcn/react/message-scroller\";\nimport { IconChevronDown } from \"@tabler/icons-react\";\nimport * as React from \"react\";\n\nimport { cn } from \"../../utils.js\";\n\ntype MessageScrollerProviderProps = React.ComponentProps<\n typeof ShadcnMessageScroller.Provider\n>;\ntype MessageScrollerRootProps = React.ComponentProps<\n typeof ShadcnMessageScroller.Root\n>;\ntype MessageScrollerViewportProps = React.ComponentProps<\n typeof ShadcnMessageScroller.Viewport\n>;\ntype MessageScrollerContentProps = React.ComponentProps<\n typeof ShadcnMessageScroller.Content\n>;\ntype MessageScrollerItemProps = React.ComponentProps<\n typeof ShadcnMessageScroller.Item\n>;\ntype MessageScrollerButtonProps = React.ComponentProps<\n typeof ShadcnMessageScroller.Button\n>;\n\nfunction MessageScrollerProvider(props: MessageScrollerProviderProps) {\n return <ShadcnMessageScroller.Provider {...props} />;\n}\n\nfunction MessageScroller({ className, ...props }: MessageScrollerRootProps) {\n return (\n <ShadcnMessageScroller.Root\n className={cn(\"relative flex min-h-0 flex-1 flex-col\", className)}\n {...props}\n />\n );\n}\n\nfunction MessageScrollerViewport({\n className,\n children,\n ...props\n}: MessageScrollerViewportProps) {\n const { start: hasContentAbove } = useMessageScrollerScrollable();\n\n return (\n <ShadcnMessageScroller.Viewport\n className={cn(\n \"min-h-0 flex-1 overflow-y-auto overflow-x-hidden\",\n hasContentAbove && \"message-scroller-viewport--top-fade\",\n className,\n )}\n {...props}\n >\n {children}\n </ShadcnMessageScroller.Viewport>\n );\n}\n\nfunction MessageScrollerContent({\n className,\n spacerClassName,\n ...props\n}: MessageScrollerContentProps) {\n return (\n <ShadcnMessageScroller.Content\n className={cn(\"flex flex-col\", className)}\n spacerClassName={cn(\"shrink-0\", spacerClassName)}\n {...props}\n />\n );\n}\n\nfunction MessageScrollerItem(props: MessageScrollerItemProps) {\n return <ShadcnMessageScroller.Item {...props} />;\n}\n\nfunction MessageScrollerButton({\n className,\n children,\n render,\n ...props\n}: MessageScrollerButtonProps) {\n return (\n <ShadcnMessageScroller.Button\n render={\n render ??\n ((buttonProps) => (\n <div className=\"shrink-0 flex justify-center -mb-1\">\n <button\n {...buttonProps}\n className={cn(\n \"flex h-7 w-7 items-center justify-center rounded-full border border-border bg-background shadow-sm hover:bg-accent\",\n \"data-[active=false]:hidden\",\n className,\n buttonProps.className as string | undefined,\n )}\n aria-label=\"Scroll to bottom\"\n >\n {children ?? (\n <IconChevronDown className=\"h-3.5 w-3.5 text-muted-foreground\" />\n )}\n </button>\n </div>\n ))\n }\n {...props}\n />\n );\n}\n\nexport {\n MessageScroller,\n MessageScrollerButton,\n MessageScrollerContent,\n MessageScrollerItem,\n MessageScrollerProvider,\n MessageScrollerViewport,\n useMessageScroller,\n useMessageScrollerScrollable,\n useMessageScrollerVisibility,\n type MessageScrollerDefaultScrollPosition,\n type MessageScrollerScrollAlign,\n type MessageScrollerScrollOptions,\n type MessageScrollerScrollable,\n type MessageScrollerVisibilityState,\n};\n"]}
@@ -260,11 +260,11 @@ export function ResourceTree({ tree, variant = "tree", selectedId, onSelect, onC
260
260
  }, [onDrop, readOnly]);
261
261
  return (_jsxs("div", { className: cn("p-1", dragOver && !readOnly && "ring-1 ring-inset ring-accent"), onDragOver: readOnly ? undefined : handleDragOver, onDragLeave: readOnly ? undefined : handleDragLeave, onDrop: readOnly ? undefined : handleDrop, children: [_jsx("div", { className: "group/root flex items-center justify-between px-1.5 py-1", children: _jsxs(TooltipProvider, { delayDuration: 200, children: [_jsxs("span", { className: "flex items-center gap-1.5 text-[11px] font-medium uppercase tracking-wide text-muted-foreground/60", children: [title, headingHint && (_jsx("span", { className: "text-[10px] font-normal normal-case tracking-normal text-muted-foreground/50", children: headingHint })), titleTooltip && (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", "aria-label": `About ${title}`, className: "flex h-3.5 w-3.5 items-center justify-center rounded-full text-muted-foreground/40 hover:text-muted-foreground", children: _jsx(IconHelpCircle, { className: "h-3 w-3" }) }) }), _jsx(TooltipContent, { children: titleTooltip })] }))] }), sectionAction ??
262
262
  (variant === "tree" && !readOnly && (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { onClick: () => handleStartCreate("", "file"), "aria-label": "New file", className: "flex h-5 w-5 items-center justify-center rounded text-muted-foreground/50 opacity-0 group-hover/root:opacity-100 hover:text-foreground hover:bg-accent/50", children: _jsx(IconPlus, { className: "h-3 w-3" }) }) }), _jsx(TooltipContent, { children: "New file" })] })))] }) }), variant === "collection"
263
- ? leafResources.length > 0 && (_jsx("div", { className: "divide-y divide-border/60", children: leafResources.map((node) => (_jsx(CollectionResourceRow, { node: node, selectedId: selectedId, deletingId: deletingId, readOnly: readOnly, onSelect: onSelect, onDelete: onDelete }, node.resource.id))) }))
263
+ ? leafResources.length > 0 && (_jsx("div", { className: "space-y-1", children: leafResources.map((node) => (_jsx(CollectionResourceRow, { node: node, selectedId: selectedId, deletingId: deletingId, readOnly: readOnly, onSelect: onSelect, onDelete: onDelete }, node.resource.id))) }))
264
264
  : tree.map((node) => (_jsx(TreeNodeRow, { node: node, depth: 0, expanded: expanded, selectedId: selectedId, deletingId: deletingId, readOnly: readOnly, onToggle: toggleExpand, onSelect: onSelect, onDelete: onDelete, onStartCreate: handleStartCreate }, node.resource?.id ?? node.path))), isLoading && isEmpty && (_jsx("div", { className: cn("px-1 py-1"), children: Array.from({ length: 3 }).map((_, i) => (_jsxs("div", { className: cn("flex items-center gap-2 px-1.5 py-1", variant === "collection" && "gap-3 px-2.5 py-3"), children: [_jsx("div", { className: cn("rounded bg-muted-foreground/10 animate-pulse", variant === "collection" ? "size-8" : "h-3.5 w-3.5"), style: { animationDelay: `${i * 75}ms` } }), _jsx("div", { className: "h-3 rounded bg-muted-foreground/10 animate-pulse", style: {
265
265
  width: `${50 + ((i * 37) % 40)}%`,
266
266
  animationDelay: `${i * 75}ms`,
267
- } })] }, i))) })), creating && creating.parentPath === "" && (_jsx(InlineInput, { depth: 0, onConfirm: handleConfirmCreate, onCancel: handleCancelCreate })), creating && creating.parentPath !== "" && (_jsx(InlineInput, { depth: creating.parentPath.split("/").filter(Boolean).length, onConfirm: handleConfirmCreate, onCancel: handleCancelCreate })), isEmpty && !creating && !isLoading && (_jsxs("div", { className: "flex flex-col items-start border-y border-border/60 px-2 py-5", children: [_jsx("p", { className: "ps-5 text-xs text-muted-foreground", children: variant === "collection"
267
+ } })] }, i))) })), creating && creating.parentPath === "" && (_jsx(InlineInput, { depth: 0, onConfirm: handleConfirmCreate, onCancel: handleCancelCreate })), creating && creating.parentPath !== "" && (_jsx(InlineInput, { depth: creating.parentPath.split("/").filter(Boolean).length, onConfirm: handleConfirmCreate, onCancel: handleCancelCreate })), isEmpty && !creating && !isLoading && (_jsxs("div", { className: "flex flex-col items-start px-2 py-5", children: [_jsx("p", { className: "text-xs text-muted-foreground", children: variant === "collection"
268
268
  ? "No resources in this collection yet"
269
269
  : "No files yet" }), emptyStateAction && _jsx("div", { className: "mt-4", children: emptyStateAction })] }))] }));
270
270
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ResourceTree.js","sourceRoot":"","sources":["../../../src/client/resources/ResourceTree.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n IconChevronRight,\n IconChevronDown,\n IconFolder,\n IconFileText,\n IconFileCode,\n IconPhoto,\n IconFile,\n IconPlus,\n IconTrash,\n IconHierarchy2,\n IconPlugConnected,\n IconBrowser,\n IconDeviceDesktop,\n IconBulb,\n IconClockHour3,\n IconLoader2,\n IconHelpCircle,\n} from \"@tabler/icons-react\";\nimport React, { useState, useRef, useCallback } from \"react\";\n\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../components/ui/tooltip.js\";\nimport { cn } from \"../utils.js\";\nimport type { McpServer } from \"./use-mcp-servers.js\";\nimport type { TreeNode, ResourceMeta, JobMetadata } from \"./use-resources.js\";\n\nfunction StatusDot({\n className,\n tooltip,\n}: {\n className: string;\n tooltip: string;\n}) {\n return (\n <TooltipProvider delayDuration={200}>\n <Tooltip>\n <TooltipTrigger asChild>\n <span\n aria-label={tooltip}\n className={cn(\"ml-1 inline-block h-1.5 w-1.5 shrink-0\", className)}\n />\n </TooltipTrigger>\n <TooltipContent>{tooltip}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n}\n\n// ─── Helpers ────────────────────────────────────────────────────────────────\n\nfunction getFileIcon(node: TreeNode): React.ReactNode {\n if (node.kind === \"agent\") {\n return (\n <IconHierarchy2 className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n );\n }\n if (node.kind === \"remote-agent\" || node.kind === \"mcp-server\") {\n return (\n <IconPlugConnected className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n );\n }\n if (node.kind === \"mcp-builtin\") {\n return node.mcpBuiltinMeta?.exclusiveGroup === \"browser\" ? (\n <IconBrowser className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n ) : (\n <IconDeviceDesktop className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n );\n }\n if (node.kind === \"skill\") {\n return <IconBulb className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />;\n }\n if (node.kind === \"job\") {\n return (\n <IconClockHour3 className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n );\n }\n const name = node.name;\n const ext = name.split(\".\").pop()?.toLowerCase() ?? \"\";\n const iconClass = \"h-3.5 w-3.5 shrink-0 text-muted-foreground\";\n if (ext === \"md\" || ext === \"mdx\")\n return <IconFileText className={iconClass} />;\n if (\n [\"ts\", \"tsx\", \"js\", \"jsx\", \"json\", \"css\", \"html\", \"py\", \"sh\"].includes(ext)\n )\n return <IconFileCode className={iconClass} />;\n if ([\"png\", \"jpg\", \"jpeg\", \"gif\", \"svg\", \"webp\", \"ico\"].includes(ext))\n return <IconPhoto className={iconClass} />;\n return <IconFile className={iconClass} />;\n}\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\nexport interface ResourceTreeProps {\n tree: TreeNode[];\n /** Presentation mode for the resources: nested tree rows or a flat collection. */\n variant?: \"tree\" | \"collection\";\n selectedId: string | null;\n onSelect: (resource: ResourceMeta) => void;\n onCreateFile: (parentPath: string, name: string) => void;\n onCreateFolder: (parentPath: string, name: string) => void;\n onDelete: (id: string) => void;\n onRename: (id: string, newPath: string) => void;\n onDrop: (files: FileList) => void;\n /** Section title displayed as heading */\n title?: string;\n /** Tooltip for the section heading */\n titleTooltip?: string;\n /** Whether this section's tree is still loading */\n isLoading?: boolean;\n /** Resource id currently being deleted (shows spinner + muted row) */\n deletingId?: string | null;\n /** When true, hide create/delete/rename/upload affordances. Files stay readable. */\n readOnly?: boolean;\n /** Optional hint shown next to the heading (e.g. \"Read only\") */\n headingHint?: React.ReactNode;\n /** Scope-specific action shown beside the section heading. */\n sectionAction?: React.ReactNode;\n /** Scope-specific action shown beneath an empty collection message. */\n emptyStateAction?: React.ReactNode;\n}\n\ninterface CreatingState {\n parentPath: string;\n type: \"file\" | \"folder\";\n}\n\nfunction McpStatusDot({ server }: { server: McpServer }) {\n const status = server.status ?? { state: \"unknown\" as const };\n if (status.state === \"connected\") {\n return (\n <StatusDot\n className=\"rounded-full bg-green-500\"\n tooltip={`Connected: ${status.toolCount} tool${status.toolCount === 1 ? \"\" : \"s\"}`}\n />\n );\n }\n if (status.state === \"error\") {\n return (\n <StatusDot\n className=\"rounded-full bg-red-500\"\n tooltip={`Error: ${status.error}`}\n />\n );\n }\n return (\n <StatusDot\n className=\"rounded-full bg-muted-foreground/40\"\n tooltip=\"Connecting…\"\n />\n );\n}\n\nfunction BuiltinStatusDot({ node }: { node: TreeNode }) {\n const meta = node.mcpBuiltinMeta;\n if (!meta?.available) {\n return (\n <StatusDot\n className=\"rounded-full bg-muted-foreground/30\"\n tooltip={meta?.unavailableReason ?? \"Not available on this host\"}\n />\n );\n }\n if (!meta.scopeEnabled) {\n return (\n <StatusDot\n className=\"rounded-full bg-muted-foreground/40\"\n tooltip=\"Disabled\"\n />\n );\n }\n const status = meta.status?.[meta.scope];\n if (status?.state === \"connected\") {\n return (\n <StatusDot\n className=\"rounded-full bg-green-500\"\n tooltip={`Connected — ${status.toolCount} tool${status.toolCount === 1 ? \"\" : \"s\"}`}\n />\n );\n }\n if (status?.state === \"error\") {\n return (\n <StatusDot\n className=\"rounded-full bg-red-500\"\n tooltip={`Error: ${status.error}`}\n />\n );\n }\n return <StatusDot className=\"rounded-full bg-amber-500\" tooltip=\"Enabled\" />;\n}\n\nfunction JobStatusDot({ meta }: { meta: JobMetadata }) {\n if (!meta.enabled) {\n return (\n <StatusDot\n className=\"rounded-full bg-muted-foreground/40\"\n tooltip=\"Disabled\"\n />\n );\n }\n if (meta.lastStatus === \"running\") {\n return (\n <StatusDot\n className=\"rounded-full bg-blue-500 animate-pulse\"\n tooltip=\"Running\"\n />\n );\n }\n if (meta.lastStatus === \"error\") {\n return (\n <StatusDot\n className=\"rounded-full bg-red-500\"\n tooltip=\"Last run failed\"\n />\n );\n }\n if (meta.lastStatus === \"success\") {\n return (\n <StatusDot\n className=\"rounded-full bg-green-500\"\n tooltip=\"Last run succeeded\"\n />\n );\n }\n return (\n <StatusDot\n className=\"rounded-full bg-amber-500\"\n tooltip=\"Scheduled (not yet run)\"\n />\n );\n}\n\ntype LeafResourceNode = TreeNode & { resource: ResourceMeta };\n\nfunction getLeafResources(nodes: TreeNode[]): LeafResourceNode[] {\n return nodes.flatMap((node) => {\n if (node.type === \"folder\") {\n return getLeafResources(node.children ?? []);\n }\n return node.resource ? [node as LeafResourceNode] : [];\n });\n}\n\nfunction formatResourceSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction getCollectionDescriptor(node: LeafResourceNode): string {\n if (node.kind === \"agent\") {\n return (\n node.agentMeta?.description || node.agentMeta?.model || \"Custom agent\"\n );\n }\n if (node.kind === \"skill\") {\n return node.skillMeta?.description || \"Skill\";\n }\n if (node.kind === \"remote-agent\") {\n return (\n node.remoteAgentMeta?.description ||\n node.remoteAgentMeta?.url ||\n \"Remote agent\"\n );\n }\n if (node.kind === \"job\") {\n return (\n node.jobMeta?.scheduleDescription ||\n node.jobMeta?.schedule ||\n \"Scheduled job\"\n );\n }\n if (node.kind === \"mcp-server\") return \"MCP server\";\n if (node.kind === \"mcp-builtin\") return \"Built-in MCP\";\n return formatResourceSize(node.resource.size);\n}\n\nfunction CollectionResourceRow({\n node,\n selectedId,\n deletingId,\n readOnly,\n onSelect,\n onDelete,\n}: {\n node: LeafResourceNode;\n selectedId: string | null;\n deletingId?: string | null;\n readOnly?: boolean;\n onSelect: (resource: ResourceMeta) => void;\n onDelete: (id: string) => void;\n}) {\n const isSelected = node.resource.id === selectedId;\n const isDeleting = node.resource.id === deletingId;\n const [confirmingDelete, setConfirmingDelete] = useState(false);\n const descriptor = getCollectionDescriptor(node);\n\n const selectResource = () => {\n if (!isDeleting) onSelect(node.resource);\n };\n\n return (\n <div\n className={cn(\n \"group/collection-row flex w-full items-center gap-3 px-2.5 py-3 text-left transition-[background-color,opacity] duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/50\",\n isDeleting\n ? \"pointer-events-none opacity-40\"\n : isSelected\n ? \"bg-accent text-foreground\"\n : \"text-foreground hover:bg-accent/50\",\n )}\n onMouseLeave={() => setConfirmingDelete(false)}\n >\n <button\n type=\"button\"\n disabled={isDeleting}\n aria-pressed={isSelected}\n onClick={selectResource}\n className=\"flex min-w-0 flex-1 cursor-pointer items-center gap-3 text-left outline-none focus-visible:ring-2 focus-visible:ring-ring/50\"\n >\n <div\n className={cn(\n \"flex size-8 shrink-0 items-center justify-center rounded-md bg-muted/50\",\n isSelected && \"bg-background/70\",\n )}\n >\n {getFileIcon(node)}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex min-w-0 items-center gap-1.5\">\n <span className=\"min-w-0 truncate text-[12px] font-medium\">\n {node.name}\n </span>\n {node.jobMeta && <JobStatusDot meta={node.jobMeta} />}\n {node.mcpServerMeta && <McpStatusDot server={node.mcpServerMeta} />}\n {node.mcpBuiltinMeta && <BuiltinStatusDot node={node} />}\n </div>\n <div className=\"mt-0.5 flex min-w-0 items-center gap-1.5 text-[10px]\">\n <span className=\"min-w-0 truncate text-muted-foreground/60\">\n {node.resource.path}\n </span>\n <span className=\"shrink-0 text-muted-foreground/30\">·</span>\n <span className=\"max-w-[40%] shrink-0 truncate text-muted-foreground/80\">\n {descriptor}\n </span>\n </div>\n </div>\n </button>\n {!readOnly && node.kind !== \"mcp-builtin\" && (\n <div\n className={cn(\n \"flex shrink-0 items-center opacity-0 transition-opacity group-hover/collection-row:opacity-100 group-focus-within/collection-row:opacity-100\",\n confirmingDelete && \"opacity-100\",\n )}\n >\n <TooltipProvider delayDuration={200}>\n {isDeleting ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <span\n aria-label=\"Deleting…\"\n className=\"flex size-6 items-center justify-center rounded text-muted-foreground\"\n >\n <IconLoader2 className=\"size-3.5 animate-spin\" />\n </span>\n </TooltipTrigger>\n <TooltipContent>Deleting…</TooltipContent>\n </Tooltip>\n ) : (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n if (confirmingDelete) {\n onDelete(node.resource.id);\n setConfirmingDelete(false);\n } else {\n setConfirmingDelete(true);\n }\n }}\n aria-label={confirmingDelete ? \"Confirm delete\" : \"Delete\"}\n className={cn(\n \"flex size-6 items-center justify-center rounded text-muted-foreground hover:bg-accent/50 hover:text-destructive\",\n confirmingDelete && \"bg-destructive/10 text-destructive\",\n )}\n >\n <IconTrash className=\"size-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>\n {confirmingDelete ? \"Click again to delete\" : \"Delete\"}\n </TooltipContent>\n </Tooltip>\n )}\n </TooltipProvider>\n </div>\n )}\n </div>\n );\n}\n\n// ─── TreeNodeRow ────────────────────────────────────────────────────────────\n\nfunction TreeNodeRow({\n node,\n depth,\n expanded,\n selectedId,\n deletingId,\n readOnly,\n onToggle,\n onSelect,\n onDelete,\n onStartCreate,\n}: {\n node: TreeNode;\n depth: number;\n expanded: Set<string>;\n selectedId: string | null;\n deletingId?: string | null;\n readOnly?: boolean;\n onToggle: (path: string) => void;\n onSelect: (resource: ResourceMeta) => void;\n onDelete: (id: string) => void;\n onStartCreate: (parentPath: string, type: \"file\" | \"folder\") => void;\n}) {\n const isFolder = node.type === \"folder\";\n const isExpanded = expanded.has(node.path);\n const isSelected = node.resource?.id === selectedId;\n const isDeleting = !!node.resource && node.resource.id === deletingId;\n const [confirmingDelete, setConfirmingDelete] = useState(false);\n\n return (\n <div>\n <div\n className={cn(\n \"group/row flex items-center gap-1 rounded-md px-1.5 py-1 select-none\",\n isDeleting ? \"pointer-events-none opacity-40\" : \"cursor-pointer\",\n isSelected\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:bg-accent/50 hover:text-foreground\",\n )}\n style={{ paddingLeft: depth * 16 + 6 }}\n onClick={() => {\n if (isDeleting) return;\n if (isFolder) {\n onToggle(node.path);\n } else if (node.resource) {\n onSelect(node.resource);\n }\n }}\n onMouseLeave={() => setConfirmingDelete(false)}\n >\n {isFolder ? (\n isExpanded ? (\n <IconChevronDown className=\"h-3 w-3 shrink-0\" />\n ) : (\n <IconChevronRight className=\"h-3 w-3 shrink-0\" />\n )\n ) : (\n <span className=\"w-3 shrink-0\" />\n )}\n {isFolder ? (\n <IconFolder className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n ) : (\n getFileIcon(node)\n )}\n <span className=\"min-w-0 truncate text-[12px] leading-none\">\n {node.name}\n </span>\n {node.jobMeta && <JobStatusDot meta={node.jobMeta} />}\n {node.mcpServerMeta && <McpStatusDot server={node.mcpServerMeta} />}\n {node.mcpBuiltinMeta && <BuiltinStatusDot node={node} />}\n {!readOnly && (\n <div\n className={cn(\n \"ml-auto flex shrink-0 items-center gap-0.5 opacity-0 group-hover/row:opacity-100\",\n confirmingDelete && \"opacity-100\",\n )}\n >\n <TooltipProvider delayDuration={200}>\n {isFolder && (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={(e) => {\n e.stopPropagation();\n onStartCreate(node.path, \"file\");\n }}\n aria-label=\"New file\"\n className=\"flex h-5 w-5 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/50\"\n >\n <IconPlus className=\"h-3 w-3\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>New file</TooltipContent>\n </Tooltip>\n )}\n {node.resource &&\n node.kind !== \"mcp-builtin\" &&\n (isDeleting ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <span\n aria-label=\"Deleting…\"\n className=\"flex h-5 w-5 items-center justify-center rounded text-muted-foreground\"\n >\n <IconLoader2 className=\"h-3 w-3 animate-spin\" />\n </span>\n </TooltipTrigger>\n <TooltipContent>Deleting…</TooltipContent>\n </Tooltip>\n ) : (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={(e) => {\n e.stopPropagation();\n if (confirmingDelete) {\n onDelete(node.resource!.id);\n setConfirmingDelete(false);\n } else {\n setConfirmingDelete(true);\n }\n }}\n aria-label={\n confirmingDelete ? \"Confirm delete\" : \"Delete\"\n }\n className={cn(\n \"flex h-5 w-5 items-center justify-center rounded text-muted-foreground hover:text-destructive hover:bg-accent/50\",\n confirmingDelete &&\n \"bg-destructive/10 text-destructive\",\n )}\n >\n <IconTrash className=\"h-3 w-3\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>\n {confirmingDelete ? \"Click again to delete\" : \"Delete\"}\n </TooltipContent>\n </Tooltip>\n ))}\n </TooltipProvider>\n </div>\n )}\n </div>\n {isFolder && isExpanded && node.children && (\n <div>\n {node.children.map((child) => (\n <TreeNodeRow\n key={child.resource?.id ?? child.path}\n node={child}\n depth={depth + 1}\n expanded={expanded}\n selectedId={selectedId}\n deletingId={deletingId}\n readOnly={readOnly}\n onToggle={onToggle}\n onSelect={onSelect}\n onDelete={onDelete}\n onStartCreate={onStartCreate}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\n// ─── InlineInput ────────────────────────────────────────────────────────────\n\nfunction InlineInput({\n depth,\n onConfirm,\n onCancel,\n}: {\n depth: number;\n onConfirm: (name: string) => void;\n onCancel: () => void;\n}) {\n const inputRef = useRef<HTMLInputElement>(null);\n const [value, setValue] = useState(\"\");\n\n React.useEffect(() => {\n inputRef.current?.focus();\n }, []);\n\n return (\n <div\n className=\"flex items-center gap-1 px-1.5 py-0.5\"\n style={{ paddingLeft: depth * 16 + 6 + 16 }}\n >\n <IconFile className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <input\n ref={inputRef}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && value.trim()) {\n onConfirm(value.trim());\n } else if (e.key === \"Escape\") {\n onCancel();\n }\n }}\n onBlur={() => {\n if (value.trim()) {\n onConfirm(value.trim());\n } else {\n onCancel();\n }\n }}\n className=\"min-w-0 flex-1 bg-transparent text-[12px] leading-none text-foreground outline-none placeholder:text-muted-foreground/50\"\n placeholder=\"filename.md\"\n />\n </div>\n );\n}\n\n// ─── ResourceTree ───────────────────────────────────────────────────────────\n\nexport function ResourceTree({\n tree,\n variant = \"tree\",\n selectedId,\n onSelect,\n onCreateFile,\n onCreateFolder,\n onDelete,\n onDrop,\n title = \"Files\",\n titleTooltip,\n isLoading = false,\n deletingId = null,\n readOnly = false,\n headingHint,\n sectionAction,\n emptyStateAction,\n}: ResourceTreeProps) {\n const [expanded, setExpanded] = useState<Set<string>>(() => new Set());\n const [creating, setCreating] = useState<CreatingState | null>(null);\n const [dragOver, setDragOver] = useState(false);\n const leafResources = variant === \"collection\" ? getLeafResources(tree) : [];\n const isEmpty =\n variant === \"collection\" ? leafResources.length === 0 : tree.length === 0;\n\n const toggleExpand = useCallback((path: string) => {\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(path)) {\n next.delete(path);\n } else {\n next.add(path);\n }\n return next;\n });\n }, []);\n\n const handleStartCreate = useCallback(\n (parentPath: string, type: \"file\" | \"folder\") => {\n setCreating({ parentPath, type });\n // auto-expand the parent folder\n setExpanded((prev) => {\n const next = new Set(prev);\n next.add(parentPath);\n return next;\n });\n },\n [],\n );\n\n const handleConfirmCreate = useCallback(\n (name: string) => {\n if (!creating) return;\n if (creating.type === \"file\") {\n onCreateFile(creating.parentPath, name);\n } else {\n onCreateFolder(creating.parentPath, name);\n }\n setCreating(null);\n },\n [creating, onCreateFile, onCreateFolder],\n );\n\n const handleCancelCreate = useCallback(() => {\n setCreating(null);\n }, []);\n\n const handleDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setDragOver(true);\n }, []);\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setDragOver(false);\n }, []);\n\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setDragOver(false);\n if (readOnly) return;\n if (e.dataTransfer.files.length > 0) {\n onDrop(e.dataTransfer.files);\n }\n },\n [onDrop, readOnly],\n );\n\n return (\n <div\n className={cn(\n \"p-1\",\n dragOver && !readOnly && \"ring-1 ring-inset ring-accent\",\n )}\n onDragOver={readOnly ? undefined : handleDragOver}\n onDragLeave={readOnly ? undefined : handleDragLeave}\n onDrop={readOnly ? undefined : handleDrop}\n >\n {/* Section heading */}\n <div className=\"group/root flex items-center justify-between px-1.5 py-1\">\n <TooltipProvider delayDuration={200}>\n <span className=\"flex items-center gap-1.5 text-[11px] font-medium uppercase tracking-wide text-muted-foreground/60\">\n {title}\n {headingHint && (\n <span className=\"text-[10px] font-normal normal-case tracking-normal text-muted-foreground/50\">\n {headingHint}\n </span>\n )}\n {titleTooltip && (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label={`About ${title}`}\n className=\"flex h-3.5 w-3.5 items-center justify-center rounded-full text-muted-foreground/40 hover:text-muted-foreground\"\n >\n <IconHelpCircle className=\"h-3 w-3\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>{titleTooltip}</TooltipContent>\n </Tooltip>\n )}\n </span>\n {sectionAction ??\n (variant === \"tree\" && !readOnly && (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={() => handleStartCreate(\"\", \"file\")}\n aria-label=\"New file\"\n className=\"flex h-5 w-5 items-center justify-center rounded text-muted-foreground/50 opacity-0 group-hover/root:opacity-100 hover:text-foreground hover:bg-accent/50\"\n >\n <IconPlus className=\"h-3 w-3\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>New file</TooltipContent>\n </Tooltip>\n ))}\n </TooltipProvider>\n </div>\n\n {variant === \"collection\"\n ? leafResources.length > 0 && (\n <div className=\"divide-y divide-border/60\">\n {leafResources.map((node) => (\n <CollectionResourceRow\n key={node.resource.id}\n node={node}\n selectedId={selectedId}\n deletingId={deletingId}\n readOnly={readOnly}\n onSelect={onSelect}\n onDelete={onDelete}\n />\n ))}\n </div>\n )\n : tree.map((node) => (\n <TreeNodeRow\n key={node.resource?.id ?? node.path}\n node={node}\n depth={0}\n expanded={expanded}\n selectedId={selectedId}\n deletingId={deletingId}\n readOnly={readOnly}\n onToggle={toggleExpand}\n onSelect={onSelect}\n onDelete={onDelete}\n onStartCreate={handleStartCreate}\n />\n ))}\n\n {isLoading && isEmpty && (\n <div className={cn(\"px-1 py-1\")}>\n {Array.from({ length: 3 }).map((_, i) => (\n <div\n key={i}\n className={cn(\n \"flex items-center gap-2 px-1.5 py-1\",\n variant === \"collection\" && \"gap-3 px-2.5 py-3\",\n )}\n >\n <div\n className={cn(\n \"rounded bg-muted-foreground/10 animate-pulse\",\n variant === \"collection\" ? \"size-8\" : \"h-3.5 w-3.5\",\n )}\n style={{ animationDelay: `${i * 75}ms` }}\n />\n <div\n className=\"h-3 rounded bg-muted-foreground/10 animate-pulse\"\n style={{\n width: `${50 + ((i * 37) % 40)}%`,\n animationDelay: `${i * 75}ms`,\n }}\n />\n </div>\n ))}\n </div>\n )}\n\n {/* Inline input for root-level creation */}\n {creating && creating.parentPath === \"\" && (\n <InlineInput\n depth={0}\n onConfirm={handleConfirmCreate}\n onCancel={handleCancelCreate}\n />\n )}\n\n {/* Inline input for folder-level creation */}\n {creating && creating.parentPath !== \"\" && (\n <InlineInput\n depth={creating.parentPath.split(\"/\").filter(Boolean).length}\n onConfirm={handleConfirmCreate}\n onCancel={handleCancelCreate}\n />\n )}\n\n {isEmpty && !creating && !isLoading && (\n <div className=\"flex flex-col items-start border-y border-border/60 px-2 py-5\">\n <p className=\"ps-5 text-xs text-muted-foreground\">\n {variant === \"collection\"\n ? \"No resources in this collection yet\"\n : \"No files yet\"}\n </p>\n {emptyStateAction && <div className=\"mt-4\">{emptyStateAction}</div>}\n </div>\n )}\n </div>\n );\n}\n"]}
1
+ {"version":3,"file":"ResourceTree.js","sourceRoot":"","sources":["../../../src/client/resources/ResourceTree.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n IconChevronRight,\n IconChevronDown,\n IconFolder,\n IconFileText,\n IconFileCode,\n IconPhoto,\n IconFile,\n IconPlus,\n IconTrash,\n IconHierarchy2,\n IconPlugConnected,\n IconBrowser,\n IconDeviceDesktop,\n IconBulb,\n IconClockHour3,\n IconLoader2,\n IconHelpCircle,\n} from \"@tabler/icons-react\";\nimport React, { useState, useRef, useCallback } from \"react\";\n\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../components/ui/tooltip.js\";\nimport { cn } from \"../utils.js\";\nimport type { McpServer } from \"./use-mcp-servers.js\";\nimport type { TreeNode, ResourceMeta, JobMetadata } from \"./use-resources.js\";\n\nfunction StatusDot({\n className,\n tooltip,\n}: {\n className: string;\n tooltip: string;\n}) {\n return (\n <TooltipProvider delayDuration={200}>\n <Tooltip>\n <TooltipTrigger asChild>\n <span\n aria-label={tooltip}\n className={cn(\"ml-1 inline-block h-1.5 w-1.5 shrink-0\", className)}\n />\n </TooltipTrigger>\n <TooltipContent>{tooltip}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n}\n\n// ─── Helpers ────────────────────────────────────────────────────────────────\n\nfunction getFileIcon(node: TreeNode): React.ReactNode {\n if (node.kind === \"agent\") {\n return (\n <IconHierarchy2 className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n );\n }\n if (node.kind === \"remote-agent\" || node.kind === \"mcp-server\") {\n return (\n <IconPlugConnected className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n );\n }\n if (node.kind === \"mcp-builtin\") {\n return node.mcpBuiltinMeta?.exclusiveGroup === \"browser\" ? (\n <IconBrowser className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n ) : (\n <IconDeviceDesktop className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n );\n }\n if (node.kind === \"skill\") {\n return <IconBulb className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />;\n }\n if (node.kind === \"job\") {\n return (\n <IconClockHour3 className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n );\n }\n const name = node.name;\n const ext = name.split(\".\").pop()?.toLowerCase() ?? \"\";\n const iconClass = \"h-3.5 w-3.5 shrink-0 text-muted-foreground\";\n if (ext === \"md\" || ext === \"mdx\")\n return <IconFileText className={iconClass} />;\n if (\n [\"ts\", \"tsx\", \"js\", \"jsx\", \"json\", \"css\", \"html\", \"py\", \"sh\"].includes(ext)\n )\n return <IconFileCode className={iconClass} />;\n if ([\"png\", \"jpg\", \"jpeg\", \"gif\", \"svg\", \"webp\", \"ico\"].includes(ext))\n return <IconPhoto className={iconClass} />;\n return <IconFile className={iconClass} />;\n}\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\nexport interface ResourceTreeProps {\n tree: TreeNode[];\n /** Presentation mode for the resources: nested tree rows or a flat collection. */\n variant?: \"tree\" | \"collection\";\n selectedId: string | null;\n onSelect: (resource: ResourceMeta) => void;\n onCreateFile: (parentPath: string, name: string) => void;\n onCreateFolder: (parentPath: string, name: string) => void;\n onDelete: (id: string) => void;\n onRename: (id: string, newPath: string) => void;\n onDrop: (files: FileList) => void;\n /** Section title displayed as heading */\n title?: string;\n /** Tooltip for the section heading */\n titleTooltip?: string;\n /** Whether this section's tree is still loading */\n isLoading?: boolean;\n /** Resource id currently being deleted (shows spinner + muted row) */\n deletingId?: string | null;\n /** When true, hide create/delete/rename/upload affordances. Files stay readable. */\n readOnly?: boolean;\n /** Optional hint shown next to the heading (e.g. \"Read only\") */\n headingHint?: React.ReactNode;\n /** Scope-specific action shown beside the section heading. */\n sectionAction?: React.ReactNode;\n /** Scope-specific action shown beneath an empty collection message. */\n emptyStateAction?: React.ReactNode;\n}\n\ninterface CreatingState {\n parentPath: string;\n type: \"file\" | \"folder\";\n}\n\nfunction McpStatusDot({ server }: { server: McpServer }) {\n const status = server.status ?? { state: \"unknown\" as const };\n if (status.state === \"connected\") {\n return (\n <StatusDot\n className=\"rounded-full bg-green-500\"\n tooltip={`Connected: ${status.toolCount} tool${status.toolCount === 1 ? \"\" : \"s\"}`}\n />\n );\n }\n if (status.state === \"error\") {\n return (\n <StatusDot\n className=\"rounded-full bg-red-500\"\n tooltip={`Error: ${status.error}`}\n />\n );\n }\n return (\n <StatusDot\n className=\"rounded-full bg-muted-foreground/40\"\n tooltip=\"Connecting…\"\n />\n );\n}\n\nfunction BuiltinStatusDot({ node }: { node: TreeNode }) {\n const meta = node.mcpBuiltinMeta;\n if (!meta?.available) {\n return (\n <StatusDot\n className=\"rounded-full bg-muted-foreground/30\"\n tooltip={meta?.unavailableReason ?? \"Not available on this host\"}\n />\n );\n }\n if (!meta.scopeEnabled) {\n return (\n <StatusDot\n className=\"rounded-full bg-muted-foreground/40\"\n tooltip=\"Disabled\"\n />\n );\n }\n const status = meta.status?.[meta.scope];\n if (status?.state === \"connected\") {\n return (\n <StatusDot\n className=\"rounded-full bg-green-500\"\n tooltip={`Connected — ${status.toolCount} tool${status.toolCount === 1 ? \"\" : \"s\"}`}\n />\n );\n }\n if (status?.state === \"error\") {\n return (\n <StatusDot\n className=\"rounded-full bg-red-500\"\n tooltip={`Error: ${status.error}`}\n />\n );\n }\n return <StatusDot className=\"rounded-full bg-amber-500\" tooltip=\"Enabled\" />;\n}\n\nfunction JobStatusDot({ meta }: { meta: JobMetadata }) {\n if (!meta.enabled) {\n return (\n <StatusDot\n className=\"rounded-full bg-muted-foreground/40\"\n tooltip=\"Disabled\"\n />\n );\n }\n if (meta.lastStatus === \"running\") {\n return (\n <StatusDot\n className=\"rounded-full bg-blue-500 animate-pulse\"\n tooltip=\"Running\"\n />\n );\n }\n if (meta.lastStatus === \"error\") {\n return (\n <StatusDot\n className=\"rounded-full bg-red-500\"\n tooltip=\"Last run failed\"\n />\n );\n }\n if (meta.lastStatus === \"success\") {\n return (\n <StatusDot\n className=\"rounded-full bg-green-500\"\n tooltip=\"Last run succeeded\"\n />\n );\n }\n return (\n <StatusDot\n className=\"rounded-full bg-amber-500\"\n tooltip=\"Scheduled (not yet run)\"\n />\n );\n}\n\ntype LeafResourceNode = TreeNode & { resource: ResourceMeta };\n\nfunction getLeafResources(nodes: TreeNode[]): LeafResourceNode[] {\n return nodes.flatMap((node) => {\n if (node.type === \"folder\") {\n return getLeafResources(node.children ?? []);\n }\n return node.resource ? [node as LeafResourceNode] : [];\n });\n}\n\nfunction formatResourceSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction getCollectionDescriptor(node: LeafResourceNode): string {\n if (node.kind === \"agent\") {\n return (\n node.agentMeta?.description || node.agentMeta?.model || \"Custom agent\"\n );\n }\n if (node.kind === \"skill\") {\n return node.skillMeta?.description || \"Skill\";\n }\n if (node.kind === \"remote-agent\") {\n return (\n node.remoteAgentMeta?.description ||\n node.remoteAgentMeta?.url ||\n \"Remote agent\"\n );\n }\n if (node.kind === \"job\") {\n return (\n node.jobMeta?.scheduleDescription ||\n node.jobMeta?.schedule ||\n \"Scheduled job\"\n );\n }\n if (node.kind === \"mcp-server\") return \"MCP server\";\n if (node.kind === \"mcp-builtin\") return \"Built-in MCP\";\n return formatResourceSize(node.resource.size);\n}\n\nfunction CollectionResourceRow({\n node,\n selectedId,\n deletingId,\n readOnly,\n onSelect,\n onDelete,\n}: {\n node: LeafResourceNode;\n selectedId: string | null;\n deletingId?: string | null;\n readOnly?: boolean;\n onSelect: (resource: ResourceMeta) => void;\n onDelete: (id: string) => void;\n}) {\n const isSelected = node.resource.id === selectedId;\n const isDeleting = node.resource.id === deletingId;\n const [confirmingDelete, setConfirmingDelete] = useState(false);\n const descriptor = getCollectionDescriptor(node);\n\n const selectResource = () => {\n if (!isDeleting) onSelect(node.resource);\n };\n\n return (\n <div\n className={cn(\n \"group/collection-row flex w-full items-center gap-3 px-2.5 py-3 text-left transition-[background-color,opacity] duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/50\",\n isDeleting\n ? \"pointer-events-none opacity-40\"\n : isSelected\n ? \"bg-accent text-foreground\"\n : \"text-foreground hover:bg-accent/50\",\n )}\n onMouseLeave={() => setConfirmingDelete(false)}\n >\n <button\n type=\"button\"\n disabled={isDeleting}\n aria-pressed={isSelected}\n onClick={selectResource}\n className=\"flex min-w-0 flex-1 cursor-pointer items-center gap-3 text-left outline-none focus-visible:ring-2 focus-visible:ring-ring/50\"\n >\n <div\n className={cn(\n \"flex size-8 shrink-0 items-center justify-center rounded-md bg-muted/50\",\n isSelected && \"bg-background/70\",\n )}\n >\n {getFileIcon(node)}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex min-w-0 items-center gap-1.5\">\n <span className=\"min-w-0 truncate text-[12px] font-medium\">\n {node.name}\n </span>\n {node.jobMeta && <JobStatusDot meta={node.jobMeta} />}\n {node.mcpServerMeta && <McpStatusDot server={node.mcpServerMeta} />}\n {node.mcpBuiltinMeta && <BuiltinStatusDot node={node} />}\n </div>\n <div className=\"mt-0.5 flex min-w-0 items-center gap-1.5 text-[10px]\">\n <span className=\"min-w-0 truncate text-muted-foreground/60\">\n {node.resource.path}\n </span>\n <span className=\"shrink-0 text-muted-foreground/30\">·</span>\n <span className=\"max-w-[40%] shrink-0 truncate text-muted-foreground/80\">\n {descriptor}\n </span>\n </div>\n </div>\n </button>\n {!readOnly && node.kind !== \"mcp-builtin\" && (\n <div\n className={cn(\n \"flex shrink-0 items-center opacity-0 transition-opacity group-hover/collection-row:opacity-100 group-focus-within/collection-row:opacity-100\",\n confirmingDelete && \"opacity-100\",\n )}\n >\n <TooltipProvider delayDuration={200}>\n {isDeleting ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <span\n aria-label=\"Deleting…\"\n className=\"flex size-6 items-center justify-center rounded text-muted-foreground\"\n >\n <IconLoader2 className=\"size-3.5 animate-spin\" />\n </span>\n </TooltipTrigger>\n <TooltipContent>Deleting…</TooltipContent>\n </Tooltip>\n ) : (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n if (confirmingDelete) {\n onDelete(node.resource.id);\n setConfirmingDelete(false);\n } else {\n setConfirmingDelete(true);\n }\n }}\n aria-label={confirmingDelete ? \"Confirm delete\" : \"Delete\"}\n className={cn(\n \"flex size-6 items-center justify-center rounded text-muted-foreground hover:bg-accent/50 hover:text-destructive\",\n confirmingDelete && \"bg-destructive/10 text-destructive\",\n )}\n >\n <IconTrash className=\"size-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>\n {confirmingDelete ? \"Click again to delete\" : \"Delete\"}\n </TooltipContent>\n </Tooltip>\n )}\n </TooltipProvider>\n </div>\n )}\n </div>\n );\n}\n\n// ─── TreeNodeRow ────────────────────────────────────────────────────────────\n\nfunction TreeNodeRow({\n node,\n depth,\n expanded,\n selectedId,\n deletingId,\n readOnly,\n onToggle,\n onSelect,\n onDelete,\n onStartCreate,\n}: {\n node: TreeNode;\n depth: number;\n expanded: Set<string>;\n selectedId: string | null;\n deletingId?: string | null;\n readOnly?: boolean;\n onToggle: (path: string) => void;\n onSelect: (resource: ResourceMeta) => void;\n onDelete: (id: string) => void;\n onStartCreate: (parentPath: string, type: \"file\" | \"folder\") => void;\n}) {\n const isFolder = node.type === \"folder\";\n const isExpanded = expanded.has(node.path);\n const isSelected = node.resource?.id === selectedId;\n const isDeleting = !!node.resource && node.resource.id === deletingId;\n const [confirmingDelete, setConfirmingDelete] = useState(false);\n\n return (\n <div>\n <div\n className={cn(\n \"group/row flex items-center gap-1 rounded-md px-1.5 py-1 select-none\",\n isDeleting ? \"pointer-events-none opacity-40\" : \"cursor-pointer\",\n isSelected\n ? \"bg-accent text-foreground\"\n : \"text-muted-foreground hover:bg-accent/50 hover:text-foreground\",\n )}\n style={{ paddingLeft: depth * 16 + 6 }}\n onClick={() => {\n if (isDeleting) return;\n if (isFolder) {\n onToggle(node.path);\n } else if (node.resource) {\n onSelect(node.resource);\n }\n }}\n onMouseLeave={() => setConfirmingDelete(false)}\n >\n {isFolder ? (\n isExpanded ? (\n <IconChevronDown className=\"h-3 w-3 shrink-0\" />\n ) : (\n <IconChevronRight className=\"h-3 w-3 shrink-0\" />\n )\n ) : (\n <span className=\"w-3 shrink-0\" />\n )}\n {isFolder ? (\n <IconFolder className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n ) : (\n getFileIcon(node)\n )}\n <span className=\"min-w-0 truncate text-[12px] leading-none\">\n {node.name}\n </span>\n {node.jobMeta && <JobStatusDot meta={node.jobMeta} />}\n {node.mcpServerMeta && <McpStatusDot server={node.mcpServerMeta} />}\n {node.mcpBuiltinMeta && <BuiltinStatusDot node={node} />}\n {!readOnly && (\n <div\n className={cn(\n \"ml-auto flex shrink-0 items-center gap-0.5 opacity-0 group-hover/row:opacity-100\",\n confirmingDelete && \"opacity-100\",\n )}\n >\n <TooltipProvider delayDuration={200}>\n {isFolder && (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={(e) => {\n e.stopPropagation();\n onStartCreate(node.path, \"file\");\n }}\n aria-label=\"New file\"\n className=\"flex h-5 w-5 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/50\"\n >\n <IconPlus className=\"h-3 w-3\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>New file</TooltipContent>\n </Tooltip>\n )}\n {node.resource &&\n node.kind !== \"mcp-builtin\" &&\n (isDeleting ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <span\n aria-label=\"Deleting…\"\n className=\"flex h-5 w-5 items-center justify-center rounded text-muted-foreground\"\n >\n <IconLoader2 className=\"h-3 w-3 animate-spin\" />\n </span>\n </TooltipTrigger>\n <TooltipContent>Deleting…</TooltipContent>\n </Tooltip>\n ) : (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={(e) => {\n e.stopPropagation();\n if (confirmingDelete) {\n onDelete(node.resource!.id);\n setConfirmingDelete(false);\n } else {\n setConfirmingDelete(true);\n }\n }}\n aria-label={\n confirmingDelete ? \"Confirm delete\" : \"Delete\"\n }\n className={cn(\n \"flex h-5 w-5 items-center justify-center rounded text-muted-foreground hover:text-destructive hover:bg-accent/50\",\n confirmingDelete &&\n \"bg-destructive/10 text-destructive\",\n )}\n >\n <IconTrash className=\"h-3 w-3\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>\n {confirmingDelete ? \"Click again to delete\" : \"Delete\"}\n </TooltipContent>\n </Tooltip>\n ))}\n </TooltipProvider>\n </div>\n )}\n </div>\n {isFolder && isExpanded && node.children && (\n <div>\n {node.children.map((child) => (\n <TreeNodeRow\n key={child.resource?.id ?? child.path}\n node={child}\n depth={depth + 1}\n expanded={expanded}\n selectedId={selectedId}\n deletingId={deletingId}\n readOnly={readOnly}\n onToggle={onToggle}\n onSelect={onSelect}\n onDelete={onDelete}\n onStartCreate={onStartCreate}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\n// ─── InlineInput ────────────────────────────────────────────────────────────\n\nfunction InlineInput({\n depth,\n onConfirm,\n onCancel,\n}: {\n depth: number;\n onConfirm: (name: string) => void;\n onCancel: () => void;\n}) {\n const inputRef = useRef<HTMLInputElement>(null);\n const [value, setValue] = useState(\"\");\n\n React.useEffect(() => {\n inputRef.current?.focus();\n }, []);\n\n return (\n <div\n className=\"flex items-center gap-1 px-1.5 py-0.5\"\n style={{ paddingLeft: depth * 16 + 6 + 16 }}\n >\n <IconFile className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <input\n ref={inputRef}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && value.trim()) {\n onConfirm(value.trim());\n } else if (e.key === \"Escape\") {\n onCancel();\n }\n }}\n onBlur={() => {\n if (value.trim()) {\n onConfirm(value.trim());\n } else {\n onCancel();\n }\n }}\n className=\"min-w-0 flex-1 bg-transparent text-[12px] leading-none text-foreground outline-none placeholder:text-muted-foreground/50\"\n placeholder=\"filename.md\"\n />\n </div>\n );\n}\n\n// ─── ResourceTree ───────────────────────────────────────────────────────────\n\nexport function ResourceTree({\n tree,\n variant = \"tree\",\n selectedId,\n onSelect,\n onCreateFile,\n onCreateFolder,\n onDelete,\n onDrop,\n title = \"Files\",\n titleTooltip,\n isLoading = false,\n deletingId = null,\n readOnly = false,\n headingHint,\n sectionAction,\n emptyStateAction,\n}: ResourceTreeProps) {\n const [expanded, setExpanded] = useState<Set<string>>(() => new Set());\n const [creating, setCreating] = useState<CreatingState | null>(null);\n const [dragOver, setDragOver] = useState(false);\n const leafResources = variant === \"collection\" ? getLeafResources(tree) : [];\n const isEmpty =\n variant === \"collection\" ? leafResources.length === 0 : tree.length === 0;\n\n const toggleExpand = useCallback((path: string) => {\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(path)) {\n next.delete(path);\n } else {\n next.add(path);\n }\n return next;\n });\n }, []);\n\n const handleStartCreate = useCallback(\n (parentPath: string, type: \"file\" | \"folder\") => {\n setCreating({ parentPath, type });\n // auto-expand the parent folder\n setExpanded((prev) => {\n const next = new Set(prev);\n next.add(parentPath);\n return next;\n });\n },\n [],\n );\n\n const handleConfirmCreate = useCallback(\n (name: string) => {\n if (!creating) return;\n if (creating.type === \"file\") {\n onCreateFile(creating.parentPath, name);\n } else {\n onCreateFolder(creating.parentPath, name);\n }\n setCreating(null);\n },\n [creating, onCreateFile, onCreateFolder],\n );\n\n const handleCancelCreate = useCallback(() => {\n setCreating(null);\n }, []);\n\n const handleDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setDragOver(true);\n }, []);\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setDragOver(false);\n }, []);\n\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setDragOver(false);\n if (readOnly) return;\n if (e.dataTransfer.files.length > 0) {\n onDrop(e.dataTransfer.files);\n }\n },\n [onDrop, readOnly],\n );\n\n return (\n <div\n className={cn(\n \"p-1\",\n dragOver && !readOnly && \"ring-1 ring-inset ring-accent\",\n )}\n onDragOver={readOnly ? undefined : handleDragOver}\n onDragLeave={readOnly ? undefined : handleDragLeave}\n onDrop={readOnly ? undefined : handleDrop}\n >\n {/* Section heading */}\n <div className=\"group/root flex items-center justify-between px-1.5 py-1\">\n <TooltipProvider delayDuration={200}>\n <span className=\"flex items-center gap-1.5 text-[11px] font-medium uppercase tracking-wide text-muted-foreground/60\">\n {title}\n {headingHint && (\n <span className=\"text-[10px] font-normal normal-case tracking-normal text-muted-foreground/50\">\n {headingHint}\n </span>\n )}\n {titleTooltip && (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label={`About ${title}`}\n className=\"flex h-3.5 w-3.5 items-center justify-center rounded-full text-muted-foreground/40 hover:text-muted-foreground\"\n >\n <IconHelpCircle className=\"h-3 w-3\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>{titleTooltip}</TooltipContent>\n </Tooltip>\n )}\n </span>\n {sectionAction ??\n (variant === \"tree\" && !readOnly && (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={() => handleStartCreate(\"\", \"file\")}\n aria-label=\"New file\"\n className=\"flex h-5 w-5 items-center justify-center rounded text-muted-foreground/50 opacity-0 group-hover/root:opacity-100 hover:text-foreground hover:bg-accent/50\"\n >\n <IconPlus className=\"h-3 w-3\" />\n </button>\n </TooltipTrigger>\n <TooltipContent>New file</TooltipContent>\n </Tooltip>\n ))}\n </TooltipProvider>\n </div>\n\n {variant === \"collection\"\n ? leafResources.length > 0 && (\n <div className=\"space-y-1\">\n {leafResources.map((node) => (\n <CollectionResourceRow\n key={node.resource.id}\n node={node}\n selectedId={selectedId}\n deletingId={deletingId}\n readOnly={readOnly}\n onSelect={onSelect}\n onDelete={onDelete}\n />\n ))}\n </div>\n )\n : tree.map((node) => (\n <TreeNodeRow\n key={node.resource?.id ?? node.path}\n node={node}\n depth={0}\n expanded={expanded}\n selectedId={selectedId}\n deletingId={deletingId}\n readOnly={readOnly}\n onToggle={toggleExpand}\n onSelect={onSelect}\n onDelete={onDelete}\n onStartCreate={handleStartCreate}\n />\n ))}\n\n {isLoading && isEmpty && (\n <div className={cn(\"px-1 py-1\")}>\n {Array.from({ length: 3 }).map((_, i) => (\n <div\n key={i}\n className={cn(\n \"flex items-center gap-2 px-1.5 py-1\",\n variant === \"collection\" && \"gap-3 px-2.5 py-3\",\n )}\n >\n <div\n className={cn(\n \"rounded bg-muted-foreground/10 animate-pulse\",\n variant === \"collection\" ? \"size-8\" : \"h-3.5 w-3.5\",\n )}\n style={{ animationDelay: `${i * 75}ms` }}\n />\n <div\n className=\"h-3 rounded bg-muted-foreground/10 animate-pulse\"\n style={{\n width: `${50 + ((i * 37) % 40)}%`,\n animationDelay: `${i * 75}ms`,\n }}\n />\n </div>\n ))}\n </div>\n )}\n\n {/* Inline input for root-level creation */}\n {creating && creating.parentPath === \"\" && (\n <InlineInput\n depth={0}\n onConfirm={handleConfirmCreate}\n onCancel={handleCancelCreate}\n />\n )}\n\n {/* Inline input for folder-level creation */}\n {creating && creating.parentPath !== \"\" && (\n <InlineInput\n depth={creating.parentPath.split(\"/\").filter(Boolean).length}\n onConfirm={handleConfirmCreate}\n onCancel={handleCancelCreate}\n />\n )}\n\n {isEmpty && !creating && !isLoading && (\n <div className=\"flex flex-col items-start px-2 py-5\">\n <p className=\"text-xs text-muted-foreground\">\n {variant === \"collection\"\n ? \"No resources in this collection yet\"\n : \"No files yet\"}\n </p>\n {emptyStateAction && <div className=\"mt-4\">{emptyStateAction}</div>}\n </div>\n )}\n </div>\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ResourcesPanel.d.ts","sourceRoot":"","sources":["../../../src/client/resources/ResourcesPanel.tsx"],"names":[],"mappings":"AAeA,OAAO,KAMN,MAAM,OAAO,CAAC;AA0Bf,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,8BAA8B,CAAC;AAgBtC,OAAO,EAQL,KAAK,aAAa,EAGlB,KAAK,QAAQ,EACd,MAAM,oBAAoB,CAAC;AAI5B,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK9D;AAsCD,MAAM,MAAM,YAAY,GACpB,OAAO,GACP,cAAc,GACd,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,WAAW,GACX,eAAe,CAAC;AAEpB,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,YAAY,CAAC;AAuCxD,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,QAAQ,EAAE,EAChB,IAAI,EAAE,YAAY,GAAG,SAAS,GAC7B,QAAQ,EAAE,CAoBZ;AAu8BD,MAAM,WAAW,mBAAmB;IAClC,0EAA0E;IAC1E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,mEAAmE;IACnE,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,8EAA8E;IAC9E,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,8DAA8D;IAC9D,cAAc,CAAC,EAAE,YAAY,CAAC;IAC9B,yEAAyE;IACzE,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,6CAA6C;IAC7C,eAAe,CAAC,EAAE,qBAAqB,EAAE,CAAC;CAC3C;AAED,wBAAgB,2BAA2B,CACzC,cAAc,EAAE,aAAa,GAAG,SAAS,EACzC,UAAU,EAAE,OAAO,GAClB,aAAa,CAIf;AAED,wBAAgB,cAAc,CAAC,EAC7B,cAAqB,EACrB,KAAK,EAAE,cAAc,EACrB,sBAA8B,EAC9B,cAAc,EACd,mBAA4B,EAC5B,eAAe,GAChB,GAAE,mBAAwB,qBAu1B1B"}
1
+ {"version":3,"file":"ResourcesPanel.d.ts","sourceRoot":"","sources":["../../../src/client/resources/ResourcesPanel.tsx"],"names":[],"mappings":"AAeA,OAAO,KAMN,MAAM,OAAO,CAAC;AA0Bf,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,8BAA8B,CAAC;AAgBtC,OAAO,EAQL,KAAK,aAAa,EAGlB,KAAK,QAAQ,EACd,MAAM,oBAAoB,CAAC;AAI5B,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK9D;AAsCD,MAAM,MAAM,YAAY,GACpB,OAAO,GACP,cAAc,GACd,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,WAAW,GACX,eAAe,CAAC;AAEpB,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,YAAY,CAAC;AAuCxD,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,QAAQ,EAAE,EAChB,IAAI,EAAE,YAAY,GAAG,SAAS,GAC7B,QAAQ,EAAE,CAoBZ;AAu8BD,MAAM,WAAW,mBAAmB;IAClC,0EAA0E;IAC1E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,mEAAmE;IACnE,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,8EAA8E;IAC9E,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,8DAA8D;IAC9D,cAAc,CAAC,EAAE,YAAY,CAAC;IAC9B,yEAAyE;IACzE,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,6CAA6C;IAC7C,eAAe,CAAC,EAAE,qBAAqB,EAAE,CAAC;CAC3C;AAED,wBAAgB,2BAA2B,CACzC,cAAc,EAAE,aAAa,GAAG,SAAS,EACzC,UAAU,EAAE,OAAO,GAClB,aAAa,CAIf;AAED,wBAAgB,cAAc,CAAC,EAC7B,cAAqB,EACrB,KAAK,EAAE,cAAc,EACrB,sBAA8B,EAC9B,cAAc,EACd,mBAA4B,EAC5B,eAAe,GAChB,GAAE,mBAAwB,qBA21B1B"}
@@ -877,17 +877,17 @@ export function ResourcesPanel({ showMcpServers = true, scope: requestedScope, s
877
877
  ? deleteResource.variables
878
878
  : deleteMcpServer.isPending
879
879
  ? `mcp:${deleteMcpServer.variables.scope}:${deleteMcpServer.variables.id}`
880
- : null, selectedId: selectedResourceId, onSelect: handleSelect, onCreateFile: () => { }, onCreateFolder: () => { }, onDelete: () => { }, onRename: () => { }, onDrop: () => { }, title: "Workspace", titleTooltip: "Global resources inherited by every app. Dispatch resources are read-only; local file mode resources can be edited here.", readOnly: true, headingHint: "Inherited" })), showPersonalTree && (_jsx(ResourceTree, { tree: displayedPersonalTree, variant: resourceTreeVariant, isLoading: personalTreeQuery.isLoading, deletingId: deleteResource.isPending
881
- ? deleteResource.variables
882
- : deleteMcpServer.isPending
883
- ? `mcp:${deleteMcpServer.variables.scope}:${deleteMcpServer.variables.id}`
884
- : null, selectedId: selectedResourceId, onSelect: handleSelect, onCreateFile: (parentPath, name) => handleCreateFile(parentPath, name, "personal"), onCreateFolder: (parentPath, name) => handleCreateFolder(parentPath, name, "personal"), onDelete: handleDelete, onRename: handleRename, onDrop: (files) => handleUploadFiles(files, "personal"), title: "Personal", titleTooltip: "Files visible only to you", sectionAction: renderScopeCreateMenu("personal"), emptyStateAction: renderEmptyStateAction("personal") })), showSharedTree && (_jsx(ResourceTree, { tree: displayedSharedTree, variant: resourceTreeVariant, isLoading: sharedTreeQuery.isLoading, deletingId: deleteResource.isPending
885
- ? deleteResource.variables
886
- : deleteMcpServer.isPending
887
- ? `mcp:${deleteMcpServer.variables.scope}:${deleteMcpServer.variables.id}`
888
- : null, selectedId: selectedResourceId, onSelect: handleSelect, onCreateFile: (parentPath, name) => handleCreateFile(parentPath, name, "shared"), onCreateFolder: (parentPath, name) => handleCreateFolder(parentPath, name, "shared"), onDelete: handleDelete, onRename: handleRename, onDrop: (files) => handleUploadFiles(files, "shared"), title: "Organization", titleTooltip: canEditOrg
889
- ? "Files visible to everyone in your organization"
890
- : "Files visible to everyone in your organization. Read-only — only admins can edit.", readOnly: !canEditOrg, headingHint: !canEditOrg ? "Read only" : undefined, sectionAction: renderScopeCreateMenu("shared"), emptyStateAction: renderEmptyStateAction("shared") }))] })) }), toast && (_jsx("div", { className: "pointer-events-none absolute bottom-3 left-1/2 z-[300] -translate-x-1/2", children: _jsxs("div", { role: "status", className: cn("pointer-events-auto flex max-w-[320px] items-center gap-3 rounded-md border px-3 py-2 text-[12px] shadow-md", toast.kind === "ok"
880
+ : null, selectedId: selectedResourceId, onSelect: handleSelect, onCreateFile: () => { }, onCreateFolder: () => { }, onDelete: () => { }, onRename: () => { }, onDrop: () => { }, title: "Workspace", titleTooltip: "Global resources inherited by every app. Dispatch resources are read-only; local file mode resources can be edited here.", readOnly: true, headingHint: "Inherited" })), showPersonalTree && (_jsx("div", { className: "pt-3", children: _jsx(ResourceTree, { tree: displayedPersonalTree, variant: resourceTreeVariant, isLoading: personalTreeQuery.isLoading, deletingId: deleteResource.isPending
881
+ ? deleteResource.variables
882
+ : deleteMcpServer.isPending
883
+ ? `mcp:${deleteMcpServer.variables.scope}:${deleteMcpServer.variables.id}`
884
+ : null, selectedId: selectedResourceId, onSelect: handleSelect, onCreateFile: (parentPath, name) => handleCreateFile(parentPath, name, "personal"), onCreateFolder: (parentPath, name) => handleCreateFolder(parentPath, name, "personal"), onDelete: handleDelete, onRename: handleRename, onDrop: (files) => handleUploadFiles(files, "personal"), title: "Personal", titleTooltip: "Files visible only to you", sectionAction: renderScopeCreateMenu("personal"), emptyStateAction: renderEmptyStateAction("personal") }) })), showSharedTree && (_jsx("div", { className: "pt-3", children: _jsx(ResourceTree, { tree: displayedSharedTree, variant: resourceTreeVariant, isLoading: sharedTreeQuery.isLoading, deletingId: deleteResource.isPending
885
+ ? deleteResource.variables
886
+ : deleteMcpServer.isPending
887
+ ? `mcp:${deleteMcpServer.variables.scope}:${deleteMcpServer.variables.id}`
888
+ : null, selectedId: selectedResourceId, onSelect: handleSelect, onCreateFile: (parentPath, name) => handleCreateFile(parentPath, name, "shared"), onCreateFolder: (parentPath, name) => handleCreateFolder(parentPath, name, "shared"), onDelete: handleDelete, onRename: handleRename, onDrop: (files) => handleUploadFiles(files, "shared"), title: "Organization", titleTooltip: canEditOrg
889
+ ? "Files visible to everyone in your organization"
890
+ : "Files visible to everyone in your organization. Read-only — only admins can edit.", readOnly: !canEditOrg, headingHint: !canEditOrg ? "Read only" : undefined, sectionAction: renderScopeCreateMenu("shared"), emptyStateAction: renderEmptyStateAction("shared") }) }))] })) }), toast && (_jsx("div", { className: "pointer-events-none absolute bottom-3 left-1/2 z-[300] -translate-x-1/2", children: _jsxs("div", { role: "status", className: cn("pointer-events-auto flex max-w-[320px] items-center gap-3 rounded-md border px-3 py-2 text-[12px] shadow-md", toast.kind === "ok"
891
891
  ? "border-emerald-500/40 bg-emerald-500/10 text-emerald-600 dark:text-emerald-300"
892
892
  : "border-red-500/40 bg-red-500/10 text-red-600 dark:text-red-300"), children: [_jsx("span", { className: "min-w-0 flex-1 truncate", children: toast.message }), toast.kind === "ok" && toast.resourceId && (_jsx("button", { type: "button", onClick: () => {
893
893
  setSelectedResourceId(toast.resourceId);