@stack-spot/ai-chat-widget 0.1.0 → 0.3.0

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 (177) hide show
  1. package/dist/StackspotAIWidget.d.ts.map +1 -1
  2. package/dist/StackspotAIWidget.js +4 -1
  3. package/dist/StackspotAIWidget.js.map +1 -1
  4. package/dist/chat-interceptors/send-message.d.ts.map +1 -1
  5. package/dist/chat-interceptors/send-message.js +15 -7
  6. package/dist/chat-interceptors/send-message.js.map +1 -1
  7. package/dist/components/HistoryList.d.ts +2 -5
  8. package/dist/components/HistoryList.d.ts.map +1 -1
  9. package/dist/components/HistoryList.js +70 -2
  10. package/dist/components/HistoryList.js.map +1 -1
  11. package/dist/components/OverlayMenu.d.ts +3 -2
  12. package/dist/components/OverlayMenu.d.ts.map +1 -1
  13. package/dist/components/OverlayMenu.js +57 -1
  14. package/dist/components/OverlayMenu.js.map +1 -1
  15. package/dist/components/RightPanelTabs.d.ts.map +1 -1
  16. package/dist/components/RightPanelTabs.js +1 -0
  17. package/dist/components/RightPanelTabs.js.map +1 -1
  18. package/dist/components/Tooltip/Tooltip.d.ts +2 -1
  19. package/dist/components/Tooltip/Tooltip.d.ts.map +1 -1
  20. package/dist/components/Tooltip/Tooltip.js +10 -2
  21. package/dist/components/Tooltip/Tooltip.js.map +1 -1
  22. package/dist/components/Tooltip/TooltipAPI.d.ts +3 -2
  23. package/dist/components/Tooltip/TooltipAPI.d.ts.map +1 -1
  24. package/dist/components/Tooltip/TooltipAPI.js +26 -1
  25. package/dist/components/Tooltip/TooltipAPI.js.map +1 -1
  26. package/dist/components/Tooltip/style.d.ts.map +1 -1
  27. package/dist/components/Tooltip/style.js +0 -1
  28. package/dist/components/Tooltip/style.js.map +1 -1
  29. package/dist/components/Tooltip/types.d.ts +6 -0
  30. package/dist/components/Tooltip/types.d.ts.map +1 -1
  31. package/dist/components/form/styled.d.ts.map +1 -1
  32. package/dist/components/form/styled.js +2 -1
  33. package/dist/components/form/styled.js.map +1 -1
  34. package/dist/context/hooks.d.ts.map +1 -1
  35. package/dist/context/hooks.js +1 -5
  36. package/dist/context/hooks.js.map +1 -1
  37. package/dist/features.d.ts.map +1 -1
  38. package/dist/features.js +2 -0
  39. package/dist/features.js.map +1 -1
  40. package/dist/right-panel/DefaultPanel.d.ts +2 -2
  41. package/dist/right-panel/DefaultPanel.d.ts.map +1 -1
  42. package/dist/right-panel/DefaultPanel.js +2 -1
  43. package/dist/right-panel/DefaultPanel.js.map +1 -1
  44. package/dist/right-panel/hooks.d.ts +2 -2
  45. package/dist/right-panel/hooks.d.ts.map +1 -1
  46. package/dist/state/ChatEntry.d.ts +7 -0
  47. package/dist/state/ChatEntry.d.ts.map +1 -1
  48. package/dist/state/ChatEntry.js +0 -3
  49. package/dist/state/ChatEntry.js.map +1 -1
  50. package/dist/state/ChatState.d.ts +4 -1
  51. package/dist/state/ChatState.d.ts.map +1 -1
  52. package/dist/state/ChatState.js.map +1 -1
  53. package/dist/state/WidgetState.d.ts +19 -8
  54. package/dist/state/WidgetState.d.ts.map +1 -1
  55. package/dist/state/WidgetState.js +0 -19
  56. package/dist/state/WidgetState.js.map +1 -1
  57. package/dist/types.d.ts +1 -1
  58. package/dist/types.d.ts.map +1 -1
  59. package/dist/utils/chat.js +1 -1
  60. package/dist/utils/chat.js.map +1 -1
  61. package/dist/utils/date.d.ts +1 -0
  62. package/dist/utils/date.d.ts.map +1 -1
  63. package/dist/utils/date.js +3 -0
  64. package/dist/utils/date.js.map +1 -1
  65. package/dist/utils/download.d.ts +2 -0
  66. package/dist/utils/download.d.ts.map +1 -0
  67. package/dist/utils/download.js +10 -0
  68. package/dist/utils/download.js.map +1 -0
  69. package/dist/utils/knowledge-source.d.ts +9 -0
  70. package/dist/utils/knowledge-source.d.ts.map +1 -0
  71. package/dist/utils/knowledge-source.js +46 -0
  72. package/dist/utils/knowledge-source.js.map +1 -0
  73. package/dist/views/Agents.d.ts.map +1 -1
  74. package/dist/views/Agents.js +130 -1
  75. package/dist/views/Agents.js.map +1 -1
  76. package/dist/views/Chat/ChatMessage.d.ts.map +1 -1
  77. package/dist/views/Chat/ChatMessage.js +10 -5
  78. package/dist/views/Chat/ChatMessage.js.map +1 -1
  79. package/dist/views/Chat/chat-scroll.d.ts.map +1 -0
  80. package/dist/{hooks → views/Chat}/chat-scroll.js +5 -3
  81. package/dist/views/Chat/chat-scroll.js.map +1 -0
  82. package/dist/views/Chat/styled.d.ts.map +1 -1
  83. package/dist/views/Chat/styled.js +24 -0
  84. package/dist/views/Chat/styled.js.map +1 -1
  85. package/dist/views/ChatHistory/ChatHistoryPanel.d.ts +5 -0
  86. package/dist/views/ChatHistory/ChatHistoryPanel.d.ts.map +1 -0
  87. package/dist/views/ChatHistory/ChatHistoryPanel.js +10 -0
  88. package/dist/views/ChatHistory/ChatHistoryPanel.js.map +1 -0
  89. package/dist/views/ChatHistory/HistoryItem.d.ts +7 -0
  90. package/dist/views/ChatHistory/HistoryItem.d.ts.map +1 -0
  91. package/dist/views/ChatHistory/HistoryItem.js +109 -0
  92. package/dist/views/ChatHistory/HistoryItem.js.map +1 -0
  93. package/dist/views/ChatHistory/dictionary.d.ts +2 -0
  94. package/dist/views/ChatHistory/dictionary.d.ts.map +1 -0
  95. package/dist/views/ChatHistory/dictionary.js +19 -0
  96. package/dist/views/ChatHistory/dictionary.js.map +1 -0
  97. package/dist/views/ChatHistory/index.d.ts +5 -0
  98. package/dist/views/ChatHistory/index.d.ts.map +1 -0
  99. package/dist/views/ChatHistory/index.js +23 -0
  100. package/dist/views/ChatHistory/index.js.map +1 -0
  101. package/dist/views/ChatHistory/styled.d.ts +2 -0
  102. package/dist/views/ChatHistory/styled.d.ts.map +1 -0
  103. package/dist/views/ChatHistory/styled.js +60 -0
  104. package/dist/views/ChatHistory/styled.js.map +1 -0
  105. package/dist/views/ChatHistory/utils.d.ts +4 -0
  106. package/dist/views/ChatHistory/utils.d.ts.map +1 -0
  107. package/dist/views/ChatHistory/utils.js +28 -0
  108. package/dist/views/ChatHistory/utils.js.map +1 -0
  109. package/dist/views/ChatTabSelection.js +1 -1
  110. package/dist/views/ChatTabSelection.js.map +1 -1
  111. package/dist/views/KSDocument.d.ts +2 -0
  112. package/dist/views/KSDocument.d.ts.map +1 -0
  113. package/dist/views/KSDocument.js +40 -0
  114. package/dist/views/KSDocument.js.map +1 -0
  115. package/dist/views/KnowledgeSources.d.ts.map +1 -1
  116. package/dist/views/KnowledgeSources.js +35 -24
  117. package/dist/views/KnowledgeSources.js.map +1 -1
  118. package/dist/views/MessageInput/ButtonGroup.d.ts.map +1 -1
  119. package/dist/views/MessageInput/ButtonGroup.js +5 -3
  120. package/dist/views/MessageInput/ButtonGroup.js.map +1 -1
  121. package/dist/views/MessageInput/dictionary.d.ts +1 -1
  122. package/dist/views/MessageInput/index.d.ts.map +1 -1
  123. package/dist/views/MessageInput/index.js +2 -4
  124. package/dist/views/MessageInput/index.js.map +1 -1
  125. package/dist/views/MessageInput/styled.d.ts +2 -0
  126. package/dist/views/MessageInput/styled.d.ts.map +1 -1
  127. package/dist/views/MessageInput/styled.js +11 -3
  128. package/dist/views/MessageInput/styled.js.map +1 -1
  129. package/dist/views/Stacks.js +9 -6
  130. package/dist/views/Stacks.js.map +1 -1
  131. package/dist/views/Workspaces.d.ts.map +1 -1
  132. package/dist/views/Workspaces.js +8 -5
  133. package/dist/views/Workspaces.js.map +1 -1
  134. package/package.json +3 -2
  135. package/src/StackspotAIWidget.tsx +6 -0
  136. package/src/chat-interceptors/send-message.ts +16 -8
  137. package/src/components/HistoryList.tsx +80 -7
  138. package/src/components/OverlayMenu.tsx +70 -3
  139. package/src/components/RightPanelTabs.tsx +1 -0
  140. package/src/components/Tooltip/Tooltip.tsx +13 -7
  141. package/src/components/Tooltip/TooltipAPI.ts +22 -2
  142. package/src/components/Tooltip/style.tsx +0 -1
  143. package/src/components/Tooltip/types.ts +7 -0
  144. package/src/components/form/styled.ts +2 -1
  145. package/src/context/hooks.ts +1 -4
  146. package/src/features.ts +2 -0
  147. package/src/right-panel/DefaultPanel.tsx +5 -4
  148. package/src/right-panel/hooks.tsx +2 -2
  149. package/src/state/ChatEntry.ts +8 -3
  150. package/src/state/ChatState.ts +5 -1
  151. package/src/state/WidgetState.ts +14 -26
  152. package/src/types.ts +1 -1
  153. package/src/utils/chat.ts +1 -1
  154. package/src/utils/date.ts +4 -0
  155. package/src/utils/download.ts +12 -0
  156. package/src/utils/knowledge-source.ts +55 -0
  157. package/src/views/Agents.tsx +187 -1
  158. package/src/views/Chat/ChatMessage.tsx +19 -5
  159. package/src/{hooks → views/Chat}/chat-scroll.ts +6 -3
  160. package/src/views/Chat/styled.ts +24 -0
  161. package/src/views/ChatHistory/ChatHistoryPanel.tsx +28 -0
  162. package/src/views/ChatHistory/HistoryItem.tsx +127 -0
  163. package/src/views/ChatHistory/dictionary.ts +20 -0
  164. package/src/views/ChatHistory/index.tsx +31 -0
  165. package/src/views/ChatHistory/styled.ts +60 -0
  166. package/src/views/ChatHistory/utils.ts +26 -0
  167. package/src/views/ChatTabSelection.tsx +1 -1
  168. package/src/views/KSDocument.tsx +58 -0
  169. package/src/views/KnowledgeSources.tsx +47 -25
  170. package/src/views/MessageInput/ButtonGroup.tsx +9 -7
  171. package/src/views/MessageInput/index.tsx +2 -5
  172. package/src/views/MessageInput/styled.ts +11 -3
  173. package/src/views/Stacks.tsx +10 -6
  174. package/src/views/Workspaces.tsx +10 -6
  175. package/dist/hooks/chat-scroll.d.ts.map +0 -1
  176. package/dist/hooks/chat-scroll.js.map +0 -1
  177. /package/dist/{hooks → views/Chat}/chat-scroll.d.ts +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-scroll.d.ts","sourceRoot":"","sources":["../../../src/views/Chat/chat-scroll.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,QASzF"}
