@larkup/workspace-app 0.0.0-stage → 0.1.0

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 (440) hide show
  1. package/LICENSE +176 -0
  2. package/README.md +4 -2
  3. package/assets/github.svg +3 -0
  4. package/assets/icons/Confluence.png +0 -0
  5. package/assets/icons/Instagram.png +0 -0
  6. package/assets/icons/Northflank.png +0 -0
  7. package/assets/icons/Salesforce.png +0 -0
  8. package/assets/icons/agentskills.png +0 -0
  9. package/assets/icons/airtable.png +0 -0
  10. package/assets/icons/asana.png +0 -0
  11. package/assets/icons/ashby.png +0 -0
  12. package/assets/icons/audio.png +0 -0
  13. package/assets/icons/aws-kendra.png +0 -0
  14. package/assets/icons/aws.svg +38 -0
  15. package/assets/icons/azure-ai-search.png +0 -0
  16. package/assets/icons/azure.svg +1 -0
  17. package/assets/icons/bigquery.png +0 -0
  18. package/assets/icons/bing.png +0 -0
  19. package/assets/icons/bitbucket.png +0 -0
  20. package/assets/icons/brave.png +0 -0
  21. package/assets/icons/browserbase.png +0 -0
  22. package/assets/icons/calendly.png +0 -0
  23. package/assets/icons/chroma.png +0 -0
  24. package/assets/icons/cloudflare.png +0 -0
  25. package/assets/icons/cohere.svg +30 -0
  26. package/assets/icons/databricks.png +0 -0
  27. package/assets/icons/daytonaio.png +0 -0
  28. package/assets/icons/daytonaio2.png +0 -0
  29. package/assets/icons/deepgram.png +0 -0
  30. package/assets/icons/deepl.png +0 -0
  31. package/assets/icons/digital-ocean.webp +0 -0
  32. package/assets/icons/discord.png +0 -0
  33. package/assets/icons/e2b-2.png +0 -0
  34. package/assets/icons/e2b.png +0 -0
  35. package/assets/icons/elevenlabs.png +0 -0
  36. package/assets/icons/email.png +0 -0
  37. package/assets/icons/exa.png +0 -0
  38. package/assets/icons/excel.png +0 -0
  39. package/assets/icons/fal.png +0 -0
  40. package/assets/icons/firecrawl.png +0 -0
  41. package/assets/icons/firecrawl2.png +0 -0
  42. package/assets/icons/flyio.jpeg +0 -0
  43. package/assets/icons/gcp.svg +1 -0
  44. package/assets/icons/gemini.svg +1 -0
  45. package/assets/icons/gmail.png +0 -0
  46. package/assets/icons/google-analytics.png +0 -0
  47. package/assets/icons/google-calender.png +0 -0
  48. package/assets/icons/google-docs.png +0 -0
  49. package/assets/icons/google-drive.png +0 -0
  50. package/assets/icons/google-maps.png +0 -0
  51. package/assets/icons/google-meet.png +0 -0
  52. package/assets/icons/google-sheets.png +0 -0
  53. package/assets/icons/google-slides.png +0 -0
  54. package/assets/icons/google-tasks.png +0 -0
  55. package/assets/icons/google.png +0 -0
  56. package/assets/icons/grok.png +0 -0
  57. package/assets/icons/hubspot.png +0 -0
  58. package/assets/icons/image.png +0 -0
  59. package/assets/icons/jina.svg +1 -0
  60. package/assets/icons/jira.png +0 -0
  61. package/assets/icons/lancedb2.png +0 -0
  62. package/assets/icons/linear.png +0 -0
  63. package/assets/icons/linux.png +0 -0
  64. package/assets/icons/looker.png +0 -0
  65. package/assets/icons/luma.png +0 -0
  66. package/assets/icons/mac.png +0 -0
  67. package/assets/icons/markdown.png +0 -0
  68. package/assets/icons/mcp.png +0 -0
  69. package/assets/icons/mcp.svg +1 -0
  70. package/assets/icons/messenger.svg +1 -0
  71. package/assets/icons/microsoft-intra.png +0 -0
  72. package/assets/icons/microsoft-onenote.png +0 -0
  73. package/assets/icons/microsoft-planner.png +0 -0
  74. package/assets/icons/microsoft-teams.png +0 -0
  75. package/assets/icons/miro.png +0 -0
  76. package/assets/icons/mistral.svg +469 -0
  77. package/assets/icons/modal.png +0 -0
  78. package/assets/icons/ngrok.png +0 -0
  79. package/assets/icons/nomic.png +0 -0
  80. package/assets/icons/onedrive.png +0 -0
  81. package/assets/icons/openai.svg +1 -0
  82. package/assets/icons/outlook-calendar.png +0 -0
  83. package/assets/icons/outlook-email.png +0 -0
  84. package/assets/icons/outlook.png +0 -0
  85. package/assets/icons/pdf.png +0 -0
  86. package/assets/icons/personio.png +0 -0
  87. package/assets/icons/pgvector2.png +0 -0
  88. package/assets/icons/phone.png +0 -0
  89. package/assets/icons/pinecone.png +0 -0
  90. package/assets/icons/pipedrive.png +0 -0
  91. package/assets/icons/power-pi.png +0 -0
  92. package/assets/icons/pylon.png +0 -0
  93. package/assets/icons/python.png +0 -0
  94. package/assets/icons/qdrant.svg +35 -0
  95. package/assets/icons/revai.png +0 -0
  96. package/assets/icons/revai.svg +1 -0
  97. package/assets/icons/sap.png +0 -0
  98. package/assets/icons/serpapi.svg +34 -0
  99. package/assets/icons/serper.png +0 -0
  100. package/assets/icons/servicenow.png +0 -0
  101. package/assets/icons/sharepoint.png +0 -0
  102. package/assets/icons/slack.png +0 -0
  103. package/assets/icons/snowflake.png +0 -0
  104. package/assets/icons/statistia.png +0 -0
  105. package/assets/icons/stripe.png +0 -0
  106. package/assets/icons/supabase.png +0 -0
  107. package/assets/icons/tableau.png +0 -0
  108. package/assets/icons/tavily.png +0 -0
  109. package/assets/icons/telegram.png +0 -0
  110. package/assets/icons/typescript.png +0 -0
  111. package/assets/icons/vercel copy.svg +1 -0
  112. package/assets/icons/vercel.svg +1 -0
  113. package/assets/icons/vertex-ai.png +0 -0
  114. package/assets/icons/video.png +0 -0
  115. package/assets/icons/voyage-light.png +0 -0
  116. package/assets/icons/weaviate.webp +0 -0
  117. package/assets/icons/webcontainers.svg +11 -0
  118. package/assets/icons/webhook.png +0 -0
  119. package/assets/icons/whatsapp copy.png +0 -0
  120. package/assets/icons/whatsapp.png +0 -0
  121. package/assets/icons/windows.png +0 -0
  122. package/assets/icons/word.png +0 -0
  123. package/assets/icons/zendesk.png +0 -0
  124. package/assets/icons/zoom.png +0 -0
  125. package/assets/notion-white.png +0 -0
  126. package/assets/notion.png +0 -0
  127. package/dist-types/asset-server.d.ts +3 -0
  128. package/dist-types/asset-server.d.ts.map +1 -0
  129. package/dist-types/components/alerts/generic-alert.d.ts +15 -0
  130. package/dist-types/components/alerts/generic-alert.d.ts.map +1 -0
  131. package/dist-types/components/chat/canvas/doc-editor-provider.d.ts +62 -0
  132. package/dist-types/components/chat/canvas/doc-editor-provider.d.ts.map +1 -0
  133. package/dist-types/components/chat/canvas/document-canvas.d.ts +7 -0
  134. package/dist-types/components/chat/canvas/document-canvas.d.ts.map +1 -0
  135. package/dist-types/components/chat/canvas/document-field.d.ts +13 -0
  136. package/dist-types/components/chat/canvas/document-field.d.ts.map +1 -0
  137. package/dist-types/components/chat/canvas/document-viewer.d.ts +2 -0
  138. package/dist-types/components/chat/canvas/document-viewer.d.ts.map +1 -0
  139. package/dist-types/components/chat/canvas/file-attachment-button.d.ts +9 -0
  140. package/dist-types/components/chat/canvas/file-attachment-button.d.ts.map +1 -0
  141. package/dist-types/components/chat/chat-workspace.d.ts +4 -0
  142. package/dist-types/components/chat/chat-workspace.d.ts.map +1 -0
  143. package/dist-types/components/chat/message-actions.d.ts +11 -0
  144. package/dist-types/components/chat/message-actions.d.ts.map +1 -0
  145. package/dist-types/components/chat/message-item.d.ts +20 -0
  146. package/dist-types/components/chat/message-item.d.ts.map +1 -0
  147. package/dist-types/components/chat/message-queue.d.ts +15 -0
  148. package/dist-types/components/chat/message-queue.d.ts.map +1 -0
  149. package/dist-types/components/chat/tools/chat-chart.d.ts +6 -0
  150. package/dist-types/components/chat/tools/chat-chart.d.ts.map +1 -0
  151. package/dist-types/components/chat/tools/chat-citations.d.ts +32 -0
  152. package/dist-types/components/chat/tools/chat-citations.d.ts.map +1 -0
  153. package/dist-types/components/chat/tools/chat-data-table.d.ts +14 -0
  154. package/dist-types/components/chat/tools/chat-data-table.d.ts.map +1 -0
  155. package/dist-types/components/chat/tools/chat-file-export.d.ts +5 -0
  156. package/dist-types/components/chat/tools/chat-file-export.d.ts.map +1 -0
  157. package/dist-types/components/chat/tools/chat-media-preview.d.ts +35 -0
  158. package/dist-types/components/chat/tools/chat-media-preview.d.ts.map +1 -0
  159. package/dist-types/components/chat/tools/chat-sandbox-result.d.ts +17 -0
  160. package/dist-types/components/chat/tools/chat-sandbox-result.d.ts.map +1 -0
  161. package/dist-types/components/chat/tools/chat-signature-request.d.ts +13 -0
  162. package/dist-types/components/chat/tools/chat-signature-request.d.ts.map +1 -0
  163. package/dist-types/components/chat/tools/chat-tabs.d.ts +17 -0
  164. package/dist-types/components/chat/tools/chat-tabs.d.ts.map +1 -0
  165. package/dist-types/components/chat/tools/corpus-data-result.d.ts +36 -0
  166. package/dist-types/components/chat/tools/corpus-data-result.d.ts.map +1 -0
  167. package/dist-types/components/chat/tools/knowledge-base-result.d.ts +14 -0
  168. package/dist-types/components/chat/tools/knowledge-base-result.d.ts.map +1 -0
  169. package/dist-types/components/chat/tools/visual-placement-modal.d.ts +23 -0
  170. package/dist-types/components/chat/tools/visual-placement-modal.d.ts.map +1 -0
  171. package/dist-types/components/configure/custom-model-modal.d.ts +13 -0
  172. package/dist-types/components/configure/custom-model-modal.d.ts.map +1 -0
  173. package/dist-types/components/configure/store-fields.d.ts +11 -0
  174. package/dist-types/components/configure/store-fields.d.ts.map +1 -0
  175. package/dist-types/components/data/corpus-panel.d.ts +12 -0
  176. package/dist-types/components/data/corpus-panel.d.ts.map +1 -0
  177. package/dist-types/components/data/data-entry-mode-switch.d.ts +13 -0
  178. package/dist-types/components/data/data-entry-mode-switch.d.ts.map +1 -0
  179. package/dist-types/components/data/data-primary-action.d.ts +7 -0
  180. package/dist-types/components/data/data-primary-action.d.ts.map +1 -0
  181. package/dist-types/components/data/data-workspace.d.ts +6 -0
  182. package/dist-types/components/data/data-workspace.d.ts.map +1 -0
  183. package/dist-types/components/data/groups-panel.d.ts +5 -0
  184. package/dist-types/components/data/groups-panel.d.ts.map +1 -0
  185. package/dist-types/components/data/integration-resources-panel.d.ts +9 -0
  186. package/dist-types/components/data/integration-resources-panel.d.ts.map +1 -0
  187. package/dist-types/components/data/integrations-panel.d.ts +5 -0
  188. package/dist-types/components/data/integrations-panel.d.ts.map +1 -0
  189. package/dist-types/components/data/jobs-panel.d.ts +6 -0
  190. package/dist-types/components/data/jobs-panel.d.ts.map +1 -0
  191. package/dist-types/components/data/jobs-tracking-button.d.ts +2 -0
  192. package/dist-types/components/data/jobs-tracking-button.d.ts.map +1 -0
  193. package/dist-types/components/data/live-media-progress.d.ts +9 -0
  194. package/dist-types/components/data/live-media-progress.d.ts.map +1 -0
  195. package/dist-types/components/data/media-indexing-jobs-panel.d.ts +34 -0
  196. package/dist-types/components/data/media-indexing-jobs-panel.d.ts.map +1 -0
  197. package/dist-types/components/data/media-panel.d.ts +58 -0
  198. package/dist-types/components/data/media-panel.d.ts.map +1 -0
  199. package/dist-types/components/data/notion-panel.d.ts +6 -0
  200. package/dist-types/components/data/notion-panel.d.ts.map +1 -0
  201. package/dist-types/components/data/paste-panel.d.ts +7 -0
  202. package/dist-types/components/data/paste-panel.d.ts.map +1 -0
  203. package/dist-types/components/data/project-data-page.d.ts +3 -0
  204. package/dist-types/components/data/project-data-page.d.ts.map +1 -0
  205. package/dist-types/components/data/scrape-panel.d.ts +9 -0
  206. package/dist-types/components/data/scrape-panel.d.ts.map +1 -0
  207. package/dist-types/components/data/tabular-preview.d.ts +10 -0
  208. package/dist-types/components/data/tabular-preview.d.ts.map +1 -0
  209. package/dist-types/components/data/tool-indexing-dialog.d.ts +54 -0
  210. package/dist-types/components/data/tool-indexing-dialog.d.ts.map +1 -0
  211. package/dist-types/components/data/upload-panel.d.ts +7 -0
  212. package/dist-types/components/data/upload-panel.d.ts.map +1 -0
  213. package/dist-types/components/data/web-crawler-status.d.ts +3 -0
  214. package/dist-types/components/data/web-crawler-status.d.ts.map +1 -0
  215. package/dist-types/components/projects/project-form-dialog.d.ts +10 -0
  216. package/dist-types/components/projects/project-form-dialog.d.ts.map +1 -0
  217. package/dist-types/components/projects/project-provider.d.ts +34 -0
  218. package/dist-types/components/projects/project-provider.d.ts.map +1 -0
  219. package/dist-types/components/settings/general/agent-customization-section.d.ts +2 -0
  220. package/dist-types/components/settings/general/agent-customization-section.d.ts.map +1 -0
  221. package/dist-types/components/settings/general/mcp-connections-section.d.ts +2 -0
  222. package/dist-types/components/settings/general/mcp-connections-section.d.ts.map +1 -0
  223. package/dist-types/components/settings/general/model-combobox.d.ts +24 -0
  224. package/dist-types/components/settings/general/model-combobox.d.ts.map +1 -0
  225. package/dist-types/components/settings/general/models-section.d.ts +2 -0
  226. package/dist-types/components/settings/general/models-section.d.ts.map +1 -0
  227. package/dist-types/components/settings/general/sandbox-section.d.ts +7 -0
  228. package/dist-types/components/settings/general/sandbox-section.d.ts.map +1 -0
  229. package/dist-types/components/settings/general/search-scraping-section.d.ts +2 -0
  230. package/dist-types/components/settings/general/search-scraping-section.d.ts.map +1 -0
  231. package/dist-types/components/settings/general/storage-indexing-section.d.ts +2 -0
  232. package/dist-types/components/settings/general/storage-indexing-section.d.ts.map +1 -0
  233. package/dist-types/components/ui/alert-dialog.d.ts +19 -0
  234. package/dist-types/components/ui/alert-dialog.d.ts.map +1 -0
  235. package/dist-types/components/ui/alert.d.ts +11 -0
  236. package/dist-types/components/ui/alert.d.ts.map +1 -0
  237. package/dist-types/components/ui/badge.d.ts +8 -0
  238. package/dist-types/components/ui/badge.d.ts.map +1 -0
  239. package/dist-types/components/ui/card.d.ts +2 -0
  240. package/dist-types/components/ui/card.d.ts.map +1 -0
  241. package/dist-types/components/ui/checkbox.d.ts +4 -0
  242. package/dist-types/components/ui/checkbox.d.ts.map +1 -0
  243. package/dist-types/components/ui/collapsible.d.ts +6 -0
  244. package/dist-types/components/ui/collapsible.d.ts.map +1 -0
  245. package/dist-types/components/ui/command.d.ts +20 -0
  246. package/dist-types/components/ui/command.d.ts.map +1 -0
  247. package/dist-types/components/ui/dialog.d.ts +18 -0
  248. package/dist-types/components/ui/dialog.d.ts.map +1 -0
  249. package/dist-types/components/ui/dropdown-menu.d.ts +30 -0
  250. package/dist-types/components/ui/dropdown-menu.d.ts.map +1 -0
  251. package/dist-types/components/ui/input-group.d.ts +19 -0
  252. package/dist-types/components/ui/input-group.d.ts.map +1 -0
  253. package/dist-types/components/ui/input.d.ts +4 -0
  254. package/dist-types/components/ui/input.d.ts.map +1 -0
  255. package/dist-types/components/ui/line-tabs.d.ts +15 -0
  256. package/dist-types/components/ui/line-tabs.d.ts.map +1 -0
  257. package/dist-types/components/ui/popover.d.ts +10 -0
  258. package/dist-types/components/ui/popover.d.ts.map +1 -0
  259. package/dist-types/components/ui/progress.d.ts +8 -0
  260. package/dist-types/components/ui/progress.d.ts.map +1 -0
  261. package/dist-types/components/ui/scroll-area.d.ts +6 -0
  262. package/dist-types/components/ui/scroll-area.d.ts.map +1 -0
  263. package/dist-types/components/ui/sheet.d.ts +15 -0
  264. package/dist-types/components/ui/sheet.d.ts.map +1 -0
  265. package/dist-types/components/ui/slider.d.ts +4 -0
  266. package/dist-types/components/ui/slider.d.ts.map +1 -0
  267. package/dist-types/components/ui/switch.d.ts +6 -0
  268. package/dist-types/components/ui/switch.d.ts.map +1 -0
  269. package/dist-types/components/ui/table.d.ts +2 -0
  270. package/dist-types/components/ui/table.d.ts.map +1 -0
  271. package/dist-types/components/ui/tabs.d.ts +11 -0
  272. package/dist-types/components/ui/tabs.d.ts.map +1 -0
  273. package/dist-types/components/ui/textarea.d.ts +2 -0
  274. package/dist-types/components/ui/textarea.d.ts.map +1 -0
  275. package/dist-types/components/ui/tooltip.d.ts +7 -0
  276. package/dist-types/components/ui/tooltip.d.ts.map +1 -0
  277. package/dist-types/hooks/use-copy-to-clipboard.d.ts +5 -0
  278. package/dist-types/hooks/use-copy-to-clipboard.d.ts.map +1 -0
  279. package/dist-types/hooks/use-integration-auth.d.ts +10 -0
  280. package/dist-types/hooks/use-integration-auth.d.ts.map +1 -0
  281. package/dist-types/hooks/use-live-media-progress.d.ts +14 -0
  282. package/dist-types/hooks/use-live-media-progress.d.ts.map +1 -0
  283. package/dist-types/hooks/use-notion-auth.d.ts +9 -0
  284. package/dist-types/hooks/use-notion-auth.d.ts.map +1 -0
  285. package/dist-types/host.d.ts +20 -0
  286. package/dist-types/host.d.ts.map +1 -0
  287. package/dist-types/lib/browser-cache.d.ts +7 -0
  288. package/dist-types/lib/browser-cache.d.ts.map +1 -0
  289. package/dist-types/lib/chat/chart-config.d.ts +2 -0
  290. package/dist-types/lib/chat/chart-config.d.ts.map +1 -0
  291. package/dist-types/lib/chat/data-export.d.ts +2 -0
  292. package/dist-types/lib/chat/data-export.d.ts.map +1 -0
  293. package/dist-types/lib/chat/live-tool-progress.d.ts +44 -0
  294. package/dist-types/lib/chat/live-tool-progress.d.ts.map +1 -0
  295. package/dist-types/lib/chat/message-feedback.d.ts +2 -0
  296. package/dist-types/lib/chat/message-feedback.d.ts.map +1 -0
  297. package/dist-types/lib/chat/table-presentation.d.ts +2 -0
  298. package/dist-types/lib/chat/table-presentation.d.ts.map +1 -0
  299. package/dist-types/lib/chat/tool-output.d.ts +3 -0
  300. package/dist-types/lib/chat/tool-output.d.ts.map +1 -0
  301. package/dist-types/lib/chat-supporting-clip.d.ts +11 -0
  302. package/dist-types/lib/chat-supporting-clip.d.ts.map +1 -0
  303. package/dist-types/lib/constants/stores.d.ts +6 -0
  304. package/dist-types/lib/constants/stores.d.ts.map +1 -0
  305. package/dist-types/lib/constants/tools.d.ts +27 -0
  306. package/dist-types/lib/constants/tools.d.ts.map +1 -0
  307. package/dist-types/lib/error-formatter.d.ts +2 -0
  308. package/dist-types/lib/error-formatter.d.ts.map +1 -0
  309. package/dist-types/lib/jobs-client.d.ts +7 -0
  310. package/dist-types/lib/jobs-client.d.ts.map +1 -0
  311. package/dist-types/lib/media/pdf.d.ts +6 -0
  312. package/dist-types/lib/media/pdf.d.ts.map +1 -0
  313. package/dist-types/lib/media/progress.d.ts +61 -0
  314. package/dist-types/lib/media/progress.d.ts.map +1 -0
  315. package/dist-types/lib/media/source-selection.d.ts +10 -0
  316. package/dist-types/lib/media/source-selection.d.ts.map +1 -0
  317. package/dist-types/lib/media/tool-indexing-estimate.d.ts +13 -0
  318. package/dist-types/lib/media/tool-indexing-estimate.d.ts.map +1 -0
  319. package/dist-types/lib/media/video-intelligence-capacity.d.ts +2 -0
  320. package/dist-types/lib/media/video-intelligence-capacity.d.ts.map +1 -0
  321. package/dist-types/lib/media/video-runtime-scope.d.ts +2 -0
  322. package/dist-types/lib/media/video-runtime-scope.d.ts.map +1 -0
  323. package/dist-types/lib/shared/error-formatter.d.ts +2 -0
  324. package/dist-types/lib/shared/error-formatter.d.ts.map +1 -0
  325. package/dist-types/lib/utils.d.ts +3 -0
  326. package/dist-types/lib/utils.d.ts.map +1 -0
  327. package/dist-types/storage.d.ts +5 -0
  328. package/dist-types/storage.d.ts.map +1 -0
  329. package/dist-types/store/chat-store.d.ts +19 -0
  330. package/dist-types/store/chat-store.d.ts.map +1 -0
  331. package/dist-types/store/scrape-store.d.ts +42 -0
  332. package/dist-types/store/scrape-store.d.ts.map +1 -0
  333. package/package.json +579 -3
  334. package/scripts/build-assets.mjs +12 -0
  335. package/src/asset-data.json +1 -0
  336. package/src/asset-server.ts +19 -0
  337. package/src/components/alerts/generic-alert.tsx +76 -0
  338. package/src/components/chat/canvas/doc-editor-provider.tsx +338 -0
  339. package/src/components/chat/canvas/document-canvas.tsx +98 -0
  340. package/src/components/chat/canvas/document-field.tsx +167 -0
  341. package/src/components/chat/canvas/document-viewer.tsx +446 -0
  342. package/src/components/chat/canvas/file-attachment-button.tsx +88 -0
  343. package/src/components/chat/chat-workspace.tsx +1552 -0
  344. package/src/components/chat/message-actions.tsx +96 -0
  345. package/src/components/chat/message-item.tsx +1398 -0
  346. package/src/components/chat/message-queue.tsx +86 -0
  347. package/src/components/chat/tools/chat-chart.tsx +558 -0
  348. package/src/components/chat/tools/chat-citations.tsx +152 -0
  349. package/src/components/chat/tools/chat-data-table.tsx +373 -0
  350. package/src/components/chat/tools/chat-file-export.tsx +49 -0
  351. package/src/components/chat/tools/chat-media-preview.tsx +466 -0
  352. package/src/components/chat/tools/chat-sandbox-result.tsx +130 -0
  353. package/src/components/chat/tools/chat-signature-request.tsx +810 -0
  354. package/src/components/chat/tools/chat-tabs.tsx +59 -0
  355. package/src/components/chat/tools/corpus-data-result.tsx +194 -0
  356. package/src/components/chat/tools/knowledge-base-result.tsx +345 -0
  357. package/src/components/chat/tools/visual-placement-modal.tsx +308 -0
  358. package/src/components/configure/custom-model-modal.tsx +209 -0
  359. package/src/components/configure/store-fields.tsx +129 -0
  360. package/src/components/data/corpus-panel.tsx +1223 -0
  361. package/src/components/data/data-entry-mode-switch.tsx +53 -0
  362. package/src/components/data/data-primary-action.ts +6 -0
  363. package/src/components/data/data-workspace.tsx +623 -0
  364. package/src/components/data/groups-panel.tsx +530 -0
  365. package/src/components/data/integration-resources-panel.tsx +282 -0
  366. package/src/components/data/integrations-panel.tsx +392 -0
  367. package/src/components/data/jobs-panel.tsx +490 -0
  368. package/src/components/data/jobs-tracking-button.tsx +224 -0
  369. package/src/components/data/live-media-progress.tsx +79 -0
  370. package/src/components/data/media-indexing-jobs-panel.tsx +190 -0
  371. package/src/components/data/media-panel.tsx +2905 -0
  372. package/src/components/data/notion-panel.tsx +408 -0
  373. package/src/components/data/paste-panel.tsx +82 -0
  374. package/src/components/data/project-data-page.tsx +55 -0
  375. package/src/components/data/scrape-panel.tsx +1290 -0
  376. package/src/components/data/tabular-preview.tsx +205 -0
  377. package/src/components/data/tool-indexing-dialog.tsx +210 -0
  378. package/src/components/data/upload-panel.tsx +1313 -0
  379. package/src/components/data/web-crawler-status.tsx +132 -0
  380. package/src/components/projects/project-form-dialog.tsx +97 -0
  381. package/src/components/projects/project-provider.tsx +143 -0
  382. package/src/components/settings/general/agent-customization-section.tsx +620 -0
  383. package/src/components/settings/general/mcp-connections-section.tsx +907 -0
  384. package/src/components/settings/general/model-combobox.tsx +235 -0
  385. package/src/components/settings/general/models-section.tsx +909 -0
  386. package/src/components/settings/general/sandbox-section.tsx +394 -0
  387. package/src/components/settings/general/search-scraping-section.tsx +757 -0
  388. package/src/components/settings/general/storage-indexing-section.tsx +394 -0
  389. package/src/components/ui/alert-dialog.tsx +162 -0
  390. package/src/components/ui/alert.tsx +69 -0
  391. package/src/components/ui/badge.tsx +49 -0
  392. package/src/components/ui/card.tsx +9 -0
  393. package/src/components/ui/checkbox.tsx +28 -0
  394. package/src/components/ui/collapsible.tsx +17 -0
  395. package/src/components/ui/command.tsx +175 -0
  396. package/src/components/ui/dialog.tsx +138 -0
  397. package/src/components/ui/dropdown-menu.tsx +267 -0
  398. package/src/components/ui/input-group.tsx +146 -0
  399. package/src/components/ui/input.tsx +19 -0
  400. package/src/components/ui/line-tabs.tsx +49 -0
  401. package/src/components/ui/popover.tsx +77 -0
  402. package/src/components/ui/progress.tsx +66 -0
  403. package/src/components/ui/scroll-area.tsx +51 -0
  404. package/src/components/ui/sheet.tsx +125 -0
  405. package/src/components/ui/slider.tsx +52 -0
  406. package/src/components/ui/switch.tsx +32 -0
  407. package/src/components/ui/table.tsx +10 -0
  408. package/src/components/ui/tabs.tsx +77 -0
  409. package/src/components/ui/textarea.tsx +1 -0
  410. package/src/components/ui/tooltip.tsx +54 -0
  411. package/src/hooks/use-copy-to-clipboard.ts +25 -0
  412. package/src/hooks/use-integration-auth.ts +39 -0
  413. package/src/hooks/use-live-media-progress.ts +71 -0
  414. package/src/hooks/use-notion-auth.ts +66 -0
  415. package/src/host.ts +55 -0
  416. package/src/lib/browser-cache.ts +17 -0
  417. package/src/lib/chat/chart-config.ts +1 -0
  418. package/src/lib/chat/data-export.ts +1 -0
  419. package/src/lib/chat/live-tool-progress.ts +69 -0
  420. package/src/lib/chat/message-feedback.ts +1 -0
  421. package/src/lib/chat/table-presentation.ts +1 -0
  422. package/src/lib/chat/tool-output.ts +14 -0
  423. package/src/lib/chat-supporting-clip.ts +16 -0
  424. package/src/lib/constants/stores.ts +12 -0
  425. package/src/lib/constants/tools.ts +178 -0
  426. package/src/lib/error-formatter.ts +30 -0
  427. package/src/lib/jobs-client.ts +27 -0
  428. package/src/lib/media/pdf.ts +57 -0
  429. package/src/lib/media/progress.ts +209 -0
  430. package/src/lib/media/source-selection.ts +47 -0
  431. package/src/lib/media/tool-indexing-estimate.ts +39 -0
  432. package/src/lib/media/video-intelligence-capacity.ts +1 -0
  433. package/src/lib/media/video-runtime-scope.ts +1 -0
  434. package/src/lib/shared/error-formatter.ts +1 -0
  435. package/src/lib/utils.ts +6 -0
  436. package/src/source.css +1 -0
  437. package/src/storage.ts +16 -0
  438. package/src/store/chat-store.ts +19 -0
  439. package/src/store/scrape-store.ts +76 -0
  440. package/src/styles.d.ts +1 -0
