@stack-spot/ai-chat-widget 0.3.0 → 0.4.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.js +1 -1
- package/dist/StackspotAIWidget.js.map +1 -1
- package/dist/chat-interceptors/quick-commands.js +2 -2
- package/dist/chat-interceptors/quick-commands.js.map +1 -1
- package/dist/chat-interceptors/send-message.d.ts.map +1 -1
- package/dist/chat-interceptors/send-message.js +4 -3
- package/dist/chat-interceptors/send-message.js.map +1 -1
- package/dist/components/Tooltip/TooltipAPI.d.ts +2 -0
- package/dist/components/Tooltip/TooltipAPI.d.ts.map +1 -1
- package/dist/components/Tooltip/TooltipAPI.js +24 -7
- package/dist/components/Tooltip/TooltipAPI.js.map +1 -1
- package/dist/components/Tooltip/context.js +1 -1
- package/dist/components/Tooltip/context.js.map +1 -1
- package/dist/layout.css +6 -0
- package/dist/state/ChatEntry.d.ts +3 -2
- package/dist/state/ChatEntry.d.ts.map +1 -1
- package/dist/state/ChatEntry.js +2 -2
- package/dist/state/ChatEntry.js.map +1 -1
- package/dist/state/ChatState.d.ts +1 -7
- package/dist/state/ChatState.d.ts.map +1 -1
- package/dist/state/ChatState.js.map +1 -1
- package/dist/state/types.d.ts +8 -0
- package/dist/state/types.d.ts.map +1 -0
- package/dist/state/types.js +2 -0
- package/dist/state/types.js.map +1 -0
- package/dist/views/Chat/AgentInfo.d.ts +3 -2
- package/dist/views/Chat/AgentInfo.d.ts.map +1 -1
- package/dist/views/Chat/AgentInfo.js +3 -3
- package/dist/views/Chat/AgentInfo.js.map +1 -1
- package/dist/views/Chat/ChatMessage.js +2 -2
- package/dist/views/Chat/ChatMessage.js.map +1 -1
- package/dist/views/Chat/styled.d.ts.map +1 -1
- package/dist/views/Chat/styled.js +8 -1
- package/dist/views/Chat/styled.js.map +1 -1
- package/dist/views/ChatHistory/HistoryItem.d.ts.map +1 -1
- package/dist/views/ChatHistory/HistoryItem.js +15 -8
- package/dist/views/ChatHistory/HistoryItem.js.map +1 -1
- package/dist/views/ChatHistory/utils.d.ts +1 -0
- package/dist/views/ChatHistory/utils.d.ts.map +1 -1
- package/dist/views/ChatHistory/utils.js +12 -1
- package/dist/views/ChatHistory/utils.js.map +1 -1
- package/dist/views/MessageInput/dictionary.d.ts +1 -1
- package/package.json +1 -1
- package/src/StackspotAIWidget.tsx +1 -1
- package/src/chat-interceptors/quick-commands.ts +2 -2
- package/src/chat-interceptors/send-message.ts +4 -3
- package/src/components/Tooltip/TooltipAPI.ts +25 -7
- package/src/components/Tooltip/context.tsx +1 -1
- package/src/layout.css +6 -0
- package/src/state/ChatEntry.ts +5 -4
- package/src/state/ChatState.ts +1 -9
- package/src/state/types.ts +8 -0
- package/src/views/Chat/AgentInfo.tsx +8 -8
- package/src/views/Chat/ChatMessage.tsx +3 -3
- package/src/views/Chat/styled.ts +8 -1
- package/src/views/ChatHistory/HistoryItem.tsx +20 -8
- package/src/views/ChatHistory/utils.ts +12 -1
|
@@ -30,6 +30,6 @@ export const StackspotAIWidget = ({ username, features = defaultFeatures, interc
|
|
|
30
30
|
const isCurrentChatEmpty = currentChat.length === 0;
|
|
31
31
|
return useMemo(() => (_jsx(TooltipProvider, { children: _jsx(RightPanelProvider, { chatWindow: chatWindowRef, panel: rightPanelRef, children: _jsxs("div", { className: listToClass(['ai-chat-widget', isMinimized && 'minimized']), children: [_jsxs("div", { className: "chat-window", ref: chatWindowRef, children: [isMinimized
|
|
32
32
|
? _jsx(MinimizedHeader, { ...minimizedActions })
|
|
33
|
-
: _jsx(ChatTabSelection, { history: features?.chatHistory, interceptors: interceptors }), _jsxs("div", { className: "chat-container", children: [_jsx("div", { className: "chat-content", children: isCurrentChatEmpty ? (children ?? _jsx(Home, { username: username })) : _jsx(Chat, { username: username }) }), _jsx(MessageInput, { features: features })] })] }), _jsx(Stacks, {}), _jsx(Workspaces, {}), _jsx(KnowledgeSources, {}), _jsx(KSDocument, {}), _jsx(Agents, {}), _jsx(ChatHistory, { interceptors: interceptors }),
|
|
33
|
+
: _jsx(ChatTabSelection, { history: features?.chatHistory, interceptors: interceptors }), _jsxs("div", { className: "chat-container", children: [_jsx("div", { className: "chat-content", children: isCurrentChatEmpty ? (children ?? _jsx(Home, { username: username })) : _jsx(Chat, { username: username }) }), _jsx(MessageInput, { features: features })] })] }), _jsx(Stacks, {}), _jsx(Workspaces, {}), _jsx(KnowledgeSources, {}), _jsx(KSDocument, {}), _jsx(Agents, {}), _jsx(ChatHistory, { interceptors: interceptors }), _jsx("div", { className: "chat-right-panel", ref: rightPanelRef, children: _jsx(RightPanel, {}) })] }) }) })), [isCurrentChatEmpty, features, username, isMinimized]);
|
|
34
34
|
};
|
|
35
35
|
//# sourceMappingURL=StackspotAIWidget.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StackspotAIWidget.js","sourceRoot":"","sources":["../src/StackspotAIWidget.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"StackspotAIWidget.js","sourceRoot":"","sources":["../src/StackspotAIWidget.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
2
2
|
export function quickCommandInterceptor(entry, _chat) {
|
|
3
|
-
const {
|
|
4
|
-
if (
|
|
3
|
+
const { agentType, content } = entry.getValue();
|
|
4
|
+
if (agentType !== 'user')
|
|
5
5
|
return;
|
|
6
6
|
if (content.startsWith('/')) {
|
|
7
7
|
alert('Quick commands are not yet supported!'); /* todo */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quick-commands.js","sourceRoot":"","sources":["../../src/chat-interceptors/quick-commands.ts"],"names":[],"mappings":"AAGA,6DAA6D;AAC7D,MAAM,UAAU,uBAAuB,CAAC,KAAgB,EAAE,KAAgB;IACxE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"quick-commands.js","sourceRoot":"","sources":["../../src/chat-interceptors/quick-commands.ts"],"names":[],"mappings":"AAGA,6DAA6D;AAC7D,MAAM,UAAU,uBAAuB,CAAC,KAAgB,EAAE,KAAgB;IACxE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAA;IAC/C,IAAI,SAAS,KAAK,MAAM;QAAE,OAAM;IAChC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,KAAK,CAAC,uCAAuC,CAAC,CAAA,CAAC,UAAU;QACzD,OAAO,KAAK,CAAA,CAAC,sGAAsG;IACrH,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"send-message.d.ts","sourceRoot":"","sources":["../../src/chat-interceptors/send-message.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAmB,MAAM,oBAAoB,CAAA;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAI9C,wBAAsB,sBAAsB,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"send-message.d.ts","sourceRoot":"","sources":["../../src/chat-interceptors/send-message.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAmB,MAAM,oBAAoB,CAAA;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAI9C,wBAAsB,sBAAsB,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,iBAqC7E"}
|
|
@@ -3,8 +3,8 @@ import { ChatEntry } from '../state/ChatEntry.js';
|
|
|
3
3
|
import { buildConversationContext } from '../utils/chat.js';
|
|
4
4
|
import { genericSourcesToKnowledgeSources } from '../utils/knowledge-source.js';
|
|
5
5
|
export async function sendMessageInterceptor(entry, chat) {
|
|
6
|
-
const {
|
|
7
|
-
if (
|
|
6
|
+
const { agentType, content } = entry.getValue();
|
|
7
|
+
if (agentType !== 'user')
|
|
8
8
|
return;
|
|
9
9
|
const context = buildConversationContext(chat);
|
|
10
10
|
chat.set('isLoading', true);
|
|
@@ -21,12 +21,13 @@ export async function sendMessageInterceptor(entry, chat) {
|
|
|
21
21
|
knowledgeSources = genericSourcesToKnowledgeSources(value.sources);
|
|
22
22
|
}
|
|
23
23
|
botEntry.setValue({
|
|
24
|
-
|
|
24
|
+
agentType: 'bot',
|
|
25
25
|
type: 'md',
|
|
26
26
|
content: value.answer ?? '',
|
|
27
27
|
messageId: value.message_id ?? undefined,
|
|
28
28
|
knowledgeSources,
|
|
29
29
|
updated: new Date().toISOString(),
|
|
30
|
+
agent: chat.get('agent'),
|
|
30
31
|
});
|
|
31
32
|
});
|
|
32
33
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"send-message.js","sourceRoot":"","sources":["../../src/chat-interceptors/send-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AACxE,OAAO,EAAE,SAAS,EAAmB,MAAM,oBAAoB,CAAA;AAE/D,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAA;AACxD,OAAO,EAAE,gCAAgC,EAAE,MAAM,2BAA2B,CAAA;AAE5E,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,KAAgB,EAAE,IAAe;IAC5E,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"send-message.js","sourceRoot":"","sources":["../../src/chat-interceptors/send-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AACxE,OAAO,EAAE,SAAS,EAAmB,MAAM,oBAAoB,CAAA;AAE/D,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAA;AACxD,OAAO,EAAE,gCAAgC,EAAE,MAAM,2BAA2B,CAAA;AAE5E,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,KAAgB,EAAE,IAAe;IAC5E,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAA;IAC/C,IAAI,SAAS,KAAK,MAAM;QAAE,OAAM;IAChC,MAAM,OAAO,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAA;IAC9C,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,CAAA;IAC3B,uDAAuD;IACvD,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IAC5B,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAA;IAC1E,MAAM,QAAQ,GAAG,SAAS,CAAC,sBAAsB,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAA;IACxE,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAA;IAC1B,IAAI,gBAA+C,CAAA;IACnD,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;QACtB,IAAI,KAAK,CAAC,OAAO,EAAE,MAAM,KAAK,gBAAgB,EAAE,MAAM,EAAE,CAAC;YACvD,gBAAgB,GAAG,gCAAgC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACpE,CAAC;QACD,QAAQ,CAAC,QAAQ,CAAC;YAChB,SAAS,EAAE,KAAK;YAChB,IAAI,EAAE,IAAI;YACV,OAAO,EAAE,KAAK,CAAC,MAAM,IAAI,EAAE;YAC3B,SAAS,EAAE,KAAK,CAAC,UAAU,IAAI,SAAS;YACxC,gBAAgB;YAChB,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACjC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;SACzB,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IACF,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAA;IACzB,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,QAAQ,CAAC,QAAQ,CAAC;YAChB,GAAG,QAAQ,CAAC,QAAQ,EAAE;YACtB,KAAK,EAAE,KAAK,YAAY,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,GAAG,KAAK,EAAE,CAAC;SAC9F,CAAC,CAAA;IACJ,CAAC;IACD,QAAQ,CAAC,MAAM,EAAE,CAAA;IACjB,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,CAAA;AAC9B,CAAC"}
|
|
@@ -4,7 +4,9 @@ export declare class TooltipAPI {
|
|
|
4
4
|
private setContent;
|
|
5
5
|
private hideTimeoutId;
|
|
6
6
|
private clickListener;
|
|
7
|
+
private relativeTo;
|
|
7
8
|
constructor(tooltipRef: React.RefObject<HTMLDivElement>, setContent: React.Dispatch<React.SetStateAction<React.ReactNode>>);
|
|
9
|
+
private computeRelativeTo;
|
|
8
10
|
show({ content, anchor, position, hideOnClickOutside }: ShowOptions): void;
|
|
9
11
|
hide(): void;
|
|
10
12
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TooltipAPI.d.ts","sourceRoot":"","sources":["../../../src/components/Tooltip/TooltipAPI.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"TooltipAPI.d.ts","sourceRoot":"","sources":["../../../src/components/Tooltip/TooltipAPI.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAQrC,qBAAa,UAAU;IACrB,OAAO,CAAC,UAAU,CAAiC;IACnD,OAAO,CAAC,UAAU,CAAuD;IACzE,OAAO,CAAC,aAAa,CAAoB;IACzC,OAAO,CAAC,aAAa,CAAuC;IAC5D,OAAO,CAAC,UAAU,CAAyB;gBAE/B,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAK1H,OAAO,CAAC,iBAAiB;IAQzB,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,QAAmB,EAAE,kBAAkB,EAAE,EAAE,WAAW,GAAG,IAAI;IAgDrF,IAAI,IAAI,IAAI;CAMb"}
|
|
@@ -1,14 +1,26 @@
|
|
|
1
1
|
import { animationTimeMS } from './style.js';
|
|
2
2
|
const MARGIN_TO_CORNERS_PX = 10;
|
|
3
|
+
function isRelative(element) {
|
|
4
|
+
return ['relative', 'absolute', 'fixed'].includes(element.computedStyleMap().get('position')?.toString() ?? '');
|
|
5
|
+
}
|
|
3
6
|
export class TooltipAPI {
|
|
4
7
|
tooltipRef;
|
|
5
8
|
setContent;
|
|
6
9
|
hideTimeoutId;
|
|
7
10
|
clickListener;
|
|
11
|
+
relativeTo;
|
|
8
12
|
constructor(tooltipRef, setContent) {
|
|
9
13
|
this.tooltipRef = tooltipRef;
|
|
10
14
|
this.setContent = setContent;
|
|
11
15
|
}
|
|
16
|
+
computeRelativeTo() {
|
|
17
|
+
if (this.relativeTo)
|
|
18
|
+
return;
|
|
19
|
+
this.relativeTo = this.tooltipRef.current?.parentElement;
|
|
20
|
+
while (this.relativeTo && this.relativeTo !== document.body && !isRelative(this.relativeTo)) {
|
|
21
|
+
this.relativeTo = this.relativeTo.parentElement;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
12
24
|
show({ content, anchor, position = 'bottom', hideOnClickOutside }) {
|
|
13
25
|
window.clearTimeout(this.hideTimeoutId);
|
|
14
26
|
this.hideTimeoutId = undefined;
|
|
@@ -18,26 +30,31 @@ export class TooltipAPI {
|
|
|
18
30
|
setTimeout(() => {
|
|
19
31
|
if (!this.tooltipRef.current)
|
|
20
32
|
return;
|
|
21
|
-
const
|
|
33
|
+
const anchorRect = anchor.getClientRects()[0];
|
|
22
34
|
this.tooltipRef.current.classList.add('visible');
|
|
23
35
|
const tooltipWidth = this.tooltipRef.current.clientWidth;
|
|
24
36
|
const tooltipHeight = this.tooltipRef.current.clientHeight;
|
|
25
37
|
let top = 0;
|
|
26
38
|
let left = 0;
|
|
27
39
|
if (position === 'left' || position === 'right') {
|
|
28
|
-
top =
|
|
40
|
+
top = anchorRect.top + anchorRect.height / 2 - tooltipHeight / 2;
|
|
29
41
|
if (position === 'left')
|
|
30
|
-
left =
|
|
42
|
+
left = anchorRect.left - tooltipWidth;
|
|
31
43
|
else
|
|
32
|
-
left =
|
|
44
|
+
left = anchorRect.left + anchorRect.width;
|
|
33
45
|
}
|
|
34
46
|
else {
|
|
35
|
-
left =
|
|
47
|
+
left = anchorRect.left + anchorRect.width / 2 - tooltipWidth / 2;
|
|
36
48
|
if (position === 'top')
|
|
37
|
-
top =
|
|
49
|
+
top = anchorRect.top - tooltipHeight;
|
|
38
50
|
else
|
|
39
|
-
top =
|
|
51
|
+
top = anchorRect.top + anchorRect.height;
|
|
40
52
|
}
|
|
53
|
+
// takes the parent the tooltip is positioned relative to into consideration
|
|
54
|
+
this.computeRelativeTo();
|
|
55
|
+
const relativeRect = this.relativeTo?.getClientRects()[0] ?? { top: 0, left: 0 };
|
|
56
|
+
top -= relativeRect.top;
|
|
57
|
+
left -= relativeRect.left;
|
|
41
58
|
// adjusts positions in order to avoid overflowing the window and leaving a margin to the corners
|
|
42
59
|
if (top <= 0)
|
|
43
60
|
top += MARGIN_TO_CORNERS_PX;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TooltipAPI.js","sourceRoot":"","sources":["../../../src/components/Tooltip/TooltipAPI.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAGzC,MAAM,oBAAoB,GAAG,EAAE,CAAA;AAE/B,MAAM,OAAO,UAAU;IACb,UAAU,CAAiC;IAC3C,UAAU,CAAuD;IACjE,aAAa,CAAoB;IACjC,aAAa,CAAuC;
|
|
1
|
+
{"version":3,"file":"TooltipAPI.js","sourceRoot":"","sources":["../../../src/components/Tooltip/TooltipAPI.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ export const TooltipProvider = ({ children }) => {
|
|
|
7
7
|
const ref = useRef(null);
|
|
8
8
|
const [content, setContent] = useState();
|
|
9
9
|
const api = useMemo(() => new TooltipAPI(ref, setContent), []);
|
|
10
|
-
return (_jsxs(Context.Provider, { value: api, children: [children, _jsx(TooltipBox, { ref: ref,
|
|
10
|
+
return (_jsxs(Context.Provider, { value: api, children: [children, _jsx(TooltipBox, { ref: ref, children: content })] }));
|
|
11
11
|
};
|
|
12
12
|
export function useTooltip() {
|
|
13
13
|
const api = useContext(Context);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/components/Tooltip/context.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAE5E,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAEzC,MAAM,OAAO,GAAG,aAAa,CAAyB,SAAS,CAAC,CAAA;AAEhE,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,EAAE,QAAQ,EAA0B,EAAE,EAAE;IACtE,MAAM,GAAG,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAA;IACxC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,EAAmB,CAAA;IACzD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAA;IAC9D,OAAO,CACL,MAAC,OAAO,CAAC,QAAQ,IAAC,KAAK,EAAE,GAAG,aACzB,QAAQ,EACT,KAAC,UAAU,IAAC,GAAG,EAAE,GAAG,
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/components/Tooltip/context.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAE5E,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAEzC,MAAM,OAAO,GAAG,aAAa,CAAyB,SAAS,CAAC,CAAA;AAEhE,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,EAAE,QAAQ,EAA0B,EAAE,EAAE;IACtE,MAAM,GAAG,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAA;IACxC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,EAAmB,CAAA;IACzD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAA;IAC9D,OAAO,CACL,MAAC,OAAO,CAAC,QAAQ,IAAC,KAAK,EAAE,GAAG,aACzB,QAAQ,EACT,KAAC,UAAU,IAAC,GAAG,EAAE,GAAG,YAAG,OAAO,GAAc,IAC3B,CACpB,CAAA;AACH,CAAC,CAAA;AAED,MAAM,UAAU,UAAU;IACxB,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;IAC/B,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,8EAA8E,CAAC,CAAA;IACzG,OAAO,GAAG,CAAA;AACZ,CAAC"}
|
package/dist/layout.css
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { LabeledWithImage } from './types.js';
|
|
1
2
|
export interface SerializableAction {
|
|
2
3
|
title: string;
|
|
3
4
|
type: 'link' | 'command';
|
|
@@ -20,13 +21,13 @@ export interface KnowledgeSource {
|
|
|
20
21
|
}
|
|
21
22
|
export interface TextChatEntry {
|
|
22
23
|
type: 'text' | 'md';
|
|
23
|
-
|
|
24
|
+
agentType: 'bot' | 'user' | 'system';
|
|
24
25
|
actions?: ChatAction[];
|
|
25
26
|
subtitle?: string;
|
|
26
27
|
content: string;
|
|
27
28
|
knowledgeSources?: KnowledgeSource[];
|
|
28
29
|
updated?: string;
|
|
29
|
-
|
|
30
|
+
agent?: LabeledWithImage;
|
|
30
31
|
messageId?: string;
|
|
31
32
|
error?: string;
|
|
32
33
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatEntry.d.ts","sourceRoot":"","sources":["../../src/state/ChatEntry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ChatEntry.d.ts","sourceRoot":"","sources":["../../src/state/ChatEntry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAE1C,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAW,SAAQ,kBAAkB;IACpD;;OAEG;IACH,UAAU,CAAC,EAAE,SAAS,GAAG,WAAW,CAAC;CACtC;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,SAAS,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC;IAErC,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAEhB;AAED,KAAK,iBAAiB,GAAG,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAA;AAIvD,qBAAa,SAAS;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,SAAS,CAA0B;IAC3C,KAAK,EAAE,MAAM,IAAI,CAAA;IAEjB;;;;OAIG;gBACS,KAAK,EAAE,aAAa,EAAE,UAAU,UAAQ,EAAE,KAAK,aAAW;IAOtE,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM;IAStC,MAAM,CAAC,sBAAsB,CAAC,KAAK,EAAE,MAAM,IAAI;IAI/C,QAAQ,CAAC,KAAK,EAAE,aAAa;IAK7B,QAAQ;IAIR,MAAM;IAIN,WAAW;IAIX,QAAQ,CAAC,QAAQ,EAAE,iBAAiB;CAMrC"}
|
package/dist/state/ChatEntry.js
CHANGED
|
@@ -19,14 +19,14 @@ export class ChatEntry {
|
|
|
19
19
|
}
|
|
20
20
|
static createUserEntry(content) {
|
|
21
21
|
return new ChatEntry({
|
|
22
|
-
|
|
22
|
+
agentType: 'user',
|
|
23
23
|
type: 'text',
|
|
24
24
|
content,
|
|
25
25
|
updated: new Date().toISOString(),
|
|
26
26
|
});
|
|
27
27
|
}
|
|
28
28
|
static createStreamedBotEntry(abort) {
|
|
29
|
-
return new ChatEntry({
|
|
29
|
+
return new ChatEntry({ agentType: 'bot', type: 'md', content: '' }, true, abort);
|
|
30
30
|
}
|
|
31
31
|
setValue(value) {
|
|
32
32
|
this.value = value;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatEntry.js","sourceRoot":"","sources":["../../src/state/ChatEntry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;
|
|
1
|
+
{"version":3,"file":"ChatEntry.js","sourceRoot":"","sources":["../../src/state/ChatEntry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AA2C7B,IAAI,MAAM,GAAG,CAAC,CAAA;AAEd,MAAM,OAAO,SAAS;IACX,EAAE,CAAQ;IACX,KAAK,CAAe;IACpB,cAAc,CAAS;IACvB,SAAS,GAAwB,EAAE,CAAA;IAC3C,KAAK,CAAY;IAEjB;;;;OAIG;IACH,YAAY,KAAoB,EAAE,UAAU,GAAG,KAAK,EAAE,KAAK,GAAG,GAAG,EAAE,GAAE,CAAC;QACpE,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,CAAA;QAClB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,cAAc,GAAG,CAAC,UAAU,CAAA;QACjC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IACpB,CAAC;IAED,MAAM,CAAC,eAAe,CAAC,OAAe;QACpC,OAAO,IAAI,SAAS,CAAC;YACnB,SAAS,EAAE,MAAM;YACjB,IAAI,EAAE,MAAM;YACZ,OAAO;YACP,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SAClC,CAAC,CAAA;IACJ,CAAC;IAED,MAAM,CAAC,sBAAsB,CAAC,KAAiB;QAC7C,OAAO,IAAI,SAAS,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;IAClF,CAAC;IAED,QAAQ,CAAC,KAAoB;QAC3B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;IAC5C,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,cAAc,GAAG,IAAI,CAAA;IAC5B,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,cAAc,CAAA;IAC5B,CAAC;IAED,QAAQ,CAAC,QAA2B;QAClC,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACvD,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;QAChC,CAAC,CAAA;IACH,CAAC;CACF"}
|
|
@@ -1,12 +1,6 @@
|
|
|
1
1
|
import { ChatEntry } from './ChatEntry.js';
|
|
2
2
|
import { ObservableState } from './ObservableState.js';
|
|
3
|
-
|
|
4
|
-
id: string;
|
|
5
|
-
label: string;
|
|
6
|
-
}
|
|
7
|
-
interface LabeledWithImage extends Labeled {
|
|
8
|
-
image?: string;
|
|
9
|
-
}
|
|
3
|
+
import { Labeled, LabeledWithImage } from './types.js';
|
|
10
4
|
export interface ChatProperties {
|
|
11
5
|
label: string;
|
|
12
6
|
agent?: LabeledWithImage;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatState.d.ts","sourceRoot":"","sources":["../../src/state/ChatState.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"ChatState.d.ts","sourceRoot":"","sources":["../../src/state/ChatState.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAEnD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,gBAAgB,CAAC,EAAE,OAAO,EAAE,CAAC;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,KAAK,oBAAoB,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,IAAI,CAAA;AAEvD,MAAM,MAAM,kBAAkB,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,KAAK,OAAO,GAAG,SAAS,GAAG,IAAI,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC,CAAA;AAExI,UAAU,OAAO;IACf,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,cAAc,CAAC;IACxB,YAAY,CAAC,EAAE,kBAAkB,EAAE,CAAC;IACpC,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;CACvB;AAED,qBAAa,SAAU,SAAQ,eAAe,CAAC,cAAc,CAAC;IAC5D,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,iBAAiB,CAA6B;IACtD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;IAEnD;;;;;;;OAOG;gBACS,EAAE,EAAE,EAAE,OAAO,EAAE,OAAY,EAAE,YAAiB,EAAE,EAAE,OAAO;IAOrE,OAAO,CAAC,oBAAoB;YAId,eAAe;IAO7B,WAAW,CAAC,GAAG,OAAO,EAAE,SAAS,EAAE;IAOnC,UAAU,CAAC,QAAQ,SAAI;IAKvB,WAAW;IAIX,gBAAgB,CAAC,QAAQ,EAAE,oBAAoB;CAMhD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatState.js","sourceRoot":"","sources":["../../src/state/ChatState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAE9C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"ChatState.js","sourceRoot":"","sources":["../../src/state/ChatState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAE9C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAwBnD,MAAM,OAAO,SAAU,SAAQ,eAA+B;IACnD,EAAE,CAAQ;IACX,OAAO,CAAa;IACpB,iBAAiB,GAA2B,EAAE,CAAA;IACrC,YAAY,CAAsB;IAEnD;;;;;;;OAOG;IACH,YAAY,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,EAAE,YAAY,GAAG,EAAE,EAAW;QACnE,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;QACZ,IAAI,CAAC,YAAY,GAAG,YAAY,CAAA;QAChC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;IAEO,oBAAoB;QAC1B,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;IACtD,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,KAAgB;QAC5C,KAAK,MAAM,WAAW,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YAC5C,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;YAC7C,IAAI,MAAM,KAAK,KAAK;gBAAE,MAAK;QAC7B,CAAC;IACH,CAAC;IAED,WAAW,CAAC,GAAG,OAAoB;QACjC,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,OAAM;QAC3B,IAAI,CAAC,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,CAAA;QAC5C,IAAI,CAAC,oBAAoB,EAAE,CAAA;QAC3B,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAE,CAAC,CAAA;IACtC,CAAC;IAED,UAAU,CAAC,QAAQ,GAAG,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;QAChD,IAAI,CAAC,oBAAoB,EAAE,CAAA;IAC7B,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED,gBAAgB,CAAC,QAA8B;QAC7C,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACrC,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAA;QACxC,CAAC,CAAA;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/state/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAiB,SAAQ,OAAO;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/state/types.ts"],"names":[],"mappings":""}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import { LabeledWithImage } from '../../state/types.js';
|
|
1
2
|
interface Props {
|
|
2
|
-
|
|
3
|
+
agent?: LabeledWithImage;
|
|
3
4
|
}
|
|
4
|
-
export declare const AgentInfo: ({
|
|
5
|
+
export declare const AgentInfo: ({ agent }: Props) => import("react/jsx-runtime").JSX.Element;
|
|
5
6
|
export {};
|
|
6
7
|
//# sourceMappingURL=AgentInfo.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentInfo.d.ts","sourceRoot":"","sources":["../../../src/views/Chat/AgentInfo.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AgentInfo.d.ts","sourceRoot":"","sources":["../../../src/views/Chat/AgentInfo.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAEpD,UAAU,KAAK;IACb,KAAK,CAAC,EAAE,gBAAgB,CAAC;CAC1B;AAED,eAAO,MAAM,SAAS,cAAe,KAAK,4CAQzC,CAAA"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { Text } from '@citric/core';
|
|
3
3
|
import { MiniLogo } from '@stack-spot/portal-components/svg';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
export const AgentInfo = ({ agent }) => (_jsxs(_Fragment, { children: [agent?.image
|
|
5
|
+
? _jsx("img", { src: agent.image, className: "custom-agent-image" })
|
|
6
|
+
: _jsx("div", { className: "default-image-wrapper", children: _jsx(MiniLogo, { className: "agent-image" }) }), _jsx(Text, { appearance: "body2", children: agent?.label || 'Stackspot AI' })] }));
|
|
7
7
|
//# sourceMappingURL=AgentInfo.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentInfo.js","sourceRoot":"","sources":["../../../src/views/Chat/AgentInfo.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAA;
|
|
1
|
+
{"version":3,"file":"AgentInfo.js","sourceRoot":"","sources":["../../../src/views/Chat/AgentInfo.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAA;AAO5D,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,EAAE,KAAK,EAAS,EAAE,EAAE,CAAC,CAC7C,8BACG,KAAK,EAAE,KAAK;YACX,CAAC,CAAC,cAAK,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE,SAAS,EAAC,oBAAoB,GAAG;YAC1D,CAAC,CAAC,cAAK,SAAS,EAAC,uBAAuB,YAAC,KAAC,QAAQ,IAAC,SAAS,EAAC,aAAa,GAAG,GAAM,EAErF,KAAC,IAAI,IAAC,UAAU,EAAC,OAAO,YAAE,KAAK,EAAE,KAAK,IAAI,cAAc,GAAQ,IAC/D,CACJ,CAAA"}
|
|
@@ -15,7 +15,7 @@ export const ChatMessage = ({ message, username }) => {
|
|
|
15
15
|
const [liked, setLiked] = useState();
|
|
16
16
|
const entry = useChatEntry(message);
|
|
17
17
|
const dateFormatter = useDateFormatter();
|
|
18
|
-
const userInfo = entry.
|
|
18
|
+
const userInfo = entry.agentType === 'user' ? _jsx(Avatar, { size: "xs", children: username }) : _jsx(AgentInfo, { agent: entry.agent });
|
|
19
19
|
const date = new Date(entry.updated ?? '');
|
|
20
20
|
const shouldShowDate = entry.updated && !isNaN(date.getTime());
|
|
21
21
|
const ref = useRef(null);
|
|
@@ -51,7 +51,7 @@ export const ChatMessage = ({ message, username }) => {
|
|
|
51
51
|
dislike: () => feedback(false),
|
|
52
52
|
};
|
|
53
53
|
}, [entry.messageId, liked]);
|
|
54
|
-
return (entry.content || entry.error) && (_jsxs("li", { className: entry.
|
|
54
|
+
return (entry.content || entry.error) && (_jsxs("li", { className: entry.agentType, ref: ref, children: [_jsxs("div", { className: "chat-message", children: [_jsx("div", { className: "user-info", children: userInfo }), entry.content && _jsx("div", { className: "message-content", children: entry.type === 'md' ? _jsx(Markdown, { children: entry.content }) : _jsx("p", { className: "plain-text", children: entry.content }) })] }), entry.error && (_jsxs("div", { className: "error", children: [_jsx(IconBox, { size: "xs", children: _jsx(TimesCircle, {}) }), _jsx(Text, { appearance: "microtext1", children: entry.error })] })), !!entry.knowledgeSources?.length && _jsxs("div", { className: "ks-box", children: [_jsx(Text, { appearance: "microtext1", colorScheme: "light.700", children: "Knowledge Sources:" }), _jsx("ul", { children: entry.knowledgeSources.map(ks => (_jsx("li", { children: _jsx(Button, { size: "sm", colorScheme: "light", onClick: () => detailKS(ks), children: ks.name }) }, ks.slug))) })] }), _jsxs("div", { className: "message-footer", children: [entry.agentType === 'bot' && entry.messageId && !entry.error && _jsxs("div", { className: "message-actions", children: [_jsx(IconButton, { title: t.like, "aria-label": t.like, onClick: like, children: liked === true ? _jsx(LikeFill, {}) : _jsx(Like, {}) }), _jsx(IconButton, { title: t.dislike, "aria-label": t.dislike, onClick: dislike, children: liked === false ? _jsx(DislikeFill, {}) : _jsx(Dislike, {}) })] }), shouldShowDate && _jsx(Text, { appearance: "microtext1", className: "chat-date", children: dateFormatter.formatForChatMessage(date) })] })] }));
|
|
55
55
|
};
|
|
56
56
|
const dictionary = {
|
|
57
57
|
en: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatMessage.js","sourceRoot":"","sources":["../../../src/views/Chat/ChatMessage.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AACpD,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AACjF,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AACrD,OAAO,EAAc,YAAY,EAAE,MAAM,8BAA8B,CAAA;AACvE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAA;AACpD,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAE7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,2BAA2B,EAAE,MAAM,eAAe,CAAA;AAE3D,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,EAAE,OAAO,EAAE,QAAQ,EAA4C,EAAE,EAAE;IAC7F,MAAM,CAAC,GAAG,YAAY,CAAC,UAAU,CAAC,CAAA;IAClC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,EAAuB,CAAA;IACzD,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,CAAA;IACnC,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAA;IACxC,MAAM,QAAQ,GAAG,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"ChatMessage.js","sourceRoot":"","sources":["../../../src/views/Chat/ChatMessage.tsx"],"names":[],"mappings":"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"}
|
|
@@ -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,4OA+IpB,CAAA"}
|
|
@@ -75,7 +75,7 @@ export const ChatList = styled.ul `
|
|
|
75
75
|
flex-direction: column;
|
|
76
76
|
gap: 4px;
|
|
77
77
|
|
|
78
|
-
.
|
|
78
|
+
.default-image-wrapper {
|
|
79
79
|
width: 24px;
|
|
80
80
|
height: 24px;
|
|
81
81
|
border-radius: 4px;
|
|
@@ -89,6 +89,12 @@ export const ChatList = styled.ul `
|
|
|
89
89
|
height: 18px;
|
|
90
90
|
}
|
|
91
91
|
}
|
|
92
|
+
|
|
93
|
+
.custom-agent-image {
|
|
94
|
+
width: 24px;
|
|
95
|
+
height: 24px;
|
|
96
|
+
border-radius: 50%;
|
|
97
|
+
}
|
|
92
98
|
}
|
|
93
99
|
}
|
|
94
100
|
|
|
@@ -99,6 +105,7 @@ export const ChatList = styled.ul `
|
|
|
99
105
|
display: flex;
|
|
100
106
|
flex-direction: row;
|
|
101
107
|
gap: 8px;
|
|
108
|
+
align-items: center;
|
|
102
109
|
|
|
103
110
|
.message-content {
|
|
104
111
|
padding: 10px;
|
|
@@ -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
|
|
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8BA8BtB,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;wBAiB5B,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;CAiB7C,CAAA"}
|
|
@@ -1 +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;
|
|
1
|
+
{"version":3,"file":"HistoryItem.d.ts","sourceRoot":"","sources":["../../../src/views/ChatHistory/HistoryItem.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAA;AAOxE,OAAO,EAAa,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAQrE,eAAO,MAAM,WAAW,2BAA4B;IAAE,IAAI,EAAE,oBAAoB,CAAC;IAAC,YAAY,EAAE,kBAAkB,EAAE,CAAA;CAAE,mDAuHrH,CAAA"}
|
|
@@ -4,6 +4,7 @@ import { Check, Download, EllipsisHorizontal, Pencil, Trash } from '@citric/icon
|
|
|
4
4
|
import { IconButton, LoadingCircular } from '@citric/ui';
|
|
5
5
|
import { aiClient } from '@stack-spot/portal-network';
|
|
6
6
|
import { theme } from '@stack-spot/portal-theme';
|
|
7
|
+
import { last } from 'lodash';
|
|
7
8
|
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
8
9
|
import { OverlayMenu } from '../../components/OverlayMenu.js';
|
|
9
10
|
import { useWidget } from '../../context/hooks.js';
|
|
@@ -13,7 +14,7 @@ import { download } from '../../utils/download.js';
|
|
|
13
14
|
import { genericSourcesToKnowledgeSources } from '../../utils/knowledge-source.js';
|
|
14
15
|
import { useHistoryDictionary } from './dictionary.js';
|
|
15
16
|
import { HistoryItemBox } from './styled.js';
|
|
16
|
-
import { findStack, findWorkspace } from './utils.js';
|
|
17
|
+
import { findStack, findWorkspace, getAllAgents } from './utils.js';
|
|
17
18
|
export const HistoryItem = ({ item, interceptors }) => {
|
|
18
19
|
const t = useHistoryDictionary();
|
|
19
20
|
const [isLoading, setLoading] = useState(false);
|
|
@@ -31,17 +32,19 @@ export const HistoryItem = ({ item, interceptors }) => {
|
|
|
31
32
|
setRenaming(true);
|
|
32
33
|
}, []);
|
|
33
34
|
async function onSubmitRename() {
|
|
35
|
+
const prev = title;
|
|
34
36
|
setRenaming(false);
|
|
37
|
+
setTitle(renamed);
|
|
35
38
|
if (!renamed || renamed === item.title)
|
|
36
39
|
return;
|
|
37
40
|
try {
|
|
38
41
|
await aiClient.renameChat.mutate({ conversationId: item.id, conversationUpdateTitleRequest: { title: renamed } });
|
|
39
|
-
setTitle(renamed);
|
|
40
42
|
aiClient.chats.invalidate();
|
|
41
43
|
}
|
|
42
44
|
catch (error) {
|
|
43
45
|
// eslint-disable-next-line no-console
|
|
44
46
|
console.error(error);
|
|
47
|
+
setTitle(prev);
|
|
45
48
|
setRenaming(true);
|
|
46
49
|
}
|
|
47
50
|
}
|
|
@@ -76,18 +79,22 @@ export const HistoryItem = ({ item, interceptors }) => {
|
|
|
76
79
|
setLoading(true);
|
|
77
80
|
try {
|
|
78
81
|
const chat = await aiClient.chat.query({ conversationId: item.id });
|
|
79
|
-
const [stack, workspace] = await Promise.all([
|
|
82
|
+
const [stack, workspace, agents] = await Promise.all([
|
|
83
|
+
findStack(chat.ai_stack_id),
|
|
84
|
+
findWorkspace(chat.workspace_id),
|
|
85
|
+
getAllAgents(),
|
|
86
|
+
]);
|
|
80
87
|
widget.chatTabs.add(new ChatState({
|
|
81
88
|
id: chat.id,
|
|
82
|
-
initial: { label: chat.title, stack, workspace },
|
|
89
|
+
initial: { label: chat.title, stack, workspace, agent: agents.find(a => a.id === last(chat.history)?.custom_agent?.id) },
|
|
83
90
|
interceptors,
|
|
84
91
|
entries: chat.history?.map(item => new ChatEntry({
|
|
85
|
-
|
|
92
|
+
agentType: item.agent === 'USER' ? 'user' : 'bot',
|
|
86
93
|
content: item.content,
|
|
87
94
|
type: item.agent === 'USER' ? 'text' : 'md',
|
|
88
|
-
|
|
95
|
+
agent: agents.find(a => a.id === item.custom_agent?.id),
|
|
89
96
|
messageId: item.message_id,
|
|
90
|
-
knowledgeSources: genericSourcesToKnowledgeSources(item.sources),
|
|
97
|
+
knowledgeSources: item.agent === 'USER' ? undefined : genericSourcesToKnowledgeSources(item.sources),
|
|
91
98
|
updated: item.updated,
|
|
92
99
|
})),
|
|
93
100
|
}));
|
|
@@ -104,6 +111,6 @@ export const HistoryItem = ({ item, interceptors }) => {
|
|
|
104
111
|
{ label: t.download, onClick: onDownload, icon: _jsx(Download, {}) },
|
|
105
112
|
{ label: t.delete, onClick: onDelete, icon: _jsx(Trash, {}), color: theme.color.danger[500] },
|
|
106
113
|
];
|
|
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, {}) }) })] })) }));
|
|
114
|
+
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), onKeyDown: e => e.key === 'Enter' && onSubmitRename() }), _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
115
|
};
|
|
109
116
|
//# sourceMappingURL=HistoryItem.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HistoryItem.js","sourceRoot":"","sources":["../../../src/views/ChatHistory/HistoryItem.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAClF,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AAErD,OAAO,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAA;AAChD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,EAAE,SAAS,EAAsB,MAAM,uBAAuB,CAAA;AAErE,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAC/C,OAAO,EAAE,gCAAgC,EAAE,MAAM,8BAA8B,CAAA;AAC/E,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AACzC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"HistoryItem.js","sourceRoot":"","sources":["../../../src/views/ChatHistory/HistoryItem.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ChatProperties } from '../../state/ChatState.js';
|
|
2
2
|
export declare function findStack(id: string | null): Promise<ChatProperties['stack'] | undefined>;
|
|
3
3
|
export declare function findWorkspace(id: string | null): Promise<ChatProperties['workspace'] | undefined>;
|
|
4
|
+
export declare function getAllAgents(): Promise<Required<ChatProperties>['agent'][]>;
|
|
4
5
|
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -1 +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"}
|
|
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;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CASjF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { aiClient, workspaceClient } from '@stack-spot/portal-network';
|
|
1
|
+
import { agentClient, aiClient, workspaceClient } from '@stack-spot/portal-network';
|
|
2
2
|
export async function findStack(id) {
|
|
3
3
|
if (!id)
|
|
4
4
|
return;
|
|
@@ -25,4 +25,15 @@ export async function findWorkspace(id) {
|
|
|
25
25
|
return { id, label: id };
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
|
+
export async function getAllAgents() {
|
|
29
|
+
try {
|
|
30
|
+
const [agents, publicAgents] = await Promise.all([agentClient.agents.query({}), agentClient.publicAgents.query({})]);
|
|
31
|
+
return [...agents, ...publicAgents].map(a => ({ id: a.id, label: a.name, image: a.avatar }));
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
// eslint-disable-next-line no-console
|
|
35
|
+
console.error(error);
|
|
36
|
+
return [];
|
|
37
|
+
}
|
|
38
|
+
}
|
|
28
39
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +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;
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/views/ChatHistory/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAGnF,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;AAED,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,IAAI,CAAC;QACH,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACpH,OAAO,CAAC,GAAG,MAAM,EAAE,GAAG,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;IAC9F,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,sCAAsC;QACtC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QACpB,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const useMessageInputDictionary: () => Record<"
|
|
1
|
+
export declare const useMessageInputDictionary: () => Record<"stack" | "workspace" | "agent" | "cancel" | "placeholder" | "send" | "collapse" | "knowledgeSource" | "expand" | "removeConfig" | "removeStack" | "removeWorkspace" | "removeKS", string>;
|
|
2
2
|
//# sourceMappingURL=dictionary.d.ts.map
|
package/package.json
CHANGED
|
@@ -63,7 +63,7 @@ export const StackspotAIWidget = (
|
|
|
63
63
|
<KSDocument />
|
|
64
64
|
<Agents />
|
|
65
65
|
<ChatHistory interceptors={interceptors} />
|
|
66
|
-
|
|
66
|
+
<div className="chat-right-panel" ref={rightPanelRef}><RightPanel /></div>
|
|
67
67
|
</div>
|
|
68
68
|
</RightPanelProvider>
|
|
69
69
|
</TooltipProvider>
|
|
@@ -3,8 +3,8 @@ import { ChatState } from '../state/ChatState'
|
|
|
3
3
|
|
|
4
4
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
5
5
|
export function quickCommandInterceptor(entry: ChatEntry, _chat: ChatState) {
|
|
6
|
-
const {
|
|
7
|
-
if (
|
|
6
|
+
const { agentType, content } = entry.getValue()
|
|
7
|
+
if (agentType !== 'user') return
|
|
8
8
|
if (content.startsWith('/')) {
|
|
9
9
|
alert('Quick commands are not yet supported!') /* todo */
|
|
10
10
|
return false // by returning false, the next interceptor are not run. i.e. the message is not sent to the AI agent.
|
|
@@ -5,8 +5,8 @@ import { buildConversationContext } from '../utils/chat'
|
|
|
5
5
|
import { genericSourcesToKnowledgeSources } from '../utils/knowledge-source'
|
|
6
6
|
|
|
7
7
|
export async function sendMessageInterceptor(entry: ChatEntry, chat: ChatState) {
|
|
8
|
-
const {
|
|
9
|
-
if (
|
|
8
|
+
const { agentType, content } = entry.getValue()
|
|
9
|
+
if (agentType !== 'user') return
|
|
10
10
|
const context = buildConversationContext(chat)
|
|
11
11
|
chat.set('isLoading', true)
|
|
12
12
|
// if this is the first message, let's rename the chat.
|
|
@@ -22,12 +22,13 @@ export async function sendMessageInterceptor(entry: ChatEntry, chat: ChatState)
|
|
|
22
22
|
knowledgeSources = genericSourcesToKnowledgeSources(value.sources)
|
|
23
23
|
}
|
|
24
24
|
botEntry.setValue({
|
|
25
|
-
|
|
25
|
+
agentType: 'bot',
|
|
26
26
|
type: 'md',
|
|
27
27
|
content: value.answer ?? '',
|
|
28
28
|
messageId: value.message_id ?? undefined,
|
|
29
29
|
knowledgeSources,
|
|
30
30
|
updated: new Date().toISOString(),
|
|
31
|
+
agent: chat.get('agent'),
|
|
31
32
|
})
|
|
32
33
|
})
|
|
33
34
|
try {
|
|
@@ -3,17 +3,30 @@ import { ShowOptions } from './types'
|
|
|
3
3
|
|
|
4
4
|
const MARGIN_TO_CORNERS_PX = 10
|
|
5
5
|
|
|
6
|
+
function isRelative(element: HTMLElement) {
|
|
7
|
+
return ['relative', 'absolute', 'fixed'].includes(element.computedStyleMap().get('position')?.toString() ?? '')
|
|
8
|
+
}
|
|
9
|
+
|
|
6
10
|
export class TooltipAPI {
|
|
7
11
|
private tooltipRef: React.RefObject<HTMLDivElement>
|
|
8
12
|
private setContent: React.Dispatch<React.SetStateAction<React.ReactNode>>
|
|
9
13
|
private hideTimeoutId: number | undefined
|
|
10
14
|
private clickListener: ((e: MouseEvent) => void) | undefined
|
|
15
|
+
private relativeTo: HTMLElement | undefined
|
|
11
16
|
|
|
12
17
|
constructor(tooltipRef: React.RefObject<HTMLDivElement>, setContent: React.Dispatch<React.SetStateAction<React.ReactNode>>) {
|
|
13
18
|
this.tooltipRef = tooltipRef
|
|
14
19
|
this.setContent = setContent
|
|
15
20
|
}
|
|
16
21
|
|
|
22
|
+
private computeRelativeTo() {
|
|
23
|
+
if (this.relativeTo) return
|
|
24
|
+
this.relativeTo = this.tooltipRef.current?.parentElement as HTMLElement
|
|
25
|
+
while (this.relativeTo && this.relativeTo !== document.body && !isRelative(this.relativeTo)) {
|
|
26
|
+
this.relativeTo = this.relativeTo.parentElement as HTMLElement
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
17
30
|
show({ content, anchor, position = 'bottom', hideOnClickOutside }: ShowOptions): void {
|
|
18
31
|
window.clearTimeout(this.hideTimeoutId)
|
|
19
32
|
this.hideTimeoutId = undefined
|
|
@@ -21,21 +34,26 @@ export class TooltipAPI {
|
|
|
21
34
|
this.setContent(content)
|
|
22
35
|
setTimeout(() => {
|
|
23
36
|
if (!this.tooltipRef.current) return
|
|
24
|
-
const
|
|
37
|
+
const anchorRect = anchor.getClientRects()[0]
|
|
25
38
|
this.tooltipRef.current.classList.add('visible')
|
|
26
39
|
const tooltipWidth = this.tooltipRef.current.clientWidth
|
|
27
40
|
const tooltipHeight = this.tooltipRef.current.clientHeight
|
|
28
41
|
let top = 0
|
|
29
42
|
let left = 0
|
|
30
43
|
if (position === 'left' || position === 'right') {
|
|
31
|
-
top =
|
|
32
|
-
if (position === 'left') left =
|
|
33
|
-
else left =
|
|
44
|
+
top = anchorRect.top + anchorRect.height / 2 - tooltipHeight / 2
|
|
45
|
+
if (position === 'left') left = anchorRect.left - tooltipWidth
|
|
46
|
+
else left = anchorRect.left + anchorRect.width
|
|
34
47
|
} else {
|
|
35
|
-
left =
|
|
36
|
-
if (position === 'top') top =
|
|
37
|
-
else top =
|
|
48
|
+
left = anchorRect.left + anchorRect.width / 2 - tooltipWidth / 2
|
|
49
|
+
if (position === 'top') top = anchorRect.top - tooltipHeight
|
|
50
|
+
else top = anchorRect.top + anchorRect.height
|
|
38
51
|
}
|
|
52
|
+
// takes the parent the tooltip is positioned relative to into consideration
|
|
53
|
+
this.computeRelativeTo()
|
|
54
|
+
const relativeRect = this.relativeTo?.getClientRects()[0] ?? { top: 0, left: 0 }
|
|
55
|
+
top -= relativeRect.top
|
|
56
|
+
left -= relativeRect.left
|
|
39
57
|
// adjusts positions in order to avoid overflowing the window and leaving a margin to the corners
|
|
40
58
|
if (top <= 0) top += MARGIN_TO_CORNERS_PX
|
|
41
59
|
else if (top + tooltipHeight >= document.body.clientHeight - MARGIN_TO_CORNERS_PX) {
|
|
@@ -12,7 +12,7 @@ export const TooltipProvider = ({ children }: Required<WithChildren>) => {
|
|
|
12
12
|
return (
|
|
13
13
|
<Context.Provider value={api}>
|
|
14
14
|
{children}
|
|
15
|
-
<TooltipBox ref={ref}
|
|
15
|
+
<TooltipBox ref={ref}>{content}</TooltipBox>
|
|
16
16
|
</Context.Provider>
|
|
17
17
|
)
|
|
18
18
|
}
|
package/src/layout.css
CHANGED
package/src/state/ChatEntry.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { pull } from 'lodash'
|
|
2
|
+
import { LabeledWithImage } from './types'
|
|
2
3
|
|
|
3
4
|
export interface SerializableAction {
|
|
4
5
|
title: string,
|
|
@@ -25,14 +26,14 @@ export interface KnowledgeSource {
|
|
|
25
26
|
|
|
26
27
|
export interface TextChatEntry {
|
|
27
28
|
type: 'text' | 'md',
|
|
28
|
-
|
|
29
|
+
agentType: 'bot' | 'user' | 'system',
|
|
29
30
|
// image?: string,
|
|
30
31
|
actions?: ChatAction[],
|
|
31
32
|
subtitle?: string,
|
|
32
33
|
content: string,
|
|
33
34
|
knowledgeSources?: KnowledgeSource[],
|
|
34
35
|
updated?: string,
|
|
35
|
-
|
|
36
|
+
agent?: LabeledWithImage,
|
|
36
37
|
messageId?: string,
|
|
37
38
|
error?: string,
|
|
38
39
|
// customInput?: CustomInputResponse,
|
|
@@ -63,7 +64,7 @@ export class ChatEntry {
|
|
|
63
64
|
|
|
64
65
|
static createUserEntry(content: string) {
|
|
65
66
|
return new ChatEntry({
|
|
66
|
-
|
|
67
|
+
agentType: 'user',
|
|
67
68
|
type: 'text',
|
|
68
69
|
content,
|
|
69
70
|
updated: new Date().toISOString(),
|
|
@@ -71,7 +72,7 @@ export class ChatEntry {
|
|
|
71
72
|
}
|
|
72
73
|
|
|
73
74
|
static createStreamedBotEntry(abort: () => void) {
|
|
74
|
-
return new ChatEntry({
|
|
75
|
+
return new ChatEntry({ agentType: 'bot', type: 'md', content: '' }, true, abort)
|
|
75
76
|
}
|
|
76
77
|
|
|
77
78
|
setValue(value: TextChatEntry) {
|
package/src/state/ChatState.ts
CHANGED
|
@@ -1,15 +1,7 @@
|
|
|
1
1
|
import { dropRight, last, pull } from 'lodash'
|
|
2
2
|
import { ChatEntry } from './ChatEntry'
|
|
3
3
|
import { ObservableState } from './ObservableState'
|
|
4
|
-
|
|
5
|
-
interface Labeled {
|
|
6
|
-
id: string,
|
|
7
|
-
label: string,
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
interface LabeledWithImage extends Labeled {
|
|
11
|
-
image?: string,
|
|
12
|
-
}
|
|
4
|
+
import { Labeled, LabeledWithImage } from './types'
|
|
13
5
|
|
|
14
6
|
export interface ChatProperties {
|
|
15
7
|
label: string,
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { Text } from '@citric/core'
|
|
2
2
|
import { MiniLogo } from '@stack-spot/portal-components/svg'
|
|
3
|
+
import { LabeledWithImage } from '../../state/types'
|
|
3
4
|
|
|
4
5
|
interface Props {
|
|
5
|
-
|
|
6
|
+
agent?: LabeledWithImage,
|
|
6
7
|
}
|
|
7
8
|
|
|
8
|
-
|
|
9
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
10
|
-
export const AgentInfo = ({ agentId: _agentId }: Props) => (
|
|
9
|
+
export const AgentInfo = ({ agent }: Props) => (
|
|
11
10
|
<>
|
|
12
|
-
|
|
13
|
-
<
|
|
14
|
-
|
|
15
|
-
|
|
11
|
+
{agent?.image
|
|
12
|
+
? <img src={agent.image} className="custom-agent-image" />
|
|
13
|
+
: <div className="default-image-wrapper"><MiniLogo className="agent-image" /></div>
|
|
14
|
+
}
|
|
15
|
+
<Text appearance="body2">{agent?.label || 'Stackspot AI'}</Text>
|
|
16
16
|
</>
|
|
17
17
|
)
|
|
@@ -16,7 +16,7 @@ export const ChatMessage = ({ message, username }: { message: ChatEntry, usernam
|
|
|
16
16
|
const [liked, setLiked] = useState<boolean | undefined>()
|
|
17
17
|
const entry = useChatEntry(message)
|
|
18
18
|
const dateFormatter = useDateFormatter()
|
|
19
|
-
const userInfo = entry.
|
|
19
|
+
const userInfo = entry.agentType === 'user' ? <Avatar size="xs">{username}</Avatar> : <AgentInfo agent={entry.agent} />
|
|
20
20
|
const date = new Date(entry.updated ?? '')
|
|
21
21
|
const shouldShowDate = entry.updated && !isNaN(date.getTime())
|
|
22
22
|
const ref = useRef<HTMLLIElement>(null)
|
|
@@ -55,7 +55,7 @@ export const ChatMessage = ({ message, username }: { message: ChatEntry, usernam
|
|
|
55
55
|
}, [entry.messageId, liked])
|
|
56
56
|
|
|
57
57
|
return (entry.content || entry.error) && (
|
|
58
|
-
<li className={entry.
|
|
58
|
+
<li className={entry.agentType} ref={ref}>
|
|
59
59
|
<div className="chat-message">
|
|
60
60
|
<div className="user-info">{userInfo}</div>
|
|
61
61
|
{entry.content && <div className="message-content">
|
|
@@ -77,7 +77,7 @@ export const ChatMessage = ({ message, username }: { message: ChatEntry, usernam
|
|
|
77
77
|
))}</ul>
|
|
78
78
|
</div>}
|
|
79
79
|
<div className="message-footer">
|
|
80
|
-
{entry.
|
|
80
|
+
{entry.agentType === 'bot' && entry.messageId && !entry.error && <div className="message-actions">
|
|
81
81
|
<IconButton title={t.like} aria-label={t.like} onClick={like}>
|
|
82
82
|
{liked === true ? <LikeFill /> : <Like />}
|
|
83
83
|
</IconButton>
|
package/src/views/Chat/styled.ts
CHANGED
|
@@ -76,7 +76,7 @@ export const ChatList = styled.ul`
|
|
|
76
76
|
flex-direction: column;
|
|
77
77
|
gap: 4px;
|
|
78
78
|
|
|
79
|
-
.
|
|
79
|
+
.default-image-wrapper {
|
|
80
80
|
width: 24px;
|
|
81
81
|
height: 24px;
|
|
82
82
|
border-radius: 4px;
|
|
@@ -90,6 +90,12 @@ export const ChatList = styled.ul`
|
|
|
90
90
|
height: 18px;
|
|
91
91
|
}
|
|
92
92
|
}
|
|
93
|
+
|
|
94
|
+
.custom-agent-image {
|
|
95
|
+
width: 24px;
|
|
96
|
+
height: 24px;
|
|
97
|
+
border-radius: 50%;
|
|
98
|
+
}
|
|
93
99
|
}
|
|
94
100
|
}
|
|
95
101
|
|
|
@@ -100,6 +106,7 @@ export const ChatList = styled.ul`
|
|
|
100
106
|
display: flex;
|
|
101
107
|
flex-direction: row;
|
|
102
108
|
gap: 8px;
|
|
109
|
+
align-items: center;
|
|
103
110
|
|
|
104
111
|
.message-content {
|
|
105
112
|
padding: 10px;
|
|
@@ -4,6 +4,7 @@ import { IconButton, LoadingCircular } from '@citric/ui'
|
|
|
4
4
|
import { aiClient } from '@stack-spot/portal-network'
|
|
5
5
|
import { ConversationResponse } from '@stack-spot/portal-network/api/ai'
|
|
6
6
|
import { theme } from '@stack-spot/portal-theme'
|
|
7
|
+
import { last } from 'lodash'
|
|
7
8
|
import { useCallback, useEffect, useRef, useState } from 'react'
|
|
8
9
|
import { OverlayMenu } from '../../components/OverlayMenu'
|
|
9
10
|
import { useWidget } from '../../context/hooks'
|
|
@@ -14,7 +15,7 @@ import { download } from '../../utils/download'
|
|
|
14
15
|
import { genericSourcesToKnowledgeSources } from '../../utils/knowledge-source'
|
|
15
16
|
import { useHistoryDictionary } from './dictionary'
|
|
16
17
|
import { HistoryItemBox } from './styled'
|
|
17
|
-
import { findStack, findWorkspace } from './utils'
|
|
18
|
+
import { findStack, findWorkspace, getAllAgents } from './utils'
|
|
18
19
|
|
|
19
20
|
export const HistoryItem = ({ item, interceptors }: { item: ConversationResponse, interceptors: MessageInterceptor[] }) => {
|
|
20
21
|
const t = useHistoryDictionary()
|
|
@@ -35,15 +36,17 @@ export const HistoryItem = ({ item, interceptors }: { item: ConversationResponse
|
|
|
35
36
|
}, [])
|
|
36
37
|
|
|
37
38
|
async function onSubmitRename() {
|
|
39
|
+
const prev = title
|
|
38
40
|
setRenaming(false)
|
|
41
|
+
setTitle(renamed)
|
|
39
42
|
if (!renamed || renamed === item.title) return
|
|
40
43
|
try {
|
|
41
44
|
await aiClient.renameChat.mutate({ conversationId: item.id, conversationUpdateTitleRequest: { title: renamed } })
|
|
42
|
-
setTitle(renamed)
|
|
43
45
|
aiClient.chats.invalidate()
|
|
44
46
|
} catch (error) {
|
|
45
47
|
// eslint-disable-next-line no-console
|
|
46
48
|
console.error(error)
|
|
49
|
+
setTitle(prev)
|
|
47
50
|
setRenaming(true)
|
|
48
51
|
}
|
|
49
52
|
}
|
|
@@ -78,18 +81,22 @@ export const HistoryItem = ({ item, interceptors }: { item: ConversationResponse
|
|
|
78
81
|
setLoading(true)
|
|
79
82
|
try {
|
|
80
83
|
const chat = await aiClient.chat.query({ conversationId: item.id })
|
|
81
|
-
const [stack, workspace] = await Promise.all([
|
|
84
|
+
const [stack, workspace, agents] = await Promise.all([
|
|
85
|
+
findStack(chat.ai_stack_id),
|
|
86
|
+
findWorkspace(chat.workspace_id),
|
|
87
|
+
getAllAgents(),
|
|
88
|
+
])
|
|
82
89
|
widget.chatTabs.add(new ChatState({
|
|
83
90
|
id: chat.id,
|
|
84
|
-
initial: { label: chat.title, stack, workspace },
|
|
91
|
+
initial: { label: chat.title, stack, workspace, agent: agents.find(a => a.id === last(chat.history)?.custom_agent?.id) },
|
|
85
92
|
interceptors,
|
|
86
93
|
entries: chat.history?.map(item => new ChatEntry({
|
|
87
|
-
|
|
94
|
+
agentType: item.agent === 'USER' ? 'user' : 'bot',
|
|
88
95
|
content: item.content,
|
|
89
96
|
type: item.agent === 'USER' ? 'text' : 'md',
|
|
90
|
-
|
|
97
|
+
agent: agents.find(a => a.id === item.custom_agent?.id),
|
|
91
98
|
messageId: item.message_id,
|
|
92
|
-
knowledgeSources: genericSourcesToKnowledgeSources(item.sources),
|
|
99
|
+
knowledgeSources: item.agent === 'USER' ? undefined : genericSourcesToKnowledgeSources(item.sources),
|
|
93
100
|
updated: item.updated,
|
|
94
101
|
})),
|
|
95
102
|
}))
|
|
@@ -111,7 +118,12 @@ export const HistoryItem = ({ item, interceptors }: { item: ConversationResponse
|
|
|
111
118
|
<HistoryItemBox className={isLoading ? 'loading' : ''}>
|
|
112
119
|
{isRenaming ? (
|
|
113
120
|
<>
|
|
114
|
-
<Input
|
|
121
|
+
<Input
|
|
122
|
+
ref={renameInput}
|
|
123
|
+
value={renamed}
|
|
124
|
+
onChange={e => setRenamed(e.target.value)}
|
|
125
|
+
onKeyDown={e => e.key === 'Enter' && onSubmitRename()}
|
|
126
|
+
/>
|
|
115
127
|
<IconButton onClick={onSubmitRename}><Check /></IconButton>
|
|
116
128
|
</>
|
|
117
129
|
) : (
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { aiClient, workspaceClient } from '@stack-spot/portal-network'
|
|
1
|
+
import { agentClient, aiClient, workspaceClient } from '@stack-spot/portal-network'
|
|
2
2
|
import { ChatProperties } from '../../state/ChatState'
|
|
3
3
|
|
|
4
4
|
export async function findStack(id: string | null): Promise<ChatProperties['stack'] | undefined> {
|
|
@@ -24,3 +24,14 @@ export async function findWorkspace(id: string | null): Promise<ChatProperties['
|
|
|
24
24
|
return { id, label: id }
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
|
+
|
|
28
|
+
export async function getAllAgents(): Promise<Required<ChatProperties>['agent'][]> {
|
|
29
|
+
try {
|
|
30
|
+
const [agents, publicAgents] = await Promise.all([agentClient.agents.query({}), agentClient.publicAgents.query({})])
|
|
31
|
+
return [...agents, ...publicAgents].map(a => ({ id: a.id, label: a.name, image: a.avatar }))
|
|
32
|
+
} catch (error) {
|
|
33
|
+
// eslint-disable-next-line no-console
|
|
34
|
+
console.error(error)
|
|
35
|
+
return []
|
|
36
|
+
}
|
|
37
|
+
}
|