@smartspace/chat-ui 1.13.1-dev.3184d8f → 1.13.1-dev.86d3703

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.
package/dist/index.js CHANGED
@@ -4,7 +4,7 @@ import { Loader2, Check, X, Paperclip, ArrowBigUp, Minimize2, AlertTriangle, Fil
4
4
  import * as React8 from 'react';
5
5
  import { createContext, forwardRef, useImperativeHandle, useRef, useState, useEffect, useMemo, useCallback, createElement, useContext } from 'react';
6
6
  import { createPortal } from 'react-dom';
7
- import { useQuery, queryOptions, useQueryClient, useMutation } from '@tanstack/react-query';
7
+ import { useQuery, queryOptions, useQueryClient, useMutation, skipToken } from '@tanstack/react-query';
8
8
  import { toast } from 'sonner';
9
9
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
10
10
  import { Editor, rootCtx, defaultValueCtx, editorViewOptionsCtx, editorViewCtx, serializerCtx, SchemaReady, nodeViewCtx, markViewCtx, schemaCtx, prosePluginsCtx, nodesCtx } from '@milkdown/core';
@@ -127,6 +127,7 @@ var filesKeys = {
127
127
  var useFileMutations = (scope) => {
128
128
  const { workspaceId, threadId } = scope;
129
129
  const service = useChatService();
130
+ const queryClient = useQueryClient();
130
131
  const [uploadedFiles, setUploadedFiles] = useState([]);
131
132
  const [fileProgress, setFileProgress] = useState({});
132
133
  const clearUploadState = useCallback(() => {
@@ -185,11 +186,19 @@ var useFileMutations = (scope) => {
185
186
  status: uploadedFiles.some((f) => f.name === file.name) ? "done" : "uploading"
186
187
  }));
187
188
  const getFileBlobUrl = useCallback(
188
- async (id) => {
189
- const blob = await service.downloadFile(id, { workspaceId, threadId });
190
- return URL.createObjectURL(blob);
191
- },
192
- [service, workspaceId, threadId]
189
+ (id) => queryClient.fetchQuery({
190
+ queryKey: filesKeys.downloadBlob(id),
191
+ queryFn: async () => {
192
+ const blob = await service.downloadFile(id, {
193
+ workspaceId,
194
+ threadId
195
+ });
196
+ return URL.createObjectURL(blob);
197
+ },
198
+ staleTime: Infinity,
199
+ gcTime: Infinity
200
+ }),
201
+ [queryClient, service, workspaceId, threadId]
193
202
  );
194
203
  return {
195
204
  uploadFilesMutation,
@@ -871,7 +880,7 @@ var ssImageView = $view(ssImageNode, (ctx) => (node2) => {
871
880
  removeBtn.type = "button";
872
881
  removeBtn.className = "ss-attach__remove";
873
882
  removeBtn.setAttribute("aria-label", "Remove image");
874
- removeBtn.textContent = "\xD7";
883
+ removeBtn.innerHTML = '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><line x1="6" y1="6" x2="18" y2="18"/><line x1="18" y1="6" x2="6" y2="18"/></svg>';
875
884
  removeBtn.addEventListener("mousedown", (e) => {
876
885
  e.preventDefault();
877
886
  e.stopPropagation();
@@ -890,16 +899,19 @@ var ssImageView = $view(ssImageNode, (ctx) => (node2) => {
890
899
  }
891
900
  });
892
901
  img.style.background = "rgba(0,0,0,0.04)";
902
+ img.style.visibility = "hidden";
893
903
  let hasSetRealSrc = false;
894
904
  img.addEventListener("load", () => {
895
905
  if (!hasSetRealSrc) return;
896
906
  spinner.remove();
897
907
  img.style.background = "";
908
+ img.style.visibility = "";
898
909
  });
899
910
  img.addEventListener("error", () => {
900
911
  if (!hasSetRealSrc) return;
901
912
  spinner.remove();
902
913
  img.style.background = "rgba(255,0,0,0.06)";
914
+ img.style.visibility = "";
903
915
  });
904
916
  try {
905
917
  const anyWin = window;
@@ -3221,7 +3233,20 @@ var threadsKeys = {
3221
3233
  };
3222
3234
 
3223
3235
  // src/domains/threads/cache.ts
3236
+ function isStaleSummary(incoming, existing) {
3237
+ if (!existing) return false;
3238
+ if (typeof existing.summaryEmittedAt !== "number") return false;
3239
+ if (typeof incoming.summaryEmittedAt !== "number") return false;
3240
+ if (incoming.summaryEmittedAt >= existing.summaryEmittedAt) return false;
3241
+ return existing.isFlowRunning === false && incoming.isFlowRunning === true;
3242
+ }
3224
3243
  function applyThreadToCache(qc, thread) {
3244
+ const existingDetail = qc.getQueryData(
3245
+ threadsKeys.detail(thread.workSpaceId, thread.id)
3246
+ );
3247
+ if (isStaleSummary(thread, existingDetail)) {
3248
+ return false;
3249
+ }
3225
3250
  qc.setQueryData(
3226
3251
  threadsKeys.detail(thread.workSpaceId, thread.id),
3227
3252
  (old) => ({ ...old ?? thread, ...thread })
@@ -3242,6 +3267,7 @@ function applyThreadToCache(qc, thread) {
3242
3267
  if (!page?.data) return page;
3243
3268
  const idx2 = page.data.findIndex((t) => t.id === thread.id);
3244
3269
  if (idx2 === -1) return page;
3270
+ if (isStaleSummary(thread, page.data[idx2])) return page;
3245
3271
  changed = true;
3246
3272
  foundInList = true;
3247
3273
  const nextData2 = page.data.slice();
@@ -3254,6 +3280,7 @@ function applyThreadToCache(qc, thread) {
3254
3280
  if (!list2.data) return old;
3255
3281
  const idx = list2.data.findIndex((t) => t.id === thread.id);
3256
3282
  if (idx === -1) return old;
3283
+ if (isStaleSummary(thread, list2.data[idx])) return old;
3257
3284
  foundInList = true;
3258
3285
  const nextData = list2.data.slice();
3259
3286
  nextData[idx] = { ...nextData[idx], ...thread };
@@ -3310,7 +3337,7 @@ function utcDate(value) {
3310
3337
  }
3311
3338
  return new Date(value);
3312
3339
  }
3313
- z.preprocess((val) => {
3340
+ var DateFromApi = z.preprocess((val) => {
3314
3341
  if (typeof val === "string" && !hasTimezone(val)) {
3315
3342
  return val + "Z";
3316
3343
  }
@@ -3323,36 +3350,40 @@ var {
3323
3350
  messageThreadsGetMessageThreadWorkspacesWorkspaceIdMessagethreadsIdResponse: threadResponseSchema
3324
3351
  } = ChatZod;
3325
3352
  function mapThreadDtoToModel(dto) {
3353
+ const lastUpdatedAt = utcDate(dto.lastUpdatedAt);
3326
3354
  return {
3327
3355
  id: dto.id,
3328
3356
  createdAt: utcDate(dto.createdAt),
3329
3357
  createdBy: dto.createdBy ?? "",
3330
3358
  createdByUserId: dto.createdByUserId,
3331
3359
  isFlowRunning: dto.isFlowRunning,
3332
- lastUpdatedAt: utcDate(dto.lastUpdatedAt),
3360
+ lastUpdatedAt,
3333
3361
  lastUpdatedByUserId: dto.lastUpdatedByUserId,
3334
3362
  name: dto.name ?? "",
3335
3363
  totalMessages: dto.totalMessages,
3336
3364
  pinned: dto.favorited,
3337
- workSpaceId: dto.workSpaceId
3365
+ workSpaceId: dto.workSpaceId,
3366
+ summaryEmittedAt: lastUpdatedAt.getTime()
3338
3367
  };
3339
3368
  }
3340
3369
  function mapThreadsResponseDtoToModel(dto) {
3341
3370
  return { data: dto.data.map(mapThreadDtoToModel), total: dto.total };
3342
3371
  }
3343
3372
  function mapSignalRThreadSummaryToModel(summary) {
3373
+ const lastUpdatedAt = utcDate(summary.lastUpdatedAt);
3344
3374
  return {
3345
3375
  id: summary.id,
3346
3376
  createdAt: utcDate(summary.createdAt),
3347
3377
  createdBy: summary.createdBy ?? "",
3348
3378
  createdByUserId: summary.createdByUserId,
3349
3379
  isFlowRunning: summary.isFlowRunning,
3350
- lastUpdatedAt: utcDate(summary.lastUpdatedAt),
3380
+ lastUpdatedAt,
3351
3381
  lastUpdatedByUserId: summary.lastUpdatedByUserId,
3352
3382
  name: summary.name ?? "",
3353
3383
  totalMessages: summary.totalMessages,
3354
3384
  pinned: summary.favorited,
3355
- workSpaceId: summary.workSpaceId
3385
+ workSpaceId: summary.workSpaceId,
3386
+ summaryEmittedAt: lastUpdatedAt.getTime()
3356
3387
  };
3357
3388
  }
3358
3389
  var threadDetailOptions = ({
@@ -3406,11 +3437,12 @@ var useThread = ({
3406
3437
  });
3407
3438
  };
3408
3439
  var useThreadIsRunning = (workspaceId, threadId) => {
3409
- const { data: thread } = useThread({
3410
- workspaceId: workspaceId ?? "",
3411
- threadId: threadId ?? "",
3412
- enabled: !!workspaceId && !!threadId
3440
+ const queryClient = useQueryClient();
3441
+ const { data: detailThread } = useQuery({
3442
+ queryKey: threadsKeys.detail(workspaceId ?? "", threadId ?? ""),
3443
+ queryFn: skipToken
3413
3444
  });
3445
+ const listThread = workspaceId && threadId ? getThreadPlaceholderFromListCache(queryClient, workspaceId, threadId) : void 0;
3414
3446
  const { data: optimistic } = useQuery({
3415
3447
  queryKey: threadsKeys.optimisticRunning(threadId ?? ""),
3416
3448
  queryFn: () => false,
@@ -3418,7 +3450,7 @@ var useThreadIsRunning = (workspaceId, threadId) => {
3418
3450
  staleTime: Infinity,
3419
3451
  enabled: !!threadId
3420
3452
  });
3421
- return !!optimistic || !!thread?.isFlowRunning;
3453
+ return !!optimistic || !!(detailThread ?? listThread)?.isFlowRunning;
3422
3454
  };
3423
3455
 
3424
3456
  // src/domains/messages/enums.ts
@@ -3444,6 +3476,15 @@ var messagesMutationsKeys = {
3444
3476
  };
3445
3477
 
3446
3478
  // src/domains/messages/mutations.ts
3479
+ function reconcileWithMessage(old, incoming, onDuplicate = "keep-existing") {
3480
+ const stable = old.filter((m) => !m.optimistic);
3481
+ const idx = stable.findIndex((m) => m.id === incoming.id);
3482
+ if (idx === -1) return [...stable, incoming];
3483
+ if (onDuplicate === "keep-existing") return stable;
3484
+ const copy = stable.slice();
3485
+ copy[idx] = incoming;
3486
+ return copy;
3487
+ }
3447
3488
  function useSendMessage() {
3448
3489
  const qc = useQueryClient();
3449
3490
  const { userId, displayName: userName } = useChatIdentity();
@@ -3527,7 +3568,10 @@ function useSendMessage() {
3527
3568
  toast.error("There was an error posting your message");
3528
3569
  throw err;
3529
3570
  }
3530
- qc.setQueryData(messagesKeys.list(threadId), [realMessage]);
3571
+ qc.setQueryData(
3572
+ messagesKeys.list(threadId),
3573
+ (old = []) => reconcileWithMessage(old, realMessage)
3574
+ );
3531
3575
  qc.setQueryData(
3532
3576
  threadsKeys.detail(workspaceId, threadId),
3533
3577
  (old) => old ? { ...old, isFlowRunning: true } : old
@@ -3583,14 +3627,10 @@ function useAddInputToMessage() {
3583
3627
  });
3584
3628
  },
3585
3629
  onSuccess: (message, { threadId }) => {
3586
- qc.setQueryData(messagesKeys.list(threadId), (old = []) => {
3587
- const stable = old.filter((x) => !x.optimistic);
3588
- const idx = stable.findIndex((x) => x.id === message.id);
3589
- if (idx === -1) return [...stable, message];
3590
- const copy = stable.slice();
3591
- copy[idx] = message;
3592
- return copy;
3593
- });
3630
+ qc.setQueryData(
3631
+ messagesKeys.list(threadId),
3632
+ (old = []) => reconcileWithMessage(old, message, "replace")
3633
+ );
3594
3634
  },
3595
3635
  onError: (_e, { threadId }) => {
3596
3636
  qc.setQueryData(
@@ -3818,11 +3858,13 @@ function MessageComposer({
3818
3858
  workspaceId,
3819
3859
  threadId: isDraftThread ? void 0 : threadId
3820
3860
  });
3821
- if (typeof window !== "undefined") {
3822
- window.__ssDownloadFile = async (id) => {
3823
- return await getFileBlobUrl(id);
3861
+ useEffect(() => {
3862
+ if (typeof window === "undefined") return;
3863
+ window.__ssDownloadFile = (id) => getFileBlobUrl(id);
3864
+ return () => {
3865
+ if (window.__ssDownloadFile) delete window.__ssDownloadFile;
3824
3866
  };
3825
- }
3867
+ }, [getFileBlobUrl]);
3826
3868
  const onUploadFiles = async (files) => {
3827
3869
  const res = await uploadFilesMutation.mutateAsync(files);
3828
3870
  return res.map(({ id, name }) => ({ id, name }));
@@ -4245,15 +4287,13 @@ var messagesListOptions = (service, threadId, opts) => queryOptions({
4245
4287
  // Avoid re-fetching the entire thread on every small navigation.
4246
4288
  staleTime: 3e4
4247
4289
  });
4248
- function useMessages(threadId, opts) {
4290
+ function useMessages(threadId) {
4249
4291
  const service = useChatService();
4250
4292
  const isDraft = isDraftThreadId(threadId);
4251
- const skipFetch = opts?.skipWhenNewThread || !threadId || isDraft;
4252
- const listOpts = opts?.take != null || opts?.skip != null ? { take: opts.take, skip: opts.skip } : void 0;
4253
4293
  return useQuery({
4254
- ...messagesListOptions(service, threadId, listOpts),
4255
- enabled: !opts?.skipWhenNewThread && !!threadId && !isDraft,
4256
- initialData: skipFetch ? [] : void 0
4294
+ ...messagesListOptions(service, threadId),
4295
+ enabled: !!threadId && !isDraft,
4296
+ initialData: !threadId || isDraft ? [] : void 0
4257
4297
  });
4258
4298
  }
4259
4299
 
@@ -18760,7 +18800,8 @@ function SsImage(props) {
18760
18800
  alt: alt ?? "",
18761
18801
  title,
18762
18802
  width: finalWidth,
18763
- height: finalHeight
18803
+ height: finalHeight,
18804
+ style: !resolvedSrc && !errored ? { visibility: "hidden" } : void 0
18764
18805
  }
18765
18806
  )
18766
18807
  ]
@@ -19086,14 +19127,20 @@ dayjs.extend(relativeTime);
19086
19127
  dayjs.extend(advancedFormat);
19087
19128
  function parseDateTime(date, customFormat) {
19088
19129
  const d = dayjs.utc(date).local();
19089
- return d.format(customFormat);
19130
+ if (customFormat === "X") return Math.floor(d.valueOf() / 1e3).toString();
19131
+ if (customFormat === "x") return d.valueOf().toString();
19132
+ return d.format(customFormat ?? "YYYY-MM-DD HH:mm:ss");
19133
+ }
19134
+ function parseDateTimeHuman(date) {
19135
+ return dayjs.utc(date).local().fromNow();
19090
19136
  }
19091
19137
 
19092
19138
  // src/shared/utils/userPhoto.ts
19093
19139
  function getChatApiBaseUrl() {
19094
19140
  try {
19095
19141
  const w = window;
19096
- const cfg = w?.ssconfig?.Chat_Api_Uri ?? import.meta.env.VITE_CHAT_API_URI;
19142
+ const env2 = import.meta.env;
19143
+ const cfg = w?.ssconfig?.Chat_Api_Uri ?? env2?.VITE_CHAT_API_URI;
19097
19144
  return typeof cfg === "string" && cfg.trim() ? cfg.trim() : "";
19098
19145
  } catch {
19099
19146
  return "";
@@ -19784,6 +19831,10 @@ function MessageList({
19784
19831
  const messagesEndRef = useRef(null);
19785
19832
  const prevMessageCountRef = useRef(0);
19786
19833
  const hasInitialScrollRef = useRef(false);
19834
+ const everHadMessagesRef = useRef({
19835
+ threadId: "",
19836
+ had: false
19837
+ });
19787
19838
  const isMobile = useIsMobile();
19788
19839
  const { data: activeWorkspace } = useWorkspace(workspaceId);
19789
19840
  const [isAtBottom, setIsAtBottom] = useState(true);
@@ -19855,8 +19906,15 @@ function MessageList({
19855
19906
  ro.observe(content);
19856
19907
  return () => ro.disconnect();
19857
19908
  }, [isAtBottom, scrollToBottom]);
19909
+ const safeMessages = messages ?? [];
19910
+ if (everHadMessagesRef.current.threadId !== threadId) {
19911
+ everHadMessagesRef.current = { threadId, had: safeMessages.length > 0 };
19912
+ } else if (safeMessages.length > 0) {
19913
+ everHadMessagesRef.current.had = true;
19914
+ }
19915
+ const hadMessagesBefore = everHadMessagesRef.current.had;
19858
19916
  const isLoading = isChoosingThread || (threadPending || threadFetching) && !thread || (messagesPending || messagesFetching) && messages === void 0;
19859
- if (isLoading) {
19917
+ if (isLoading && !hadMessagesBefore) {
19860
19918
  return /* @__PURE__ */ jsx(
19861
19919
  "div",
19862
19920
  {
@@ -19872,7 +19930,7 @@ function MessageList({
19872
19930
  }
19873
19931
  );
19874
19932
  }
19875
- if (threadError || messagesError) {
19933
+ if ((threadError || messagesError) && !hadMessagesBefore) {
19876
19934
  return /* @__PURE__ */ jsx("div", { className: "flex flex-1 items-center justify-center p-6", children: /* @__PURE__ */ jsxs("div", { className: "w-full max-w-md space-y-3", children: [
19877
19935
  threadError && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 rounded-md border border-destructive/30 bg-destructive/10 px-3 py-2 text-destructive", children: [
19878
19936
  /* @__PURE__ */ jsx(AlertTriangle, { className: "h-4 w-4" }),
@@ -19884,8 +19942,7 @@ function MessageList({
19884
19942
  ] })
19885
19943
  ] }) });
19886
19944
  }
19887
- const safeMessages = messages ?? [];
19888
- if (safeMessages.length === 0) {
19945
+ if (safeMessages.length === 0 && !hadMessagesBefore) {
19889
19946
  return /* @__PURE__ */ jsxs("div", { className: "flex overflow-auto flex-shrink-10 flex-col p-8 text-center", children: [
19890
19947
  /* @__PURE__ */ jsx("h3", { className: "text-lg font-medium mb-2", children: activeWorkspace?.name ?? "No messages yet" }),
19891
19948
  activeWorkspace?.firstPrompt && /* @__PURE__ */ jsx("div", { className: "max-w-3xl mx-auto p-4", children: /* @__PURE__ */ jsx(MessageMarkdown, { value: activeWorkspace.firstPrompt }) })
@@ -20126,26 +20183,28 @@ function mapWorkspaceDtoToModel(dto) {
20126
20183
  id: dto.id ?? "",
20127
20184
  name: dto.name ?? "",
20128
20185
  tags: dto.tags ?? [],
20129
- showSources: dto.showSources ?? void 0,
20130
- dataSpaces: Array.isArray(dto.dataSpaces) ? dto.dataSpaces : void 0,
20186
+ showSources: truthy(dto.showSources),
20187
+ dataSpaces: Array.isArray(dto.dataSpaces) ? dto.dataSpaces : [],
20131
20188
  createdByUserId: dto.createdByUserId ?? void 0,
20132
20189
  createdAt: dto.createdAt != null ? utcDate(dto.createdAt) : void 0,
20133
20190
  modifiedByUserId: dto.modifiedByUserId ?? void 0,
20134
20191
  modifiedAt: dto.modifiedAt != null ? utcDate(dto.modifiedAt) : void 0,
20135
20192
  favorited: truthy(dto.favorited),
20136
- summary: dto.summary ?? void 0,
20137
- firstPrompt: dto.firstPrompt ?? void 0,
20193
+ summary: dto.summary ?? "",
20194
+ firstPrompt: dto.firstPrompt ?? "",
20138
20195
  outputSchema: dto.outputSchema ?? void 0,
20139
- isPromptAndResponseLoggingEnabled: dto.isPromptAndResponseLoggingEnabled ?? void 0,
20140
20196
  inputs: dto.inputs ?? void 0,
20197
+ isPromptAndResponseLoggingEnabled: truthy(
20198
+ dto.isPromptAndResponseLoggingEnabled
20199
+ ),
20141
20200
  variables,
20142
20201
  sandBoxThreadId: dto.sandBoxThreadId ?? void 0,
20143
- supportsFiles: dto.supportsFiles ?? void 0,
20202
+ supportsFiles: truthy(dto.supportsFiles),
20144
20203
  avatarName: computeAvatar(dto.name ?? "")
20145
20204
  };
20146
20205
  }
20147
20206
  var mapWorkspacesDtoToModels = (arr) => arr.map(mapWorkspaceDtoToModel);
20148
20207
 
20149
- export { ChatProvider, ChatVariablesForm, DRAFT_THREAD_PREFIX, MarkdownEditor, MessageComposer, MessageList, MessageListSkeleton, MessageMarkdown, MessageValueType, NEW_THREAD_ID, THREAD_LIST_PAGE_SIZE, applyDeltaToMessage, applyThreadToCache, createDraftThreadId, createThreadId, downloadFileBlobOptions, filesKeys, flowRunsKeys, getModelIcon, getThreadPlaceholderFromListCache, invalidateWorkspaceThreadLists, isDraftThreadId, mapFileInfoDtoToModel, mapMentionUserDtoToModel, mapMessageDtoToModel, mapMessageErrorDtoToModel, mapMessageValueDtoToModel, mapMessagesDtoToModels, mapSignalRThreadSummaryToModel, mapThreadDtoToModel, mapThreadsResponseDtoToModel, mapWorkspaceDtoToModel, mapWorkspacesDtoToModels, markDraftThreadId, messagesKeys, messagesListOptions, messagesMutationsKeys, modelsKeys, setThreadOptimisticRunning, setThreadRunningInLists, taggableUsersOptions, threadDetailOptions, threadsKeys, unmarkDraftThreadId, useAddInputToMessage, useChatContext, useChatIdentity, useChatService, useDownloadFileBlobQuery, useFileMutations, useFlowRunVariables, useMessages, useModels, useSendMessage, useTaggableWorkspaceUsers, useThread, useThreadIsRunning, useUpdateFlowRunVariable, useWorkspace, workspaceDetailOptions, workspaceKeys };
20208
+ export { ChatProvider, ChatVariablesForm, DRAFT_THREAD_PREFIX, DateFromApi, MarkdownEditor, MessageComposer, MessageList, MessageListSkeleton, MessageMarkdown, MessageValueType, NEW_THREAD_ID, THREAD_LIST_PAGE_SIZE, applyDeltaToMessage, applyThreadToCache, createDraftThreadId, createThreadId, downloadFileBlobOptions, filesKeys, flowRunsKeys, getModelIcon, getThreadPlaceholderFromListCache, getUserPhotoUrl, invalidateWorkspaceThreadLists, isDraftThreadId, mapFileInfoDtoToModel, mapMentionUserDtoToModel, mapMessageDtoToModel, mapMessageErrorDtoToModel, mapMessageValueDtoToModel, mapMessagesDtoToModels, mapSignalRThreadSummaryToModel, mapThreadDtoToModel, mapThreadsResponseDtoToModel, mapWorkspaceDtoToModel, mapWorkspacesDtoToModels, markDraftThreadId, messagesKeys, messagesListOptions, messagesMutationsKeys, modelsKeys, parseDateTime, parseDateTimeHuman, setThreadOptimisticRunning, setThreadRunningInLists, taggableUsersOptions, threadDetailOptions, threadsKeys, unmarkDraftThreadId, useAddInputToMessage, useChatContext, useChatIdentity, useChatService, useDownloadFileBlobQuery, useFileMutations, useFlowRunVariables, useMessages, useModels, useSendMessage, useTaggableWorkspaceUsers, useThread, useThreadIsRunning, useUpdateFlowRunVariable, useWorkspace, utcDate, workspaceDetailOptions, workspaceKeys };
20150
20209
  //# sourceMappingURL=index.js.map
20151
20210
  //# sourceMappingURL=index.js.map