@@ -1,15 +1,17 @@
1
- import { useEffect } from 'react';
1
+ import { useEffect, useRef } from 'react';
2
2
  /**
3
3
  * Scrolls the closest chat (upwards in the tree) to its bottom.
4
4
  * @param ref the reference element.
5
5
  * @param deps when the deps changes, the chat is scrolled.
6
6
  */
7
7
  export function useChatScrollToBottomEffect(ref, deps) {
8
+ const prevScrollTop = useRef(0);
8
9
  useEffect(() => {
9
10
  const chat = ref.current?.closest('.chat-content');
10
- if (!chat)
11
+ if (!chat || chat.scrollTop < prevScrollTop.current)
11
12
  return;
12
- chat.scrollTop = chat.scrollHeight;
13
+ chat.scrollTop = chat.scrollHeight - chat.clientHeight;
14
+ prevScrollTop.current = chat.scrollTop;
13
15
  }, deps);
14
16
  }
15
17
  //# sourceMappingURL=chat-scroll.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-scroll.js","sourceRoot":"","sources":["../../../src/views/Chat/chat-scroll.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AAEzC;;;;GAIG;AACH,MAAM,UAAU,2BAA2B,CAAC,GAAiC,EAAE,IAAW;IACxF,MAAM,aAAa,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;IAE/B,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,CAAA;QAClD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,GAAG,aAAa,CAAC,OAAO;YAAE,OAAM;QAC3D,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAA;QACtD,aAAa,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAA;IACxC,CAAC,EAAE,IAAI,CAAC,CAAA;AACV,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"styled.d.ts","sourceRoot":"","sources":["../../../src/views/Chat/styled.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,QAAQ,4OAgHpB,CAAA"}
