@arbidocs/react 0.4.3 → 0.4.5

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 (72) hide show
  1. package/README.md +33 -0
  2. package/dist/artifacts/index.cjs +458 -0
  3. package/dist/artifacts/index.cjs.map +1 -0
  4. package/dist/artifacts/index.d.cts +276 -0
  5. package/dist/artifacts/index.d.ts +276 -0
  6. package/dist/artifacts/index.js +434 -0
  7. package/dist/artifacts/index.js.map +1 -0
  8. package/dist/artifacts/redline-core.cjs +20 -0
  9. package/dist/artifacts/redline-core.cjs.map +1 -0
  10. package/dist/artifacts/redline-core.d.cts +36 -0
  11. package/dist/artifacts/redline-core.d.ts +36 -0
  12. package/dist/artifacts/redline-core.js +3 -0
  13. package/dist/artifacts/redline-core.js.map +1 -0
  14. package/dist/chunk-2DXS7L7M.cjs +302 -0
  15. package/dist/chunk-2DXS7L7M.cjs.map +1 -0
  16. package/dist/{chunk-ORKGCXG3.cjs → chunk-7BDGLRQX.cjs} +123 -427
  17. package/dist/chunk-7BDGLRQX.cjs.map +1 -0
  18. package/dist/chunk-7V7B7OEM.cjs +318 -0
  19. package/dist/chunk-7V7B7OEM.cjs.map +1 -0
  20. package/dist/{chunk-MIJRORQL.js → chunk-DVRJFLE7.js} +8 -302
  21. package/dist/chunk-DVRJFLE7.js.map +1 -0
  22. package/dist/{chunk-EJ2BMHYK.js → chunk-FSMIN5VX.js} +4 -3
  23. package/dist/chunk-FSMIN5VX.js.map +1 -0
  24. package/dist/chunk-H7ZZQ4ZV.js +305 -0
  25. package/dist/chunk-H7ZZQ4ZV.js.map +1 -0
  26. package/dist/{chunk-JKO3NR5L.js → chunk-HDCRPPBW.js} +5 -23
  27. package/dist/chunk-HDCRPPBW.js.map +1 -0
  28. package/dist/chunk-J4MX2W4H.js +26 -0
  29. package/dist/chunk-J4MX2W4H.js.map +1 -0
  30. package/dist/{chunk-6ALMBER7.js → chunk-N5SVBDLC.js} +4 -9
  31. package/dist/chunk-N5SVBDLC.js.map +1 -0
  32. package/dist/{chunk-RZQACYNQ.cjs → chunk-OBNTJEEO.cjs} +14 -20
  33. package/dist/chunk-OBNTJEEO.cjs.map +1 -0
  34. package/dist/{chunk-BXP6S34V.cjs → chunk-PGLV23SB.cjs} +13 -12
  35. package/dist/chunk-PGLV23SB.cjs.map +1 -0
  36. package/dist/chunk-RKWNX32A.js +299 -0
  37. package/dist/chunk-RKWNX32A.js.map +1 -0
  38. package/dist/chunk-S6A6FSG7.cjs +13 -0
  39. package/dist/chunk-S6A6FSG7.cjs.map +1 -0
  40. package/dist/chunk-SN5YV6FF.js +11 -0
  41. package/dist/chunk-SN5YV6FF.js.map +1 -0
  42. package/dist/{chunk-7IOCMCC5.cjs → chunk-TMPDW7J5.cjs} +3 -23
  43. package/dist/chunk-TMPDW7J5.cjs.map +1 -0
  44. package/dist/chunk-VJWAP2HJ.cjs +303 -0
  45. package/dist/chunk-VJWAP2HJ.cjs.map +1 -0
  46. package/dist/chunk-ZMTLGO3K.cjs +29 -0
  47. package/dist/chunk-ZMTLGO3K.cjs.map +1 -0
  48. package/dist/chunk-ZY53R6I4.js +276 -0
  49. package/dist/chunk-ZY53R6I4.js.map +1 -0
  50. package/dist/index.cjs +784 -612
  51. package/dist/index.cjs.map +1 -1
  52. package/dist/index.d.cts +1522 -82
  53. package/dist/index.d.ts +1522 -82
  54. package/dist/index.js +327 -250
  55. package/dist/index.js.map +1 -1
  56. package/dist/shell/index.cjs +8 -7
  57. package/dist/shell/index.js +3 -2
  58. package/dist/ui/index.cjs +156 -154
  59. package/dist/ui/index.js +4 -2
  60. package/dist/viewers/index.cjs +9 -8
  61. package/dist/viewers/index.cjs.map +1 -1
  62. package/dist/viewers/index.js +3 -2
  63. package/dist/viewers/index.js.map +1 -1
  64. package/package.json +19 -3
  65. package/dist/chunk-6ALMBER7.js.map +0 -1
  66. package/dist/chunk-7IOCMCC5.cjs.map +0 -1
  67. package/dist/chunk-BXP6S34V.cjs.map +0 -1
  68. package/dist/chunk-EJ2BMHYK.js.map +0 -1
  69. package/dist/chunk-JKO3NR5L.js.map +0 -1
  70. package/dist/chunk-MIJRORQL.js.map +0 -1
  71. package/dist/chunk-ORKGCXG3.cjs.map +0 -1
  72. package/dist/chunk-RZQACYNQ.cjs.map +0 -1
