@docyrus/ui-pro-ai-assistant 0.2.2 → 0.2.4

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/README.md CHANGED
@@ -57,6 +57,13 @@ function App() {
57
57
  const config = useMemo(() => ({
58
58
  apiBaseUrl: "https://api.docyrus.com/v1",
59
59
  getAuthToken,
60
+ user: {
61
+ id: "current-user-id",
62
+ firstname: "Ada",
63
+ lastname: "Lovelace",
64
+ email: "ada@example.com",
65
+ photo: "https://example.com/avatar.png",
66
+ },
60
67
  }), [getAuthToken]);
61
68
 
62
69
  if (status !== "authenticated" || !client) {
@@ -157,21 +164,23 @@ Wraps your component tree to provide API configuration context. Must be an ances
157
164
  |----------|------|----------|-------------|
158
165
  | `apiBaseUrl` | `string` | Yes | Base API URL, e.g. `"https://api.docyrus.com/v1"` |
159
166
  | `getAuthToken` | `() => Promise<string>` | Yes | Async callback returning a valid Bearer token |
160
- | `user` | `AssistantUser \| null` | No | Current user info for display |
167
+ | `user` | `AssistantUser` | **Yes** | Current authenticated user. Used to filter sessions/projects to the active user and to display name and avatar in the chat |
161
168
  | `getDataSourceSchema` | `(id: string) => Promise<DataSourceSchema \| null>` | No | Resolver for data source schemas |
162
169
 
163
170
  #### `AssistantUser`
164
171
 
165
172
  ```ts
166
173
  interface AssistantUser {
167
- id: string;
168
- email?: string;
174
+ id: string; // required — used for server-side filtering
175
+ email?: string; // optional — shown as fallback display name
169
176
  firstname?: string;
170
177
  lastname?: string;
171
- photo?: string;
178
+ photo?: string; // optional — avatar in chat messages
172
179
  }
173
180
  ```
174
181
 
182
+ > **Note:** `user.id` must be the authenticated user's UUID as stored in Docyrus. Without it, the session list will not be filtered and all tenant users' threads will be visible.
183
+
175
184
  ---
176
185
 
177
186
  ### `<DocyAssistant>`
@@ -27,7 +27,6 @@ interface UseAssistantApiReturn {
27
27
  name: string;
28
28
  description?: string;
29
29
  instructions?: string;
30
- userId?: string;
31
30
  }) => Promise<Project | null>;
32
31
  updateProject: (projectId: string, params: {
33
32
  name?: string;
package/dist/index.js CHANGED
@@ -2579,27 +2579,14 @@ function useAssistantApi({
2579
2579
  try {
2580
2580
  const apiParams = {
2581
2581
  columns: "id,subject,created_on,last_modified_on,body_text,tenant_ai_agent_id,created_by",
2582
- expand: "created_by",
2583
2582
  orderBy: JSON.stringify({ field: "created_on", direction: "desc" })
2584
2583
  };
2585
- apiParams.filters = JSON.stringify({
2586
- rules: [
2587
- {
2588
- field: "tenant_ai_agent_id",
2589
- operator: "=",
2590
- value: tenantAiAgentId
2591
- }
2592
- ]
2593
- });
2584
+ const rules = [{ field: "tenant_ai_agent_id", operator: "=", value: tenantAiAgentId }];
2585
+ rules.push({ field: "created_by", operator: "=", value: configUser.id });
2586
+ apiParams.filters = JSON.stringify({ rules });
2594
2587
  const response = await apiClient.get("/apps/base/data-sources/thread/items", apiParams);
2595
2588
  if (response.success && response.data) {
2596
- let items2 = Array.isArray(response.data) ? response.data : response.data.items || [];
2597
- if (configUser?.id) {
2598
- items2 = items2.filter((item) => {
2599
- const createdById = typeof item.created_by === "object" ? item.created_by?.id : item.created_by;
2600
- return createdById === configUser.id;
2601
- });
2602
- }
2589
+ const items2 = Array.isArray(response.data) ? response.data : response.data.items || [];
2603
2590
  return items2.map((item) => ({
2604
2591
  id: item.id,
2605
2592
  title: item.subject,
@@ -2614,32 +2601,19 @@ function useAssistantApi({
2614
2601
  console.error("Failed to fetch threads:", error);
2615
2602
  return [];
2616
2603
  }
2617
- }, [apiClient, tenantAiAgentId, configUser?.id]);
2604
+ }, [apiClient, tenantAiAgentId, configUser.id]);
2618
2605
  const fetchProjectThreads2 = useCallback(async (projectId) => {
2619
2606
  try {
2620
2607
  const apiParams = {
2621
2608
  columns: "id,subject,created_on,last_modified_on,body_text,tenant_ai_agent_id,tenant_ai_project_id,created_by",
2622
- expand: "created_by",
2623
2609
  orderBy: JSON.stringify({ field: "created_on", direction: "desc" })
2624
2610
  };
2625
- apiParams.filters = JSON.stringify({
2626
- rules: [
2627
- {
2628
- field: "tenant_ai_project_id",
2629
- operator: "=",
2630
- value: projectId
2631
- }
2632
- ]
2633
- });
2611
+ const rules = [{ field: "tenant_ai_project_id", operator: "=", value: projectId }];
2612
+ rules.push({ field: "created_by", operator: "=", value: configUser.id });
2613
+ apiParams.filters = JSON.stringify({ rules });
2634
2614
  const response = await apiClient.get("/apps/base/data-sources/thread/items", apiParams);
2635
2615
  if (response.success && response.data) {
2636
- let items2 = Array.isArray(response.data) ? response.data : response.data.items || [];
2637
- if (configUser?.id) {
2638
- items2 = items2.filter((item) => {
2639
- const createdById = typeof item.created_by === "object" ? item.created_by?.id : item.created_by;
2640
- return createdById === configUser.id;
2641
- });
2642
- }
2616
+ const items2 = Array.isArray(response.data) ? response.data : response.data.items || [];
2643
2617
  return items2.map((item) => ({
2644
2618
  id: item.id,
2645
2619
  title: item.subject,
@@ -2654,7 +2628,7 @@ function useAssistantApi({
2654
2628
  console.error("Failed to fetch project threads:", error);
2655
2629
  return [];
2656
2630
  }
2657
- }, [apiClient, configUser?.id]);
2631
+ }, [apiClient, configUser.id]);
2658
2632
  const loadThreadMessages2 = useCallback(async (threadId) => {
2659
2633
  try {
2660
2634
  const response = await apiClient.get("/apps/base/data-sources/message/items", {
@@ -2696,7 +2670,6 @@ function useAssistantApi({
2696
2670
  }, [apiClient, deploymentId, tenantAiAgentId]);
2697
2671
  const fetchProjects2 = useCallback(async () => {
2698
2672
  try {
2699
- const userId = configUser?.id || null;
2700
2673
  const response = await apiClient.get("/ai/projects");
2701
2674
  if (response.success && response.data) {
2702
2675
  const responseItems = Array.isArray(response.data) ? response.data : response.data.items || [];
@@ -2709,16 +2682,16 @@ function useAssistantApi({
2709
2682
  created_by: item.created_by,
2710
2683
  shared_to: item.shared_to
2711
2684
  }));
2712
- return userId ? allProjects.filter(
2713
- (project) => project.created_by === userId || project.shared_to && project.shared_to.includes(userId)
2714
- ) : allProjects;
2685
+ return allProjects.filter(
2686
+ (project) => project.created_by === configUser.id || project.shared_to && project.shared_to.includes(configUser.id)
2687
+ );
2715
2688
  }
2716
2689
  return [];
2717
2690
  } catch (error) {
2718
2691
  console.error("Failed to fetch projects:", error);
2719
2692
  return [];
2720
2693
  }
2721
- }, [apiClient, configUser?.id]);
2694
+ }, [apiClient, configUser.id]);
2722
2695
  const createProject = useCallback(async (params) => {
2723
2696
  try {
2724
2697
  const response = await apiClient.post("/ai/projects", {
@@ -2727,7 +2700,7 @@ function useAssistantApi({
2727
2700
  instructions: params.instructions,
2728
2701
  tenant_ai_agent_id: tenantAiAgentId,
2729
2702
  tenant_ai_agent_deployment_id: deploymentId,
2730
- created_by: params.userId
2703
+ created_by: configUser.id
2731
2704
  });
2732
2705
  if (response.success && response.data) {
2733
2706
  toast.success(t("toast.project_created_success"));
@@ -2743,6 +2716,7 @@ function useAssistantApi({
2743
2716
  apiClient,
2744
2717
  tenantAiAgentId,
2745
2718
  deploymentId,
2719
+ configUser.id,
2746
2720
  t
2747
2721
  ]);
2748
2722
  const updateProject2 = useCallback(async (projectId, params) => {
@@ -24616,7 +24590,7 @@ var DocyAssistant = ({
24616
24590
  const { state: projectState, actions: projectActions } = useProjectState();
24617
24591
  const { state: worksState, actions: worksActions } = useWorksState();
24618
24592
  const [input, setInput] = useState("");
24619
- const currentUserId = configUser?.id || null;
24593
+ const currentUserId = configUser.id;
24620
24594
  const [projectSearchQuery, setProjectSearchQuery] = useState("");
24621
24595
  const [isInlineFullscreen, setIsInlineFullscreen] = useState(defaultFullscreen);
24622
24596
  const { isRecording, recognition, handleMicrophoneClick } = useSpeechRecognition({
@@ -24742,7 +24716,7 @@ var DocyAssistant = ({
24742
24716
  }
24743
24717
  }, [addToolOutput]);
24744
24718
  const userDisplayName = configUser ? `${configUser.firstname || ""} ${configUser.lastname || ""}`.trim() || configUser.email?.split("@")[0] || "User" : "User";
24745
- const userPhoto = configUser?.photo || "";
24719
+ const userPhoto = configUser.photo || "";
24746
24720
  const isInlineMode = uiState.currentRenderMode === "inline";
24747
24721
  useEffect(() => {
24748
24722
  if (uiState.activeTab === 2 && projectState.projectsLoaded && projectState.projects.length === 0 && projectState.view === "list") {
@@ -24787,7 +24761,7 @@ var DocyAssistant = ({
24787
24761
  const fetchProjects2 = useCallback(async () => {
24788
24762
  await fetchProjects(
24789
24763
  apiClient,
24790
- configUser?.id || null,
24764
+ configUser.id,
24791
24765
  projectActions.setProjects,
24792
24766
  (project) => {
24793
24767
  fetchProjectThreads2(project.id);
@@ -24798,7 +24772,7 @@ var DocyAssistant = ({
24798
24772
  );
24799
24773
  }, [
24800
24774
  apiClient,
24801
- configUser?.id,
24775
+ configUser.id,
24802
24776
  projectActions,
24803
24777
  fetchProjectThreads2,
24804
24778
  fetchProjectWorks2,