@docyrus/ui-pro-ai-assistant 0.7.1 → 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
@@ -2714,6 +2714,8 @@ var AgentTabs = ({
2714
2714
  return /* @__PURE__ */ jsxs(
2715
2715
  "div",
2716
2716
  {
2717
+ role: "tab",
2718
+ "aria-selected": isActive,
2717
2719
  className: cn(
2718
2720
  "group/tab flex items-center gap-1.5 h-8 pl-2 pr-1 rounded-md cursor-pointer text-sm font-medium max-w-[200px] shrink-0 transition-colors",
2719
2721
  isActive ? "bg-accent text-foreground" : "text-muted-foreground hover:bg-accent/50 hover:text-foreground"
@@ -3106,13 +3108,19 @@ function processMessagesData(rawData) {
3106
3108
  }
3107
3109
 
3108
3110
  // src/lib/assistant-api-actions.ts
3109
- async function fetchAgentThreads(apiClient, tenantAiAgentId, onSuccess, userId, deploymentId) {
3111
+ async function fetchAgentThreads(apiClient, tenantAiAgentId, onSuccess, userId, deploymentId, limit, offset3) {
3110
3112
  try {
3111
3113
  const apiParams = {
3112
3114
  columns: "id,subject,created_on,last_modified_on,body_text,tenant_ai_agent_id,created_by",
3113
3115
  expand: "created_by",
3114
3116
  orderBy: JSON.stringify({ field: "created_on", direction: "desc" })
3115
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
+ }
3116
3124
  const agentRule = deploymentId ? { field: "tenant_ai_agent_deployment_id", operator: "=", value: deploymentId } : { field: "tenant_ai_agent_id", operator: "=", value: tenantAiAgentId };
3117
3125
  const rules = [agentRule, { field: "archived", operator: "=", value: "false" }];
3118
3126
  if (userId) {
@@ -4749,6 +4757,12 @@ function sessionReducer(state, action) {
4749
4757
  switch (action.type) {
4750
4758
  case "SET_SESSIONS":
4751
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
+ }
4752
4766
  case "SELECT_SESSION_ID":
4753
4767
  return { ...state, selectedSessionId: action.payload };
4754
4768
  case "SELECT_SESSION":
@@ -4797,6 +4811,9 @@ function useSessionState() {
4797
4811
  const setSessions = useCallback((sessions) => {
4798
4812
  dispatch({ type: "SET_SESSIONS", payload: sessions });
4799
4813
  }, []);
4814
+ const appendSessions = useCallback((sessions) => {
4815
+ dispatch({ type: "APPEND_SESSIONS", payload: sessions });
4816
+ }, []);
4800
4817
  const selectSessionId = useCallback((id) => {
4801
4818
  dispatch({ type: "SELECT_SESSION_ID", payload: id });
4802
4819
  }, []);
@@ -4839,6 +4856,7 @@ function useSessionState() {
4839
4856
  const actions = useMemo(
4840
4857
  () => ({
4841
4858
  setSessions,
4859
+ appendSessions,
4842
4860
  selectSessionId,
4843
4861
  selectSession,
4844
4862
  startEditing,
@@ -4855,6 +4873,7 @@ function useSessionState() {
4855
4873
  }),
4856
4874
  [
4857
4875
  setSessions,
4876
+ appendSessions,
4858
4877
  selectSessionId,
4859
4878
  selectSession,
4860
4879
  startEditing,
@@ -19431,6 +19450,7 @@ var MessageItem = memo(({
19431
19450
  ), children: [
19432
19451
  /* @__PURE__ */ jsx(MessageContent, { className: cn(
19433
19452
  "group-[.is-user]:p-2 group-[.is-user]:mt-0.5",
19453
+ "group-[.is-user]:text-foreground",
19434
19454
  isEditing && isUserMessage && "flex-1 w-full max-w-full"
19435
19455
  ), children: renderMessageContent() }),
19436
19456
  isAssistantMessage && !isStreaming && textContent && /* @__PURE__ */ jsx(MessageActions, { className: "mt-1 opacity-0 group-hover:opacity-100 transition-opacity", children: /* @__PURE__ */ jsx(CopyButton, { text: textContent }) }),
@@ -35694,12 +35714,19 @@ var SidebarContent = ({
35694
35714
  onShowMoreProjects,
35695
35715
  onNewProject,
35696
35716
  onToggleSidebar,
35717
+ onLoadMoreSessions,
35718
+ hasMoreSessions,
35697
35719
  supportWorkCanvas = true,
35698
35720
  t
35699
35721
  }) => {
35700
35722
  const [storedListType, setActiveListType] = useState("sessions");
35701
35723
  const activeListType = !supportWorkCanvas && storedListType === "works" ? "sessions" : storedListType;
35702
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]);
35703
35730
  const navItems = [{ id: 1, label: t("tabs.sessions"), icon: MessageSquare }, ...supportWorkCanvas ? [{ id: 3, label: t("tabs.works"), icon: NotebookText }] : []];
35704
35731
  return /* @__PURE__ */ jsxs("div", { className: "flex flex-col flex-1 min-h-0", children: [
35705
35732
  /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-px", children: [
@@ -35821,6 +35848,7 @@ var SidebarContent = ({
35821
35848
  "div",
35822
35849
  {
35823
35850
  className: "flex-1 overflow-y-auto",
35851
+ onScroll: handleSessionsScroll,
35824
35852
  style: {
35825
35853
  scrollbarWidth: "thin",
35826
35854
  scrollbarColor: "var(--muted-foreground) transparent"
@@ -36101,6 +36129,7 @@ function dataUrlToFile(dataUrl, filename) {
36101
36129
  }
36102
36130
  return new File([u8arr], filename, { type: mime });
36103
36131
  }
36132
+ var THREADS_PAGE_SIZE = 20;
36104
36133
  var DocyAssistant = ({
36105
36134
  ref,
36106
36135
  isOpen = true,
@@ -36130,6 +36159,7 @@ var DocyAssistant = ({
36130
36159
  onVoiceEnd,
36131
36160
  className,
36132
36161
  defaultFullscreen = false,
36162
+ isFullscreen: isFullscreenProp,
36133
36163
  hideExpand = false,
36134
36164
  hideCloseButton = false,
36135
36165
  hideBorder = false,
@@ -36209,7 +36239,9 @@ var DocyAssistant = ({
36209
36239
  const [showWelcome, setShowWelcome] = useState(() => enableWelcomePage && tabs.length <= 1);
36210
36240
  const currentUserId = configUser.id;
36211
36241
  const [projectSearchQuery, setProjectSearchQuery] = useState("");
36212
- const [isInlineFullscreen, setIsInlineFullscreen] = useState(defaultFullscreen);
36242
+ const [internalInlineFullscreen, setInternalInlineFullscreen] = useState(defaultFullscreen);
36243
+ const isInlineFullscreen = isFullscreenProp ?? internalInlineFullscreen;
36244
+ const setIsInlineFullscreen = setInternalInlineFullscreen;
36213
36245
  const [sharingEditorOpen, setSharingEditorOpen] = useState(false);
36214
36246
  const [appContext, setAppContext] = useState(
36215
36247
  appId ? { id: appId, name: appName, icon: appIcon } : null
@@ -36415,8 +36447,35 @@ var DocyAssistant = ({
36415
36447
  return changed ? next : prev;
36416
36448
  });
36417
36449
  }, [agentDetails, agentDetailsForId]);
36418
- const fetchThreads = useCallback(async () => {
36419
- 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;
36420
36479
  }, [
36421
36480
  apiClient,
36422
36481
  activeAgentId,
@@ -36424,6 +36483,10 @@ var DocyAssistant = ({
36424
36483
  currentUserId,
36425
36484
  deploymentId
36426
36485
  ]);
36486
+ const loadMoreThreads = useCallback(() => {
36487
+ if (!hasMoreThreads) return;
36488
+ void fetchThreads("more");
36489
+ }, [fetchThreads, hasMoreThreads]);
36427
36490
  const fetchProjectThreads2 = useCallback(async (projectId) => {
36428
36491
  await fetchProjectThreads(apiClient, projectId, projectActions.setProjectThreads);
36429
36492
  }, [apiClient, projectActions]);
@@ -36461,7 +36524,8 @@ var DocyAssistant = ({
36461
36524
  ]);
36462
36525
  useEffect(() => {
36463
36526
  if (isOpen && enableSidebar) {
36464
- fetchThreads();
36527
+ setHasMoreThreads(true);
36528
+ void fetchThreads("initial");
36465
36529
  }
36466
36530
  }, [isOpen, enableSidebar, fetchThreads]);
36467
36531
  useEffect(() => {
@@ -36908,6 +36972,8 @@ var DocyAssistant = ({
36908
36972
  },
36909
36973
  onToggleSidebar: isFloating && !uiState.isExpanded ? () => uiActions.setSidebarOpen(false) : void 0,
36910
36974
  supportWorkCanvas: effectiveSupportWorkCanvas,
36975
+ onLoadMoreSessions: loadMoreThreads,
36976
+ hasMoreSessions: hasMoreThreads,
36911
36977
  t
36912
36978
  }
36913
36979
  );