@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.
- package/dist/StackspotAIWidget.d.ts.map +1 -1
- package/dist/StackspotAIWidget.js +4 -1
- package/dist/StackspotAIWidget.js.map +1 -1
- package/dist/chat-interceptors/send-message.d.ts.map +1 -1
- package/dist/chat-interceptors/send-message.js +15 -7
- package/dist/chat-interceptors/send-message.js.map +1 -1
- package/dist/components/HistoryList.d.ts +2 -5
- package/dist/components/HistoryList.d.ts.map +1 -1
- package/dist/components/HistoryList.js +70 -2
- package/dist/components/HistoryList.js.map +1 -1
- package/dist/components/OverlayMenu.d.ts +3 -2
- package/dist/components/OverlayMenu.d.ts.map +1 -1
- package/dist/components/OverlayMenu.js +57 -1
- package/dist/components/OverlayMenu.js.map +1 -1
- package/dist/components/RightPanelTabs.d.ts.map +1 -1
- package/dist/components/RightPanelTabs.js +1 -0
- package/dist/components/RightPanelTabs.js.map +1 -1
- package/dist/components/Tooltip/Tooltip.d.ts +2 -1
- package/dist/components/Tooltip/Tooltip.d.ts.map +1 -1
- package/dist/components/Tooltip/Tooltip.js +10 -2
- package/dist/components/Tooltip/Tooltip.js.map +1 -1
- package/dist/components/Tooltip/TooltipAPI.d.ts +3 -2
- package/dist/components/Tooltip/TooltipAPI.d.ts.map +1 -1
- package/dist/components/Tooltip/TooltipAPI.js +26 -1
- package/dist/components/Tooltip/TooltipAPI.js.map +1 -1
- package/dist/components/Tooltip/style.d.ts.map +1 -1
- package/dist/components/Tooltip/style.js +0 -1
- package/dist/components/Tooltip/style.js.map +1 -1
- package/dist/components/Tooltip/types.d.ts +6 -0
- package/dist/components/Tooltip/types.d.ts.map +1 -1
- package/dist/components/form/styled.d.ts.map +1 -1
- package/dist/components/form/styled.js +2 -1
- package/dist/components/form/styled.js.map +1 -1
- package/dist/context/hooks.d.ts.map +1 -1
- package/dist/context/hooks.js +1 -5
- package/dist/context/hooks.js.map +1 -1
- package/dist/features.d.ts.map +1 -1
- package/dist/features.js +2 -0
- package/dist/features.js.map +1 -1
- package/dist/right-panel/DefaultPanel.d.ts +2 -2
- package/dist/right-panel/DefaultPanel.d.ts.map +1 -1
- package/dist/right-panel/DefaultPanel.js +2 -1
- package/dist/right-panel/DefaultPanel.js.map +1 -1
- package/dist/right-panel/hooks.d.ts +2 -2
- package/dist/right-panel/hooks.d.ts.map +1 -1
- package/dist/state/ChatEntry.d.ts +7 -0
- package/dist/state/ChatEntry.d.ts.map +1 -1
- package/dist/state/ChatEntry.js +0 -3
- package/dist/state/ChatEntry.js.map +1 -1
- package/dist/state/ChatState.d.ts +4 -1
- package/dist/state/ChatState.d.ts.map +1 -1
- package/dist/state/ChatState.js.map +1 -1
- package/dist/state/WidgetState.d.ts +19 -8
- package/dist/state/WidgetState.d.ts.map +1 -1
- package/dist/state/WidgetState.js +0 -19
- package/dist/state/WidgetState.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/chat.js +1 -1
- package/dist/utils/chat.js.map +1 -1
- package/dist/utils/date.d.ts +1 -0
- package/dist/utils/date.d.ts.map +1 -1
- package/dist/utils/date.js +3 -0
- package/dist/utils/date.js.map +1 -1
- package/dist/utils/download.d.ts +2 -0
- package/dist/utils/download.d.ts.map +1 -0
- package/dist/utils/download.js +10 -0
- package/dist/utils/download.js.map +1 -0
- package/dist/utils/knowledge-source.d.ts +9 -0
- package/dist/utils/knowledge-source.d.ts.map +1 -0
- package/dist/utils/knowledge-source.js +46 -0
- package/dist/utils/knowledge-source.js.map +1 -0
- package/dist/views/Agents.d.ts.map +1 -1
- package/dist/views/Agents.js +130 -1
- package/dist/views/Agents.js.map +1 -1
- package/dist/views/Chat/ChatMessage.d.ts.map +1 -1
- package/dist/views/Chat/ChatMessage.js +10 -5
- package/dist/views/Chat/ChatMessage.js.map +1 -1
- package/dist/views/Chat/chat-scroll.d.ts.map +1 -0
- package/dist/{hooks → views/Chat}/chat-scroll.js +5 -3
- package/dist/views/Chat/chat-scroll.js.map +1 -0
- package/dist/views/Chat/styled.d.ts.map +1 -1
- package/dist/views/Chat/styled.js +24 -0
- package/dist/views/Chat/styled.js.map +1 -1
- package/dist/views/ChatHistory/ChatHistoryPanel.d.ts +5 -0
- package/dist/views/ChatHistory/ChatHistoryPanel.d.ts.map +1 -0
- package/dist/views/ChatHistory/ChatHistoryPanel.js +10 -0
- package/dist/views/ChatHistory/ChatHistoryPanel.js.map +1 -0
- package/dist/views/ChatHistory/HistoryItem.d.ts +7 -0
- package/dist/views/ChatHistory/HistoryItem.d.ts.map +1 -0
- package/dist/views/ChatHistory/HistoryItem.js +109 -0
- package/dist/views/ChatHistory/HistoryItem.js.map +1 -0
- package/dist/views/ChatHistory/dictionary.d.ts +2 -0
- package/dist/views/ChatHistory/dictionary.d.ts.map +1 -0
- package/dist/views/ChatHistory/dictionary.js +19 -0
- package/dist/views/ChatHistory/dictionary.js.map +1 -0
- package/dist/views/ChatHistory/index.d.ts +5 -0
- package/dist/views/ChatHistory/index.d.ts.map +1 -0
- package/dist/views/ChatHistory/index.js +23 -0
- package/dist/views/ChatHistory/index.js.map +1 -0
- package/dist/views/ChatHistory/styled.d.ts +2 -0
- package/dist/views/ChatHistory/styled.d.ts.map +1 -0
- package/dist/views/ChatHistory/styled.js +60 -0
- package/dist/views/ChatHistory/styled.js.map +1 -0
- package/dist/views/ChatHistory/utils.d.ts +4 -0
- package/dist/views/ChatHistory/utils.d.ts.map +1 -0
- package/dist/views/ChatHistory/utils.js +28 -0
- package/dist/views/ChatHistory/utils.js.map +1 -0
- package/dist/views/ChatTabSelection.js +1 -1
- package/dist/views/ChatTabSelection.js.map +1 -1
- package/dist/views/KSDocument.d.ts +2 -0
- package/dist/views/KSDocument.d.ts.map +1 -0
- package/dist/views/KSDocument.js +40 -0
- package/dist/views/KSDocument.js.map +1 -0
- package/dist/views/KnowledgeSources.d.ts.map +1 -1
- package/dist/views/KnowledgeSources.js +35 -24
- package/dist/views/KnowledgeSources.js.map +1 -1
- package/dist/views/MessageInput/ButtonGroup.d.ts.map +1 -1
- package/dist/views/MessageInput/ButtonGroup.js +5 -3
- package/dist/views/MessageInput/ButtonGroup.js.map +1 -1
- package/dist/views/MessageInput/dictionary.d.ts +1 -1
- package/dist/views/MessageInput/index.d.ts.map +1 -1
- package/dist/views/MessageInput/index.js +2 -4
- package/dist/views/MessageInput/index.js.map +1 -1
- package/dist/views/MessageInput/styled.d.ts +2 -0
- package/dist/views/MessageInput/styled.d.ts.map +1 -1
- package/dist/views/MessageInput/styled.js +11 -3
- package/dist/views/MessageInput/styled.js.map +1 -1
- package/dist/views/Stacks.js +9 -6
- package/dist/views/Stacks.js.map +1 -1
- package/dist/views/Workspaces.d.ts.map +1 -1
- package/dist/views/Workspaces.js +8 -5
- package/dist/views/Workspaces.js.map +1 -1
- package/package.json +3 -2
- package/src/StackspotAIWidget.tsx +6 -0
- package/src/chat-interceptors/send-message.ts +16 -8
- package/src/components/HistoryList.tsx +80 -7
- package/src/components/OverlayMenu.tsx +70 -3
- package/src/components/RightPanelTabs.tsx +1 -0
- package/src/components/Tooltip/Tooltip.tsx +13 -7
- package/src/components/Tooltip/TooltipAPI.ts +22 -2
- package/src/components/Tooltip/style.tsx +0 -1
- package/src/components/Tooltip/types.ts +7 -0
- package/src/components/form/styled.ts +2 -1
- package/src/context/hooks.ts +1 -4
- package/src/features.ts +2 -0
- package/src/right-panel/DefaultPanel.tsx +5 -4
- package/src/right-panel/hooks.tsx +2 -2
- package/src/state/ChatEntry.ts +8 -3
- package/src/state/ChatState.ts +5 -1
- package/src/state/WidgetState.ts +14 -26
- package/src/types.ts +1 -1
- package/src/utils/chat.ts +1 -1
- package/src/utils/date.ts +4 -0
- package/src/utils/download.ts +12 -0
- package/src/utils/knowledge-source.ts +55 -0
- package/src/views/Agents.tsx +187 -1
- package/src/views/Chat/ChatMessage.tsx +19 -5
- package/src/{hooks → views/Chat}/chat-scroll.ts +6 -3
- package/src/views/Chat/styled.ts +24 -0
- package/src/views/ChatHistory/ChatHistoryPanel.tsx +28 -0
- package/src/views/ChatHistory/HistoryItem.tsx +127 -0
- package/src/views/ChatHistory/dictionary.ts +20 -0
- package/src/views/ChatHistory/index.tsx +31 -0
- package/src/views/ChatHistory/styled.ts +60 -0
- package/src/views/ChatHistory/utils.ts +26 -0
- package/src/views/ChatTabSelection.tsx +1 -1
- package/src/views/KSDocument.tsx +58 -0
- package/src/views/KnowledgeSources.tsx +47 -25
- package/src/views/MessageInput/ButtonGroup.tsx +9 -7
- package/src/views/MessageInput/index.tsx +2 -5
- package/src/views/MessageInput/styled.ts +11 -3
- package/src/views/Stacks.tsx +10 -6
- package/src/views/Workspaces.tsx +10 -6
- package/dist/hooks/chat-scroll.d.ts.map +0 -1
- package/dist/hooks/chat-scroll.js.map +0 -1
- /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,
|
|
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
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|
|
@@ -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,
|
|
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 @@
|
|
|
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":"
|
|
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 {
|
|
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
|
|
16
|
+
const panel = useWidgetState('panel');
|
|
16
17
|
const { open } = useRightPanel();
|
|
17
18
|
const widget = useWidget();
|
|
18
19
|
useEffect(() => {
|
|
19
|
-
if (
|
|
20
|
-
open(_jsx(KnowledgeSourcesPanel, {}), { title: t.title, description: t.description, onClose: () => widget.set('
|
|
21
|
-
}, [
|
|
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 =
|
|
41
|
-
return knowledgeSources.filter(ks => currentlySelected?.includes(ks.
|
|
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
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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: {
|