package/dist/index.js CHANGED
@@ -1,13 +1,19 @@
1
- import { formatRelativeTime } from './chunk-EJ2BMHYK.js';
2
- export { DEFAULT_NOTIFY_TONE, NotificationBell, Toaster, formatRelativeTime, notify, seedNotifications, selectUnread, toast, useNotify } from './chunk-EJ2BMHYK.js';
3
- import { normalizeCitationMarkup, MarkMenu, AiMarkdown, Card, Button, Badge, TagEntity, MarkdownRenderer, Input, FILE_TYPE_COLORS, getEntityIcon, UserEntity, getEntityColorStyles, AgentBadge, Textarea, Slider, Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, DocumentEntity, DocumentCard, useAudioRecorder, MicWaveformIndicator, IconToggle, classifyMediaError, formatElapsed, PassageCard } from './chunk-MIJRORQL.js';
4
- export { AgentBadge, AiMarkdown, ArbiBotHeadIcon, AudIcon, Avatar, AvatarFallback, AvatarImage, BASE_COLORS, Badge, Button, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Checkbox, Collapsible, CollapsibleContent, CollapsibleTrigger, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DictateProvider, DocumentCard, DocumentEntity, ENTITY_MAPPINGS, EmlIcon, EntityIcon, EntityPill, FILE_TYPE_COLORS, HoverCard, HoverCardContent, HoverCardTrigger, IconToggle, ImgIcon, InlineMicButton, Input, Label, MarkMenu, MarkdownRenderer, MarkdownStreamingContext, MicRecordingOverlay, MicWaveformIndicator, NEUTRAL_GRAY, PLACEHOLDER_COLOR, PassageCard, PdfIcon, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, PresenceLabel, Progress, ProjectEntity, RadioGroup, RadioGroupItem, RagDot, RelevanceDot, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Slider, StatusPill, Switch, TAG_TYPE_ICONS, TAG_TYPE_LABELS, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, TagEntity, Textarea, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, UserEntity, UserMenu, VISIBILITY_ICONS, VidIcon, VisibilityIcon, badgeVariants, buttonVariants, cardVariants, configureEntityRegistry, configureRagLabels, configureStatusRegistry, formatElapsed, getDocIcon, getEntityColor, getEntityColorStyles, getEntityIcon, getEntityLabel, getStatusVariant, getTagTypeIcon, getTagTypeLabel, getWorkspaceColor, markdownBaseComponents, normalizeCitationMarkup, splitMarkdownBlocks, toggleVariants, useAudioRecorder } from './chunk-MIJRORQL.js';
5
- import { cn, ScrollArea, DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator } from './chunk-6ALMBER7.js';
6
- export { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, ScrollArea, ScrollBar, cn } from './chunk-6ALMBER7.js';
7
- import { useArbi, AudioViewer, ImageViewer, VideoViewer } from './chunk-JKO3NR5L.js';
8
- export { ArbiProvider, useArbi } from './chunk-JKO3NR5L.js';
1
+ import { useDocuments, useAssistantQuery, arbiQueryKeys, useWorkspaces, useParsedDocument, useTags, useActivity, useThumbnails } from './chunk-ZY53R6I4.js';
2
+ export { DEFAULT_USD_PER_CREDIT, arbiQueryKeys, creditsToUsd, formatCredits, isUsageMetered, useActivity, useAgents, useAssistantQuery, useConfigs, useConversations, useDeleteAgents, useDocuments, useFacts, useHealth, useParsedDocument, useProjectInvoices, useProjectUsage, useProjects, useProjectsUsage, useSessions, useTags, useTasks, useThumbnails, useUserUsageToday, useWorkspaces } from './chunk-ZY53R6I4.js';
3
+ import { formatRelativeTime } from './chunk-FSMIN5VX.js';
4
+ export { DEFAULT_NOTIFY_TONE, NotificationBell, Toaster, formatRelativeTime, notify, seedNotifications, selectUnread, toast, useNotify } from './chunk-FSMIN5VX.js';
5
+ import { MarkMenu, AiMarkdown, Card, Button, Badge, TagEntity, Input, FILE_TYPE_COLORS, getEntityIcon, UserEntity, getEntityColorStyles, AgentBadge, Textarea, Label, Slider, Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, DocumentEntity, DocumentCard, useAudioRecorder, MicWaveformIndicator, IconToggle, classifyMediaError, formatElapsed, PassageCard } from './chunk-DVRJFLE7.js';
6
+ export { AgentBadge, AiMarkdown, ArbiBotHeadIcon, AudIcon, Avatar, AvatarFallback, AvatarImage, BASE_COLORS, Badge, Button, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Checkbox, Collapsible, CollapsibleContent, CollapsibleTrigger, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DictateProvider, DocumentCard, DocumentEntity, ENTITY_MAPPINGS, EmlIcon, EntityIcon, EntityPill, FILE_TYPE_COLORS, HoverCard, HoverCardContent, HoverCardTrigger, IconToggle, ImgIcon, InlineMicButton, Input, Label, MarkMenu, MicRecordingOverlay, MicWaveformIndicator, NEUTRAL_GRAY, PLACEHOLDER_COLOR, PassageCard, PdfIcon, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, PresenceLabel, Progress, ProjectEntity, RadioGroup, RadioGroupItem, RagDot, RelevanceDot, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Slider, StatusPill, Switch, TAG_TYPE_ICONS, TAG_TYPE_LABELS, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, TagEntity, Textarea, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, UserEntity, UserMenu, VISIBILITY_ICONS, VidIcon, VisibilityIcon, badgeVariants, buttonVariants, cardVariants, configureEntityRegistry, configureRagLabels, configureStatusRegistry, formatElapsed, getDocIcon, getEntityColor, getEntityColorStyles, getEntityIcon, getEntityLabel, getStatusVariant, getTagTypeIcon, getTagTypeLabel, getWorkspaceColor, toggleVariants, useAudioRecorder } from './chunk-DVRJFLE7.js';
7
+ import { normalizeCitationMarkup, MarkdownRenderer } from './chunk-H7ZZQ4ZV.js';
8
+ export { MarkdownRenderer, MarkdownStreamingContext, markdownBaseComponents, normalizeCitationMarkup, splitMarkdownBlocks } from './chunk-H7ZZQ4ZV.js';
9
+ import { ScrollArea, DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator } from './chunk-N5SVBDLC.js';
10
+ export { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, ScrollArea, ScrollBar } from './chunk-N5SVBDLC.js';
11
+ import { cn } from './chunk-SN5YV6FF.js';
12
+ export { cn } from './chunk-SN5YV6FF.js';
13
+ import { AudioViewer, ImageViewer, VideoViewer } from './chunk-HDCRPPBW.js';
14
+ import { useArbi } from './chunk-J4MX2W4H.js';
15
+ export { ArbiProvider, useArbi } from './chunk-J4MX2W4H.js';
9
16
  import React, { memo, useState, createContext, useMemo, useCallback, useEffect, useRef, useLayoutEffect, useContext, useId, Fragment as Fragment$1 } from 'react';