1
+ {"version":3,"file":"styled.d.ts","sourceRoot":"","sources":["../../../src/views/Chat/styled.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,QAAQ,4OAwIpB,CAAA"}
@@ -112,5 +112,29 @@ export const ChatList = styled.ul `
112
112
  .plain-text {
113
113
  margin: 0
114
114
  }
115
+
116
+ .ks-box {
117
+ border-radius: 8px;
118
+ display: flex;
119
+ flex-direction: column;
120
+ gap: 10px;
121
+ padding: 8px;
122
+ border: 1px solid ${theme.color.light[500]};
123
+
124
+ > ul {
125
+ display: flex;
126
+ flex-direction: row;
127
+ flex-wrap: wrap;
128
+ white-space: nowrap;
129
+ margin: 0;
130
+ padding: 0;
131
+ list-style: none;
132
+ gap: 6px;
133
+
134
+ > li button {
135
+ margin: 0;
136
+ }
137
+ }
138
+ }
115
139
  `;
116
140
  //# sourceMappingURL=styled.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"styled.js","sourceRoot":"","sources":["../../../src/views/Chat/styled.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAE1C,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,EAAE,CAAA;;;;;;;;;;;;;;wBAcT,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;aAClC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY;;;;;cAK9B,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY;;;;;;;;;;;;;;;;;;;;;;;;0BAwBnB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8BAmCjB,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;8BAuBtB,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;;;;;;;;;;CAUnD,CAAA"}
1
+ {"version":3,"file":"styled.js","sourceRoot":"","sources":["../../../src/views/Chat/styled.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAE1C,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,EAAE,CAAA;;;;;;;;;;;;;;wBAcT,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;aAClC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY;;;;;cAK9B,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY;;;;;;;;;;;;;;;;;;;;;;;;0BAwBnB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8BAmCjB,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;8BAuBtB,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;wBAiB5B,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;CAiB7C,CAAA"}
@@ -0,0 +1,5 @@
1
+ import { MessageInterceptor } from '../../state/ChatState.js';
2
+ export declare const ChatHistoryPanel: ({ interceptors }: {
3
+ interceptors: MessageInterceptor[];
4
+ }) => import("react/jsx-runtime").JSX.Element;
5
+ //# sourceMappingURL=ChatHistoryPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatHistoryPanel.d.ts","sourceRoot":"","sources":["../../../src/views/ChatHistory/ChatHistoryPanel.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAG1D,eAAO,MAAM,gBAAgB,qBAAsB;IAAE,YAAY,EAAE,kBAAkB,EAAE,CAAA;CAAE,4CAqBxF,CAAA"}
@@ -0,0 +1,10 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { aiClient } from '@stack-spot/portal-network';
3
+ import InfiniteScroll from 'react-infinite-scroll-component';
4
+ import { HistoryList } from '../../components/HistoryList.js';
5
+ import { HistoryItem } from './HistoryItem.js';
6
+ export const ChatHistoryPanel = ({ interceptors }) => {
7
+ const [chats, { fetchNextPage, hasNextPage }] = aiClient.chats.useInfiniteQuery({ size: 40 });
8
+ return (_jsx("div", { id: "chatHistoryList", style: { height: '100%', overflow: 'auto' }, children: _jsx(InfiniteScroll, { scrollableTarget: "chatHistoryList", dataLength: chats.length, next: fetchNextPage, hasMore: hasNextPage, loader: _jsx("div", {}), children: _jsx(HistoryList, { items: chats, getDate: c => new Date(c.updated || c.created || ''), keygen: c => c.id, renderItem: c => _jsx(HistoryItem, { item: c, interceptors: interceptors }), style: { marginRight: '6px' } }) }) }));
9
+ };
10
+ //# sourceMappingURL=ChatHistoryPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatHistoryPanel.js","sourceRoot":"","sources":["../../../src/views/ChatHistory/ChatHistoryPanel.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AACrD,OAAO,cAAc,MAAM,iCAAiC,CAAA;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAE1D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAE3C,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,EAAE,YAAY,EAA0C,EAAE,EAAE;IAC3F,MAAM,CAAC,KAAK,EAAE,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAA;IAC7F,OAAO,CACL,cAAK,EAAE,EAAC,iBAAiB,EAAC,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,YACnE,KAAC,cAAc,IACb,gBAAgB,EAAC,iBAAiB,EAClC,UAAU,EAAE,KAAK,CAAC,MAAM,EACxB,IAAI,EAAE,aAAa,EACnB,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,eAAW,YAEnB,KAAC,WAAW,IACV,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,EACpD,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EACjB,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,KAAC,WAAW,IAAC,IAAI,EAAE,CAAC,EAAE,YAAY,EAAE,YAAY,GAAI,EACrE,KAAK,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,GAC7B,GACa,GACb,CACP,CAAA;AACH,CAAC,CAAA"}
@@ -0,0 +1,7 @@
1
+ import { ConversationResponse } from '@stack-spot/portal-network/api/ai';
2
+ import { MessageInterceptor } from '../../state/ChatState.js';
3
+ export declare const HistoryItem: ({ item, interceptors }: {
4
+ item: ConversationResponse;
5
+ interceptors: MessageInterceptor[];
6
+ }) => import("react/jsx-runtime").JSX.Element | null;
7
+ //# sourceMappingURL=HistoryItem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HistoryItem.d.ts","sourceRoot":"","sources":["../../../src/views/ChatHistory/HistoryItem.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAA;AAMxE,OAAO,EAAa,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAQrE,eAAO,MAAM,WAAW,2BAA4B;IAAE,IAAI,EAAE,oBAAoB,CAAC;IAAC,YAAY,EAAE,kBAAkB,EAAE,CAAA;CAAE,mDA4GrH,CAAA"}
@@ -0,0 +1,109 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { IconBox, Input } from '@citric/core';
3
+ import { Check, Download, EllipsisHorizontal, Pencil, Trash } from '@citric/icons';
4
+ import { IconButton, LoadingCircular } from '@citric/ui';
5
+ import { aiClient } from '@stack-spot/portal-network';
6
+ import { theme } from '@stack-spot/portal-theme';
7
+ import { useCallback, useEffect, useRef, useState } from 'react';
8
+ import { OverlayMenu } from '../../components/OverlayMenu.js';
9
+ import { useWidget } from '../../context/hooks.js';
10
+ import { ChatEntry } from '../../state/ChatEntry.js';
11
+ import { ChatState } from '../../state/ChatState.js';
12
+ import { download } from '../../utils/download.js';
13
+ import { genericSourcesToKnowledgeSources } from '../../utils/knowledge-source.js';
14
+ import { useHistoryDictionary } from './dictionary.js';
15
+ import { HistoryItemBox } from './styled.js';
16
+ import { findStack, findWorkspace } from './utils.js';
17
+ export const HistoryItem = ({ item, interceptors }) => {
18
+ const t = useHistoryDictionary();
19
+ const [isLoading, setLoading] = useState(false);
20
+ const [isRenaming, setRenaming] = useState(false);
21
+ const [renamed, setRenamed] = useState(item.title);
22
+ const [title, setTitle] = useState(item.title);
23
+ const [isDeleted, setDeleted] = useState(false);
24
+ const renameInput = useRef(null);
25
+ const widget = useWidget();
26
+ useEffect(() => {
27
+ if (isRenaming)
28
+ renameInput.current?.focus();
29
+ }, [isRenaming]);
30
+ const onRename = useCallback(() => {
31
+ setRenaming(true);
32
+ }, []);
33
+ async function onSubmitRename() {
34
+ setRenaming(false);
35
+ if (!renamed || renamed === item.title)
36
+ return;
37
+ try {
38
+ await aiClient.renameChat.mutate({ conversationId: item.id, conversationUpdateTitleRequest: { title: renamed } });
39
+ setTitle(renamed);
40
+ aiClient.chats.invalidate();
41
+ }
42
+ catch (error) {
43
+ // eslint-disable-next-line no-console
44
+ console.error(error);
45
+ setRenaming(true);
46
+ }
47
+ }
48
+ const onDownload = useCallback(async () => {
49
+ setLoading(true);
50
+ try {
51
+ const content = await aiClient.downloadChat.mutate({ conversationId: item.id });
52
+ download(`${title}.txt`, content);
53
+ }
54
+ catch (error) {
55
+ // eslint-disable-next-line no-console
56
+ console.error(error);
57
+ }
58
+ setLoading(false);
59
+ }, []);
60
+ const onDelete = useCallback(async () => {
61
+ setDeleted(true);
62
+ try {
63
+ await aiClient.deleteChat.mutate({ conversationId: item.id });
64
+ aiClient.chats.invalidate();
65
+ }
66
+ catch (error) {
67
+ // eslint-disable-next-line no-console
68
+ console.error(error);
69
+ setDeleted(false);
70
+ }
71
+ }, []);
72
+ const onSelect = useCallback(async () => {
73
+ const tab = widget.chatTabs.getAll().find(c => c.id === item.id);
74
+ if (tab)
75
+ return widget.chatTabs.select(item.id);
76
+ setLoading(true);
77
+ try {
78
+ const chat = await aiClient.chat.query({ conversationId: item.id });
79
+ const [stack, workspace] = await Promise.all([findStack(chat.ai_stack_id), findWorkspace(chat.workspace_id)]);
80
+ widget.chatTabs.add(new ChatState({
81
+ id: chat.id,
82
+ initial: { label: chat.title, stack, workspace },
83
+ interceptors,
84
+ entries: chat.history?.map(item => new ChatEntry({
85
+ agent: item.agent === 'USER' ? 'user' : 'bot',
86
+ content: item.content,
87
+ type: item.agent === 'USER' ? 'text' : 'md',
88
+ agentId: item.custom_agent?.id,
89
+ messageId: item.message_id,
90
+ knowledgeSources: genericSourcesToKnowledgeSources(item.sources),
91
+ updated: item.updated,
92
+ })),
93
+ }));
94
+ widget.chatTabs.select(chat.id);
95
+ }
96
+ catch (error) {
97
+ // eslint-disable-next-line no-console
98
+ console.error(error);
99
+ }
100
+ setLoading(false);
101
+ }, []);
102
+ const actions = [
103
+ { label: t.rename, onClick: onRename, icon: _jsx(Pencil, {}) },
104
+ { label: t.download, onClick: onDownload, icon: _jsx(Download, {}) },
105
+ { label: t.delete, onClick: onDelete, icon: _jsx(Trash, {}), color: theme.color.danger[500] },
106
+ ];
107
+ return isDeleted ? null : (_jsx(HistoryItemBox, { className: isLoading ? 'loading' : '', children: isRenaming ? (_jsxs(_Fragment, { children: [_jsx(Input, { ref: renameInput, value: renamed, onChange: e => setRenamed(e.target.value) }), _jsx(IconButton, { onClick: onSubmitRename, children: _jsx(Check, {}) })] })) : (_jsxs(_Fragment, { children: [_jsx("button", { className: "label", onClick: onSelect, disabled: isLoading, children: title }), isLoading ? _jsx(LoadingCircular, { size: "xs" }) : _jsx(OverlayMenu, { actions: actions, position: "left", children: _jsx(IconBox, { children: _jsx(EllipsisHorizontal, {}) }) })] })) }));
108
+ };
109
+ //# sourceMappingURL=HistoryItem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HistoryItem.js","sourceRoot":"","sources":["../../../src/views/ChatHistory/HistoryItem.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const useHistoryDictionary: () => Record<"title" | "download" | "description" | "rename" | "delete", string>;
2
+ //# sourceMappingURL=dictionary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dictionary.d.ts","sourceRoot":"","sources":["../../../src/views/ChatHistory/dictionary.ts"],"names":[],"mappings":"AAmBA,eAAO,MAAM,oBAAoB,kFAAiC,CAAA"}
@@ -0,0 +1,19 @@
1
+ import { useTranslate } from '@stack-spot/portal-translate';
2
+ const dictionary = {
3
+ en: {
4
+ title: 'History',
5
+ description: 'Manage or continue previous conversations.',
6
+ rename: 'Rename',
7
+ download: 'Download',
8
+ delete: 'Delete',
9
+ },
10
+ pt: {
11
+ title: 'Histórico',
12
+ description: 'Gerencie ou retome conversas anteriores.',
13
+ rename: 'Renomear',
14
+ download: 'Download',
15
+ delete: 'Remover',
16
+ },
17
+ };
18
+ export const useHistoryDictionary = () => useTranslate(dictionary);
19
+ //# sourceMappingURL=dictionary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dictionary.js","sourceRoot":"","sources":["../../../src/views/ChatHistory/dictionary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAEvE,MAAM,UAAU,GAAG;IACjB,EAAE,EAAE;QACF,KAAK,EAAE,SAAS;QAChB,WAAW,EAAE,4CAA4C;QACzD,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,UAAU;QACpB,MAAM,EAAE,QAAQ;KACjB;IACD,EAAE,EAAE;QACF,KAAK,EAAE,WAAW;QAClB,WAAW,EAAE,0CAA0C;QACvD,MAAM,EAAE,UAAU;QAClB,QAAQ,EAAE,UAAU;QACpB,MAAM,EAAE,SAAS;KAClB;CACmB,CAAA;AAEtB,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,CAAA"}
@@ -0,0 +1,5 @@
1
+ import { MessageInterceptor } from '../../state/ChatState.js';
2
+ export declare const ChatHistory: ({ interceptors }: {
3
+ interceptors: MessageInterceptor[];
4
+ }) => null;
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/views/ChatHistory/index.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAI1D,eAAO,MAAM,WAAW,qBAAsB;IAAE,YAAY,EAAE,kBAAkB,EAAE,CAAA;CAAE,SAkBnF,CAAA"}
@@ -0,0 +1,23 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useEffect } from 'react';
3
+ import { FallbackBoundary } from '../../components/FallbackBoundary/index.js';
4
+ import { useWidget, useWidgetState } from '../../context/hooks.js';
5
+ import { useRightPanel } from '../../right-panel/hooks.js';
6
+ import { ChatHistoryPanel } from './ChatHistoryPanel.js';
7
+ import { useHistoryDictionary } from './dictionary.js';
8
+ export const ChatHistory = ({ interceptors }) => {
9
+ const t = useHistoryDictionary();
10
+ const panel = useWidgetState('panel');
11
+ const { open } = useRightPanel();
12
+ const widget = useWidget();
13
+ useEffect(() => {
14
+ if (panel === 'history')
15
+ open(_jsx(FallbackBoundary, { children: _jsx(ChatHistoryPanel, { interceptors: interceptors }) }), {
16
+ title: t.title,
17
+ description: t.description,
18
+ onClose: () => widget.set('panel', undefined),
19
+ });
20
+ }, [panel, t]);
21
+ return null;
22
+ };
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/views/ChatHistory/index.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAA;AACpE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAEvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AAEnD,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,EAAE,YAAY,EAA0C,EAAE,EAAE;IACtF,MAAM,CAAC,GAAG,oBAAoB,EAAE,CAAA;IAChC,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;IACrC,MAAM,EAAE,IAAI,EAAE,GAAG,aAAa,EAAE,CAAA;IAChC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;IAE1B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,KAAK,KAAK,SAAS;YAAE,IAAI,CAC3B,KAAC,gBAAgB,cAAC,KAAC,gBAAgB,IAAC,YAAY,EAAE,YAAY,GAAI,GAAmB,EACrF;gBACE,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC;aAC9C,CACF,CAAA;IACH,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAA;IAEd,OAAO,IAAI,CAAA;AACb,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export declare const HistoryItemBox: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components/dist/types").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never>> & string;
2
+ //# sourceMappingURL=styled.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styled.d.ts","sourceRoot":"","sources":["../../../src/views/ChatHistory/styled.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,cAAc,wOAsD1B,CAAA"}
@@ -0,0 +1,60 @@
1
+ import { IconBox } from '@citric/core';
2
+ import { IconButton } from '@citric/ui';
3
+ import { theme } from '@stack-spot/portal-theme';
4
+ import { styled } from 'styled-components';
5
+ export const HistoryItemBox = styled.div `
6
+ padding: 8px;
7
+ display: flex;
8
+ flex-direction: row;
9
+ align-items: center;
10
+ border-radius: 4px;
11
+ transition: background-color 0.2s;
12
+ cursor: pointer;
13
+ gap: 20px;
14
+
15
+ &:hover:not(.loading) {
16
+ background-color: ${theme.color.light[600]};
17
+ }
18
+
19
+ &.loading {
20
+ cursor: progress;
21
+
22
+ > svg {
23
+ width: 18px;
24
+ height: 18px;
25
+ }
26
+ }
27
+
28
+ button.label {
29
+ opacity: 0.8;
30
+ background-color: transparent;
31
+ border: none;
32
+ padding: 0;
33
+ color: ${theme.color.light.contrastText};
34
+ flex: 1;
35
+ display: flex;
36
+ cursor: pointer;
37
+ text-align: left;
38
+
39
+ &:disabled {
40
+ opacity: 0.4;
41
+ }
42
+ }
43
+
44
+ ${IconBox}, ${IconButton} {
45
+ padding: 0;
46
+ border: none;
47
+ background-color: transparent;
48
+ width: auto;
49
+ height: auto;
50
+
51
+ svg {
52
+ width: 12px;
53
+ }
54
+ }
55
+
56
+ ${IconButton} svg {
57
+ width: 16px;
58
+ }
59
+ `;
60
+ //# sourceMappingURL=styled.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styled.js","sourceRoot":"","sources":["../../../src/views/ChatHistory/styled.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAE1C,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;wBAWhB,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;aAiBjC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY;;;;;;;;;;;IAWvC,OAAO,KAAK,UAAU;;;;;;;;;;;;IAYtB,UAAU;;;CAGb,CAAA"}
@@ -0,0 +1,4 @@
1
+ import { ChatProperties } from '../../state/ChatState.js';
2
+ export declare function findStack(id: string | null): Promise<ChatProperties['stack'] | undefined>;
3
+ export declare function findWorkspace(id: string | null): Promise<ChatProperties['workspace'] | undefined>;
4
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/views/ChatHistory/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAEtD,wBAAsB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC,CAU/F;AAED,wBAAsB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,cAAc,CAAC,WAAW,CAAC,GAAG,SAAS,CAAC,CAUvG"}
@@ -0,0 +1,28 @@
1
+ import { aiClient, workspaceClient } from '@stack-spot/portal-network';
2
+ export async function findStack(id) {
3
+ if (!id)
4
+ return;
5
+ try {
6
+ const stacks = await aiClient.aiStacks.query({});
7
+ return { id, label: stacks.find(s => s.id === id)?.name || id };
8
+ }
9
+ catch (error) {
10
+ // eslint-disable-next-line no-console
11
+ console.error(error);
12
+ return { id, label: id };
13
+ }
14
+ }
15
+ export async function findWorkspace(id) {
16
+ if (!id)
17
+ return;
18
+ try {
19
+ const ws = await workspaceClient.workspace.query({ workspaceId: id });
20
+ return { id, label: ws.name };
21
+ }
22
+ catch (error) {
23
+ // eslint-disable-next-line no-console
24
+ console.error(error);
25
+ return { id, label: id };
26
+ }
27
+ }
28
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/views/ChatHistory/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAGtE,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,EAAiB;IAC/C,IAAI,CAAC,EAAE;QAAE,OAAM;IACf,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QAChD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,IAAI,EAAE,EAAE,CAAA;IACjE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,sCAAsC;QACtC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QACpB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAA;IAC1B,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,EAAiB;IACnD,IAAI,CAAC,EAAE;QAAE,OAAM;IACf,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAA;QACrE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE,CAAA;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,sCAAsC;QACtC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QACpB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAA;IAC1B,CAAC;AACH,CAAC"}
@@ -25,7 +25,7 @@ export const ChatTabSelection = ({ history, interceptors }) => {
25
25
  label: t.openHistory,
26
26
  className: 'test',
27
27
  style: { marginLeft: 'auto' },
28
- onClick: () => { },
28
+ onClick: () => widget.set('panel', 'history'),
29
29
  });
