@docyrus/ui-pro-ai-assistant 0.7.2 → 0.7.3

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.
@@ -1,5 +1,5 @@
1
1
  import { type RefObject } from 'react';
2
2
  import { type DocyAssistantProps } from './types';
3
- export declare const DocyAssistant: ({ ref, isOpen, onClose, supportWebSearch, supportThinking, supportFiles, supportDocumentSearch, supportDeepResearch, supportMultiModels, supportWorkCanvas, apiEndpoint, title: titleProp, description: descriptionProp, placeholder: placeholderProp, logo, footerText: footerTextProp, variant, renderMode, enableSidebar, enableVoice, enableMicrophone, enableWelcomePage, tenantAiAgentId, onMessageSend, onVoiceStart, onVoiceEnd, className, defaultFullscreen, hideExpand, hideCloseButton, hideBorder, showHeader, hideHeaderOnWelcome, agentSelectorUrl, onAgentChange, onFullscreenChange, enableSharing, onShare: onShareProp, initialPrompt, initialModelId, initialFeatures, initialFiles, hostEnvironment, appId, appName, appIcon, clientTools, ...props }: DocyAssistantProps & {
3
+ export declare const DocyAssistant: ({ ref, isOpen, onClose, supportWebSearch, supportThinking, supportFiles, supportDocumentSearch, supportDeepResearch, supportMultiModels, supportWorkCanvas, apiEndpoint, title: titleProp, description: descriptionProp, placeholder: placeholderProp, logo, footerText: footerTextProp, variant, renderMode, enableSidebar, enableVoice, enableMicrophone, enableWelcomePage, tenantAiAgentId, onMessageSend, onVoiceStart, onVoiceEnd, className, defaultFullscreen, isFullscreen: isFullscreenProp, hideExpand, hideCloseButton, hideBorder, showHeader, hideHeaderOnWelcome, agentSelectorUrl, onAgentChange, onFullscreenChange, enableSharing, onShare: onShareProp, initialPrompt, initialModelId, initialFeatures, initialFiles, hostEnvironment, appId, appName, appIcon, clientTools, ...props }: DocyAssistantProps & {
4
4
  ref?: RefObject<HTMLDivElement | null>;
5
5
  }) => import("react/jsx-runtime").JSX.Element;
@@ -14,6 +14,7 @@ export declare function useSessionState(): {
14
14
  state: SessionState;
15
15
  actions: {
16
16
  setSessions: (sessions: AssistantSession[]) => void;
17
+ appendSessions: (sessions: AssistantSession[]) => void;
17
18
  selectSessionId: (id: string | null) => void;
18
19
  selectSession: (session: AssistantSession | null) => void;
19
20
  startEditing: () => void;
package/dist/index.js CHANGED
@@ -3108,13 +3108,19 @@ function processMessagesData(rawData) {
3108
3108
  }
3109
3109
 
3110
3110
  // src/lib/assistant-api-actions.ts
3111
- async function fetchAgentThreads(apiClient, tenantAiAgentId, onSuccess, userId, deploymentId) {
3111
+ async function fetchAgentThreads(apiClient, tenantAiAgentId, onSuccess, userId, deploymentId, limit, offset3) {
3112
3112
  try {
3113
3113
  const apiParams = {
3114
3114
  columns: "id,subject,created_on,last_modified_on,body_text,tenant_ai_agent_id,created_by",
3115
3115
  expand: "created_by",
3116
3116
  orderBy: JSON.stringify({ field: "created_on", direction: "desc" })
3117
3117
  };
3118
+ if (typeof limit === "number" && limit > 0) {
3119
+ apiParams.limit = limit;
3120
+ }
3121
+ if (typeof offset3 === "number" && offset3 > 0) {
3122
+ apiParams.offset = offset3;
3123
+ }
3118
3124
  const agentRule = deploymentId ? { field: "tenant_ai_agent_deployment_id", operator: "=", value: deploymentId } : { field: "tenant_ai_agent_id", operator: "=", value: tenantAiAgentId };
3119
3125
  const rules = [agentRule, { field: "archived", operator: "=", value: "false" }];
3120
3126
  if (userId) {
@@ -4751,6 +4757,12 @@ function sessionReducer(state, action) {
4751
4757
  switch (action.type) {
4752
4758
  case "SET_SESSIONS":
4753
4759
  return { ...state, sessions: action.payload };
4760
+ case "APPEND_SESSIONS": {
4761
+ const existing = new Set(state.sessions.map((s) => s.id));
4762
+ const fresh = action.payload.filter((s) => !existing.has(s.id));
4763
+ if (fresh.length === 0) return state;
4764
+ return { ...state, sessions: [...state.sessions, ...fresh] };
4765
+ }
4754
4766
  case "SELECT_SESSION_ID":
4755
4767
  return { ...state, selectedSessionId: action.payload };
4756
4768
  case "SELECT_SESSION":
@@ -4799,6 +4811,9 @@ function useSessionState() {
4799
4811
  const setSessions = useCallback((sessions) => {
4800
4812
  dispatch({ type: "SET_SESSIONS", payload: sessions });
4801
4813
  }, []);
4814
+ const appendSessions = useCallback((sessions) => {
4815
+ dispatch({ type: "APPEND_SESSIONS", payload: sessions });
4816
+ }, []);
4802
4817
  const selectSessionId = useCallback((id) => {
4803
4818
  dispatch({ type: "SELECT_SESSION_ID", payload: id });
4804
4819
  }, []);
@@ -4841,6 +4856,7 @@ function useSessionState() {
4841
4856
  const actions = useMemo(
4842
4857
  () => ({
4843
4858
  setSessions,
4859
+ appendSessions,
4844
4860
  selectSessionId,
4845
4861
  selectSession,
4846
4862
  startEditing,
@@ -4857,6 +4873,7 @@ function useSessionState() {
4857
4873
  }),
4858
4874
  [
4859
4875
  setSessions,
4876
+ appendSessions,
4860
4877
  selectSessionId,
4861
4878
  selectSession,
4862
4879
  startEditing,
@@ -19433,6 +19450,7 @@ var MessageItem = memo(({
19433
19450
  ), children: [
19434
19451
  /* @__PURE__ */ jsx(MessageContent, { className: cn(
19435
19452
  "group-[.is-user]:p-2 group-[.is-user]:mt-0.5",
19453
+ "group-[.is-user]:text-foreground",
19436
19454
  isEditing && isUserMessage && "flex-1 w-full max-w-full"
19437
19455
  ), children: renderMessageContent() }),
19438
19456
  isAssistantMessage && !isStreaming && textContent && /* @__PURE__ */ jsx(MessageActions, { className: "mt-1 opacity-0 group-hover:opacity-100 transition-opacity", children: /* @__PURE__ */ jsx(CopyButton, { text: textContent }) }),
@@ -35696,12 +35714,19 @@ var SidebarContent = ({
35696
35714
  onShowMoreProjects,
35697
35715
  onNewProject,
35698
35716
  onToggleSidebar,
35717
+ onLoadMoreSessions,
35718
+ hasMoreSessions,
35699
35719
  supportWorkCanvas = true,
35700
35720
  t
35701
35721
  }) => {
35702
35722
  const [storedListType, setActiveListType] = useState("sessions");
35703
35723
  const activeListType = !supportWorkCanvas && storedListType === "works" ? "sessions" : storedListType;
35704
35724
  const [openMenuId, setOpenMenuId] = useState(null);
35725
+ const handleSessionsScroll = useCallback((e) => {
35726
+ if (activeListType !== "sessions" || !hasMoreSessions || !onLoadMoreSessions) return;
35727
+ const el = e.currentTarget;
35728
+ if (el.scrollHeight - el.scrollTop - el.clientHeight < 80) onLoadMoreSessions();
35729
+ }, [activeListType, hasMoreSessions, onLoadMoreSessions]);
35705
35730
  const navItems = [{ id: 1, label: t("tabs.sessions"), icon: MessageSquare }, ...supportWorkCanvas ? [{ id: 3, label: t("tabs.works"), icon: NotebookText }] : []];
35706
35731
  return /* @__PURE__ */ jsxs("div", { className: "flex flex-col flex-1 min-h-0", children: [
35707
35732
  /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-px", children: [
@@ -35823,6 +35848,7 @@ var SidebarContent = ({
35823
35848
  "div",
35824
35849
  {
35825
35850
  className: "flex-1 overflow-y-auto",
35851
+ onScroll: handleSessionsScroll,
35826
35852
  style: {
35827
35853
  scrollbarWidth: "thin",
35828
35854
  scrollbarColor: "var(--muted-foreground) transparent"
@@ -36103,6 +36129,7 @@ function dataUrlToFile(dataUrl, filename) {
36103
36129
  }
36104
36130
  return new File([u8arr], filename, { type: mime });
36105
36131
  }
36132
+ var THREADS_PAGE_SIZE = 20;
36106
36133
  var DocyAssistant = ({
36107
36134
  ref,
36108
36135
  isOpen = true,
@@ -36132,6 +36159,7 @@ var DocyAssistant = ({
36132
36159
  onVoiceEnd,
36133
36160
  className,
36134
36161
  defaultFullscreen = false,
36162
+ isFullscreen: isFullscreenProp,
36135
36163
  hideExpand = false,
36136
36164
  hideCloseButton = false,
36137
36165
  hideBorder = false,
@@ -36211,7 +36239,9 @@ var DocyAssistant = ({
36211
36239
  const [showWelcome, setShowWelcome] = useState(() => enableWelcomePage && tabs.length <= 1);
36212
36240
  const currentUserId = configUser.id;
36213
36241
  const [projectSearchQuery, setProjectSearchQuery] = useState("");
36214
- const [isInlineFullscreen, setIsInlineFullscreen] = useState(defaultFullscreen);
36242
+ const [internalInlineFullscreen, setInternalInlineFullscreen] = useState(defaultFullscreen);
36243
+ const isInlineFullscreen = isFullscreenProp ?? internalInlineFullscreen;
36244
+ const setIsInlineFullscreen = setInternalInlineFullscreen;
36215
36245
  const [sharingEditorOpen, setSharingEditorOpen] = useState(false);
36216
36246
  const [appContext, setAppContext] = useState(
36217
36247
  appId ? { id: appId, name: appName, icon: appIcon } : null
@@ -36417,8 +36447,35 @@ var DocyAssistant = ({
36417
36447
  return changed ? next : prev;
36418
36448
  });
36419
36449
  }, [agentDetails, agentDetailsForId]);
36420
- const fetchThreads = useCallback(async () => {
36421
- await fetchAgentThreads(apiClient, activeAgentId, sessionActions.setSessions, currentUserId, deploymentId);
36450
+ const [hasMoreThreads, setHasMoreThreads] = useState(true);
36451
+ const isLoadingMoreThreadsRef = useRef(false);
36452
+ const sessionsRef = useRef(sessionState.sessions);
36453
+ useEffect(() => {
36454
+ sessionsRef.current = sessionState.sessions;
36455
+ }, [sessionState.sessions]);
36456
+ const fetchThreads = useCallback(async (mode = "initial") => {
36457
+ if (mode === "more") {
36458
+ if (isLoadingMoreThreadsRef.current) return;
36459
+ isLoadingMoreThreadsRef.current = true;
36460
+ }
36461
+ const offset3 = mode === "more" ? sessionsRef.current.length : 0;
36462
+ await fetchAgentThreads(
36463
+ apiClient,
36464
+ activeAgentId,
36465
+ (threads) => {
36466
+ if (mode === "initial") {
36467
+ sessionActions.setSessions(threads);
36468
+ } else {
36469
+ sessionActions.appendSessions(threads);
36470
+ }
36471
+ setHasMoreThreads(threads.length === THREADS_PAGE_SIZE);
36472
+ },
36473
+ currentUserId,
36474
+ deploymentId,
36475
+ THREADS_PAGE_SIZE,
36476
+ offset3
36477
+ );
36478
+ if (mode === "more") isLoadingMoreThreadsRef.current = false;
36422
36479
  }, [
36423
36480
  apiClient,
36424
36481
  activeAgentId,
@@ -36426,6 +36483,10 @@ var DocyAssistant = ({
36426
36483
  currentUserId,
36427
36484
  deploymentId
36428
36485
  ]);
36486
+ const loadMoreThreads = useCallback(() => {
36487
+ if (!hasMoreThreads) return;
36488
+ void fetchThreads("more");
36489
+ }, [fetchThreads, hasMoreThreads]);
36429
36490
  const fetchProjectThreads2 = useCallback(async (projectId) => {
36430
36491
  await fetchProjectThreads(apiClient, projectId, projectActions.setProjectThreads);
36431
36492
  }, [apiClient, projectActions]);
@@ -36463,7 +36524,8 @@ var DocyAssistant = ({
36463
36524
  ]);
36464
36525
  useEffect(() => {
36465
36526
  if (isOpen && enableSidebar) {
36466
- fetchThreads();
36527
+ setHasMoreThreads(true);
36528
+ void fetchThreads("initial");
36467
36529
  }
36468
36530
  }, [isOpen, enableSidebar, fetchThreads]);
36469
36531
  useEffect(() => {
@@ -36910,6 +36972,8 @@ var DocyAssistant = ({
36910
36972
  },
36911
36973
  onToggleSidebar: isFloating && !uiState.isExpanded ? () => uiActions.setSidebarOpen(false) : void 0,
36912
36974
  supportWorkCanvas: effectiveSupportWorkCanvas,
36975
+ onLoadMoreSessions: loadMoreThreads,
36976
+ hasMoreSessions: hasMoreThreads,
36913
36977
  t
36914
36978
  }
36915
36979
  );