10
- import { useQuery, useMutation, useQueries, useQueryClient } from '@tanstack/react-query';
11
17
  import { Link, Trash2, CheckCheck, Check, Loader2, AlertTriangle, ShieldCheck, Copy, Sparkles, FileText, GitCompareArrows, Download, Image as Image$1, Search, CornerDownLeft, X, ArrowLeft, Send, Tags, Crown, Info, Activity, Gauge, Gift, PartyPopper, UserCheck, MessageCircleMore, FileX2, FileCheck2, Pencil, FolderPlus, SquareArrowOutUpRight, MessagesSquare, ArrowRight, MoreHorizontal, SquarePen, Mic, Pause, Play, Square, RotateCcw, Camera, Circle } from 'lucide-react';
12
18
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
13
19
  import { connectWithReconnect } from '@arbidocs/sdk/browser';
@@ -15,6 +21,7 @@ export { Arbi, ArbiError } from '@arbidocs/sdk/browser';
15
21
  import { isMessageType } from '@arbidocs/client';
16
22
  export { isMessageType } from '@arbidocs/client';
17
23
  import { create } from 'zustand';
24
+ import { useQueryClient, useMutation, useQuery } from '@tanstack/react-query';
18
25
  import { diffWords } from 'diff';
19
26
  import { AnimatePresence, motion } from 'framer-motion';
20
27
  import { createPortal } from 'react-dom';
@@ -23,241 +30,6 @@ import Cropper from 'react-easy-crop';
23
30
  import { AgGridReact } from 'ag-grid-react';
24
31
  import { ModuleRegistry, AllCommunityModule } from 'ag-grid-community';
25
32
 