30
30
  }
31
31
  return actions;
@@ -1 +1 @@
1
- {"version":3,"file":"ChatTabSelection.js","sourceRoot":"","sources":["../../src/views/ChatTabSelection.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAc,YAAY,EAAE,MAAM,8BAA8B,CAAA;AACvE,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AACrD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAGvE,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAO7C,MAAM,QAAQ,GAAG,CAAC,EAAE,EAAE,EAAkB,EAAE,EAAE;IAC1C,MAAM,KAAK,GAAG,YAAY,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;IACvC,OAAO,cAAK,KAAK,EAAE,KAAK,YAAG,KAAK,GAAO,CAAA;AACzC,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,EAAE,OAAO,EAAE,YAAY,EAAS,EAAE,EAAE;IACnE,MAAM,CAAC,GAAG,YAAY,CAAC,UAAU,CAAC,CAAA;IAClC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;IAC1B,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,WAAW,EAAE,CAAA;IAEvC,MAAM,OAAO,GAAG,OAAO,CACrB,GAAG,EAAE;QACH,MAAM,OAAO,GAAmB,CAAC;gBAC/B,IAAI,EAAE,KAAC,IAAI,KAAG;gBACd,KAAK,EAAE,CAAC,CAAC,OAAO;gBAChB,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,YAAY,CAAC;aACnD,CAAC,CAAA;QACF,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,KAAC,KAAK,KAAG;gBACf,KAAK,EAAE,CAAC,CAAC,WAAW;gBACpB,SAAS,EAAE,MAAM;gBACjB,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE;gBAC7B,OAAO,EAAE,GAAG,EAAE,GAAc,CAAC;aAC9B,CAAC,CAAA;QACJ,CAAC;QACD,OAAO,OAAO,CAAA;IAChB,CAAC,EACD,CAAC,OAAO,CAAC,CACV,CAAA;IACD,OAAO,KAAC,UAAU,IAChB,IAAI,EAAE,KAAK,EACX,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,KAAC,QAAQ,IAAC,EAAE,EAAE,EAAE,GAAI,EAC7C,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EACtB,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAChD,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAChD,OAAO,EAAE,OAAO,GAChB,CAAA;AACJ,CAAC,CAAA;AAED,MAAM,UAAU,GAAG;IACjB,EAAE,EAAE;QACF,WAAW,EAAE,mBAAmB;QAChC,OAAO,EAAE,UAAU;KACpB;IACD,EAAE,EAAE;QACF,WAAW,EAAE,6BAA6B;QAC1C,OAAO,EAAE,WAAW;KACrB;CACmB,CAAA"}
1
+ {"version":3,"file":"ChatTabSelection.js","sourceRoot":"","sources":["../../src/views/ChatTabSelection.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAc,YAAY,EAAE,MAAM,8BAA8B,CAAA;AACvE,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AACrD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAGvE,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAO7C,MAAM,QAAQ,GAAG,CAAC,EAAE,EAAE,EAAkB,EAAE,EAAE;IAC1C,MAAM,KAAK,GAAG,YAAY,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;IACvC,OAAO,cAAK,KAAK,EAAE,KAAK,YAAG,KAAK,GAAO,CAAA;AACzC,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,EAAE,OAAO,EAAE,YAAY,EAAS,EAAE,EAAE;IACnE,MAAM,CAAC,GAAG,YAAY,CAAC,UAAU,CAAC,CAAA;IAClC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;IAC1B,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,WAAW,EAAE,CAAA;IAEvC,MAAM,OAAO,GAAG,OAAO,CACrB,GAAG,EAAE;QACH,MAAM,OAAO,GAAmB,CAAC;gBAC/B,IAAI,EAAE,KAAC,IAAI,KAAG;gBACd,KAAK,EAAE,CAAC,CAAC,OAAO;gBAChB,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,YAAY,CAAC;aACnD,CAAC,CAAA;QACF,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,KAAC,KAAK,KAAG;gBACf,KAAK,EAAE,CAAC,CAAC,WAAW;gBACpB,SAAS,EAAE,MAAM;gBACjB,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE;gBAC7B,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC;aAC9C,CAAC,CAAA;QACJ,CAAC;QACD,OAAO,OAAO,CAAA;IAChB,CAAC,EACD,CAAC,OAAO,CAAC,CACV,CAAA;IACD,OAAO,KAAC,UAAU,IAChB,IAAI,EAAE,KAAK,EACX,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,KAAC,QAAQ,IAAC,EAAE,EAAE,EAAE,GAAI,EAC7C,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EACtB,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAChD,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAChD,OAAO,EAAE,OAAO,GAChB,CAAA;AACJ,CAAC,CAAA;AAED,MAAM,UAAU,GAAG;IACjB,EAAE,EAAE;QACF,WAAW,EAAE,mBAAmB;QAChC,OAAO,EAAE,UAAU;KACpB;IACD,EAAE,EAAE;QACF,WAAW,EAAE,6BAA6B;QAC1C,OAAO,EAAE,WAAW;KACrB;CACmB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export declare const KSDocument: () => null;
2
+ //# sourceMappingURL=KSDocument.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KSDocument.d.ts","sourceRoot":"","sources":["../../src/views/KSDocument.tsx"],"names":[],"mappings":"AAUA,eAAO,MAAM,UAAU,YA2BtB,CAAA"}
@@ -0,0 +1,40 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { Flex, IconBox, Text } from '@citric/core';
3
+ import { Score } from '@citric/icons';
4
+ import { aiClient } from '@stack-spot/portal-network';
5
+ import { useTranslate } from '@stack-spot/portal-translate';
6
+ import { useEffect } from 'react';
7
+ import { Code } from '../components/Code.js';
8
+ import { useWidget, useWidgetState } from '../context/hooks.js';
9
+ import { useRightPanel } from '../right-panel/hooks.js';
10
+ import { extractCodeFromKSDocument } from '../utils/knowledge-source.js';
11
+ export const KSDocument = () => {
12
+ const t = useTranslate(dictionary);
13
+ const panel = useWidgetState('panel');
14
+ const ks = useWidgetState('currentKSInPanel');
15
+ const { open } = useRightPanel();
16
+ const widget = useWidget();
17
+ useEffect(() => {
18
+ if (panel === 'ks-details' && ks)
19
+ open(_jsx(KSDocumentPanel, { documentId: ks.documentId, slug: ks.slug }), {
20
+ title: (_jsxs(Flex, { flexDirection: "row", alignItems: "center", flex: "1", children: [_jsx(Text, { appearance: "h5", style: { flex: 1 }, children: ks.name }), _jsxs(Flex, { flexDirection: "row", alignItems: "center", style: { gap: '5px' }, title: "Score", "aria-label": "Score", children: [_jsx(IconBox, { children: _jsx(Score, {}) }), _jsx(Text, { children: ks.score.toFixed(2) })] })] })),
21
+ description: t.description,
22
+ onClose: () => widget.set('panel', undefined),
23
+ });
24
+ }, [panel, ks, t]);
25
+ return null;
26
+ };
27
+ const KSDocumentPanel = ({ slug, documentId }) => {
28
+ const document = aiClient.knowledgeSourceDocument.useQuery({ slug, customId: documentId });
29
+ const { snippet, language, text } = extractCodeFromKSDocument(document);
30
+ return (_jsxs(_Fragment, { children: [text && _jsx(Text, { children: text }), _jsx(Code, { language: language, children: snippet })] }));
31
+ };
32
+ const dictionary = {
33
+ en: {
34
+ description: 'Knowledge Source details',
35
+ },
36
+ pt: {
37
+ description: 'Detalhes do Knowledge Source',
38
+ },
39
+ };
40
+ //# sourceMappingURL=KSDocument.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KSDocument.js","sourceRoot":"","sources":["../../src/views/KSDocument.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AACrD,OAAO,EAAc,YAAY,EAAE,MAAM,8BAA8B,CAAA;AACvE,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AACzC,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAA;AAErE,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,EAAE;IAC7B,MAAM,CAAC,GAAG,YAAY,CAAC,UAAU,CAAC,CAAA;IAClC,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;IACrC,MAAM,EAAE,GAAG,cAAc,CAAC,kBAAkB,CAAC,CAAA;IAC7C,MAAM,EAAE,IAAI,EAAE,GAAG,aAAa,EAAE,CAAA;IAChC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;IAE1B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,KAAK,KAAK,YAAY,IAAI,EAAE;YAAE,IAAI,CACpC,KAAC,eAAe,IAAC,UAAU,EAAE,EAAE,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,GAAI,EAC7D;gBACE,KAAK,EAAE,CACL,MAAC,IAAI,IAAC,aAAa,EAAC,KAAK,EAAC,UAAU,EAAC,QAAQ,EAAC,IAAI,EAAC,GAAG,aACpD,KAAC,IAAI,IAAC,UAAU,EAAC,IAAI,EAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,YAAG,EAAE,CAAC,IAAI,GAAQ,EAC1D,MAAC,IAAI,IAAC,aAAa,EAAC,KAAK,EAAC,UAAU,EAAC,QAAQ,EAAC,KAAK,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,KAAK,EAAC,OAAO,gBAAY,OAAO,aACnG,KAAC,OAAO,cAAC,KAAC,KAAK,KAAG,GAAU,EAC5B,KAAC,IAAI,cAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAQ,IAC7B,IACF,CACR;gBACD,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC;aAC9C,CACF,CAAA;IACH,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA;IAElB,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,MAAM,eAAe,GAAG,CAAC,EAAE,IAAI,EAAE,UAAU,EAAwC,EAAE,EAAE;IACrF,MAAM,QAAQ,GAAG,QAAQ,CAAC,uBAAuB,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAA;IAC1F,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,yBAAyB,CAAC,QAAQ,CAAC,CAAA;IACvE,OAAO,CACL,8BACG,IAAI,IAAI,KAAC,IAAI,cAAE,IAAI,GAAQ,EAC5B,KAAC,IAAI,IAAC,QAAQ,EAAE,QAAQ,YAAG,OAAO,GAAQ,IACzC,CACJ,CAAA;AACH,CAAC,CAAA;AAED,MAAM,UAAU,GAAG;IACjB,EAAE,EAAE;QACF,WAAW,EAAE,0BAA0B;KACxC;IACD,EAAE,EAAE;QACF,WAAW,EAAE,8BAA8B;KAC5C;CACmB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"KnowledgeSources.d.ts","sourceRoot":"","sources":["../../src/views/KnowledgeSources.tsx"],"names":[],"mappings":"AAaA,eAAO,MAAM,gBAAgB,YAc5B,CAAA"}
1
+ {"version":3,"file":"KnowledgeSources.d.ts","sourceRoot":"","sources":["../../src/views/KnowledgeSources.tsx"],"names":[],"mappings":"AAqBA,eAAO,MAAM,gBAAgB,YAc5B,CAAA"}
@@ -4,7 +4,8 @@ import { Search } from '@citric/icons';
4
4
  import { Placeholder } from '@stack-spot/portal-components/Placeholder';
5
5
  import { aiClient } from '@stack-spot/portal-network';
6
6
  import { useTranslate } from '@stack-spot/portal-translate';
7
- import { useEffect, useMemo, useState } from 'react';
7
+ import { difference, uniqBy } from 'lodash';
8
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
8
9
  import { DescribedCheckboxGroup } from '../components/form/DescribedCheckboxGroup.js';
9
10
  import { IconInput } from '../components/IconInput.js';
10
11
  import { RightPanelTabs } from '../components/RightPanelTabs.js';
@@ -12,46 +13,56 @@ import { useCurrentChat, useWidget, useWidgetState } from '../context/hooks.js';
12
13
  import { useRightPanel } from '../right-panel/hooks.js';
13
14
  export const KnowledgeSources = () => {
14
15
  const t = useTranslate(dictionary);
15
- const isKnowledgeSourceSelectionOpen = useWidgetState('isKnowledgeSourceSelectionOpen');
16
+ const panel = useWidgetState('panel');
16
17
  const { open } = useRightPanel();
17
18
  const widget = useWidget();
18
19
  useEffect(() => {
19
- if (isKnowledgeSourceSelectionOpen)
20
- open(_jsx(KnowledgeSourcesPanel, {}), { title: t.title, description: t.description, onClose: () => widget.set('isKnowledgeSourceSelectionOpen', false) });
21
- }, [isKnowledgeSourceSelectionOpen, t]);
20
+ if (panel === 'ks')
21
+ open(_jsx(KnowledgeSourcesPanel, {}), { title: t.title, description: t.description, onClose: () => widget.set('panel', undefined) });
22
+ }, [panel, t]);
22
23
  return null;
23
24
  };
24
25
  const KnowledgeSourcesPanel = () => {
25
26
  const t = useTranslate(dictionary);
27
+ const chat = useCurrentChat();
28
+ const allKS = useRef(chat.get('knowledgeSources') ?? []);
29
+ const { close } = useRightPanel();
30
+ const onSubmit = useCallback(() => {
31
+ chat.set('knowledgeSources', allKS.current);
32
+ close();
33
+ }, [chat]);
34
+ useEffect(() => {
35
+ allKS.current = chat.get('knowledgeSources') ?? [];
36
+ }, [chat]);
26
37
  return _jsx(RightPanelTabs, { tabs: [
27
- { title: t.personal, content: _jsx(KnowledgeSourcesTab, { visibility: "personal" }, "personal") },
28
- { title: t.shared, content: _jsx(KnowledgeSourcesTab, { visibility: "shared" }, "shared") },
29
- { title: t.account, content: _jsx(KnowledgeSourcesTab, { visibility: "account" }, "account") },
30
- ] });
38
+ { title: t.personal, content: _jsx(KnowledgeSourcesTab, { visibility: "personal", allKS: allKS, onSubmit: onSubmit }, "personal") },
39
+ { title: t.shared, content: _jsx(KnowledgeSourcesTab, { visibility: "shared", allKS: allKS, onSubmit: onSubmit }, "shared") },
40
+ { title: t.account, content: _jsx(KnowledgeSourcesTab, { visibility: "account", allKS: allKS, onSubmit: onSubmit }, "account") },
41
+ ] }, chat.id);
31
42
  };
