@stack-spot/ai-chat-widget 0.2.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 +2 -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 +2 -6
- 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/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/features.d.ts.map +1 -1
- package/dist/features.js +1 -0
- package/dist/features.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.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 +3 -1
- package/dist/utils/knowledge-source.d.ts.map +1 -1
- package/dist/utils/knowledge-source.js +8 -0
- package/dist/utils/knowledge-source.js.map +1 -1
- package/dist/views/Agents.js +2 -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 +1 -1
- 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/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/KnowledgeSources.d.ts.map +1 -1
- package/dist/views/KnowledgeSources.js +30 -21
- package/dist/views/KnowledgeSources.js.map +1 -1
- package/dist/views/MessageInput/dictionary.d.ts +1 -1
- package/dist/views/Stacks.js +2 -1
- package/dist/views/Stacks.js.map +1 -1
- package/dist/views/Workspaces.d.ts.map +1 -1
- package/dist/views/Workspaces.js +3 -2
- package/dist/views/Workspaces.js.map +1 -1
- package/package.json +3 -2
- package/src/StackspotAIWidget.tsx +2 -0
- package/src/chat-interceptors/send-message.ts +2 -6
- package/src/components/HistoryList.tsx +80 -7
- package/src/components/OverlayMenu.tsx +70 -3
- 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/features.ts +1 -0
- package/src/types.ts +1 -1
- package/src/utils/date.ts +4 -0
- package/src/utils/download.ts +12 -0
- package/src/utils/knowledge-source.ts +13 -1
- package/src/views/Agents.tsx +2 -1
- package/src/views/Chat/ChatMessage.tsx +1 -1
- package/src/{hooks → views/Chat}/chat-scroll.ts +6 -3
- 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/KnowledgeSources.tsx +39 -20
- package/src/views/Stacks.tsx +2 -1
- package/src/views/Workspaces.tsx +3 -2
- 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
package/dist/views/Stacks.js
CHANGED
|
@@ -23,11 +23,12 @@ export const Stacks = () => {
|
|
|
23
23
|
};
|
|
24
24
|
const StacksPanel = () => {
|
|
25
25
|
const t = useTranslate(dictionary);
|
|
26
|
+
const chat = useCurrentChat();
|
|
26
27
|
return _jsx(RightPanelTabs, { tabs: [
|
|
27
28
|
{ title: t.personal, content: _jsx(StacksTab, { visibility: "personal" }, "personal") },
|
|
28
29
|
{ title: t.shared, content: _jsx(StacksTab, { visibility: "shared" }, "shared") },
|
|
29
30
|
{ title: t.account, content: _jsx(StacksTab, { visibility: "account" }, "account") },
|
|
30
|
-
] });
|
|
31
|
+
] }, chat.id);
|
|
31
32
|
};
|
|
32
33
|
const StacksTab = ({ visibility }) => {
|
|
33
34
|
const t = useTranslate(dictionary);
|
package/dist/views/Stacks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Stacks.js","sourceRoot":"","sources":["../../src/views/Stacks.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,2CAA2C,CAAA;AACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AAErD,OAAO,EAAc,YAAY,EAAE,MAAM,8BAA8B,CAAA;AACvE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAA;AAC5E,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC7D,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEpD,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,EAAE;IACzB,MAAM,CAAC,GAAG,YAAY,CAAC,UAAU,CAAC,CAAA;IAClC,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,OAAO;YAAE,IAAI,CACzB,KAAC,WAAW,KAAG,EACf,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAC9F,CAAA;IACH,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAA;IAEd,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,MAAM,WAAW,GAAG,GAAG,EAAE;IACvB,MAAM,CAAC,GAAG,YAAY,CAAC,UAAU,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"Stacks.js","sourceRoot":"","sources":["../../src/views/Stacks.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Workspaces.d.ts","sourceRoot":"","sources":["../../src/views/Workspaces.tsx"],"names":[],"mappings":"AAaA,eAAO,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"Workspaces.d.ts","sourceRoot":"","sources":["../../src/views/Workspaces.tsx"],"names":[],"mappings":"AAaA,eAAO,MAAM,UAAU,YAetB,CAAA"}
|
package/dist/views/Workspaces.js
CHANGED
|
@@ -15,10 +15,11 @@ export const Workspaces = () => {
|
|
|
15
15
|
const panel = useWidgetState('panel');
|
|
16
16
|
const { open } = useRightPanel();
|
|
17
17
|
const widget = useWidget();
|
|
18
|
+
const chat = useCurrentChat();
|
|
18
19
|
useEffect(() => {
|
|
19
20
|
if (panel === 'workspace')
|
|
20
|
-
open(_jsx(RightPanelForm, { children: _jsx(WorkspacesPanel, {}) }), { title: t.title, description: t.description, onClose: () => widget.set('panel', undefined) });
|
|
21
|
-
}, [panel, t]);
|
|
21
|
+
open(_jsx(RightPanelForm, { children: _jsx(WorkspacesPanel, {}, chat.id) }), { title: t.title, description: t.description, onClose: () => widget.set('panel', undefined) });
|
|
22
|
+
}, [panel, t, chat.id]);
|
|
22
23
|
return null;
|
|
23
24
|
};
|
|
24
25
|
const WorkspacesPanel = () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Workspaces.js","sourceRoot":"","sources":["../../src/views/Workspaces.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,2CAA2C,CAAA;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAE5D,OAAO,EAAc,YAAY,EAAE,MAAM,8BAA8B,CAAA;AACvE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAA;AAC5E,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC7D,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEpD,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,IAAI,EAAE,GAAG,aAAa,EAAE,CAAA;IAChC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"Workspaces.js","sourceRoot":"","sources":["../../src/views/Workspaces.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stack-spot/ai-chat-widget",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"@citric/icons": "^5.4.0 || ^6.0.0",
|
|
10
10
|
"@citric/ui": "^5.4.0 || ^6.0.0",
|
|
11
11
|
"@stack-spot/portal-components": "^2.6.1",
|
|
12
|
-
"@stack-spot/portal-network": "^0.
|
|
12
|
+
"@stack-spot/portal-network": "^0.42.2",
|
|
13
13
|
"@stack-spot/portal-theme": "^1.0.0",
|
|
14
14
|
"@stack-spot/portal-translate": "^1.1.0",
|
|
15
15
|
"lodash": "^4.17.0",
|
|
@@ -40,6 +40,7 @@
|
|
|
40
40
|
"typescript": "^5.2.2"
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
|
+
"react-infinite-scroll-component": "^6.1.0",
|
|
43
44
|
"react-markdown": "^9.0.1",
|
|
44
45
|
"react-syntax-highlighter": "^15.5.0",
|
|
45
46
|
"remark-gfm": "^4.0.0",
|
|
@@ -12,6 +12,7 @@ import { MessageInterceptor } from './state/ChatState'
|
|
|
12
12
|
import { MinimizedActions } from './types'
|
|
13
13
|
import { Agents } from './views/Agents'
|
|
14
14
|
import { Chat } from './views/Chat'
|
|
15
|
+
import { ChatHistory } from './views/ChatHistory'
|
|
15
16
|
import { ChatTabSelection } from './views/ChatTabSelection'
|
|
16
17
|
import { Home } from './views/Home'
|
|
17
18
|
import { KnowledgeSources } from './views/KnowledgeSources'
|
|
@@ -61,6 +62,7 @@ export const StackspotAIWidget = (
|
|
|
61
62
|
<KnowledgeSources />
|
|
62
63
|
<KSDocument />
|
|
63
64
|
<Agents />
|
|
65
|
+
<ChatHistory interceptors={interceptors} />
|
|
64
66
|
{!isMinimized && <div className="chat-right-panel" ref={rightPanelRef}><RightPanel /></div>}
|
|
65
67
|
</div>
|
|
66
68
|
</RightPanelProvider>
|
|
@@ -2,6 +2,7 @@ import { aiClient, StackspotAPIError } from '@stack-spot/portal-network'
|
|
|
2
2
|
import { ChatEntry, KnowledgeSource } from '../state/ChatEntry'
|
|
3
3
|
import { ChatState } from '../state/ChatState'
|
|
4
4
|
import { buildConversationContext } from '../utils/chat'
|
|
5
|
+
import { genericSourcesToKnowledgeSources } from '../utils/knowledge-source'
|
|
5
6
|
|
|
6
7
|
export async function sendMessageInterceptor(entry: ChatEntry, chat: ChatState) {
|
|
7
8
|
const { agent, content } = entry.getValue()
|
|
@@ -18,12 +19,7 @@ export async function sendMessageInterceptor(entry: ChatEntry, chat: ChatState)
|
|
|
18
19
|
let knowledgeSources: KnowledgeSource[] | undefined
|
|
19
20
|
stream.onChange(value => {
|
|
20
21
|
if (value.sources?.length !== knowledgeSources?.length) {
|
|
21
|
-
knowledgeSources = value.sources
|
|
22
|
-
documentId: ks.document_id,
|
|
23
|
-
documentScore: ks.document_score,
|
|
24
|
-
name: ks.name,
|
|
25
|
-
slug: ks.slug,
|
|
26
|
-
}))
|
|
22
|
+
knowledgeSources = genericSourcesToKnowledgeSources(value.sources)
|
|
27
23
|
}
|
|
28
24
|
botEntry.setValue({
|
|
29
25
|
agent: 'bot',
|
|
@@ -1,16 +1,89 @@
|
|
|
1
1
|
/* eslint-disable no-empty-pattern */
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { Text } from '@citric/core'
|
|
3
|
+
import { theme, WithStyle } from '@stack-spot/portal-theme'
|
|
4
|
+
import { Dictionary, useTranslate } from '@stack-spot/portal-translate'
|
|
5
|
+
import { groupBy, map } from 'lodash'
|
|
6
|
+
import { useMemo } from 'react'
|
|
7
|
+
import { styled } from 'styled-components'
|
|
8
|
+
import { subtractDays } from '../utils/date'
|
|
9
|
+
|
|
10
|
+
type HistorySectionName = 'today' | 'yesterday' | 'last7' | 'last30' | 'older'
|
|
4
11
|
|
|
5
12
|
interface Props<T> extends WithStyle {
|
|
6
13
|
items: T[],
|
|
7
|
-
|
|
14
|
+
renderItem: (item: T) => React.ReactNode,
|
|
8
15
|
getDate: (item: T) => Date,
|
|
9
16
|
keygen: (item: T) => React.Key,
|
|
10
|
-
getActions?: (item: T) => ButtonAction[],
|
|
11
|
-
onSelect?: (item: T) => void,
|
|
12
17
|
}
|
|
13
18
|
|
|
14
|
-
|
|
15
|
-
|
|
19
|
+
const HistoryBox = styled.div`
|
|
20
|
+
display: flex;
|
|
21
|
+
flex-direction: column;
|
|
22
|
+
gap: 4px;
|
|
23
|
+
|
|
24
|
+
> section {
|
|
25
|
+
> header {
|
|
26
|
+
background-color: ${theme.color.light[500]};
|
|
27
|
+
padding: 8px;
|
|
28
|
+
border-radius: 4px;
|
|
29
|
+
color: ${theme.color.light[700]};
|
|
30
|
+
margin-bottom: 4px;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
> ul {
|
|
34
|
+
margin: 0;
|
|
35
|
+
padding: 0;
|
|
36
|
+
list-style: none;
|
|
37
|
+
display: flex;
|
|
38
|
+
flex-direction: column;
|
|
39
|
+
gap: 2px;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
`
|
|
43
|
+
|
|
44
|
+
function dateToSectionName(date: Date): HistorySectionName {
|
|
45
|
+
const now = new Date()
|
|
46
|
+
if (date.toDateString() === now.toDateString()) return 'today'
|
|
47
|
+
const yesterday = subtractDays(now, 1)
|
|
48
|
+
if (date.toDateString() === yesterday.toDateString()) return 'yesterday'
|
|
49
|
+
const todayAtMidnight = new Date(now.toDateString())
|
|
50
|
+
const last7Days = subtractDays(todayAtMidnight, 7)
|
|
51
|
+
if (date.getTime() >= last7Days.getTime()) return 'last7'
|
|
52
|
+
const last30Days = subtractDays(todayAtMidnight, 30)
|
|
53
|
+
return date.getTime() >= last30Days.getTime() ? 'last30' : 'older'
|
|
16
54
|
}
|
|
55
|
+
|
|
56
|
+
export function HistoryList<T>({ getDate, items, keygen, className, style, renderItem }: Props<T>) {
|
|
57
|
+
const t = useTranslate(dictionary)
|
|
58
|
+
const sections = useMemo(() => {
|
|
59
|
+
const byDate = groupBy(items, item => dateToSectionName(getDate(item)))
|
|
60
|
+
return map(byDate, (value: T[], key: HistorySectionName) => (
|
|
61
|
+
<section key={key}>
|
|
62
|
+
<header>
|
|
63
|
+
<Text>{t[key]}</Text>
|
|
64
|
+
</header>
|
|
65
|
+
<ul>{value.map(item => <li key={keygen(item)}>{renderItem(item)}</li>)}</ul>
|
|
66
|
+
</section>
|
|
67
|
+
))
|
|
68
|
+
}, [items])
|
|
69
|
+
|
|
70
|
+
return <HistoryBox className={className} style={style}>{sections}</HistoryBox>
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const dictionary = {
|
|
74
|
+
en: {
|
|
75
|
+
today: 'Today',
|
|
76
|
+
yesterday: 'Yesterday',
|
|
77
|
+
last7: 'Last 7 days',
|
|
78
|
+
last30: 'Last 30 days',
|
|
79
|
+
older: 'Older',
|
|
80
|
+
},
|
|
81
|
+
pt: {
|
|
82
|
+
today: 'Hoje',
|
|
83
|
+
yesterday: 'Ontem',
|
|
84
|
+
last7: 'Últimos 7 dias',
|
|
85
|
+
last30: 'Últimos 30 dias',
|
|
86
|
+
older: 'Mais antigo',
|
|
87
|
+
},
|
|
88
|
+
} satisfies Dictionary
|
|
89
|
+
|
|
@@ -1,10 +1,77 @@
|
|
|
1
1
|
/* eslint-disable no-empty-pattern */
|
|
2
|
-
import {
|
|
2
|
+
import { IconBox, Text } from '@citric/core'
|
|
3
|
+
import { theme, WithStyle } from '@stack-spot/portal-theme'
|
|
4
|
+
import { useMemo } from 'react'
|
|
5
|
+
import { styled } from 'styled-components'
|
|
3
6
|
import { ButtonAction, WithChildren } from '../types'
|
|
7
|
+
import { Tooltip } from './Tooltip'
|
|
8
|
+
import { useTooltip } from './Tooltip/context'
|
|
9
|
+
import { TooltipPosition } from './Tooltip/types'
|
|
4
10
|
|
|
5
11
|
interface Props extends WithStyle, WithChildren {
|
|
6
|
-
position?:
|
|
12
|
+
position?: TooltipPosition,
|
|
7
13
|
actions: ButtonAction[],
|
|
8
14
|
}
|
|
9
15
|
|
|
10
|
-
|
|
16
|
+
const MenuList = styled.ul`
|
|
17
|
+
margin: 0;
|
|
18
|
+
padding: 0;
|
|
19
|
+
list-style: none;
|
|
20
|
+
border-radius: 8px;
|
|
21
|
+
background-color: ${theme.color.light[400]};
|
|
22
|
+
overflow: hidden;
|
|
23
|
+
display: flex;
|
|
24
|
+
flex-direction: column;
|
|
25
|
+
|
|
26
|
+
> li {
|
|
27
|
+
display: flex;
|
|
28
|
+
flex-direction: column;
|
|
29
|
+
|
|
30
|
+
> button {
|
|
31
|
+
padding: 8px 12px;
|
|
32
|
+
transition: background-color 0.2s;
|
|
33
|
+
cursor: pointer;
|
|
34
|
+
display: flex;
|
|
35
|
+
flex-direction: row;
|
|
36
|
+
align-items: center;
|
|
37
|
+
gap: 8px;
|
|
38
|
+
background-color: transparent;
|
|
39
|
+
border: none;
|
|
40
|
+
|
|
41
|
+
&:hover {
|
|
42
|
+
background-color: ${theme.color.light[500]};
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
`
|
|
47
|
+
|
|
48
|
+
const StyledButton = styled.button<{ $color: string | undefined }>`
|
|
49
|
+
color: ${({ $color }) => $color || theme.color.light.contrastText};
|
|
50
|
+
|
|
51
|
+
svg {
|
|
52
|
+
fill: ${({ $color }) => $color || theme.color.light.contrastText};
|
|
53
|
+
}
|
|
54
|
+
`
|
|
55
|
+
|
|
56
|
+
export const OverlayMenu = ({ actions, children, className, position, style }: Props) => {
|
|
57
|
+
const tooltip = useTooltip()
|
|
58
|
+
const menu = useMemo(() => {
|
|
59
|
+
const items = actions.map(({ label, onClick, className, color, icon, style }) => (
|
|
60
|
+
<li key={label} className={className} style={style}>
|
|
61
|
+
<StyledButton $color={color} onClick={() => {
|
|
62
|
+
onClick()
|
|
63
|
+
tooltip.hide()
|
|
64
|
+
}}>
|
|
65
|
+
<IconBox>{icon}</IconBox>
|
|
66
|
+
<Text>{label}</Text>
|
|
67
|
+
</StyledButton>
|
|
68
|
+
</li>
|
|
69
|
+
))
|
|
70
|
+
return <MenuList>{items}</MenuList>
|
|
71
|
+
}, [actions])
|
|
72
|
+
return (
|
|
73
|
+
<Tooltip content={menu} custom position={position} className={className} style={style} triggeredBy="click">
|
|
74
|
+
{children}
|
|
75
|
+
</Tooltip>
|
|
76
|
+
)
|
|
77
|
+
}
|
|
@@ -8,21 +8,27 @@ import { TooltipPosition } from './types'
|
|
|
8
8
|
interface Props extends WithChildren, WithStyle {
|
|
9
9
|
content: React.ReactNode,
|
|
10
10
|
position?: TooltipPosition,
|
|
11
|
+
triggeredBy?: 'click' | 'hover',
|
|
11
12
|
custom?: boolean,
|
|
12
13
|
}
|
|
13
14
|
|
|
14
|
-
export const Tooltip = ({ content, custom, position = '
|
|
15
|
+
export const Tooltip = ({ content, custom, position, triggeredBy = 'hover', children, className, style }: Props) => {
|
|
15
16
|
const api = useTooltip()
|
|
17
|
+
|
|
18
|
+
function show(e: React.MouseEvent<HTMLDivElement, MouseEvent>, hideOnClickOutside?: boolean) {
|
|
19
|
+
api.show({
|
|
20
|
+
content: custom ? content : <DefaultTooltip><Text appearance="microtext1">{content}</Text></DefaultTooltip>,
|
|
21
|
+
anchor: e.target as HTMLElement,
|
|
22
|
+
position,
|
|
23
|
+
hideOnClickOutside,
|
|
24
|
+
})
|
|
25
|
+
}
|
|
16
26
|
return (
|
|
17
27
|
<div
|
|
18
|
-
onMouseEnter
|
|
19
|
-
custom ? content : <DefaultTooltip><Text appearance="microtext1">{content}</Text></DefaultTooltip>,
|
|
20
|
-
e.target as HTMLElement,
|
|
21
|
-
position,
|
|
22
|
-
)}
|
|
23
|
-
onMouseLeave={() => api.hide()}
|
|
28
|
+
{...(triggeredBy === 'hover' ? { onMouseEnter: show, onMouseLeave: () => api.hide() } : { onClick: (e) => show(e, true) })}
|
|
24
29
|
className={className}
|
|
25
30
|
style={style}
|
|
31
|
+
tabIndex={triggeredBy === 'click' ? 0 : undefined}
|
|
26
32
|
>
|
|
27
33
|
{children}
|
|
28
34
|
</div>
|
|
@@ -1,20 +1,23 @@
|
|
|
1
1
|
import { animationTimeMS } from './style'
|
|
2
|
-
import {
|
|
2
|
+
import { ShowOptions } from './types'
|
|
3
3
|
|
|
4
|
+
const MARGIN_TO_CORNERS_PX = 10
|
|
4
5
|
|
|
5
6
|
export class TooltipAPI {
|
|
6
7
|
private tooltipRef: React.RefObject<HTMLDivElement>
|
|
7
8
|
private setContent: React.Dispatch<React.SetStateAction<React.ReactNode>>
|
|
8
9
|
private hideTimeoutId: number | undefined
|
|
10
|
+
private clickListener: ((e: MouseEvent) => void) | undefined
|
|
9
11
|
|
|
10
12
|
constructor(tooltipRef: React.RefObject<HTMLDivElement>, setContent: React.Dispatch<React.SetStateAction<React.ReactNode>>) {
|
|
11
13
|
this.tooltipRef = tooltipRef
|
|
12
14
|
this.setContent = setContent
|
|
13
15
|
}
|
|
14
16
|
|
|
15
|
-
show(content
|
|
17
|
+
show({ content, anchor, position = 'bottom', hideOnClickOutside }: ShowOptions): void {
|
|
16
18
|
window.clearTimeout(this.hideTimeoutId)
|
|
17
19
|
this.hideTimeoutId = undefined
|
|
20
|
+
if (this.clickListener) document.removeEventListener('click', this.clickListener)
|
|
18
21
|
this.setContent(content)
|
|
19
22
|
setTimeout(() => {
|
|
20
23
|
if (!this.tooltipRef.current) return
|
|
@@ -33,8 +36,24 @@ export class TooltipAPI {
|
|
|
33
36
|
if (position === 'top') top = rect.top - tooltipHeight
|
|
34
37
|
else top = rect.top + rect.height
|
|
35
38
|
}
|
|
39
|
+
// adjusts positions in order to avoid overflowing the window and leaving a margin to the corners
|
|
40
|
+
if (top <= 0) top += MARGIN_TO_CORNERS_PX
|
|
41
|
+
else if (top + tooltipHeight >= document.body.clientHeight - MARGIN_TO_CORNERS_PX) {
|
|
42
|
+
top = document.body.clientHeight - MARGIN_TO_CORNERS_PX + tooltipHeight
|
|
43
|
+
}
|
|
44
|
+
if (left <= 0) left += MARGIN_TO_CORNERS_PX
|
|
45
|
+
else if (left + tooltipWidth >= document.body.clientWidth - MARGIN_TO_CORNERS_PX) {
|
|
46
|
+
left = document.body.clientWidth - MARGIN_TO_CORNERS_PX - tooltipWidth
|
|
47
|
+
}
|
|
36
48
|
this.tooltipRef.current.style.top = `${top}px`
|
|
37
49
|
this.tooltipRef.current.style.left = `${left}px`
|
|
50
|
+
if (hideOnClickOutside) {
|
|
51
|
+
this.clickListener = (e: MouseEvent) => {
|
|
52
|
+
if (this.tooltipRef.current?.contains(e.target as HTMLElement)) return
|
|
53
|
+
this.hide()
|
|
54
|
+
}
|
|
55
|
+
document.addEventListener('click', this.clickListener)
|
|
56
|
+
}
|
|
38
57
|
}, 10)
|
|
39
58
|
}
|
|
40
59
|
|
|
@@ -42,5 +61,6 @@ export class TooltipAPI {
|
|
|
42
61
|
if (!this.tooltipRef.current) return
|
|
43
62
|
this.tooltipRef.current.classList.remove('visible')
|
|
44
63
|
this.hideTimeoutId = window.setTimeout(() => this.setContent(undefined), animationTimeMS)
|
|
64
|
+
if (this.clickListener) document.removeEventListener('click', this.clickListener)
|
|
45
65
|
}
|
|
46
66
|
}
|
package/src/features.ts
CHANGED
package/src/types.ts
CHANGED
package/src/utils/date.ts
CHANGED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export function download(filename: string, text: string) {
|
|
2
|
+
const element = document.createElement('a')
|
|
3
|
+
element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text))
|
|
4
|
+
element.setAttribute('download', filename)
|
|
5
|
+
|
|
6
|
+
element.style.display = 'none'
|
|
7
|
+
document.body.appendChild(element)
|
|
8
|
+
|
|
9
|
+
element.click()
|
|
10
|
+
|
|
11
|
+
document.body.removeChild(element)
|
|
12
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { DocumentResponse } from '@stack-spot/portal-network/api/ai'
|
|
1
|
+
import { DocumentResponse, SourceKnowledgeSource4, SourceProjectFile4, SourceStackAi } from '@stack-spot/portal-network/api/ai'
|
|
2
|
+
import { KnowledgeSource } from '../state/ChatEntry'
|
|
2
3
|
|
|
3
4
|
function attemptToParseMalFormedJson(str: string) {
|
|
4
5
|
try {
|
|
@@ -41,3 +42,14 @@ export function extractCodeFromKSDocument(document: DocumentResponse): { languag
|
|
|
41
42
|
|
|
42
43
|
return typeof document === 'object' ? { language: 'json', snippet: JSON.stringify(document, null, 2) } : { snippet: String(document) }
|
|
43
44
|
}
|
|
45
|
+
|
|
46
|
+
export function genericSourcesToKnowledgeSources(
|
|
47
|
+
sources: (SourceStackAi | SourceKnowledgeSource4 | SourceProjectFile4)[] | undefined,
|
|
48
|
+
): KnowledgeSource[] | undefined {
|
|
49
|
+
return sources?.filter(s => s.type === 'knowledge_source').map(ks => ({
|
|
50
|
+
documentId: ks.document_id,
|
|
51
|
+
documentScore: ks.document_score,
|
|
52
|
+
name: ks.name,
|
|
53
|
+
slug: ks.slug,
|
|
54
|
+
}))
|
|
55
|
+
}
|
package/src/views/Agents.tsx
CHANGED
|
@@ -83,8 +83,9 @@ export const Agents = () => {
|
|
|
83
83
|
|
|
84
84
|
const AgentsPanel = () => {
|
|
85
85
|
const t = useTranslate(dictionary)
|
|
86
|
+
const chat = useCurrentChat()
|
|
86
87
|
|
|
87
|
-
return <RightPanelTabs tabs={[
|
|
88
|
+
return <RightPanelTabs key={chat.id} tabs={[
|
|
88
89
|
{ title: t.personal, content: <AgentsTab key="personal" visibility="PERSONAL" /> },
|
|
89
90
|
{ title: t.builtin, content: <AgentsTab key="builtin" visibility="BUILT-IN" /> },
|
|
90
91
|
{ title: t.shared, content: <AgentsTab key="shared" visibility="SHARED" /> },
|
|
@@ -6,10 +6,10 @@ import { Dictionary, useTranslate } from '@stack-spot/portal-translate'
|
|
|
6
6
|
import { useCallback, useMemo, useRef, useState } from 'react'
|
|
7
7
|
import { Markdown } from '../../components/Markdown'
|
|
8
8
|
import { useChatEntry, useWidget } from '../../context/hooks'
|
|
9
|
-
import { useChatScrollToBottomEffect } from '../../hooks/chat-scroll'
|
|
10
9
|
import { ChatEntry, TextChatEntry } from '../../state/ChatEntry'
|
|
11
10
|
import { useDateFormatter } from '../../utils/date'
|
|
12
11
|
import { AgentInfo } from './AgentInfo'
|
|
12
|
+
import { useChatScrollToBottomEffect } from './chat-scroll'
|
|
13
13
|
|
|
14
14
|
export const ChatMessage = ({ message, username }: { message: ChatEntry, username: string }) => {
|
|
15
15
|
const t = useTranslate(dictionary)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useEffect } from 'react'
|
|
1
|
+
import { useEffect, useRef } from 'react'
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Scrolls the closest chat (upwards in the tree) to its bottom.
|
|
@@ -6,9 +6,12 @@ import { useEffect } from 'react'
|
|
|
6
6
|
* @param deps when the deps changes, the chat is scrolled.
|
|
7
7
|
*/
|
|
8
8
|
export function useChatScrollToBottomEffect(ref: React.RefObject<HTMLElement>, deps: any[]) {
|
|
9
|
+
const prevScrollTop = useRef(0)
|
|
10
|
+
|
|
9
11
|
useEffect(() => {
|
|
10
12
|
const chat = ref.current?.closest('.chat-content')
|
|
11
|
-
if (!chat) return
|
|
12
|
-
chat.scrollTop = chat.scrollHeight
|
|
13
|
+
if (!chat || chat.scrollTop < prevScrollTop.current) return
|
|
14
|
+
chat.scrollTop = chat.scrollHeight - chat.clientHeight
|
|
15
|
+
prevScrollTop.current = chat.scrollTop
|
|
13
16
|
}, deps)
|
|
14
17
|
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { aiClient } from '@stack-spot/portal-network'
|
|
2
|
+
import InfiniteScroll from 'react-infinite-scroll-component'
|
|
3
|
+
import { HistoryList } from '../../components/HistoryList'
|
|
4
|
+
import { MessageInterceptor } from '../../state/ChatState'
|
|
5
|
+
import { HistoryItem } from './HistoryItem'
|
|
6
|
+
|
|
7
|
+
export const ChatHistoryPanel = ({ interceptors }: { interceptors: MessageInterceptor[] }) => {
|
|
8
|
+
const [chats, { fetchNextPage, hasNextPage }] = aiClient.chats.useInfiniteQuery({ size: 40 })
|
|
9
|
+
return (
|
|
10
|
+
<div id="chatHistoryList" style={{ height: '100%', overflow: 'auto' }}>
|
|
11
|
+
<InfiniteScroll
|
|
12
|
+
scrollableTarget="chatHistoryList"
|
|
13
|
+
dataLength={chats.length}
|
|
14
|
+
next={fetchNextPage}
|
|
15
|
+
hasMore={hasNextPage}
|
|
16
|
+
loader={<div></div>}
|
|
17
|
+
>
|
|
18
|
+
<HistoryList
|
|
19
|
+
items={chats}
|
|
20
|
+
getDate={c => new Date(c.updated || c.created || '')}
|
|
21
|
+
keygen={c => c.id}
|
|
22
|
+
renderItem={c => <HistoryItem item={c} interceptors={interceptors} />}
|
|
23
|
+
style={{ marginRight: '6px' }}
|
|
24
|
+
/>
|
|
25
|
+
</InfiniteScroll>
|
|
26
|
+
</div>
|
|
27
|
+
)
|
|
28
|
+
}
|