@stack-spot/ai-chat-widget 1.7.1 → 1.8.2
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/CHANGELOG.md +14 -0
- package/dist/app-metadata.json +2 -2
- package/dist/views/MessageInput/AgentSelector.d.ts.map +1 -1
- package/dist/views/MessageInput/AgentSelector.js +1 -1
- package/dist/views/MessageInput/AgentSelector.js.map +1 -1
- package/dist/views/MessageInput/QuickCommandSelector.d.ts.map +1 -1
- package/dist/views/MessageInput/QuickCommandSelector.js +1 -1
- package/dist/views/MessageInput/QuickCommandSelector.js.map +1 -1
- package/dist/views/MessageInput/chat-entry-history.d.ts +11 -0
- package/dist/views/MessageInput/chat-entry-history.d.ts.map +1 -0
- package/dist/views/MessageInput/chat-entry-history.js +71 -0
- package/dist/views/MessageInput/chat-entry-history.js.map +1 -0
- package/dist/views/MessageInput/index.d.ts.map +1 -1
- package/dist/views/MessageInput/index.js +5 -2
- package/dist/views/MessageInput/index.js.map +1 -1
- package/package.json +1 -1
- package/src/app-metadata.json +2 -2
- package/src/views/MessageInput/AgentSelector.tsx +1 -3
- package/src/views/MessageInput/QuickCommandSelector.tsx +1 -2
- package/src/views/MessageInput/chat-entry-history.ts +88 -0
- package/src/views/MessageInput/index.tsx +7 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [1.7.2](https://github.com/stack-spot/portal-ai-chat-widget/compare/ai-chat-widget@v1.7.1...ai-chat-widget@v1.7.2) (2025-02-13)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
* bug invoke agent multiple tabs ([#57](https://github.com/stack-spot/portal-ai-chat-widget/issues/57)) ([8a212aa](https://github.com/stack-spot/portal-ai-chat-widget/commit/8a212aac15b4aa6073bf93e0760a8ccb141ba7d4))
|
|
9
|
+
|
|
10
|
+
## [1.7.1](https://github.com/stack-spot/portal-ai-chat-widget/compare/ai-chat-widget@v1.7.0...ai-chat-widget@v1.7.1) (2025-02-13)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### Bug Fixes
|
|
14
|
+
|
|
15
|
+
* bug invoke agent multiple tabs ([#55](https://github.com/stack-spot/portal-ai-chat-widget/issues/55)) ([c872161](https://github.com/stack-spot/portal-ai-chat-widget/commit/c87216184669685d18d3ce237742e9c4b9303b89))
|
|
16
|
+
|
|
3
17
|
## [1.7.0](https://github.com/stack-spot/portal-ai-chat-widget/compare/ai-chat-widget@v1.6.0...ai-chat-widget@v1.7.0) (2025-02-06)
|
|
4
18
|
|
|
5
19
|
|
package/dist/app-metadata.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stack-spot/ai-chat-widget",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"date": "
|
|
3
|
+
"version": "1.8.2",
|
|
4
|
+
"date": "Thu Mar 13 2025 09:51:45 GMT-0300 (Brasilia Standard Time)",
|
|
5
5
|
"dependencies": [
|
|
6
6
|
{
|
|
7
7
|
"name": "@stack-spot/app-metadata",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentSelector.d.ts","sourceRoot":"","sources":["../../../src/views/MessageInput/AgentSelector.tsx"],"names":[],"mappings":"AAsBA,eAAO,MAAM,aAAa,iBAAkB;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,mBAAmB,GAAG,gBAAgB,CAAC,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"AgentSelector.d.ts","sourceRoot":"","sources":["../../../src/views/MessageInput/AgentSelector.tsx"],"names":[],"mappings":"AAsBA,eAAO,MAAM,aAAa,iBAAkB;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,mBAAmB,GAAG,gBAAgB,CAAC,CAAA;CAAE,4CAiDhH,CAAA"}
|
|
@@ -29,7 +29,7 @@ export const AgentSelector = ({ inputRef }) => {
|
|
|
29
29
|
return;
|
|
30
30
|
inputRef.current.value = newValue;
|
|
31
31
|
inputRef.current.focus();
|
|
32
|
-
}, []);
|
|
32
|
+
}, [chat, inputRef]);
|
|
33
33
|
const getAgents = () => {
|
|
34
34
|
const agents = agentClient.agents.useQuery({});
|
|
35
35
|
const publicAgents = agentClient.publicAgents.useQuery({});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentSelector.js","sourceRoot":"","sources":["../../../src/views/MessageInput/AgentSelector.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAA;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAA;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AAExD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAA;AACpD,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC,MAAM,kBAAkB,GAAG,cAAc,CAAA;AAEzC,MAAM,kBAAkB,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,KAAK,kBAAkB,CAAA;AAExE,MAAM,YAAY,GAAG;IACnB,EAAE,EAAE,EAAE;IACN,IAAI,EAAE,cAAc;IACpB,IAAI,EAAE,kBAAkB;IACxB,gBAAgB,EAAE,SAAS;CACX,CAAA;AAElB,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,EAAE,QAAQ,EAAyE,EAAE,EAAE;IACnH,MAAM,IAAI,GAAG,cAAc,EAAE,CAAA;IAC7B,MAAM,cAAc,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC,KAAK,CAAA;IAC5D,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,KAAoB,EAAE,EAAE;QACxD,MAAM,QAAQ,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,CAAA;QACjC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,SAAS,CAAC,CAAA;QAClC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC;YAC9C,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAC1G,CAAA;QAED,IAAI,CAAC,QAAQ,CAAC,OAAO;YAAE,OAAM;QAC7B,QAAQ,CAAC,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAA;QACjC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,CAAA;IAC1B,CAAC,EAAE,EAAE,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"AgentSelector.js","sourceRoot":"","sources":["../../../src/views/MessageInput/AgentSelector.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QuickCommandSelector.d.ts","sourceRoot":"","sources":["../../../src/views/MessageInput/QuickCommandSelector.tsx"],"names":[],"mappings":"AAQA,eAAO,MAAM,oBAAoB,iBAAkB;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,mBAAmB,GAAG,gBAAgB,CAAC,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"QuickCommandSelector.d.ts","sourceRoot":"","sources":["../../../src/views/MessageInput/QuickCommandSelector.tsx"],"names":[],"mappings":"AAQA,eAAO,MAAM,oBAAoB,iBAAkB;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,mBAAmB,GAAG,gBAAgB,CAAC,CAAA;CAAE,4CAkCvH,CAAA"}
|
|
@@ -15,7 +15,7 @@ export const QuickCommandSelector = ({ inputRef }) => {
|
|
|
15
15
|
return;
|
|
16
16
|
inputRef.current.value = newValue;
|
|
17
17
|
inputRef.current.focus();
|
|
18
|
-
}, []);
|
|
18
|
+
}, [chat, inputRef]);
|
|
19
19
|
const QuickCommandItem = ({ slug, description }) => _jsxs(_Fragment, { children: [_jsxs("p", { className: "selector-title", children: ["/", slug.toUpperCase()] }), _jsx("p", { className: "selector-description", children: description })] });
|
|
20
20
|
return _jsx(Selector, { inputRef: inputRef, selectorConfig: {
|
|
21
21
|
resourceName: 'Quick Command',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QuickCommandSelector.js","sourceRoot":"","sources":["../../../src/views/MessageInput/QuickCommandSelector.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AAErD,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAA;AACpD,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAE/C,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,EAAE,QAAQ,EAAyE,EAAE,EAAE;IAC1H,MAAM,IAAI,GAAG,cAAc,EAAE,CAAA;IAC7B,MAAM,qBAAqB,GAAI,mBAAmB,CAAC,UAAU,CAAC,CAAC,aAAa,CAAA;IAE5E,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,EAA4B,EAAE,EAAE;QAChE,MAAM,QAAQ,GAAG,IAAI,EAAE,CAAC,IAAI,EAAE,CAAA;QAC9B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAA;QAEjC,IAAI,CAAC,QAAQ,CAAC,OAAO;YAAE,OAAM;QAC7B,QAAQ,CAAC,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAA;QACjC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,CAAA;IAC1B,CAAC,EAAE,EAAE,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"QuickCommandSelector.js","sourceRoot":"","sources":["../../../src/views/MessageInput/QuickCommandSelector.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AAErD,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAA;AACpD,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAE/C,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,EAAE,QAAQ,EAAyE,EAAE,EAAE;IAC1H,MAAM,IAAI,GAAG,cAAc,EAAE,CAAA;IAC7B,MAAM,qBAAqB,GAAI,mBAAmB,CAAC,UAAU,CAAC,CAAC,aAAa,CAAA;IAE5E,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,EAA4B,EAAE,EAAE;QAChE,MAAM,QAAQ,GAAG,IAAI,EAAE,CAAC,IAAI,EAAE,CAAA;QAC9B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAA;QAEjC,IAAI,CAAC,QAAQ,CAAC,OAAO;YAAE,OAAM;QAC7B,QAAQ,CAAC,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAA;QACjC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,CAAA;IAC1B,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAA;IAEpB,MAAM,gBAAgB,GAAG,CAAC,EAAE,IAAI,EAAE,WAAW,EAA4B,EAAE,EAAE,CAAC,8BAC5E,aAAG,SAAS,EAAC,gBAAgB,kBAAG,IAAI,CAAC,WAAW,EAAE,IAAK,EACvD,YAAG,SAAS,EAAC,sBAAsB,YAAE,WAAW,GAAK,IACpD,CAAA;IAEH,OAAO,KAAC,QAAQ,IACd,QAAQ,EAAE,QAAQ,EAClB,cAAc,EAAE;YACd,YAAY,EAAE,eAAe;YAC7B,QAAQ,EAAE,GAAG;YACb,IAAI,EAAE,KAAC,YAAY,KAAG;YACtB,UAAU,EAAE,MAAM;YAClB,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,kBAAkB,EAAE,EAAE,IAAI,EAAE;YAChD,KAAK,EAAE,iBAAiB;YACxB,QAAQ,EAAE,CAAC,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,CAAC;YACxD,SAAS,EAAE,qBAAqB;YAChC,QAAQ,EAAE,YAAY;YACtB,mBAAmB,EAAE,gBAAgB;YACrC,IAAI,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;SACjE,GACD,CAAA;AACJ,CAAC,CAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook to manage keyboard shortcuts for the user's input history.
|
|
3
|
+
*
|
|
4
|
+
* This hook allows the user to navigate through the history of messages sent in a chat
|
|
5
|
+
* using the up arrow (`ArrowUp`) and down arrow (`ArrowDown`) keys.
|
|
6
|
+
*/
|
|
7
|
+
export declare const useUserEntryHistoryShortcut: () => {
|
|
8
|
+
handleKeyDown: (event: React.KeyboardEvent<HTMLTextAreaElement>) => void;
|
|
9
|
+
handleKeyUp: (event: React.KeyboardEvent<HTMLTextAreaElement>) => void;
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=chat-entry-history.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-entry-history.d.ts","sourceRoot":"","sources":["../../../src/views/MessageInput/chat-entry-history.ts"],"names":[],"mappings":"AAkCA;;;;;GAKG;AACH,eAAO,MAAM,2BAA2B;2BA8BI,KAAK,CAAC,aAAa,CAAC,mBAAmB,CAAC;yBAU1C,KAAK,CAAC,aAAa,CAAC,mBAAmB,CAAC;CAOjF,CAAA"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { useCallback, useEffect, useRef } from 'react';
|
|
2
|
+
import { useCurrentChat } from '../../context/hooks.js';
|
|
3
|
+
const DEFAULT_POINTER = -1;
|
|
4
|
+
const useChatEntryHistory = () => {
|
|
5
|
+
const chat = useCurrentChat();
|
|
6
|
+
const historyPointer = useRef(DEFAULT_POINTER);
|
|
7
|
+
const messages = chat.getMessages();
|
|
8
|
+
useEffect(() => {
|
|
9
|
+
historyPointer.current = chat.getMessages().length;
|
|
10
|
+
}, [chat.id, messages]);
|
|
11
|
+
const navigateEntry = useCallback((startIndex, direction, inputValue) => {
|
|
12
|
+
const chatEntries = chat.getMessages() || [];
|
|
13
|
+
let pointer = startIndex + direction;
|
|
14
|
+
while (pointer > DEFAULT_POINTER && pointer < chatEntries.length && chatEntries[pointer]?.getValue().agentType !== 'user') {
|
|
15
|
+
pointer += direction;
|
|
16
|
+
}
|
|
17
|
+
if (pointer < DEFAULT_POINTER || pointer >= chatEntries.length + direction)
|
|
18
|
+
return inputValue;
|
|
19
|
+
historyPointer.current = pointer;
|
|
20
|
+
return chatEntries[pointer]?.getValue().content ?? inputValue;
|
|
21
|
+
}, [chat]);
|
|
22
|
+
const getPreviousUserEntry = useCallback((inputValue) => navigateEntry(historyPointer.current, -1, inputValue), [navigateEntry]);
|
|
23
|
+
const getNextUserEntry = useCallback((inputValue) => navigateEntry(historyPointer.current, +1, inputValue), [navigateEntry]);
|
|
24
|
+
return { getNextUserEntry, getPreviousUserEntry };
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Hook to manage keyboard shortcuts for the user's input history.
|
|
28
|
+
*
|
|
29
|
+
* This hook allows the user to navigate through the history of messages sent in a chat
|
|
30
|
+
* using the up arrow (`ArrowUp`) and down arrow (`ArrowDown`) keys.
|
|
31
|
+
*/
|
|
32
|
+
export const useUserEntryHistoryShortcut = () => {
|
|
33
|
+
const { getNextUserEntry, getPreviousUserEntry } = useChatEntryHistory();
|
|
34
|
+
const chat = useCurrentChat();
|
|
35
|
+
const userEntryRef = useRef('');
|
|
36
|
+
chat.onChange('nextMessage', (value) => {
|
|
37
|
+
if (value === '') {
|
|
38
|
+
userEntryRef.current = '';
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
const setNextMessageFromHistory = useCallback((event, getEntryHistory) => {
|
|
42
|
+
const textarea = event.target;
|
|
43
|
+
if (textarea.selectionStart !== 0)
|
|
44
|
+
return;
|
|
45
|
+
const entryHistory = getEntryHistory(userEntryRef.current);
|
|
46
|
+
if (entryHistory === chat.get('nextMessage'))
|
|
47
|
+
return;
|
|
48
|
+
chat.set('nextMessage', entryHistory);
|
|
49
|
+
requestAnimationFrame(() => {
|
|
50
|
+
textarea.selectionStart = 0;
|
|
51
|
+
textarea.selectionEnd = 0;
|
|
52
|
+
event.preventDefault();
|
|
53
|
+
event.stopPropagation();
|
|
54
|
+
});
|
|
55
|
+
}, [chat]);
|
|
56
|
+
const handleKeyDown = useCallback((event) => {
|
|
57
|
+
if (event.key === 'ArrowUp') {
|
|
58
|
+
setNextMessageFromHistory(event, getPreviousUserEntry);
|
|
59
|
+
}
|
|
60
|
+
if (event.key === 'ArrowDown') {
|
|
61
|
+
setNextMessageFromHistory(event, getNextUserEntry);
|
|
62
|
+
}
|
|
63
|
+
}, [getPreviousUserEntry, getNextUserEntry, setNextMessageFromHistory]);
|
|
64
|
+
const handleKeyUp = useCallback((event) => {
|
|
65
|
+
if (!event.key.startsWith('Arrow')) {
|
|
66
|
+
userEntryRef.current = chat.get('nextMessage') ?? '';
|
|
67
|
+
}
|
|
68
|
+
}, [chat]);
|
|
69
|
+
return { handleKeyDown, handleKeyUp };
|
|
70
|
+
};
|
|
71
|
+
//# sourceMappingURL=chat-entry-history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-entry-history.js","sourceRoot":"","sources":["../../../src/views/MessageInput/chat-entry-history.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/views/MessageInput/index.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/views/MessageInput/index.tsx"],"names":[],"mappings":"AAkBA;;;;GAIG;AACH,eAAO,MAAM,YAAY,+CA0ExB,CAAA"}
|
|
@@ -12,6 +12,7 @@ import { ButtonAgent } from './ButtonAgent.js';
|
|
|
12
12
|
import { ButtonGroup } from './ButtonGroup.js';
|
|
13
13
|
import { useMessageInputDictionary } from './dictionary.js';
|
|
14
14
|
import { InfoBar } from './InfoBar.js';
|
|
15
|
+
import { useUserEntryHistoryShortcut } from './chat-entry-history.js';
|
|
15
16
|
import { QuickCommandSelector } from './QuickCommandSelector.js';
|
|
16
17
|
import { MAX_INPUT_HEIGHT, MessageInputBox, MIN_INPUT_HEIGHT } from './styled.js';
|
|
17
18
|
/**
|
|
@@ -30,6 +31,7 @@ export const MessageInput = () => {
|
|
|
30
31
|
const isMinimized = useWidgetState('isMinimized');
|
|
31
32
|
const textAreaRef = useRef(null);
|
|
32
33
|
const agentLabel = useCurrentChatState('agent')?.label ?? 'Stackspot AI';
|
|
34
|
+
const { handleKeyDown, handleKeyUp } = useUserEntryHistoryShortcut();
|
|
33
35
|
const onSend = useCallback(async () => {
|
|
34
36
|
const message = chat.get('nextMessage');
|
|
35
37
|
if (!message)
|
|
@@ -46,12 +48,13 @@ export const MessageInput = () => {
|
|
|
46
48
|
event.preventDefault();
|
|
47
49
|
onSend();
|
|
48
50
|
}
|
|
49
|
-
|
|
51
|
+
handleKeyDown(event);
|
|
52
|
+
}, [onSend, handleKeyDown]);
|
|
50
53
|
useEffect(() => {
|
|
51
54
|
if (!isLoading)
|
|
52
55
|
textAreaRef.current?.focus();
|
|
53
56
|
}, [isLoading]);
|
|
54
|
-
return (_jsxs(MessageInputBox, { "aria-busy": isLoading, className: "message-input", children: [_jsx(ProgressBar, { visible: isLoading, shimmer: true }), _jsx(InfoBar, {}), _jsxs("div", { className: "wrapper-action", children: [_jsx(QuickCommandSelector, { inputRef: textAreaRef }), _jsx(AgentSelector, { inputRef: textAreaRef }), _jsxs("div", { className: listToClass(['action-box', focused && 'focused', isLoading && 'disabled']), children: [_jsx(ButtonAgent, {}), _jsx(AdaptiveTextArea, { ref: textAreaRef, disabled: isLoading, placeholder: interpolate(t.placeholder, agentLabel), onChange: e => chat.set('nextMessage', e.target.value), value: value, onFocus: () => setFocused(true), onBlur: () => setFocused(false), onKeyDown: onKeyDown, onIncreaseSize: () => setExpanded(false), onResetSize: () => !expansionLocked.current && setExpanded(true), maxHeight: isMinimized ? MIN_INPUT_HEIGHT : MAX_INPUT_HEIGHT }), _jsx(ButtonGroup, { onSend: onSend, onCancel: () => chat.abort(), expanded: expanded, isLoading: isLoading, setExpanded: (value) => {
|
|
57
|
+
return (_jsxs(MessageInputBox, { "aria-busy": isLoading, className: "message-input", children: [_jsx(ProgressBar, { visible: isLoading, shimmer: true }), _jsx(InfoBar, {}), _jsxs("div", { className: "wrapper-action", children: [_jsx(QuickCommandSelector, { inputRef: textAreaRef }), _jsx(AgentSelector, { inputRef: textAreaRef }), _jsxs("div", { className: listToClass(['action-box', focused && 'focused', isLoading && 'disabled']), children: [_jsx(ButtonAgent, {}), _jsx(AdaptiveTextArea, { ref: textAreaRef, disabled: isLoading, placeholder: interpolate(t.placeholder, agentLabel), onChange: e => chat.set('nextMessage', e.target.value), value: value, onFocus: () => setFocused(true), onBlur: () => setFocused(false), onKeyDown: onKeyDown, onKeyUp: handleKeyUp, onIncreaseSize: () => setExpanded(false), onResetSize: () => !expansionLocked.current && setExpanded(true), maxHeight: isMinimized ? MIN_INPUT_HEIGHT : MAX_INPUT_HEIGHT }), _jsx(ButtonGroup, { onSend: onSend, onCancel: () => chat.abort(), expanded: expanded, isLoading: isLoading, setExpanded: (value) => {
|
|
55
58
|
setExpanded(value);
|
|
56
59
|
expansionLocked.current = expanded;
|
|
57
60
|
} })] })] })] }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/views/MessageInput/index.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAA;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACzF,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAA;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/views/MessageInput/index.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/app-metadata.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stack-spot/ai-chat-widget",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"date": "
|
|
3
|
+
"version": "1.8.2",
|
|
4
|
+
"date": "Thu Mar 13 2025 09:51:45 GMT-0300 (Brasilia Standard Time)",
|
|
5
5
|
"dependencies": [
|
|
6
6
|
{
|
|
7
7
|
"name": "@stack-spot/app-metadata",
|
|
@@ -34,15 +34,13 @@ export const AgentSelector = ({ inputRef }: { inputRef: React.RefObject<HTMLText
|
|
|
34
34
|
if (!inputRef.current) return
|
|
35
35
|
inputRef.current.value = newValue
|
|
36
36
|
inputRef.current.focus()
|
|
37
|
-
}, [])
|
|
37
|
+
}, [chat, inputRef])
|
|
38
38
|
|
|
39
39
|
const getAgents = () => {
|
|
40
40
|
const agents = agentClient.agents.useQuery({})
|
|
41
41
|
const publicAgents = agentClient.publicAgents.useQuery({})
|
|
42
42
|
const accountAgents = agentClient.agents.useQuery({ visibility: 'ACCOUNT' })
|
|
43
|
-
|
|
44
43
|
const buildIns = [...[defaultAgent], ...publicAgents.map((agent) => ({ ...agent, visibility_level: 'builtIn' }))]
|
|
45
|
-
|
|
46
44
|
return uniqBy([...agents, ...buildIns, ...accountAgents], 'id')
|
|
47
45
|
}
|
|
48
46
|
|
|
@@ -17,7 +17,7 @@ export const QuickCommandSelector = ({ inputRef }: { inputRef: React.RefObject<H
|
|
|
17
17
|
if (!inputRef.current) return
|
|
18
18
|
inputRef.current.value = newValue
|
|
19
19
|
inputRef.current.focus()
|
|
20
|
-
}, [])
|
|
20
|
+
}, [chat, inputRef])
|
|
21
21
|
|
|
22
22
|
const QuickCommandItem = ({ slug, description }: QuickCommandListResponse) => <>
|
|
23
23
|
<p className="selector-title">/{slug.toUpperCase()}</p>
|
|
@@ -38,7 +38,6 @@ export const QuickCommandSelector = ({ inputRef }: { inputRef: React.RefObject<H
|
|
|
38
38
|
onSelect: onSelectItem,
|
|
39
39
|
renderComponentItem: QuickCommandItem,
|
|
40
40
|
data: () => aiClient.quickCommands.useQuery({ order: 'a-to-z' }),
|
|
41
|
-
|
|
42
41
|
}}
|
|
43
42
|
/>
|
|
44
43
|
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { useCallback, useEffect, useRef } from 'react'
|
|
2
|
+
import { useCurrentChat } from '../../context/hooks'
|
|
3
|
+
|
|
4
|
+
const DEFAULT_POINTER = -1
|
|
5
|
+
|
|
6
|
+
const useChatEntryHistory = () => {
|
|
7
|
+
const chat = useCurrentChat()
|
|
8
|
+
const historyPointer = useRef(DEFAULT_POINTER)
|
|
9
|
+
const messages = chat.getMessages()
|
|
10
|
+
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
historyPointer.current = chat.getMessages().length
|
|
13
|
+
}, [chat.id, messages])
|
|
14
|
+
|
|
15
|
+
const navigateEntry = useCallback((startIndex: number, direction: 1 | -1, inputValue: string) => {
|
|
16
|
+
const chatEntries = chat.getMessages() || []
|
|
17
|
+
let pointer = startIndex + direction
|
|
18
|
+
|
|
19
|
+
while (pointer > DEFAULT_POINTER && pointer < chatEntries.length && chatEntries[pointer]?.getValue().agentType !== 'user') {
|
|
20
|
+
pointer += direction
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if (pointer < DEFAULT_POINTER || pointer >= chatEntries.length + direction) return inputValue
|
|
24
|
+
|
|
25
|
+
historyPointer.current = pointer
|
|
26
|
+
return chatEntries[pointer]?.getValue().content ?? inputValue
|
|
27
|
+
}, [chat])
|
|
28
|
+
|
|
29
|
+
const getPreviousUserEntry = useCallback((inputValue: string) => navigateEntry(historyPointer.current, -1, inputValue), [navigateEntry])
|
|
30
|
+
const getNextUserEntry = useCallback((inputValue: string) => navigateEntry(historyPointer.current, +1, inputValue), [navigateEntry])
|
|
31
|
+
|
|
32
|
+
return { getNextUserEntry, getPreviousUserEntry }
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Hook to manage keyboard shortcuts for the user's input history.
|
|
37
|
+
*
|
|
38
|
+
* This hook allows the user to navigate through the history of messages sent in a chat
|
|
39
|
+
* using the up arrow (`ArrowUp`) and down arrow (`ArrowDown`) keys.
|
|
40
|
+
*/
|
|
41
|
+
export const useUserEntryHistoryShortcut = () => {
|
|
42
|
+
const { getNextUserEntry, getPreviousUserEntry } = useChatEntryHistory()
|
|
43
|
+
const chat = useCurrentChat()
|
|
44
|
+
const userEntryRef = useRef('')
|
|
45
|
+
|
|
46
|
+
chat.onChange('nextMessage', (value) => {
|
|
47
|
+
if (value === '') {
|
|
48
|
+
userEntryRef.current = ''
|
|
49
|
+
}
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
const setNextMessageFromHistory = useCallback(
|
|
53
|
+
(event: React.KeyboardEvent<HTMLTextAreaElement>, getEntryHistory: typeof getNextUserEntry) => {
|
|
54
|
+
const textarea = event.target as HTMLTextAreaElement
|
|
55
|
+
if (textarea.selectionStart !== 0) return
|
|
56
|
+
|
|
57
|
+
const entryHistory = getEntryHistory(userEntryRef.current)
|
|
58
|
+
if (entryHistory === chat.get('nextMessage')) return
|
|
59
|
+
|
|
60
|
+
chat.set('nextMessage', entryHistory)
|
|
61
|
+
|
|
62
|
+
requestAnimationFrame(() => {
|
|
63
|
+
textarea.selectionStart = 0
|
|
64
|
+
textarea.selectionEnd = 0
|
|
65
|
+
event.preventDefault()
|
|
66
|
+
event.stopPropagation()
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
}, [chat])
|
|
70
|
+
|
|
71
|
+
const handleKeyDown = useCallback((event: React.KeyboardEvent<HTMLTextAreaElement>) => {
|
|
72
|
+
if (event.key === 'ArrowUp') {
|
|
73
|
+
setNextMessageFromHistory(event, getPreviousUserEntry)
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (event.key === 'ArrowDown') {
|
|
77
|
+
setNextMessageFromHistory(event, getNextUserEntry)
|
|
78
|
+
}
|
|
79
|
+
}, [getPreviousUserEntry, getNextUserEntry, setNextMessageFromHistory])
|
|
80
|
+
|
|
81
|
+
const handleKeyUp = useCallback((event: React.KeyboardEvent<HTMLTextAreaElement>) => {
|
|
82
|
+
if (!event.key.startsWith('Arrow')) {
|
|
83
|
+
userEntryRef.current = chat.get('nextMessage') ?? ''
|
|
84
|
+
}
|
|
85
|
+
}, [chat])
|
|
86
|
+
|
|
87
|
+
return { handleKeyDown, handleKeyUp }
|
|
88
|
+
}
|
|
@@ -11,6 +11,8 @@ import { ButtonAgent } from './ButtonAgent'
|
|
|
11
11
|
import { ButtonGroup } from './ButtonGroup'
|
|
12
12
|
import { useMessageInputDictionary } from './dictionary'
|
|
13
13
|
import { InfoBar } from './InfoBar'
|
|
14
|
+
|
|
15
|
+
import { useUserEntryHistoryShortcut } from './chat-entry-history'
|
|
14
16
|
import { QuickCommandSelector } from './QuickCommandSelector'
|
|
15
17
|
import { MAX_INPUT_HEIGHT, MessageInputBox, MIN_INPUT_HEIGHT } from './styled'
|
|
16
18
|
|
|
@@ -30,6 +32,7 @@ export const MessageInput = () => {
|
|
|
30
32
|
const isMinimized = useWidgetState('isMinimized')
|
|
31
33
|
const textAreaRef = useRef<HTMLTextAreaElement>(null)
|
|
32
34
|
const agentLabel = useCurrentChatState('agent')?.label ?? 'Stackspot AI'
|
|
35
|
+
const { handleKeyDown, handleKeyUp } = useUserEntryHistoryShortcut()
|
|
33
36
|
|
|
34
37
|
const onSend = useCallback(async () => {
|
|
35
38
|
const message = chat.get('nextMessage')
|
|
@@ -47,7 +50,9 @@ export const MessageInput = () => {
|
|
|
47
50
|
event.preventDefault()
|
|
48
51
|
onSend()
|
|
49
52
|
}
|
|
50
|
-
|
|
53
|
+
|
|
54
|
+
handleKeyDown(event)
|
|
55
|
+
}, [onSend, handleKeyDown])
|
|
51
56
|
|
|
52
57
|
useEffect(() => {
|
|
53
58
|
if (!isLoading) textAreaRef.current?.focus()
|
|
@@ -71,6 +76,7 @@ export const MessageInput = () => {
|
|
|
71
76
|
onFocus={() => setFocused(true)}
|
|
72
77
|
onBlur={() => setFocused(false)}
|
|
73
78
|
onKeyDown={onKeyDown}
|
|
79
|
+
onKeyUp={handleKeyUp}
|
|
74
80
|
onIncreaseSize={() => setExpanded(false)}
|
|
75
81
|
onResetSize={() => !expansionLocked.current && setExpanded(true)}
|
|
76
82
|
maxHeight={isMinimized ? MIN_INPUT_HEIGHT : MAX_INPUT_HEIGHT}
|