26
- var arbiQueryKeys = {
27
- workspaces: () => ["arbi", "workspaces"],
28
- documents: (workspaceId) => ["arbi", "documents", workspaceId],
29
- conversations: (workspaceId) => ["arbi", "conversations", workspaceId],
30
- tags: (workspaceId) => ["arbi", "tags", workspaceId],
31
- thumbnails: (docIds) => ["arbi", "thumbnails", [...docIds].sort().join(",")],
32
- parsedDoc: (docId, stage) => ["arbi", "parsedDoc", docId, stage],
33
- agents: () => ["arbi", "agents"],
34
- sessions: () => ["arbi", "sessions"],
35
- health: () => ["arbi", "health"],
36
- tasks: () => ["arbi", "tasks"],
37
- facts: (workspaceId) => ["arbi", "facts", workspaceId],
38
- configs: () => ["arbi", "configs"],
39
- activity: () => ["arbi", "activity"],
40
- projects: () => ["arbi", "projects"],
41
- projectUsage: (projectExtId, monthsBack) => ["arbi", "projectUsage", projectExtId, monthsBack],
42
- projectInvoices: (projectExtId) => ["arbi", "projectInvoices", projectExtId],
43
- userUsageToday: () => ["arbi", "userUsageToday"]
44
- };
45
- function useWorkspaces(options) {
46
- const arbi = useArbi();
47
- return useQuery({
48
- queryKey: arbiQueryKeys.workspaces(),
49
- queryFn: () => arbi.workspaces.list(),
50
- enabled: options?.enabled ?? arbi.isLoggedIn
51
- });
52
- }
53
- function useDocuments(workspaceId, options) {
54
- const arbi = useArbi();
55
- return useQuery({
56
- queryKey: arbiQueryKeys.documents(workspaceId ?? ""),
57
- queryFn: () => arbi.documents.list(),
58
- enabled: (options?.enabled ?? true) && !!workspaceId && arbi.hasWorkspace
59
- });
60
- }
61
- function useConversations(workspaceId, options) {
62
- const arbi = useArbi();
63
- return useQuery({
64
- queryKey: arbiQueryKeys.conversations(workspaceId ?? ""),
65
- queryFn: () => arbi.conversations.list(),
66
- enabled: (options?.enabled ?? true) && !!workspaceId && arbi.hasWorkspace
67
- });
68
- }
69
- function useTags(workspaceId, options) {
70
- const arbi = useArbi();
71
- return useQuery({
72
- queryKey: arbiQueryKeys.tags(workspaceId ?? ""),
73
- queryFn: () => arbi.tags.list(),
74
- enabled: (options?.enabled ?? true) && !!workspaceId && arbi.hasWorkspace
75
- });
76
- }
77
- function useThumbnails(docIds, options) {
78
- const arbi = useArbi();
79
- return useQuery({
80
- queryKey: arbiQueryKeys.thumbnails(docIds),
81
- queryFn: () => arbi.documents.getThumbnails(docIds),
82
- enabled: (options?.enabled ?? true) && docIds.length > 0 && arbi.hasWorkspace,
83
- staleTime: 5 * 6e4
84
- });
85
- }
86
- function useParsedDocument(docId, stage = "final", options) {
87
- const arbi = useArbi();
88
- return useQuery({
89
- queryKey: arbiQueryKeys.parsedDoc(docId ?? "", stage),
90
- queryFn: () => arbi.documents.getParsedContent(docId, stage),
91
- enabled: (options?.enabled ?? true) && !!docId && arbi.hasWorkspace
92
- });
93
- }
94
- function useAssistantQuery() {
95
- const arbi = useArbi();
96
- return useMutation({
97
- mutationFn: ({ question, ...options }) => arbi.assistant.query(question, options)
98
- });
99
- }
100
- function useAgents(options) {
101
- const arbi = useArbi();
102
- return useQuery({
103
- queryKey: arbiQueryKeys.agents(),
104
- queryFn: () => arbi.agents.list(),
105
- enabled: options?.enabled ?? arbi.isLoggedIn
106
- });
107
- }
108
- function useDeleteAgents() {
109
- const arbi = useArbi();
110
- return useMutation({
111
- mutationFn: ({ agentExtIds }) => arbi.agents.delete(agentExtIds)
112
- });
113
- }
114
- function useSessions(options) {
115
- const arbi = useArbi();
116
- return useQuery({
117
- queryKey: arbiQueryKeys.sessions(),
118
- queryFn: () => arbi.sessions.list(),
119
- enabled: options?.enabled ?? arbi.isLoggedIn
120
- });
121
- }
122
- function useHealth(options) {
123
- const arbi = useArbi();
124
- return useQuery({
125
- queryKey: arbiQueryKeys.health(),
126
- queryFn: () => arbi.health.check(),
127
- enabled: options?.enabled
128
- });
129
- }
130
- function useTasks(options) {
131
- const arbi = useArbi();
132
- return useQuery({
133
- queryKey: arbiQueryKeys.tasks(),
134
- queryFn: () => arbi.tasks.list(),
135
- enabled: options?.enabled ?? arbi.isLoggedIn
136
- });
137
- }
138
- function useFacts(workspaceId, options) {
139
- const arbi = useArbi();
140
- return useQuery({
141
- queryKey: arbiQueryKeys.facts(workspaceId ?? ""),
142
- queryFn: () => arbi.facts.list({ pinnedOnly: options?.pinnedOnly }),
143
- enabled: (options?.enabled ?? true) && !!workspaceId && arbi.hasWorkspace
144
- });
145
- }
146
- function useConfigs(options) {
147
- const arbi = useArbi();
148
- return useQuery({
149
- queryKey: arbiQueryKeys.configs(),
150
- queryFn: () => arbi.agentConfig.list(),
151
- enabled: options?.enabled ?? arbi.isLoggedIn
152
- });
153
- }
154
- function useActivity(options) {
155
- const arbi = useArbi();
156
- return useQuery({
157
- queryKey: arbiQueryKeys.activity(),
158
- queryFn: () => arbi.dm.listActivity({ limit: options?.limit, offset: options?.offset }),
159
- enabled: options?.enabled ?? arbi.isLoggedIn
160
- });
161
- }
162
- function useProjects(options) {
163
- const arbi = useArbi();
164
- return useQuery({
165
- queryKey: arbiQueryKeys.projects(),
166
- queryFn: () => arbi.projects.list(),
167
- enabled: options?.enabled ?? arbi.isLoggedIn
168
- });
169
- }
170
- function useProjectUsage(projectExtId, monthsBack = 0, options) {
171
- const arbi = useArbi();
172
- return useQuery({
173
- queryKey: arbiQueryKeys.projectUsage(projectExtId ?? "", monthsBack),
174
- queryFn: () => arbi.projects.usage(projectExtId, monthsBack),
175
- enabled: (options?.enabled ?? true) && !!projectExtId && arbi.isLoggedIn
176
- });
177
- }
178
- function useProjectsUsage(projectExtIds, monthsBack = 0, options) {
179
- const arbi = useArbi();
180
- const enabled = (options?.enabled ?? true) && arbi.isLoggedIn;
181
- const results = useQueries({
182
- queries: projectExtIds.map((id) => ({
183
- queryKey: arbiQueryKeys.projectUsage(id, monthsBack),
184
- queryFn: () => arbi.projects.usage(id, monthsBack),
185
- enabled: enabled && !!id
186
- }))
187
- });
188
- const signature = results.map((r) => `${r.status}:${r.dataUpdatedAt ?? 0}`).join("|");
189
- return useMemo(() => {
190
- const dailyMap = /* @__PURE__ */ new Map();
191
- const modelMap = /* @__PURE__ */ new Map();
192
- let totalSpend = 0;
193
- let totalTokens = 0;
194
- let totalRequests = 0;
195
- for (const r of results) {
196
- const d = r.data;
197
- if (!d) continue;
198
- totalSpend += d.total_spend ?? 0;
199
- totalTokens += d.total_tokens ?? 0;
200
- totalRequests += d.total_requests ?? 0;
201
- for (const day of d.daily ?? []) {
202
- const cur = dailyMap.get(day.date) ?? {
203
- date: day.date,
204
- spend: 0,
205
- totalTokens: 0,
206
- apiRequests: 0
207
- };
208
- cur.spend += day.spend ?? 0;
209
- cur.totalTokens += day.total_tokens ?? 0;
210
- cur.apiRequests += day.api_requests ?? 0;
211
- dailyMap.set(day.date, cur);
212
- }
213
- for (const [model, mg] of Object.entries(d.model_groups ?? {})) {
214
- const cur = modelMap.get(model) ?? {
215
- model,
216
- spend: 0,
217
- totalTokens: 0,
218
- promptTokens: 0,
219
- completionTokens: 0,
220
- successfulRequests: 0
221
- };
222
- cur.spend += mg.spend ?? 0;
223
- cur.totalTokens += mg.total_tokens ?? 0;
224
- cur.promptTokens += mg.prompt_tokens ?? 0;
225
- cur.completionTokens += mg.completion_tokens ?? 0;
226
- cur.successfulRequests += mg.successful_requests ?? 0;
227
- modelMap.set(model, cur);
228
- }
229
- }
230
- return {
231
- totalSpend,
232
- totalTokens,
233
- totalRequests,
234
- daily: [...dailyMap.values()].sort((a, b) => a.date.localeCompare(b.date)),
235
- modelGroups: [...modelMap.values()].sort(
236
- (a, b) => b.spend - a.spend || b.totalTokens - a.totalTokens
237
- ),
238
- isLoading: results.some((r) => r.isLoading),
239
- isError: results.some((r) => r.isError)
240
- };
241
- }, [signature]);
242
- }
243
- function useProjectInvoices(projectExtId, options) {
244
- const arbi = useArbi();
245
- return useQuery({
246
- queryKey: arbiQueryKeys.projectInvoices(projectExtId ?? ""),
247
- queryFn: () => arbi.projects.invoices(projectExtId),
248
- enabled: (options?.enabled ?? true) && !!projectExtId && arbi.isLoggedIn
249
- });
250
- }
251
- function useUserUsageToday(options) {
252
- const arbi = useArbi();
253
- return useQuery({
254
- queryKey: arbiQueryKeys.userUsageToday(),
255
- queryFn: () => arbi.user.usageToday(),
256
- enabled: options?.enabled ?? arbi.isLoggedIn
257
- });
258
- }
259
-
260
- // src/chat/useArbiChat.ts
261
33
  var counter = 0;
