@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.
Files changed (117) hide show
  1. package/dist/StackspotAIWidget.d.ts.map +1 -1
  2. package/dist/StackspotAIWidget.js +2 -1
  3. package/dist/StackspotAIWidget.js.map +1 -1
  4. package/dist/chat-interceptors/send-message.d.ts.map +1 -1
  5. package/dist/chat-interceptors/send-message.js +2 -6
  6. package/dist/chat-interceptors/send-message.js.map +1 -1
  7. package/dist/components/HistoryList.d.ts +2 -5
  8. package/dist/components/HistoryList.d.ts.map +1 -1
  9. package/dist/components/HistoryList.js +70 -2
  10. package/dist/components/HistoryList.js.map +1 -1
  11. package/dist/components/OverlayMenu.d.ts +3 -2
  12. package/dist/components/OverlayMenu.d.ts.map +1 -1
  13. package/dist/components/OverlayMenu.js +57 -1
  14. package/dist/components/OverlayMenu.js.map +1 -1
  15. package/dist/components/Tooltip/Tooltip.d.ts +2 -1
  16. package/dist/components/Tooltip/Tooltip.d.ts.map +1 -1
  17. package/dist/components/Tooltip/Tooltip.js +10 -2
  18. package/dist/components/Tooltip/Tooltip.js.map +1 -1
  19. package/dist/components/Tooltip/TooltipAPI.d.ts +3 -2
  20. package/dist/components/Tooltip/TooltipAPI.d.ts.map +1 -1
  21. package/dist/components/Tooltip/TooltipAPI.js +26 -1
  22. package/dist/components/Tooltip/TooltipAPI.js.map +1 -1
  23. package/dist/components/Tooltip/style.d.ts.map +1 -1
  24. package/dist/components/Tooltip/style.js +0 -1
  25. package/dist/components/Tooltip/style.js.map +1 -1
  26. package/dist/components/Tooltip/types.d.ts +6 -0
  27. package/dist/components/Tooltip/types.d.ts.map +1 -1
  28. package/dist/features.d.ts.map +1 -1
  29. package/dist/features.js +1 -0
  30. package/dist/features.js.map +1 -1
  31. package/dist/types.d.ts +1 -1
  32. package/dist/types.d.ts.map +1 -1
  33. package/dist/utils/date.d.ts +1 -0
  34. package/dist/utils/date.d.ts.map +1 -1
  35. package/dist/utils/date.js +3 -0
  36. package/dist/utils/date.js.map +1 -1
  37. package/dist/utils/download.d.ts +2 -0
  38. package/dist/utils/download.d.ts.map +1 -0
  39. package/dist/utils/download.js +10 -0
  40. package/dist/utils/download.js.map +1 -0
  41. package/dist/utils/knowledge-source.d.ts +3 -1
  42. package/dist/utils/knowledge-source.d.ts.map +1 -1
  43. package/dist/utils/knowledge-source.js +8 -0
  44. package/dist/utils/knowledge-source.js.map +1 -1
  45. package/dist/views/Agents.js +2 -1
  46. package/dist/views/Agents.js.map +1 -1
  47. package/dist/views/Chat/ChatMessage.d.ts.map +1 -1
  48. package/dist/views/Chat/ChatMessage.js +1 -1
  49. package/dist/views/Chat/ChatMessage.js.map +1 -1
  50. package/dist/views/Chat/chat-scroll.d.ts.map +1 -0
  51. package/dist/{hooks → views/Chat}/chat-scroll.js +5 -3
  52. package/dist/views/Chat/chat-scroll.js.map +1 -0
  53. package/dist/views/ChatHistory/ChatHistoryPanel.d.ts +5 -0
  54. package/dist/views/ChatHistory/ChatHistoryPanel.d.ts.map +1 -0
  55. package/dist/views/ChatHistory/ChatHistoryPanel.js +10 -0
  56. package/dist/views/ChatHistory/ChatHistoryPanel.js.map +1 -0
  57. package/dist/views/ChatHistory/HistoryItem.d.ts +7 -0
  58. package/dist/views/ChatHistory/HistoryItem.d.ts.map +1 -0
  59. package/dist/views/ChatHistory/HistoryItem.js +109 -0
  60. package/dist/views/ChatHistory/HistoryItem.js.map +1 -0
  61. package/dist/views/ChatHistory/dictionary.d.ts +2 -0
  62. package/dist/views/ChatHistory/dictionary.d.ts.map +1 -0
  63. package/dist/views/ChatHistory/dictionary.js +19 -0
  64. package/dist/views/ChatHistory/dictionary.js.map +1 -0
  65. package/dist/views/ChatHistory/index.d.ts +5 -0
  66. package/dist/views/ChatHistory/index.d.ts.map +1 -0
  67. package/dist/views/ChatHistory/index.js +23 -0
  68. package/dist/views/ChatHistory/index.js.map +1 -0
  69. package/dist/views/ChatHistory/styled.d.ts +2 -0
  70. package/dist/views/ChatHistory/styled.d.ts.map +1 -0
  71. package/dist/views/ChatHistory/styled.js +60 -0
  72. package/dist/views/ChatHistory/styled.js.map +1 -0
  73. package/dist/views/ChatHistory/utils.d.ts +4 -0
  74. package/dist/views/ChatHistory/utils.d.ts.map +1 -0
  75. package/dist/views/ChatHistory/utils.js +28 -0
  76. package/dist/views/ChatHistory/utils.js.map +1 -0
  77. package/dist/views/ChatTabSelection.js +1 -1
  78. package/dist/views/ChatTabSelection.js.map +1 -1
  79. package/dist/views/KnowledgeSources.d.ts.map +1 -1
  80. package/dist/views/KnowledgeSources.js +30 -21
  81. package/dist/views/KnowledgeSources.js.map +1 -1
  82. package/dist/views/MessageInput/dictionary.d.ts +1 -1
  83. package/dist/views/Stacks.js +2 -1
  84. package/dist/views/Stacks.js.map +1 -1
  85. package/dist/views/Workspaces.d.ts.map +1 -1
  86. package/dist/views/Workspaces.js +3 -2
  87. package/dist/views/Workspaces.js.map +1 -1
  88. package/package.json +3 -2
  89. package/src/StackspotAIWidget.tsx +2 -0
  90. package/src/chat-interceptors/send-message.ts +2 -6
  91. package/src/components/HistoryList.tsx +80 -7
  92. package/src/components/OverlayMenu.tsx +70 -3
  93. package/src/components/Tooltip/Tooltip.tsx +13 -7
  94. package/src/components/Tooltip/TooltipAPI.ts +22 -2
  95. package/src/components/Tooltip/style.tsx +0 -1
  96. package/src/components/Tooltip/types.ts +7 -0
  97. package/src/features.ts +1 -0
  98. package/src/types.ts +1 -1
  99. package/src/utils/date.ts +4 -0
  100. package/src/utils/download.ts +12 -0
  101. package/src/utils/knowledge-source.ts +13 -1
  102. package/src/views/Agents.tsx +2 -1
  103. package/src/views/Chat/ChatMessage.tsx +1 -1
  104. package/src/{hooks → views/Chat}/chat-scroll.ts +6 -3
  105. package/src/views/ChatHistory/ChatHistoryPanel.tsx +28 -0
  106. package/src/views/ChatHistory/HistoryItem.tsx +127 -0
  107. package/src/views/ChatHistory/dictionary.ts +20 -0
  108. package/src/views/ChatHistory/index.tsx +31 -0
  109. package/src/views/ChatHistory/styled.ts +60 -0
  110. package/src/views/ChatHistory/utils.ts +26 -0
  111. package/src/views/ChatTabSelection.tsx +1 -1
  112. package/src/views/KnowledgeSources.tsx +39 -20
  113. package/src/views/Stacks.tsx +2 -1
  114. package/src/views/Workspaces.tsx +3 -2
  115. package/dist/hooks/chat-scroll.d.ts.map +0 -1
  116. package/dist/hooks/chat-scroll.js.map +0 -1
  117. /package/dist/{hooks → views/Chat}/chat-scroll.d.ts +0 -0