32
- const KnowledgeSourcesTab = ({ visibility }) => {
43
+ const KnowledgeSourcesTab = ({ visibility, allKS, onSubmit }) => {
33
44
  const t = useTranslate(dictionary);
34
- const { close } = useRightPanel();
35
- const chat = useCurrentChat();
36
45
  const [filter, setFilter] = useState('');
37
46
  const knowledgeSources = aiClient.knowledgeSources.useQuery({ visibility, order: 'a-to-z' });
38
- const [hasChanged, setChanged] = useState(false);
39
47
  const [value, setValue] = useState((() => {
40
- const currentlySelected = chat.get('knowledgeSources')?.map(ks => ks.id);
41
- return knowledgeSources.filter(ks => currentlySelected?.includes(ks.id));
48
+ const currentlySelected = allKS.current?.map(ks => ks.id);
49
+ return knowledgeSources.filter(ks => currentlySelected?.includes(ks.slug));
42
50
  })());
43
51
  const filtered = useMemo(() => filter
44
52
  ? knowledgeSources.filter(ks => value.includes(ks) || ks.name.toLocaleLowerCase().includes(filter.toLocaleLowerCase()))
45
53
  : knowledgeSources, [knowledgeSources, filter, value]);
46
- function submit() {
47
- if (value)
48
- chat.set('knowledgeSources', value.map(({ id, name }) => ({ id, label: name })));
49
- close();
50
- }
51
- return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "content", children: [_jsx(IconInput, { icon: _jsx(Search, {}), value: filter, onChange: setFilter, className: "search" }), !!filtered.length && _jsx(DescribedCheckboxGroup, { options: filtered, keygen: ks => ks.id, value: value, onChange: (value) => {
52
- setValue(value);
53
- setChanged(true);
54
- }, renderLabel: ks => ks.name, renderDescription: ks => ks.description, optionClassName: ks => (filter && !ks.name.includes(filter) && value.includes(ks)) ? 'filtered-out' : '', className: "option-list" }), !!knowledgeSources.length && !filtered.length && (_jsx(Placeholder, { title: t.noSearchResults, description: t.noSearchResultsDescription })), !knowledgeSources.length && _jsx(Placeholder, { title: t.noData, description: t.noDataDescription })] }), _jsx(Button, { onClick: submit, disabled: !hasChanged, children: t.apply })] }));
54
+ const onChange = useCallback((newValue) => {
55
+ setValue((current) => {
56
+ const added = difference(newValue, current);
57
+ const removed = difference(current, newValue);
58
+ allKS.current = allKS.current?.filter(ks => !removed.some(r => r.slug === ks.id)) ?? [];
59
+ allKS.current = uniqBy([...allKS.current, ...added.map(ks => ({ id: ks.slug, label: ks.name }))], 'id');
60
+ return newValue;
61
+ });
62
+ }, []);
63
+ return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "content", children: [_jsx(IconInput, { icon: _jsx(Search, {}), value: filter, onChange: setFilter, className: "search" }), !!filtered.length && _jsx(DescribedCheckboxGroup, { options: filtered, keygen: ks => ks.id, value: value, onChange: onChange, renderLabel: ks => ks.name, renderDescription: ks => ks.description, optionClassName: ks => (filter && !ks.name.toLocaleLowerCase().includes(filter.toLocaleLowerCase()) && value.includes(ks))
64
+ ? 'filtered-out'
65
+ : '', className: "option-list" }), !!knowledgeSources.length && !filtered.length && (_jsx(Placeholder, { title: t.noSearchResults, description: t.noSearchResultsDescription })), !knowledgeSources.length && _jsx(Placeholder, { title: t.noData, description: t.noDataDescription })] }), _jsx(Button, { onClick: onSubmit, children: t.apply })] }));
55
66
  };
56
67
  const dictionary = {
57
68
  en: {