262
34
  var nextId = (prefix) => `${prefix}-${Date.now().toString(36)}-${(counter++).toString(36)}`;
263
35
  var emptyThread = () => ({
@@ -890,6 +662,186 @@ function useArbiShellWorkspaces(options = {}) {
890
662
  select: select ?? defaultSelect
891
663
  });
892
664
  }
665
+ function useCreateTask() {
666
+ const arbi = useArbi();
667
+ const qc = useQueryClient();
668
+ return useMutation({
669
+ mutationFn: (body) => arbi.tasks.create(body),
670
+ onSuccess: () => qc.invalidateQueries({ queryKey: arbiQueryKeys.tasks() })
671
+ });
672
+ }
673
+ function useUpdateTask() {
674
+ const arbi = useArbi();
675
+ const qc = useQueryClient();
676
+ return useMutation({
677
+ mutationFn: ({ taskId, patch }) => arbi.tasks.update(taskId, patch),
678
+ onSuccess: () => qc.invalidateQueries({ queryKey: arbiQueryKeys.tasks() })
679
+ });
680
+ }
681
+ function useRunTask() {
682
+ const arbi = useArbi();
683
+ const qc = useQueryClient();
684
+ return useMutation({
685
+ mutationFn: (taskId) => arbi.tasks.runWithAuth(taskId),
686
+ onSuccess: (_task, taskId) => Promise.all([
687
+ qc.invalidateQueries({ queryKey: arbiQueryKeys.tasks() }),
688
+ qc.invalidateQueries({ queryKey: arbiQueryKeys.taskRuns(taskId) })
689
+ ])
690
+ });
691
+ }
692
+ function useDeleteTask() {
693
+ const arbi = useArbi();
694
+ const qc = useQueryClient();
695
+ return useMutation({
696
+ mutationFn: (taskId) => arbi.tasks.delete(taskId),
697
+ onSuccess: () => qc.invalidateQueries({ queryKey: arbiQueryKeys.tasks() })
698
+ });
699
+ }
700
+ function useTaskRuns(taskId, options) {
701
+ const arbi = useArbi();
702
+ return useQuery({
703
+ queryKey: arbiQueryKeys.taskRuns(taskId ?? ""),
704
+ queryFn: () => arbi.tasks.listRuns(taskId),
705
+ enabled: (options?.enabled ?? true) && !!taskId && arbi.isLoggedIn,
706
+ refetchInterval: (q) => q.state.data?.some((r) => r.status === "running") ? 3e3 : false
707
+ });
708
+ }
709
+ function useCreateAgent() {
710
+ const arbi = useArbi();
711
+ const qc = useQueryClient();
712
+ return useMutation({
713
+ mutationFn: (name) => arbi.agents.create(name),
714
+ onSuccess: () => qc.invalidateQueries({ queryKey: arbiQueryKeys.agents() })
715
+ });
716
+ }
717
+ function useAgentConfig(agentExtId, options) {
718
+ const arbi = useArbi();
719
+ return useQuery({
720
+ queryKey: arbiQueryKeys.agentConfig(agentExtId),
721
+ queryFn: async () => agentExtId ? await arbi.agents.getConfig(agentExtId) : await arbi.agentConfig.get("default"),
722
+ enabled: (options?.enabled ?? true) && arbi.isLoggedIn
723
+ });
724
+ }
725
+ function useAgentModels(options) {
726
+ const arbi = useArbi();
727
+ return useQuery({
728
+ queryKey: arbiQueryKeys.models(),
729
+ queryFn: async () => (await arbi.agentConfig.getModels()).models.map((m) => m.model_name),
730
+ enabled: (options?.enabled ?? true) && arbi.isLoggedIn
731
+ });
732
+ }
733
+ function useSaveAgentConfig() {
734
+ const arbi = useArbi();
735
+ const qc = useQueryClient();
736
+ return useMutation({
737
+ mutationFn: async ({ agentExtId, title, sections }) => {
738
+ const pinned = await arbi.agents.getConfig(agentExtId);
739
+ const base = pinned ?? await arbi.agentConfig.get("default");
740
+ const merged = structuredClone(base);
741
+ for (const [section, params] of Object.entries(sections)) {
742
+ merged[section] = { ...merged[section] ?? {}, ...params };
743
+ }
744
+ return arbi.agentConfig.save({
745
+ ...merged,
746
+ agent_ext_id: agentExtId,
747
+ title: title ?? `agent-${agentExtId}`
748
+ });
749
+ },
750
+ onSuccess: (_saved, { agentExtId }) => Promise.all([
751
+ qc.invalidateQueries({ queryKey: arbiQueryKeys.configs() }),
752
+ qc.invalidateQueries({ queryKey: arbiQueryKeys.agentConfig(agentExtId) })
753
+ ])
754
+ });
755
+ }
756
+ function useAgentWorkspaces(agentExtId, options) {
757
+ const arbi = useArbi();
758
+ return useQuery({
759
+ queryKey: arbiQueryKeys.agentWorkspaces(agentExtId ?? ""),
760
+ queryFn: () => arbi.agents.listWorkspaces(agentExtId),
761
+ enabled: (options?.enabled ?? true) && !!agentExtId && arbi.isLoggedIn
762
+ });
763
+ }
764
+ function useGrantAgentAccess() {
765
+ const arbi = useArbi();
766
+ const qc = useQueryClient();
767
+ return useMutation({
768
+ mutationFn: async ({
769
+ agentExtId,
770
+ workspaceId,
771
+ mode = { kind: "standing" }
772
+ }) => {
773
+ if (mode.kind === "temporary") {
774
+ return arbi.agents.grantTemporaryAccess(agentExtId, workspaceId, mode.ttlSeconds);
775
+ }
776
+ const agent = (await arbi.agents.list()).find((a) => a.external_id === agentExtId);
777
+ if (!agent?.email) throw new Error("The agent's address is unknown.");
778
+ return arbi.workspaces.grantAccess({ workspaceId, emails: [agent.email] });
779
+ },
780
+ onSuccess: (_res, { agentExtId }) => qc.invalidateQueries({ queryKey: arbiQueryKeys.agentWorkspaces(agentExtId) })
781
+ });
782
+ }
783
+ function useRevokeAgentAccess() {
784
+ const arbi = useArbi();
785
+ const qc = useQueryClient();
786
+ return useMutation({
787
+ mutationFn: async ({
788
+ agentExtId,
789
+ workspaceId
790
+ }) => {
791
+ const previous = arbi.hasWorkspace ? arbi.getWorkspaceId() : null;
792
+ await arbi.selectWorkspace(workspaceId);
793
+ try {
794
+ await arbi.workspaces.removeUsers([agentExtId]);
795
+ } finally {
796
+ if (previous && previous !== workspaceId) await arbi.selectWorkspace(previous);
797
+ }
798
+ },
799
+ onSuccess: (_res, { agentExtId }) => qc.invalidateQueries({ queryKey: arbiQueryKeys.agentWorkspaces(agentExtId) })
800
+ });
801
+ }
802
+ function useSkills(options) {
803
+ const arbi = useArbi();
804
+ return useQuery({
805
+ queryKey: [...arbiQueryKeys.skills(), options?.includeHidden ?? false],
806
+ queryFn: () => arbi.assistant.listSkills({ includeHidden: options?.includeHidden }),
807
+ enabled: (options?.enabled ?? true) && arbi.isLoggedIn,
808
+ staleTime: 3e4
809
+ });
810
+ }
811
+ function useContacts(options) {
812
+ const arbi = useArbi();
813
+ return useQuery({
814
+ queryKey: arbiQueryKeys.contacts(),
815
+ queryFn: () => arbi.contacts.list(),
816
+ enabled: (options?.enabled ?? true) && arbi.isLoggedIn
817
+ });
818
+ }
819
+ function usePendingContacts(options) {
820
+ const contacts = useContacts(options);
821
+ const pending = useMemo(
822
+ () => (contacts.data ?? []).filter(
823
+ (c) => c.status === "invitation_pending" || c.status === "invitation_expired"
824
+ ),
825
+ [contacts.data]
826
+ );
827
+ return { ...contacts, pending };
828
+ }
829
+ function useAddContacts() {
830
+ const arbi = useArbi();
831
+ const qc = useQueryClient();
832
+ return useMutation({
833
+ mutationFn: (emails) => arbi.contacts.add(emails),
834
+ onSuccess: () => qc.invalidateQueries({ queryKey: arbiQueryKeys.contacts() })
835
+ });
836
+ }
837
+ function useRemoveContacts() {
838
+ const arbi = useArbi();
839
+ const qc = useQueryClient();
840
+ return useMutation({
841
+ mutationFn: (contactIds) => arbi.contacts.remove(contactIds),
842
+ onSuccess: () => qc.invalidateQueries({ queryKey: arbiQueryKeys.contacts() })
843
+ });
844
+ }
893
845
  function useWorkspaceDocs(workspaceId) {
894
846
  const { data: docs = [], isLoading, isError } = useDocuments(workspaceId);
895
847
  const docIds = useMemo(
@@ -3065,7 +3017,6 @@ function isAgentUser(user) {
3065
3017
  return user.external_id.startsWith("agt-");
3066
3018
  }
3067
3019
  var DM_QUERY_KEY = ["arbi", "directMessages"];
3068
- var CONTACTS_QUERY_KEY = ["arbi", "contacts"];
3069
3020
  function mergeContacts(threads, contacts) {
3070
3021
  const byPeer = /* @__PURE__ */ new Map();
3071
3022
  for (const t of threads) byPeer.set(t.peer.external_id, t);
@@ -3131,7 +3082,7 @@ function useDirectMessages(options) {
3131
3082
  enabled
3132
3083
  });
3133
3084
  const contactsQuery = useQuery({
3134
- queryKey: CONTACTS_QUERY_KEY,
3085
+ queryKey: arbiQueryKeys.contacts(),
3135
3086
  queryFn: () => arbi.contacts.list(),
3136
3087
  enabled
3137
3088
  });
@@ -3216,6 +3167,7 @@ function ConversationList({
3216
3167
  classNames,
3217
3168
  emptyState,
3218
3169
  header,
3170
+ lead,
3219
3171
  className
3220
3172
  }) {
3221
3173
  return /* @__PURE__ */ jsxs(
@@ -3235,6 +3187,7 @@ function ConversationList({
3235
3187
  conversations.length === 1 ? "colleague" : "colleagues"
3236
3188
  ] })
3237
3189
  ] }) : header,