@@ -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);
@@ -1 +1 @@
1
- {"version":3,"file":"Stacks.js","sourceRoot":"","sources":["../../src/views/Stacks.tsx"],"names":[],"mappings":"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"}
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,YActB,CAAA"}
1
+ {"version":3,"file":"Workspaces.d.ts","sourceRoot":"","sources":["../../src/views/Workspaces.tsx"],"names":[],"mappings":"AAaA,eAAO,MAAM,UAAU,YAetB,CAAA"}
@@ -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;IAE1B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,KAAK,KAAK,WAAW;YAAE,IAAI,CAC7B,KAAC,cAAc,cAAC,KAAC,eAAe,KAAG,GAAiB,EACpD,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,eAAe,GAAG,GAAG,EAAE;IAC3B,MAAM,CAAC,GAAG,YAAY,CAAC,UAAU,CAAC,CAAA;IAClC,MAAM,EAAE,KAAK,EAAE,GAAG,aAAa,EAAE,CAAA;IACjC,MAAM,IAAI,GAAG,cAAc,EAAE,CAAA;IAC7B,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IACxC,MAAM,UAAU,GAAG,eAAe,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAA;IAC1E,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAoC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;IAC/H,MAAM,QAAQ,GAAG,OAAO,CACtB,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,EAClI,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,CAC5B,CAAA;IAED,SAAS,MAAM;QACb,IAAI,KAAK;YAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;QACrE,KAAK,EAAE,CAAA;IACT,CAAC;IAED,OAAO,CACL,8BACE,eAAK,SAAS,EAAC,SAAS,aACtB,KAAC,SAAS,IAAC,IAAI,EAAE,KAAC,MAAM,KAAG,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAC,QAAQ,GAAG,EACrF,CAAC,CAAC,QAAQ,CAAC,MAAM,IAAI,KAAC,mBAAmB,IACxC,OAAO,EAAE,QAAQ,EACjB,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EACjB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EACxB,iBAAiB,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EACrC,eAAe,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,MAAM,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC;4BAC/G,CAAC,CAAC,cAAc;4BAChB,CAAC,CAAC,EAAE,EAEN,SAAS,EAAC,aAAa,GACvB,EACD,CAAC,CAAC,UAAU,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,KAAC,WAAW,IAAC,KAAK,EAAE,CAAC,CAAC,eAAe,EAAE,WAAW,EAAE,CAAC,CAAC,0BAA0B,GAAI,EAC/H,CAAC,UAAU,CAAC,MAAM,IAAI,KAAC,WAAW,IAAC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,iBAAiB,GAAI,IACrF,EACN,KAAC,MAAM,IAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,KAAK,YAAG,CAAC,CAAC,KAAK,GAAU,IAC5D,CACJ,CAAA;AACH,CAAC,CAAA;AAED,MAAM,UAAU,GAAG;IACjB,EAAE,EAAE;QACF,KAAK,EAAE,YAAY;QACnB,WAAW,EAAE,kGAAkG;QAC/G,KAAK,EAAE,OAAO;QACd,eAAe,EAAE,mCAAmC;QACpD,0BAA0B,EAAE,kCAAkC;QAC9D,MAAM,EAAE,8BAA8B;QACtC,iBAAiB,EAAE,6CAA6C;KACjE;IACD,EAAE,EAAE;QACF,KAAK,EAAE,YAAY;QACnB,WAAW,EAAE,qGAAqG;QAClH,KAAK,EAAE,SAAS;QAChB,eAAe,EAAE,mCAAmC;QACpD,0BAA0B,EAAE,+BAA+B;QAC3D,MAAM,EAAE,yBAAyB;QACjC,iBAAiB,EAAE,8CAA8C;KAClE;CACmB,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.2.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.41.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?.filter(s => s.type === 'knowledge_source').map(ks => ({
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 { WithStyle } from '@stack-spot/portal-theme'
3
- import { ButtonAction } from '../types'
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
- renderLabel: (item: T) => React.ReactElement,
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
- export function HistoryList<T>({}: Props<T>) {
15
- return null
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 { WithStyle } from '@stack-spot/portal-theme'
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?: 'left' | 'top' | 'bottom' | 'right',
12
+ position?: TooltipPosition,
7
13
  actions: ButtonAction[],
8
14
  }
9
15
 
10
- export const OverlayMenu = ({}: Props) => null
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 = 'bottom', children, className, style }: Props) => {
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={e => api.show(
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 { TooltipPosition } from './types'
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: React.ReactNode, anchor: HTMLElement, position: TooltipPosition): void {
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
  }
@@ -5,7 +5,6 @@ export const animationTimeMS = 300
5
5
 
6
6
  export const TooltipBox = styled.div`
7
7
  position: absolute;
8
- pointer-events: none;
9
8
  opacity: 0;
10
9
  transition: opacity ${animationTimeMS/ 1000}s;
11
10
  top: 0;
@@ -6,3 +6,10 @@ export interface BoxPosition {
6
6
  y1: number,
7
7
  y2: number,
8
8
  }
9
+
10
+ export interface ShowOptions {
11
+ content: React.ReactNode,
12
+ anchor: HTMLElement,
13
+ position?: TooltipPosition,
14
+ hideOnClickOutside?: boolean,
15
+ }
package/src/features.ts CHANGED
@@ -16,4 +16,5 @@ export const defaultFeatures: AIWidgetFeatures = {
16
16
  workspace: true,
17
17
  knowledgeSource: true,
18
18
  agent: true,
19
+ chatHistory: true,
19
20
  }
package/src/types.ts CHANGED
@@ -10,7 +10,7 @@ export interface ButtonAction extends WithStyle {
10
10
  icon?: React.ReactElement,
11
11
  color?: string,
12
12
  label: string,
13
- onClick: () => void,
13
+ onClick: () => any,
14
14
  }
15
15
 
16
16
  export interface MinimizedActions {
package/src/utils/date.ts CHANGED
@@ -28,6 +28,10 @@ export function useDateFormatter() {
28
28
  }
29
29
  }
30
30
 
31
+ export function subtractDays(date: Date, numberOfDays: number) {
32
+ return new Date(date.getTime() - 24 * numberOfDays * 60 * 60000)
33
+ }
34
+
31
35
  const dictionary = {
32
36
  en: {
33
37
  today: 'Today',
@@ -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
+ }
@@ -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
+ }