@@ -0,0 +1,530 @@
1
+ 'use client';
2
+
3
+ import { workspaceUrl, workspaceFetch as fetch } from '../../host';
4
+ import { useState } from 'react';
5
+ import useSWR from 'swr';
6
+ import {
7
+ Dices,
8
+ FolderPlus,
9
+ Grid2X2,
10
+ List,
11
+ Loader2,
12
+ MoreHorizontal,
13
+ Pencil,
14
+ Plus,
15
+ Trash2,
16
+ } from 'lucide-react';
17
+ import { toast } from 'sonner';
18
+ import { Button } from '@larkup/workspace-ui/button';
19
+ import { Input } from '../ui/input';
20
+ import { Label } from '@larkup/workspace-ui/label';
21
+ import { Switch } from '../ui/switch';
22
+ import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../ui/tooltip';
23
+ import {
24
+ Dialog,
25
+ DialogContent,
26
+ DialogDescription,
27
+ DialogFooter,
28
+ DialogHeader,
29
+ DialogTitle,
30
+ } from '../ui/dialog';
31
+ import {
32
+ AlertDialog,
33
+ AlertDialogAction,
34
+ AlertDialogCancel,
35
+ AlertDialogContent,
36
+ AlertDialogDescription,
37
+ AlertDialogFooter,
38
+ AlertDialogHeader,
39
+ AlertDialogTitle,
40
+ } from '../ui/alert-dialog';
41
+ import {
42
+ DropdownMenu,
43
+ DropdownMenuContent,
44
+ DropdownMenuItem,
45
+ DropdownMenuSeparator,
46
+ DropdownMenuTrigger,
47
+ } from '../ui/dropdown-menu';
48
+ import type { DataGroup } from '@larkup/core/types';
49
+
50
+ const fetcher = (url: string) => fetch(url).then((response) => response.json());
51
+ type GroupSummary = DataGroup & { sourceCount: number };
52
+
53
+ export function GroupsPanel({
54
+ onAddToGroup,
55
+ onView,
56
+ }: {
57
+ onAddToGroup: (groupId: string) => void;
58
+ onView: (groupId: string) => void;
59
+ }) {
60
+ const { data, mutate } = useSWR<{ groups: GroupSummary[]; ungroupedCount: number }>(
61
+ workspaceUrl('/api/groups'),
62
+ fetcher,
63
+ );
64
+ const [view, setView] = useState<'cards' | 'table'>('cards');
65
+ const [open, setOpen] = useState(false);
66
+ const [name, setName] = useState('');
67
+ const [icon, setIcon] = useState('');
68
+ const [searchQuery, setSearchQuery] = useState('');
69
+ const [editingGroup, setEditingGroup] = useState<GroupSummary | null>(null);
70
+ const [editName, setEditName] = useState('');
71
+ const [savingEdit, setSavingEdit] = useState(false);
72
+ const [deletingGroup, setDeletingGroup] = useState<GroupSummary | null>(null);
73
+ const [deleting, setDeleting] = useState(false);
74
+ const groups = data?.groups ?? [];
75
+
76
+ const filteredGroups = groups.filter((group) =>
77
+ group.name.toLowerCase().includes(searchQuery.toLowerCase()),
78
+ );
79
+
80
+ async function create() {
81
+ const trimmed = name.trim();
82
+ if (!trimmed) return toast.error('Enter a group name.');
83
+ const response = await fetch(workspaceUrl('/api/groups'), {
84
+ method: 'POST',
85
+ headers: { 'Content-Type': 'application/json' },
86
+ body: JSON.stringify({ name: trimmed, icon: icon.trim() || undefined }),
87
+ });
88
+ if (!response.ok)
89
+ return toast.error(
90
+ (await response.json().catch(() => ({}))).error || 'Could not create group.',
91
+ );
92
+ setName('');
93
+ setIcon('');
94
+ setOpen(false);
95
+ await mutate();
96
+ toast.success(`Created ${trimmed}.`);
97
+ }
98
+
99
+ async function setAvailability(group: GroupSummary, assistantEnabled: boolean) {
100
+ const response = await fetch(workspaceUrl('/api/groups'), {
101
+ method: 'PATCH',
102
+ headers: { 'Content-Type': 'application/json' },
103
+ body: JSON.stringify({ id: group.id, assistantEnabled }),
104
+ });
105
+ if (!response.ok) return toast.error('Could not update group availability.');
106
+ await mutate();
107
+ }
108
+
109
+ function startRename(group: GroupSummary) {
110
+ setEditingGroup(group);
111
+ setEditName(group.name);
112
+ }
113
+
114
+ async function rename() {
115
+ if (!editingGroup || savingEdit) return;
116
+ const trimmed = editName.trim();
117
+ if (!trimmed) return toast.error('Enter a group name.');
118
+ setSavingEdit(true);
119
+ try {
120
+ const response = await fetch(workspaceUrl('/api/groups'), {
121
+ method: 'PATCH',
122
+ headers: { 'Content-Type': 'application/json' },
123
+ body: JSON.stringify({ id: editingGroup.id, name: trimmed }),
124
+ });
125
+ if (!response.ok) {
126
+ const body = (await response.json().catch(() => ({}))) as { error?: string };
127
+ return toast.error(body.error || 'Could not rename group.');
128
+ }
129
+ setEditingGroup(null);
130
+ await mutate();
131
+ toast.success(`Renamed group to ${trimmed}.`);
132
+ } finally {
133
+ setSavingEdit(false);
134
+ }
135
+ }
136
+
137
+ async function remove() {
138
+ if (!deletingGroup || deleting || deletingGroup.sourceCount > 0) return;
139
+ setDeleting(true);
140
+ try {
141
+ const response = await fetch(
142
+ workspaceUrl(`/api/groups?id=${encodeURIComponent(deletingGroup.id)}`),
143
+ {
144
+ method: 'DELETE',
145
+ },
146
+ );
147
+ if (!response.ok) {
148
+ const body = (await response.json().catch(() => ({}))) as { error?: string };
149
+ return toast.error(body.error || 'Could not delete group.');
150
+ }
151
+ const deletedName = deletingGroup.name;
152
+ setDeletingGroup(null);
153
+ await mutate();
154
+ toast.success(`Deleted ${deletedName}.`);
155
+ } finally {
156
+ setDeleting(false);
157
+ }
158
+ }
159
+
160
+ function generateRandomIcon() {
161
+ const emojis = [
162
+ '🚀',
163
+ '🌟',
164
+ '📚',
165
+ '🛠️',
166
+ '💡',
167
+ '🔥',
168
+ '⚙️',
169
+ '📈',
170
+ '🎨',
171
+ '🧩',
172
+ '🧪',
173
+ '🌍',
174
+ '⚡',
175
+ '🏆',
176
+ '🎯',
177
+ '📦',
178
+ '🧠',
179
+ '🛡️',
180
+ '💎',
181
+ '📱',
182
+ '🕹️',
183
+ '🔮',
184
+ ];
185
+ setIcon(emojis[Math.floor(Math.random() * emojis.length)]);
186
+ }
187
+
188
+ return (
189
+ <section className="px-6 py-2 md:px-8">
190
+ <div className="flex flex-wrap items-center gap-2">
191
+ <div className="mr-auto w-full max-w-md flex-1">
192
+ <Input
193
+ placeholder="Search groups..."
194
+ value={searchQuery}
195
+ onChange={(e) => setSearchQuery(e.target.value)}
196
+ className="h-9 w-full bg-white"
197
+ />
198
+ </div>
199
+ <div className="flex rounded-md border p-0.5 bg-white">
200
+ <TooltipProvider delay={250}>
201
+ <Tooltip>
202
+ <TooltipTrigger
203
+ render={
204
+ <Button
205
+ size="icon"
206
+ variant={view === 'cards' ? 'secondary' : 'ghost'}
207
+ className="size-8"
208
+ onClick={() => setView('cards')}
209
+ aria-label="Card view"
210
+ >
211
+ <Grid2X2 className="size-4" />
212
+ </Button>
213
+ }
214
+ />
215
+ <TooltipContent>Card view</TooltipContent>
216
+ </Tooltip>
217
+ </TooltipProvider>
218
+ <TooltipProvider delay={250}>
219
+ <Tooltip>
220
+ <TooltipTrigger
221
+ render={
222
+ <Button
223
+ size="icon"
224
+ variant={view === 'table' ? 'secondary' : 'ghost'}
225
+ className="size-8"
226
+ onClick={() => setView('table')}
227
+ aria-label="Table view"
228
+ >
229
+ <List className="size-4" />
230
+ </Button>
231
+ }
232
+ />
233
+ <TooltipContent>Table view</TooltipContent>
234
+ </Tooltip>
235
+ </TooltipProvider>
236
+ </div>
237
+ <Button size="default" className="h-9" onClick={() => setOpen(true)}>
238
+ <FolderPlus className="mr-2 size-4" /> New group
239
+ </Button>
240
+ </div>
241
+ {view === 'cards' ? (
242
+ <div className="mt-4 grid gap-3 sm:grid-cols-2 xl:grid-cols-4 2xl:grid-cols-5">
243
+ {filteredGroups.map((group) => (
244
+ <GroupCard
245
+ key={group.id}
246
+ group={group}
247
+ onAdd={onAddToGroup}
248
+ onAvailability={setAvailability}
249
+ onDelete={setDeletingGroup}
250
+ onRename={startRename}
251
+ onView={onView}
252
+ />
253
+ ))}
254
+ </div>
255
+ ) : (
256
+ <div className="mt-4 overflow-hidden rounded-lg border">
257
+ {filteredGroups.map((group) => (
258
+ <div
259
+ key={group.id}
260
+ className="flex items-center gap-3 border-b px-3 py-2.5 last:border-0 bg-white/70 cursor-pointer hover:bg-white/90"
261
+ onClick={() => onView(group.id)}
262
+ >
263
+ <span className="text-lg">{group.icon || '✦'}</span>
264
+ <span className="min-w-0 flex-1 truncate text-sm font-medium">{group.name}</span>
265
+ <span className="text-xs text-muted-foreground">{group.sourceCount} sources</span>
266
+ <Availability group={group} onChange={setAvailability} />
267
+ {group.id !== 'default' && (
268
+ <GroupActions group={group} onDelete={setDeletingGroup} onRename={startRename} />
269
+ )}
270
+ <Button
271
+ size="sm"
272
+ variant="ghost"
273
+ className="h-7"
274
+ onClick={(e) => {
275
+ e.stopPropagation();
276
+ onAddToGroup(group.id);
277
+ }}
278
+ >
279
+ <Plus className="size-3" /> Add
280
+ </Button>
281
+ </div>
282
+ ))}
283
+ </div>
284
+ )}
285
+ <Dialog open={open} onOpenChange={setOpen}>
286
+ <DialogContent className="sm:max-w-sm">
287
+ <DialogHeader>
288
+ <DialogTitle>New group</DialogTitle>
289
+ <DialogDescription>
290
+ Use an optional emoji or image URL. A unique icon is chosen automatically when left
291
+ blank.
292
+ </DialogDescription>
293
+ </DialogHeader>
294
+ <div className="space-y-4">
295
+ <div className="space-y-2">
296
+ <Label htmlFor="group-name">Name</Label>
297
+ <Input
298
+ id="group-name"
299
+ autoFocus
300
+ value={name}
301
+ onChange={(event) => setName(event.target.value)}
302
+ onKeyDown={(event) => event.key === 'Enter' && void create()}
303
+ placeholder="Support docs"
304
+ />
305
+ </div>
306
+ <div className="space-y-2">
307
+ <Label htmlFor="group-icon">
308
+ Icon or image URL <span className="text-muted-foreground">(optional)</span>
309
+ </Label>
310
+ <div className="flex gap-2">
311
+ <Input
312
+ id="group-icon"
313
+ value={icon}
314
+ onChange={(event) => setIcon(event.target.value)}
315
+ placeholder="📘 or https://…"
316
+ />
317
+ <TooltipProvider delay={250}>
318
+ <Tooltip>
319
+ <TooltipTrigger
320
+ render={
321
+ <Button
322
+ type="button"
323
+ size="icon"
324
+ variant="outline"
325
+ className="shrink-0 h-10 w-9"
326
+ onClick={generateRandomIcon}
327
+ aria-label="Generate random icon"
328
+ >
329
+ <Dices className="size-4" />
330
+ </Button>
331
+ }
332
+ />
333
+ <TooltipContent>Random icon</TooltipContent>
334
+ </Tooltip>
335
+ </TooltipProvider>
336
+ </div>
337
+ </div>
338
+ </div>
339
+ <DialogFooter>
340
+ <Button variant="outline" onClick={() => setOpen(false)}>
341
+ Cancel
342
+ </Button>
343
+ <Button onClick={() => void create()}>Create group</Button>
344
+ </DialogFooter>
345
+ </DialogContent>
346
+ </Dialog>
347
+ <Dialog
348
+ open={editingGroup !== null}
349
+ onOpenChange={(nextOpen) => !nextOpen && !savingEdit && setEditingGroup(null)}
350
+ >
351
+ <DialogContent className="sm:max-w-sm">
352
+ <DialogHeader>
353
+ <DialogTitle>Rename group</DialogTitle>
354
+ <DialogDescription>
355
+ Choose a clear name for this collection of sources.
356
+ </DialogDescription>
357
+ </DialogHeader>
358
+ <div className="space-y-2">
359
+ <Label htmlFor="rename-group-name">Name</Label>
360
+ <Input
361
+ id="rename-group-name"
362
+ autoFocus
363
+ value={editName}
364
+ onChange={(event) => setEditName(event.target.value)}
365
+ onKeyDown={(event) => event.key === 'Enter' && void rename()}
366
+ placeholder="Support docs"
367
+ />
368
+ </div>
369
+ <DialogFooter>
370
+ <Button variant="outline" onClick={() => setEditingGroup(null)} disabled={savingEdit}>
371
+ Cancel
372
+ </Button>
373
+ <Button onClick={() => void rename()} disabled={savingEdit || !editName.trim()}>
374
+ {savingEdit && <Loader2 className="size-4 animate-spin" />}
375
+ Save name
376
+ </Button>
377
+ </DialogFooter>
378
+ </DialogContent>
379
+ </Dialog>
380
+ <AlertDialog
381
+ open={deletingGroup !== null}
382
+ onOpenChange={(nextOpen) => !nextOpen && !deleting && setDeletingGroup(null)}
383
+ >
384
+ <AlertDialogContent>
385
+ <AlertDialogHeader>
386
+ <AlertDialogTitle>Delete {deletingGroup?.name}?</AlertDialogTitle>
387
+ <AlertDialogDescription>
388
+ {deletingGroup && deletingGroup.sourceCount > 0
389
+ ? `This group still contains ${deletingGroup.sourceCount} ${deletingGroup.sourceCount === 1 ? 'source' : 'sources'}. Move or delete them before deleting the group.`
390
+ : 'This removes the empty group permanently. Your other groups and sources are not affected.'}
391
+ </AlertDialogDescription>
392
+ </AlertDialogHeader>
393
+ <AlertDialogFooter>
394
+ <AlertDialogCancel disabled={deleting}>Cancel</AlertDialogCancel>
395
+ <AlertDialogAction
396
+ variant="destructive"
397
+ disabled={deleting || (deletingGroup?.sourceCount ?? 0) > 0}
398
+ onClick={() => void remove()}
399
+ >
400
+ {deleting && <Loader2 className="size-4 animate-spin" />}
401
+ Delete group
402
+ </AlertDialogAction>
403
+ </AlertDialogFooter>
404
+ </AlertDialogContent>
405
+ </AlertDialog>
406
+ </section>
407
+ );
408
+ }
409
+
410
+ function GroupActions({
411
+ group,
412
+ onDelete,
413
+ onRename,
414
+ }: {
415
+ group: GroupSummary;
416
+ onDelete: (group: GroupSummary) => void;
417
+ onRename: (group: GroupSummary) => void;
418
+ }) {
419
+ return (
420
+ <DropdownMenu>
421
+ <DropdownMenuTrigger
422
+ render={
423
+ <Button
424
+ type="button"
425
+ size="icon"
426
+ variant="ghost"
427
+ className="size-7 shrink-0"
428
+ aria-label={`Group actions for ${group.name}`}
429
+ onClick={(event) => event.stopPropagation()}
430
+ >
431
+ <MoreHorizontal className="size-4" />
432
+ </Button>
433
+ }
434
+ />
435
+ <DropdownMenuContent align="end" className="w-36">
436
+ <DropdownMenuItem onClick={() => onRename(group)}>
437
+ <Pencil className="size-4" /> Rename
438
+ </DropdownMenuItem>
439
+ <DropdownMenuSeparator />
440
+ <DropdownMenuItem variant="destructive" onClick={() => onDelete(group)}>
441
+ <Trash2 className="size-4" /> Delete
442
+ </DropdownMenuItem>
443
+ </DropdownMenuContent>
444
+ </DropdownMenu>
445
+ );
446
+ }
447
+
448
+ function Availability({
449
+ group,
450
+ onChange,
451
+ }: {
452
+ group: GroupSummary;
453
+ onChange: (group: GroupSummary, value: boolean) => void;
454
+ }) {
455
+ return (
456
+ <TooltipProvider delay={250}>
457
+ <Tooltip>
458
+ <TooltipTrigger
459
+ render={
460
+ <span>
461
+ <Switch
462
+ checked={group.assistantEnabled}
463
+ onCheckedChange={(value) => void onChange(group, value)}
464
+ aria-label={`Make ${group.name} available to Assistant`}
465
+ />
466
+ </span>
467
+ }
468
+ />
469
+ <TooltipContent>
470
+ {group.assistantEnabled ? 'Available to Assistant chat' : 'Hidden from Assistant chat'}
471
+ </TooltipContent>
472
+ </Tooltip>
473
+ </TooltipProvider>
474
+ );
475
+ }
476
+
477
+ function GroupCard({
478
+ group,
479
+ onAdd,
480
+ onAvailability,
481
+ onDelete,
482
+ onRename,
483
+ onView,
484
+ }: {
485
+ group: GroupSummary;
486
+ onAdd: (id: string) => void;
487
+ onAvailability: (group: GroupSummary, value: boolean) => void;
488
+ onDelete: (group: GroupSummary) => void;
489
+ onRename: (group: GroupSummary) => void;
490
+ onView: (id: string) => void;
491
+ }) {
492
+ const image = group.icon?.startsWith('http');
493
+ return (
494
+ <div
495
+ className="rounded-xl border bg-card p-3 transition-colors hover:border-primary/30 cursor-pointer"
496
+ onClick={() => onView(group.id)}
497
+ >
498
+ <div className="flex items-start gap-3">
499
+ <div className="flex size-10 shrink-0 items-center justify-center overflow-hidden rounded-lg bg-muted text-lg">
500
+ {image ? (
501
+ <img src={group.icon} alt="" className="size-full object-cover" />
502
+ ) : (
503
+ group.icon || '✦'
504
+ )}
505
+ </div>
506
+ <div className="min-w-0 flex-1">
507
+ <p className="truncate text-sm font-medium">{group.name}</p>
508
+ <p className="mt-0.5 text-xs text-muted-foreground">{group.sourceCount} sources</p>
509
+ </div>
510
+ <div className="flex items-center gap-1" onClick={(e) => e.stopPropagation()}>
511
+ <Availability group={group} onChange={onAvailability} />
512
+ {group.id !== 'default' && (
513
+ <GroupActions group={group} onDelete={onDelete} onRename={onRename} />
514
+ )}
515
+ </div>
516
+ </div>
517
+ <Button
518
+ size="sm"
519
+ variant="secondary"
520
+ className="mt-3 w-full"
521
+ onClick={(e) => {
522
+ e.stopPropagation();
523
+ onAdd(group.id);
524
+ }}
525
+ >
526
+ <Plus className="size-3.5" /> Add data
527
+ </Button>
528
+ </div>
529
+ );
530
+ }