3190
+ lead,
3238
3191
  /* @__PURE__ */ jsx("div", { className: "min-h-0 flex-1 overflow-y-auto", children: conversations.length === 0 ? /* @__PURE__ */ jsx("div", { className: "px-4 py-6 text-xs text-muted-foreground", children: emptyState ?? "No conversations yet." }) : /* @__PURE__ */ jsx("ul", { className: "w-full", children: conversations.map((c, i) => {
3239
3192
  const { peer, lastMessage, unreadCount } = c;
3240
3193
  const newSection = c.sectionLabel && c.sectionLabel !== conversations[i - 1]?.sectionLabel;
@@ -3521,14 +3474,117 @@ function DmComposer({
3521
3474
  error && /* @__PURE__ */ jsx("p", { className: "mt-2 text-xs text-destructive", "data-testid": "arbi-dm-error", children: error })
3522
3475
  ] });
3523
3476
  }
3477
+ var DEFAULT_START_BY_EMAIL_LABELS = {
3478
+ email: "Email address",
3479
+ emailPlaceholder: "name@example.com",
3480
+ message: "Message",
3481
+ messagePlaceholder: "Write the first message\u2026",
3482
+ send: "Send",
3483
+ sending: "Sending\u2026",
3484
+ invalidEmail: "Enter a valid email address."
3485
+ };
3486
+ var EMAIL = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
3487
+ function StartByEmail({
3488
+ onStart,
3489
+ onStarted,
3490
+ classNames,
3491
+ labels,
3492
+ className
3493
+ }) {
3494
+ const l = { ...DEFAULT_START_BY_EMAIL_LABELS, ...labels };
3495
+ const uid = useId();
3496
+ const [email, setEmail] = useState("");
3497
+ const [text, setText] = useState("");
3498
+ const [busy, setBusy] = useState(false);
3499
+ const [error, setError] = useState(null);
3500
+ const address = email.trim().toLowerCase();
3501
+ const valid = EMAIL.test(address);
3502
+ const submit = async () => {
3503
+ if (!valid || !text.trim() || busy) return;
3504
+ setBusy(true);
3505
+ setError(null);
3506
+ try {
3507
+ const result = await onStart(address, text.trim());
3508
+ setEmail("");
3509
+ setText("");
3510
+ onStarted?.(result);
3511
+ } catch (e) {
3512
+ setError(e instanceof Error ? e.message : String(e));
3513
+ } finally {
3514
+ setBusy(false);
3515
+ }
3516
+ };
3517
+ return /* @__PURE__ */ jsxs(
3518
+ "form",
3519
+ {
3520
+ "data-testid": "arbi-dm-start",
3521
+ className: cn("flex flex-col gap-2 border-b border-border px-4 py-3", className),
3522
+ onSubmit: (e) => {
3523
+ e.preventDefault();
3524
+ void submit();
3525
+ },
3526
+ children: [
3527
+ /* @__PURE__ */ jsx(Label, { htmlFor: `${uid}-email`, children: l.email }),
3528
+ /* @__PURE__ */ jsx(
3529
+ Input,
3530
+ {
3531
+ id: `${uid}-email`,
3532
+ type: "email",
3533
+ value: email,
3534
+ onChange: (e) => setEmail(e.target.value),
3535
+ placeholder: l.emailPlaceholder,
3536
+ "aria-invalid": email !== "" && !valid,
3537
+ "aria-describedby": email !== "" && !valid ? `${uid}-bad` : void 0,
3538
+ disabled: busy,
3539
+ "data-testid": "arbi-dm-start-email"
3540
+ }
3541
+ ),
3542
+ email !== "" && !valid && /* @__PURE__ */ jsx("p", { id: `${uid}-bad`, className: "text-xs text-destructive", children: l.invalidEmail }),
3543
+ /* @__PURE__ */ jsx(Label, { htmlFor: `${uid}-text`, children: l.message }),
3544
+ /* @__PURE__ */ jsx(
3545
+ Textarea,
3546
+ {
3547
+ id: `${uid}-text`,
3548
+ value: text,
3549
+ onChange: (e) => setText(e.target.value),
3550
+ placeholder: l.messagePlaceholder,
3551
+ rows: 2,
3552
+ disabled: busy,
3553
+ "data-testid": "arbi-dm-start-message"
3554
+ }
3555
+ ),
3556
+ error && /* @__PURE__ */ jsx("p", { role: "alert", className: "text-xs text-destructive", "data-testid": "arbi-dm-start-error", children: error }),
3557
+ /* @__PURE__ */ jsxs(
3558
+ Button,
3559
+ {
3560
+ type: "submit",
3561
+ size: "sm",
3562
+ disabled: !valid || !text.trim() || busy,
3563
+ className: cn("self-end", classNames?.sendButton),
3564
+ "data-testid": "arbi-dm-start-send",
3565
+ children: [
3566
+ busy ? /* @__PURE__ */ jsx(Loader2, { className: "size-4 animate-spin", "aria-hidden": true }) : /* @__PURE__ */ jsx(Send, { className: "size-4", "aria-hidden": true }),
3567
+ busy ? l.sending : l.send
3568
+ ]
3569
+ }
3570
+ )
3571
+ ]
3572
+ }
3573
+ );
3574
+ }
3524
3575
  function DirectMessages({
3525
3576
  className,
3526
3577
  classNames,
3527
3578
  emptyThread: emptyThread2,
3528
- emptyList
3579
+ emptyList,
3580
+ listHeader,
3581
+ listLead,
3582
+ startByEmail,
3583
+ hideOwnContact
3529
3584
  }) {
3530
3585
  const {
3531
- conversations,
3586
+ conversations: allConversations,
3587
+ myExtId,
3532
3588
  isLoading,
3533
3589
  isError,
3534
3590
  error,
@@ -3538,6 +3594,14 @@ function DirectMessages({
3538
3594
  markRead
3539
3595
  } = useDirectMessages();
3540
3596
  const [selectedPeerId, setSelectedPeerId] = useState(null);
3597
+ const conversations = useMemo(
3598
+ () => hideOwnContact && myExtId ? allConversations.filter((c) => c.peer.external_id !== myExtId) : allConversations,
3599
+ [allConversations, hideOwnContact, myExtId]
3600
+ );
3601
+ const openStarted = (created) => {
3602
+ const peer = Array.isArray(created) ? created[0]?.recipient?.external_id : void 0;
3603
+ if (peer) setSelectedPeerId(peer);
3604
+ };
3541
3605
  const loadError = isError ? error instanceof Error ? error.message : "Couldn\u2019t load messages." : null;
3542
3606
  const selected = useMemo(
3543
3607
  () => conversations.find((c) => c.peer.external_id === selectedPeerId) ?? null,
@@ -3581,7 +3645,20 @@ function DirectMessages({
3581
3645
  selectedPeerId: selected?.peer.external_id ?? null,
3582
3646
  onSelect: setSelectedPeerId,
3583
3647
  classNames,
3584
- emptyState: isLoading ? "Loading messages\u2026" : emptyList
3648
+ emptyState: isLoading ? "Loading messages\u2026" : emptyList,
3649
+ header: listHeader,
3650
+ lead: /* @__PURE__ */ jsxs(Fragment, { children: [
3651
+ listLead,
3652
+ startByEmail && /* @__PURE__ */ jsx(
3653
+ StartByEmail,
3654
+ {
3655
+ onStart: sendMessageTo,
3656
+ onStarted: openStarted,
3657
+ classNames,
3658
+ labels: typeof startByEmail === "object" ? startByEmail.labels : void 0
3659
+ }
3660
+ )
3661
+ ] })
3585
3662
  }
3586
3663
  ),
3587
3664
  /* @__PURE__ */ jsxs("div", { className: "flex min-h-0 min-w-0 flex-1 flex-col", children: [
@@ -4990,6 +5067,6 @@ function hasVideoTrack(blob) {
4990
5067
  });
4991
5068
  }
4992
5069
 
4993
- export { ActivityFeed, AiActionCard, AiAnswer, AppleIcon, ArbiBotIcon, ArbiIcon, ArbiWebSocketProvider, ArtifactCanvas, ChatBubble, CitationRenderer, ClaudeIcon, CommandPalette, CommandPaletteProvider, ConversationList, DEFAULT_ASPECT_OPTIONS, DateSeparator, DirectMessages, DmAvatar, DmComposer, DocIcon, DocQaPanel, DocSearch, DocumentCardMenu, DocumentGallery, DocumentReview, DocumentTable, DraftTitleControls, FileIcon, FireworksIcon, GeminiIcon, GitHubIcon, GoogleIcon, HtmlIcon, ImageCropModal, ImageCropper, LinkedInIcon, MessageArtifactCard, MessageBubble, MessageThread, OpenAIIcon, PhotoCapture, ProviderIcon, RUN_WINDOW_MS, SemanticSearch, TxtIcon, TypingIndicator, VideoCapture, VoiceNoteRecorder, XlsIcon, annotateThread, arbiQueryKeys, captureFrameAsBlob, cropImage, dayKey, describeActivity, getNotificationTypeMeta, getWorkspaceActionText, getWorkspaceKind, getWorkspaceSentPhrase, hasVideoTrack, isWorkspaceNotificationType, parseActivityContent, pickRecentWorkspaces, redlineStats, resolveActiveWorkspace, textToArtifact, titleFromQuestion, toRedlineMarkdown, toShellWorkspace, useActivity, useAgents, useAiTask, useArbiChat, useArbiConnected, useArbiDocumentSync, useArbiShellWorkspaces, useArbiUiStore, useArbiWebSocket, useArbiWsContext, useArbiWsMessage, useArbiWsStatus, useArbiWsStore, useArbiWsTask, useArbiWsTasks, useAssistantQuery, useCameraStream, useCommandPalette, useConfigs, useConversations, useDeleteAgents, useDirectMessages, useDocuments, useFacts, useHealth, useParsedDocument, useProjectInvoices, useProjectUsage, useProjects, useProjectsUsage, useSemanticSearch, useSessions, useShellWorkspaces, useTags, useTasks, useThumbnails, useUserUsageToday, useVideoRecorder, useWorkspaceDocs, useWorkspaces, userDisplayName, userInitials };
5070
+ export { ActivityFeed, AiActionCard, AiAnswer, AppleIcon, ArbiBotIcon, ArbiIcon, ArbiWebSocketProvider, ArtifactCanvas, ChatBubble, CitationRenderer, ClaudeIcon, CommandPalette, CommandPaletteProvider, ConversationList, DEFAULT_ASPECT_OPTIONS, DEFAULT_START_BY_EMAIL_LABELS, DateSeparator, DirectMessages, DmAvatar, DmComposer, DocIcon, DocQaPanel, DocSearch, DocumentCardMenu, DocumentGallery, DocumentReview, DocumentTable, DraftTitleControls, FileIcon, FireworksIcon, GeminiIcon, GitHubIcon, GoogleIcon, HtmlIcon, ImageCropModal, ImageCropper, LinkedInIcon, MessageArtifactCard, MessageBubble, MessageThread, OpenAIIcon, PhotoCapture, ProviderIcon, RUN_WINDOW_MS, SemanticSearch, StartByEmail, TxtIcon, TypingIndicator, VideoCapture, VoiceNoteRecorder, XlsIcon, annotateThread, captureFrameAsBlob, cropImage, dayKey, describeActivity, getNotificationTypeMeta, getWorkspaceActionText, getWorkspaceKind, getWorkspaceSentPhrase, hasVideoTrack, isWorkspaceNotificationType, parseActivityContent, pickRecentWorkspaces, redlineStats, resolveActiveWorkspace, textToArtifact, titleFromQuestion, toRedlineMarkdown, toShellWorkspace, useAddContacts, useAgentConfig, useAgentModels, useAgentWorkspaces, useAiTask, useArbiChat, useArbiConnected, useArbiDocumentSync, useArbiShellWorkspaces, useArbiUiStore, useArbiWebSocket, useArbiWsContext, useArbiWsMessage, useArbiWsStatus, useArbiWsStore, useArbiWsTask, useArbiWsTasks, useCameraStream, useCommandPalette, useContacts, useCreateAgent, useCreateTask, useDeleteTask, useDirectMessages, useGrantAgentAccess, usePendingContacts, useRemoveContacts, useRevokeAgentAccess, useRunTask, useSaveAgentConfig, useSemanticSearch, useShellWorkspaces, useSkills, useTaskRuns, useUpdateTask, useVideoRecorder, useWorkspaceDocs, userDisplayName, userInitials };
4994
5071
  //# sourceMappingURL=index.js.map
4995
5072
  //# sourceMappingURL=index.js.map