@red-hat-developer-hub/backstage-plugin-intelligent-assistant 5.3.0 → 5.3.1

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 (72) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/components/AttachmentContext.esm.js +1 -1
  3. package/dist/components/ChatLoadingFallback.esm.js +37 -0
  4. package/dist/components/ChatLoadingFallback.esm.js.map +1 -0
  5. package/dist/components/CollapsedHistoryStrip.esm.js +1 -1
  6. package/dist/components/LightSpeedChat.esm.js +2 -2
  7. package/dist/components/LightspeedChatBox.esm.js +2 -2
  8. package/dist/components/LightspeedChatBoxHeader.esm.js +2 -2
  9. package/dist/components/LightspeedChatContainer.esm.js +18 -3
  10. package/dist/components/LightspeedChatContainer.esm.js.map +1 -1
  11. package/dist/components/LightspeedDrawerContext.esm.js.map +1 -1
  12. package/dist/components/LightspeedDrawerProvider.esm.js +11 -26
  13. package/dist/components/LightspeedDrawerProvider.esm.js.map +1 -1
  14. package/dist/components/LightspeedFABContent.esm.js +14 -2
  15. package/dist/components/LightspeedFABContent.esm.js.map +1 -1
  16. package/dist/components/LightspeedOverlayChat.esm.js +39 -0
  17. package/dist/components/LightspeedOverlayChat.esm.js.map +1 -0
  18. package/dist/components/McpConfigureServerModal.esm.js +2 -2
  19. package/dist/components/MessageBarModelSelector.esm.js +2 -2
  20. package/dist/components/ScreenContextChip.esm.js +2 -2
  21. package/dist/components/ToastAlertGroup.esm.js +1 -1
  22. package/dist/components/criticalFabBundle.esm.js +3 -0
  23. package/dist/components/criticalFabBundle.esm.js.map +1 -0
  24. package/dist/components/loaders.esm.js +11 -0
  25. package/dist/components/loaders.esm.js.map +1 -0
  26. package/dist/components/notebooks/AddDocumentModal.esm.js +2 -2
  27. package/dist/components/notebooks/DocumentSidebar.esm.js +1 -1
  28. package/dist/components/notebooks/NotebookCard.esm.js +1 -1
  29. package/dist/components/notebooks/NotebookStreamProvider.esm.js +1 -1
  30. package/dist/components/notebooks/NotebookView.esm.js +3 -3
  31. package/dist/components/notebooks/OverwriteConfirmModal.esm.js +1 -1
  32. package/dist/components/notebooks/UploadResourceScreen.esm.js +1 -1
  33. package/dist/components/notebooks/notebookStreamStore.esm.js +1 -1
  34. package/dist/components/notebooks/notebookStreamStore.esm.js.map +1 -1
  35. package/dist/const.esm.js +9 -1
  36. package/dist/const.esm.js.map +1 -1
  37. package/dist/fabModule.esm.js +51 -0
  38. package/dist/fabModule.esm.js.map +1 -0
  39. package/dist/hooks/useConversationMessages.esm.js +2 -1
  40. package/dist/hooks/useConversationMessages.esm.js.map +1 -1
  41. package/dist/hooks/useDisplayModeSettings.esm.js +1 -1
  42. package/dist/hooks/useDisplayModeSettings.esm.js.map +1 -1
  43. package/dist/hooks/useLightspeedProviderState.esm.js +1 -2
  44. package/dist/hooks/useLightspeedProviderState.esm.js.map +1 -1
  45. package/dist/index.d.ts +1 -15
  46. package/dist/index.esm.js +7 -69
  47. package/dist/index.esm.js.map +1 -1
  48. package/dist/intelligent-assistant-fab-module.d.ts +12 -4
  49. package/dist/intelligent-assistant-fab-module.esm.js +1 -1
  50. package/dist/intelligent-assistant-translations-module.d.ts +10 -4
  51. package/dist/intelligent-assistant-translations-module.esm.js +1 -1
  52. package/dist/lazy/LazyLightspeedChatDrawerContent.esm.js +13 -0
  53. package/dist/lazy/LazyLightspeedChatDrawerContent.esm.js.map +1 -0
  54. package/dist/lazy/LazyLightspeedFabRootWrapper.esm.js +17 -0
  55. package/dist/lazy/LazyLightspeedFabRootWrapper.esm.js.map +1 -0
  56. package/dist/legacy.d.ts +14 -16
  57. package/dist/legacy.esm.js +2 -9
  58. package/dist/legacy.esm.js.map +1 -1
  59. package/dist/loadChatPatternflyStyles.esm.js +14 -0
  60. package/dist/loadChatPatternflyStyles.esm.js.map +1 -0
  61. package/dist/muiClassNameConfig.esm.js +6 -0
  62. package/dist/muiClassNameConfig.esm.js.map +1 -0
  63. package/dist/plugin.esm.js +4 -4
  64. package/dist/plugin.esm.js.map +1 -1
  65. package/dist/translationsModule.esm.js +18 -0
  66. package/dist/translationsModule.esm.js.map +1 -0
  67. package/dist/types.esm.js.map +1 -1
  68. package/dist/utils/lightspeed-chatbox-message-utils.esm.js +145 -0
  69. package/dist/utils/lightspeed-chatbox-message-utils.esm.js.map +1 -0
  70. package/dist/utils/lightspeed-chatbox-utils.esm.js +20 -144
  71. package/dist/utils/lightspeed-chatbox-utils.esm.js.map +1 -1
  72. package/package.json +2 -2
@@ -0,0 +1,145 @@
1
+ const getTimestampVariablesString = (v) => {
2
+ if (v < 10) {
3
+ return `0${v}`;
4
+ }
5
+ return `${v}`;
6
+ };
7
+ const isBlankLine = (line) => !line.trim();
8
+ const isOrderedListLine = (line) => /^\s*\d+\.\s/.test(line);
9
+ const isBulletListLine = (line) => /^\s*[-*+]\s/.test(line) || /^\s*\u2022(?:\s+|\S|$)/u.test(line);
10
+ const escapeBulletListMarker = (line) => {
11
+ if (/^\s*\u2022/u.test(line)) {
12
+ return line;
13
+ }
14
+ return line.replace(/^(\s*)([*+-])(\s)/, String.raw`$1\$2$3`);
15
+ };
16
+ const escapeOrderedListMarker = (line) => line.replace(/^(\s*)(\d+)\.(\s)/, String.raw`$1$2\.$3`);
17
+ const foldListWithIntro = (s, isListItemLine, escapeListLine) => {
18
+ const lines = s.split("\n");
19
+ let firstListIdx = -1;
20
+ for (let i = 0; i < lines.length; i++) {
21
+ const line = lines[i];
22
+ if (line !== void 0 && isListItemLine(line)) {
23
+ firstListIdx = i;
24
+ break;
25
+ }
26
+ }
27
+ if (firstListIdx < 0) {
28
+ return s;
29
+ }
30
+ const intro = lines.slice(0, firstListIdx);
31
+ if (intro.some(isBlankLine)) {
32
+ return s;
33
+ }
34
+ const rest = lines.slice(firstListIdx);
35
+ const restItems = rest.filter((l) => !isBlankLine(l));
36
+ if (restItems.length === 0 || !restItems.every(isListItemLine)) {
37
+ return s;
38
+ }
39
+ const escaped = restItems.map(escapeListLine);
40
+ if (intro.length === 0) {
41
+ return escaped.join(" \n");
42
+ }
43
+ return `${intro.join(" \n")}
44
+ ${escaped.join(" \n")}`;
45
+ };
46
+ const foldOrderedListWithIntro = (s) => foldListWithIntro(s, isOrderedListLine, escapeOrderedListMarker);
47
+ const foldBulletListWithIntro = (s) => foldListWithIntro(s, isBulletListLine, escapeBulletListMarker);
48
+ const normalizeChatUserInput = (input) => {
49
+ let s = input.replaceAll("\r\n", "\n").trim();
50
+ if (!s) {
51
+ return s;
52
+ }
53
+ s = s.replace(/\n{3,}/g, "\n\n");
54
+ s = s.replace(/\n\n(?=[ \t]*\d+\.\s)/gm, "\n");
55
+ s = s.replace(/\n\n(?=[ \t]*[-*+]\s)/gm, "\n");
56
+ s = s.replace(/\n\n(?=[ \t]*\u2022)/gm, "\n");
57
+ s = foldOrderedListWithIntro(s);
58
+ s = foldBulletListWithIntro(s);
59
+ return s.trim();
60
+ };
61
+ const getTimestamp = (unix_timestamp) => {
62
+ if (typeof unix_timestamp !== "number" || Number.isNaN(unix_timestamp)) {
63
+ console.error("Invalid Unix timestamp provided");
64
+ return "";
65
+ }
66
+ const a = new Date(unix_timestamp);
67
+ const month = getTimestampVariablesString(a.getMonth() + 1);
68
+ const year = a.getFullYear();
69
+ const date = getTimestampVariablesString(a.getDate());
70
+ const hour = getTimestampVariablesString(a.getHours());
71
+ const min = getTimestampVariablesString(a.getMinutes());
72
+ const sec = getTimestampVariablesString(a.getSeconds());
73
+ const time = `${date}/${month}/${year}, ${hour}:${min}:${sec}`;
74
+ return time;
75
+ };
76
+ const createMessage = ({
77
+ role,
78
+ name,
79
+ avatar,
80
+ isLoading = false,
81
+ content,
82
+ timestamp,
83
+ error,
84
+ sources,
85
+ toolCalls,
86
+ defaultUserName = "Guest"
87
+ }) => ({
88
+ role,
89
+ name: name || defaultUserName,
90
+ avatar,
91
+ isLoading,
92
+ content,
93
+ timestamp,
94
+ error,
95
+ sources,
96
+ toolCalls
97
+ });
98
+ const createUserMessage = (props) => createMessage({
99
+ ...props,
100
+ role: "user",
101
+ defaultUserName: props.defaultUserName
102
+ });
103
+ const createBotMessage = (props) => createMessage({
104
+ ...props,
105
+ role: "bot"
106
+ });
107
+ const getConversationsData = (conversation) => {
108
+ const [userMessage, botMessage] = conversation.messages || [];
109
+ return [
110
+ {
111
+ ...userMessage,
112
+ timestamp: getTimestamp(
113
+ conversation.started_at ? new Date(conversation.started_at).getTime() : Date.now()
114
+ )
115
+ },
116
+ {
117
+ ...botMessage,
118
+ timestamp: getTimestamp(
119
+ conversation.completed_at ? new Date(conversation.completed_at).getTime() : Date.now()
120
+ ),
121
+ referenced_documents: botMessage?.referenced_documents ?? []
122
+ }
123
+ ];
124
+ };
125
+ const transformDocumentsToSources = (referenced_documents) => {
126
+ if (!referenced_documents || referenced_documents?.length === 0) {
127
+ return void 0;
128
+ }
129
+ return {
130
+ sources: referenced_documents.map(
131
+ (doc) => ({
132
+ body: doc.doc_description,
133
+ title: doc.doc_title,
134
+ link: doc?.doc_url,
135
+ isExternal: !!doc?.doc_url,
136
+ ...doc.source ? {
137
+ ragSource: doc.source
138
+ } : {}
139
+ })
140
+ )
141
+ };
142
+ };
143
+
144
+ export { createBotMessage, createMessage, createUserMessage, getConversationsData, getTimestamp, getTimestampVariablesString, normalizeChatUserInput, transformDocumentsToSources };
145
+ //# sourceMappingURL=lightspeed-chatbox-message-utils.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lightspeed-chatbox-message-utils.esm.js","sources":["../../src/utils/lightspeed-chatbox-message-utils.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Pure message helpers with no PatternFly CSS side effects.\n *\n * Kept separate from `lightspeed-chatbox-utils.tsx` so\n * `NotebookStreamProvider` (always mounted under the FAB drawer provider)\n * does not pull chatbot / react-core styles into the critical FAB graph.\n */\n\nimport type { SourcesCardProps } from '@patternfly/chatbot';\n\nimport type {\n BaseMessage,\n LCSConversation,\n ReferencedDocument,\n ReferencedDocuments,\n ToolCall,\n} from '../types';\n\nexport type SourceWithRagId = SourcesCardProps['sources'][number] & {\n /** Full LCORE RAG source id for chip-modal labels. */\n ragSource?: string;\n};\n\ntype MessageProps = {\n content: string;\n timestamp: string;\n name?: string;\n avatar?: string;\n isLoading?: boolean;\n error?: {\n title: string;\n };\n sources?: SourcesCardProps;\n toolCalls?: ToolCall[];\n};\n\nexport const getTimestampVariablesString = (v: number) => {\n if (v < 10) {\n return `0${v}`;\n }\n return `${v}`;\n};\n\nconst isBlankLine = (line: string) => !line.trim();\n\n/** Ordered list item at line start (CommonMark), ignoring leading spaces. */\nconst isOrderedListLine = (line: string) => /^\\s*\\d+\\.\\s/.test(line);\n\n/** ASCII bullets; also U+2022 (•) — not a CommonMark marker, but users paste it as a list. */\nconst isBulletListLine = (line: string) =>\n /^\\s*[-*+]\\s/.test(line) || /^\\s*\\u2022(?:\\s+|\\S|$)/u.test(line);\n\nconst escapeBulletListMarker = (line: string) => {\n if (/^\\s*\\u2022/u.test(line)) {\n return line;\n }\n return line.replace(/^(\\s*)([*+-])(\\s)/, String.raw`$1\\$2$3`);\n};\n\nconst escapeOrderedListMarker = (line: string) =>\n line.replace(/^(\\s*)(\\d+)\\.(\\s)/, String.raw`$1$2\\.$3`);\n\n/**\n * When intro lines (no blank lines among them) are followed by a contiguous run of\n * list lines, join intro + list into one Markdown paragraph using hard breaks and\n * per-line escaping so the block does not split awkwardly in the chat UI.\n */\nconst foldListWithIntro = (\n s: string,\n isListItemLine: (line: string) => boolean,\n escapeListLine: (line: string) => string,\n): string => {\n const lines = s.split('\\n');\n let firstListIdx = -1;\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (line !== undefined && isListItemLine(line)) {\n firstListIdx = i;\n break;\n }\n }\n if (firstListIdx < 0) {\n return s;\n }\n\n const intro = lines.slice(0, firstListIdx);\n if (intro.some(isBlankLine)) {\n return s;\n }\n\n const rest = lines.slice(firstListIdx);\n const restItems = rest.filter(l => !isBlankLine(l));\n if (restItems.length === 0 || !restItems.every(isListItemLine)) {\n return s;\n }\n\n const escaped = restItems.map(escapeListLine);\n if (intro.length === 0) {\n return escaped.join(' \\n');\n }\n return `${intro.join(' \\n')} \\n${escaped.join(' \\n')}`;\n};\n\nconst foldOrderedListWithIntro = (s: string) =>\n foldListWithIntro(s, isOrderedListLine, escapeOrderedListMarker);\n\nconst foldBulletListWithIntro = (s: string) =>\n foldListWithIntro(s, isBulletListLine, escapeBulletListMarker);\n\n/**\n * Trims user chat input and reduces blank lines that split Markdown blocks\n * (e.g. paragraph + blank line + ordered list) so PatternFly renders one user bubble.\n */\nexport const normalizeChatUserInput = (input: string): string => {\n let s = input.replaceAll('\\r\\n', '\\n').trim();\n if (!s) {\n return s;\n }\n // Use [ \\t]* (not \\s*) in lookaheads so newlines cannot participate in\n // quantifier backtracking (typescript:S8786).\n s = s.replace(/\\n{3,}/g, '\\n\\n');\n s = s.replace(/\\n\\n(?=[ \\t]*\\d+\\.\\s)/gm, '\\n');\n s = s.replace(/\\n\\n(?=[ \\t]*[-*+]\\s)/gm, '\\n');\n s = s.replace(/\\n\\n(?=[ \\t]*\\u2022)/gm, '\\n');\n s = foldOrderedListWithIntro(s);\n s = foldBulletListWithIntro(s);\n return s.trim();\n};\n\nexport const getTimestamp = (unix_timestamp: number) => {\n if (typeof unix_timestamp !== 'number' || Number.isNaN(unix_timestamp)) {\n // eslint-disable-next-line no-console\n console.error('Invalid Unix timestamp provided');\n return '';\n }\n\n const a = new Date(unix_timestamp);\n const month = getTimestampVariablesString(a.getMonth() + 1);\n const year = a.getFullYear();\n const date = getTimestampVariablesString(a.getDate());\n const hour = getTimestampVariablesString(a.getHours());\n const min = getTimestampVariablesString(a.getMinutes());\n const sec = getTimestampVariablesString(a.getSeconds());\n const time = `${date}/${month}/${year}, ${hour}:${min}:${sec}`;\n return time;\n};\n\nexport const createMessage = ({\n role,\n name,\n avatar,\n isLoading = false,\n content,\n timestamp,\n error,\n sources,\n toolCalls,\n defaultUserName = 'Guest',\n}: MessageProps & { role: 'user' | 'bot'; defaultUserName?: string }) => ({\n role,\n name: name || defaultUserName,\n avatar,\n isLoading,\n content,\n timestamp,\n error,\n sources,\n toolCalls,\n});\n\nexport const createUserMessage = (\n props: MessageProps & { defaultUserName?: string },\n) =>\n createMessage({\n ...props,\n role: 'user',\n defaultUserName: props.defaultUserName,\n });\n\nexport const createBotMessage = (props: MessageProps) =>\n createMessage({\n ...props,\n role: 'bot',\n });\n\nexport const getConversationsData = (\n conversation: LCSConversation,\n): [BaseMessage, BaseMessage] => {\n const [userMessage, botMessage] = conversation.messages || [];\n return [\n {\n ...userMessage,\n timestamp: getTimestamp(\n conversation.started_at\n ? new Date(conversation.started_at).getTime()\n : Date.now(),\n ),\n },\n {\n ...botMessage,\n timestamp: getTimestamp(\n conversation.completed_at\n ? new Date(conversation.completed_at).getTime()\n : Date.now(),\n ),\n referenced_documents: botMessage?.referenced_documents ?? [],\n },\n ];\n};\n\n/**\n * Maps LCORE referenced documents to chatbot sources (data only).\n * Inline SourcesCard pills are attached in `lightspeed-chatbox-utils`\n * (`headerContent`); SourcesChipModal reads `ragSource`. Keep this free of\n * JSX so the notebook stream store stays CSS-clean.\n */\nexport const transformDocumentsToSources = (\n referenced_documents: ReferencedDocuments,\n): SourcesCardProps | undefined => {\n if (!referenced_documents || referenced_documents?.length === 0) {\n return undefined;\n }\n return {\n sources: referenced_documents.map(\n (doc: ReferencedDocument): SourceWithRagId => ({\n body: doc.doc_description,\n title: doc.doc_title,\n link: doc?.doc_url,\n isExternal: !!doc?.doc_url,\n ...(doc.source\n ? {\n ragSource: doc.source,\n }\n : {}),\n }),\n ),\n };\n};\n"],"names":[],"mappings":"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"}
@@ -4,7 +4,26 @@ import { Spinner } from '@patternfly/react-core';
4
4
  import { ThumbtackIcon } from '@patternfly/react-icons';
5
5
  import { RhUiAiInfoIcon } from '@patternfly/react-icons/dist/esm/icons/rh-ui-ai-info-icon';
6
6
  import { RagSourceLabel } from '../components/RagSourceLabel.esm.js';
7
+ import { transformDocumentsToSources as transformDocumentsToSources$1 } from './lightspeed-chatbox-message-utils.esm.js';
8
+ export { createBotMessage, createMessage, createUserMessage, getConversationsData, getTimestamp, getTimestampVariablesString, normalizeChatUserInput } from './lightspeed-chatbox-message-utils.esm.js';
7
9
 
10
+ const transformDocumentsToSources = (referenced_documents) => {
11
+ const result = transformDocumentsToSources$1(referenced_documents);
12
+ if (!result) {
13
+ return void 0;
14
+ }
15
+ return {
16
+ sources: result.sources.map((source) => {
17
+ if (!source.ragSource) {
18
+ return source;
19
+ }
20
+ return {
21
+ ...source,
22
+ headerContent: /* @__PURE__ */ jsx(RagSourceLabel, { source: source.ragSource })
23
+ };
24
+ })
25
+ };
26
+ };
8
27
  const getFootnoteProps = (t) => ({
9
28
  label: t?.("footer.accuracy.label") || "Always review AI generated content prior to use."
10
29
  });
@@ -23,149 +42,6 @@ const ChatbotFootnoteWithIcon = ({ label }) => /* @__PURE__ */ jsxs(
23
42
  ]
24
43
  }
25
44
  );
26
- const getTimestampVariablesString = (v) => {
27
- if (v < 10) {
28
- return `0${v}`;
29
- }
30
- return `${v}`;
31
- };
32
- const isBlankLine = (line) => !line.trim();
33
- const isOrderedListLine = (line) => /^\s*\d+\.\s/.test(line);
34
- const isBulletListLine = (line) => /^\s*[-*+]\s/.test(line) || /^\s*\u2022(?:\s+|\S|$)/u.test(line);
35
- const escapeBulletListMarker = (line) => {
36
- if (/^\s*\u2022/u.test(line)) {
37
- return line;
38
- }
39
- return line.replace(/^(\s*)([*+-])(\s)/, "$1\\$2$3");
40
- };
41
- const escapeOrderedListMarker = (line) => line.replace(/^(\s*)(\d+)\.(\s)/, "$1$2\\.$3");
42
- const foldListWithIntro = (s, isListItemLine, escapeListLine) => {
43
- const lines = s.split("\n");
44
- let firstListIdx = -1;
45
- for (let i = 0; i < lines.length; i++) {
46
- const line = lines[i];
47
- if (line !== void 0 && isListItemLine(line)) {
48
- firstListIdx = i;
49
- break;
50
- }
51
- }
52
- if (firstListIdx < 0) {
53
- return s;
54
- }
55
- const intro = lines.slice(0, firstListIdx);
56
- if (intro.some(isBlankLine)) {
57
- return s;
58
- }
59
- const rest = lines.slice(firstListIdx);
60
- const restItems = rest.filter((l) => !isBlankLine(l));
61
- if (restItems.length === 0 || !restItems.every(isListItemLine)) {
62
- return s;
63
- }
64
- const escaped = restItems.map(escapeListLine);
65
- if (intro.length === 0) {
66
- return escaped.join(" \n");
67
- }
68
- return `${intro.join(" \n")}
69
- ${escaped.join(" \n")}`;
70
- };
71
- const foldOrderedListWithIntro = (s) => foldListWithIntro(s, isOrderedListLine, escapeOrderedListMarker);
72
- const foldBulletListWithIntro = (s) => foldListWithIntro(s, isBulletListLine, escapeBulletListMarker);
73
- const normalizeChatUserInput = (input) => {
74
- let s = input.replace(/\r\n/g, "\n").trim();
75
- if (!s) {
76
- return s;
77
- }
78
- s = s.replace(/\n{3,}/g, "\n\n");
79
- s = s.replace(/\n\n(?=\s*\d+\.\s)/gm, "\n");
80
- s = s.replace(/\n\n(?=\s*[-*+]\s)/gm, "\n");
81
- s = s.replace(/\n\n(?=\s*\u2022)/gm, "\n");
82
- s = foldOrderedListWithIntro(s);
83
- s = foldBulletListWithIntro(s);
84
- return s.trim();
85
- };
86
- const getTimestamp = (unix_timestamp) => {
87
- if (typeof unix_timestamp !== "number" || Number.isNaN(unix_timestamp)) {
88
- console.error("Invalid Unix timestamp provided");
89
- return "";
90
- }
91
- const a = new Date(unix_timestamp);
92
- const month = getTimestampVariablesString(a.getMonth() + 1);
93
- const year = a.getFullYear();
94
- const date = getTimestampVariablesString(a.getDate());
95
- const hour = getTimestampVariablesString(a.getHours());
96
- const min = getTimestampVariablesString(a.getMinutes());
97
- const sec = getTimestampVariablesString(a.getSeconds());
98
- const time = `${date}/${month}/${year}, ${hour}:${min}:${sec}`;
99
- return time;
100
- };
101
- const createMessage = ({
102
- role,
103
- name,
104
- avatar,
105
- isLoading = false,
106
- content,
107
- timestamp,
108
- error,
109
- sources,
110
- toolCalls,
111
- defaultUserName = "Guest"
112
- }) => ({
113
- role,
114
- name: name || defaultUserName,
115
- avatar,
116
- isLoading,
117
- content,
118
- timestamp,
119
- error,
120
- sources,
121
- toolCalls
122
- });
123
- const createUserMessage = (props) => createMessage({
124
- ...props,
125
- role: "user",
126
- defaultUserName: props.defaultUserName
127
- });
128
- const createBotMessage = (props) => createMessage({
129
- ...props,
130
- role: "bot"
131
- });
132
- const getConversationsData = (conversation) => {
133
- const [userMessage, botMessage] = conversation.messages || [];
134
- return [
135
- {
136
- ...userMessage,
137
- timestamp: getTimestamp(
138
- conversation.started_at ? new Date(conversation.started_at).getTime() : Date.now()
139
- )
140
- },
141
- {
142
- ...botMessage,
143
- timestamp: getTimestamp(
144
- conversation.completed_at ? new Date(conversation.completed_at).getTime() : Date.now()
145
- ),
146
- referenced_documents: botMessage?.referenced_documents ?? []
147
- }
148
- ];
149
- };
150
- const transformDocumentsToSources = (referenced_documents) => {
151
- if (!referenced_documents || referenced_documents?.length === 0) {
152
- return void 0;
153
- }
154
- return {
155
- sources: referenced_documents.map(
156
- (doc) => ({
157
- body: doc.doc_description,
158
- title: doc.doc_title,
159
- link: doc?.doc_url,
160
- isExternal: !!doc?.doc_url,
161
- ...doc.source ? {
162
- headerContent: /* @__PURE__ */ jsx(RagSourceLabel, { source: doc.source }),
163
- ragSource: doc.source
164
- } : {}
165
- })
166
- )
167
- };
168
- };
169
45
  const sortConversations = (messages, sortOption) => {
170
46
  return [...messages].sort((a, b) => {
171
47
  const aTopicSummary = a.topic_summary || "";
@@ -235,5 +111,5 @@ const getCategorizeMessages = (messages, pinnedChats, addProps, t, sortOption =
235
111
  return filteredCategories;
236
112
  };
237
113
 
238
- export { ChatbotFootnoteWithIcon, createBotMessage, createMessage, createUserMessage, getCategorizeMessages, getConversationsData, getFootnoteProps, getTimestamp, getTimestampVariablesString, normalizeChatUserInput, transformDocumentsToSources };
114
+ export { ChatbotFootnoteWithIcon, getCategorizeMessages, getFootnoteProps, transformDocumentsToSources };
239
115
  //# sourceMappingURL=lightspeed-chatbox-utils.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"lightspeed-chatbox-utils.esm.js","sources":["../../src/utils/lightspeed-chatbox-utils.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n ChatbotFootnote,\n Conversation,\n SourcesCardProps,\n} from '@patternfly/chatbot';\nimport { Spinner } from '@patternfly/react-core';\nimport { ThumbtackIcon } from '@patternfly/react-icons';\nimport { RhUiAiInfoIcon } from '@patternfly/react-icons/dist/esm/icons/rh-ui-ai-info-icon';\n\nimport { RagSourceLabel } from '../components/RagSourceLabel';\nimport {\n BaseMessage,\n ConversationList,\n ConversationSummary,\n LCSConversation,\n ReferencedDocument,\n ReferencedDocuments,\n ToolCall,\n} from '../types';\n\nexport const getFootnoteProps = (\n t?: (key: string, params?: any) => string,\n) => ({\n label:\n t?.('footer.accuracy.label') ||\n 'Always review AI generated content prior to use.',\n});\n\nexport const ChatbotFootnoteWithIcon = ({ label }: { label: string }) => (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '4px',\n }}\n >\n <RhUiAiInfoIcon style={{ width: '14px', height: '14px', flexShrink: 0 }} />\n <ChatbotFootnote label={label} />\n </div>\n);\n\nexport const getTimestampVariablesString = (v: number) => {\n if (v < 10) {\n return `0${v}`;\n }\n return `${v}`;\n};\n\nconst isBlankLine = (line: string) => !line.trim();\n\n/** Ordered list item at line start (CommonMark), ignoring leading spaces. */\nconst isOrderedListLine = (line: string) => /^\\s*\\d+\\.\\s/.test(line);\n\n/** ASCII bullets; also U+2022 (•) — not a CommonMark marker, but users paste it as a list. */\nconst isBulletListLine = (line: string) =>\n /^\\s*[-*+]\\s/.test(line) || /^\\s*\\u2022(?:\\s+|\\S|$)/u.test(line);\n\nconst escapeBulletListMarker = (line: string) => {\n if (/^\\s*\\u2022/u.test(line)) {\n return line;\n }\n return line.replace(/^(\\s*)([*+-])(\\s)/, '$1\\\\$2$3');\n};\n\nconst escapeOrderedListMarker = (line: string) =>\n line.replace(/^(\\s*)(\\d+)\\.(\\s)/, '$1$2\\\\.$3');\n\n/**\n * When intro lines (no blank lines among them) are followed by a contiguous run of\n * list lines, join intro + list into one Markdown paragraph using hard breaks and\n * per-line escaping so the block does not split awkwardly in the chat UI.\n */\nconst foldListWithIntro = (\n s: string,\n isListItemLine: (line: string) => boolean,\n escapeListLine: (line: string) => string,\n): string => {\n const lines = s.split('\\n');\n let firstListIdx = -1;\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (line !== undefined && isListItemLine(line)) {\n firstListIdx = i;\n break;\n }\n }\n if (firstListIdx < 0) {\n return s;\n }\n\n const intro = lines.slice(0, firstListIdx);\n if (intro.some(isBlankLine)) {\n return s;\n }\n\n const rest = lines.slice(firstListIdx);\n const restItems = rest.filter(l => !isBlankLine(l));\n if (restItems.length === 0 || !restItems.every(isListItemLine)) {\n return s;\n }\n\n const escaped = restItems.map(escapeListLine);\n if (intro.length === 0) {\n return escaped.join(' \\n');\n }\n return `${intro.join(' \\n')} \\n${escaped.join(' \\n')}`;\n};\n\n/**\n * Paragraph + ordered list (even with a single newline) parses as two blocks; merge\n * intro + contiguous numbered lines into one paragraph using hard breaks (two spaces\n * + newline) and escaped `1.` markers so Markdown stays a single block.\n */\nconst foldOrderedListWithIntro = (s: string) =>\n foldListWithIntro(s, isOrderedListLine, escapeOrderedListMarker);\n\n/** Same idea as ordered lists for intro + bullet lines. */\nconst foldBulletListWithIntro = (s: string) =>\n foldListWithIntro(s, isBulletListLine, escapeBulletListMarker);\n\n/**\n * Trims user chat input and reduces blank lines that split Markdown blocks\n * (e.g. paragraph + blank line + ordered list) so PatternFly renders one user bubble.\n */\nexport const normalizeChatUserInput = (input: string): string => {\n let s = input.replace(/\\r\\n/g, '\\n').trim();\n if (!s) {\n return s;\n }\n s = s.replace(/\\n{3,}/g, '\\n\\n');\n s = s.replace(/\\n\\n(?=\\s*\\d+\\.\\s)/gm, '\\n');\n s = s.replace(/\\n\\n(?=\\s*[-*+]\\s)/gm, '\\n');\n s = s.replace(/\\n\\n(?=\\s*\\u2022)/gm, '\\n');\n s = foldOrderedListWithIntro(s);\n s = foldBulletListWithIntro(s);\n return s.trim();\n};\n\nexport const getTimestamp = (unix_timestamp: number) => {\n if (typeof unix_timestamp !== 'number' || Number.isNaN(unix_timestamp)) {\n // eslint-disable-next-line no-console\n console.error('Invalid Unix timestamp provided');\n return '';\n }\n\n const a = new Date(unix_timestamp);\n const month = getTimestampVariablesString(a.getMonth() + 1);\n const year = a.getFullYear();\n const date = getTimestampVariablesString(a.getDate());\n const hour = getTimestampVariablesString(a.getHours());\n const min = getTimestampVariablesString(a.getMinutes());\n const sec = getTimestampVariablesString(a.getSeconds());\n const time = `${date}/${month}/${year}, ${hour}:${min}:${sec}`;\n return time;\n};\n\nexport const splitJsonStrings = (jsonString: string): string[] => {\n const chunks = jsonString.split('}{');\n\n if (chunks.length <= 1) {\n return [jsonString];\n }\n\n return chunks.map((chunk, index, arr) => {\n if (index === 0) {\n return `${chunk}}`;\n } else if (index === arr.length - 1) {\n return `{${chunk}`;\n }\n return `{${chunk}}`;\n });\n};\n\ntype MessageProps = {\n content: string;\n timestamp: string;\n name?: string;\n avatar?: string | any;\n isLoading?: boolean;\n error?: {\n title: string;\n };\n sources?: SourcesCardProps;\n toolCalls?: ToolCall[];\n};\n\nexport const createMessage = ({\n role,\n name,\n avatar,\n isLoading = false,\n content,\n timestamp,\n error,\n sources,\n toolCalls,\n defaultUserName = 'Guest',\n}: MessageProps & { role: 'user' | 'bot'; defaultUserName?: string }) => ({\n role,\n name: name || defaultUserName,\n avatar,\n isLoading,\n content,\n timestamp,\n error,\n sources,\n toolCalls,\n});\n\nexport const createUserMessage = (\n props: MessageProps & { defaultUserName?: string },\n) =>\n createMessage({\n ...props,\n role: 'user',\n defaultUserName: props.defaultUserName,\n });\n\nexport const createBotMessage = (props: MessageProps) =>\n createMessage({\n ...props,\n role: 'bot',\n });\n\nexport const getConversationsData = (\n conversation: LCSConversation,\n): [BaseMessage, BaseMessage] => {\n const [userMessage, botMessage] = conversation.messages || [];\n return [\n {\n ...userMessage,\n timestamp: getTimestamp(\n conversation.started_at\n ? new Date(conversation.started_at).getTime()\n : Date.now(),\n ),\n },\n {\n ...botMessage,\n timestamp: getTimestamp(\n conversation.completed_at\n ? new Date(conversation.completed_at).getTime()\n : Date.now(),\n ),\n referenced_documents: botMessage?.referenced_documents ?? [],\n },\n ];\n};\n\nexport type SourceWithRagId = SourcesCardProps['sources'][number] & {\n /** Full LCORE RAG source id for chip-modal labels. */\n ragSource?: string;\n};\n\nexport const transformDocumentsToSources = (\n referenced_documents: ReferencedDocuments,\n): SourcesCardProps | undefined => {\n if (!referenced_documents || referenced_documents?.length === 0) {\n return undefined;\n }\n return {\n sources: referenced_documents.map(\n (doc: ReferencedDocument): SourceWithRagId => ({\n body: doc.doc_description,\n title: doc.doc_title,\n link: doc?.doc_url,\n isExternal: !!doc?.doc_url,\n ...(doc.source\n ? {\n headerContent: <RagSourceLabel source={doc.source} />,\n ragSource: doc.source,\n }\n : {}),\n }),\n ),\n };\n};\n\nexport type SortOption =\n 'newest' | 'oldest' | 'alphabeticalAsc' | 'alphabeticalDesc';\n\nconst sortConversations = (\n messages: ConversationList,\n sortOption: SortOption,\n): ConversationList => {\n return [...messages].sort((a, b) => {\n const aTopicSummary = a.topic_summary || '';\n const bTopicSummary = b.topic_summary || '';\n switch (sortOption) {\n case 'oldest':\n return a.last_message_timestamp - b.last_message_timestamp;\n case 'alphabeticalAsc':\n return aTopicSummary.localeCompare(bTopicSummary, undefined, {\n sensitivity: 'base',\n });\n case 'alphabeticalDesc':\n return bTopicSummary.localeCompare(aTopicSummary, undefined, {\n sensitivity: 'base',\n });\n case 'newest':\n default:\n return b.last_message_timestamp - a.last_message_timestamp;\n }\n });\n};\n\nexport const getCategorizeMessages = (\n messages: ConversationList,\n pinnedChats: string[],\n addProps: (c: ConversationSummary) => { [k: string]: any },\n t?: (key: string, params?: any) => string,\n sortOption: SortOption = 'newest',\n): { [k: string]: Conversation[] } => {\n const pinnedChatsKey =\n t?.('conversation.category.pinnedChats') || 'Pinned chats';\n const recentKey = t?.('conversation.category.recent') || 'Chats';\n const categorizedMessages: { [k: string]: Conversation[] } = {\n [pinnedChatsKey]: [],\n [recentKey]: [],\n };\n const sortedMessages = sortConversations(messages, sortOption);\n sortedMessages.forEach(c => {\n const message: Conversation = {\n id: c.conversation_id,\n text: c.topic_summary ?? '',\n icon: c.topic_summary ? undefined : <Spinner size=\"sm\" />,\n label: t?.('message.options.label') || 'Options',\n additionalProps: {\n 'aria-label': t?.('aria.options.label') || 'Options',\n },\n ...addProps(c),\n };\n\n if (pinnedChats.includes(c.conversation_id)) {\n categorizedMessages[pinnedChatsKey].push({\n ...message,\n icon: (\n <ThumbtackIcon\n style={{\n width: '1rem',\n height: '1rem',\n display: 'flex',\n alignItems: 'center',\n }}\n />\n ),\n });\n } else {\n categorizedMessages[recentKey].push(message);\n }\n });\n\n const filteredCategories = Object.keys(categorizedMessages).reduce(\n (result, category) => {\n result[category] = categorizedMessages[category];\n return result;\n },\n {} as any,\n );\n\n return filteredCategories;\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lightspeed-chatbox-utils.esm.js","sources":["../../src/utils/lightspeed-chatbox-utils.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n ChatbotFootnote,\n Conversation,\n type SourcesCardProps,\n} from '@patternfly/chatbot';\nimport { Spinner } from '@patternfly/react-core';\nimport { ThumbtackIcon } from '@patternfly/react-icons';\nimport { RhUiAiInfoIcon } from '@patternfly/react-icons/dist/esm/icons/rh-ui-ai-info-icon';\n\nimport { RagSourceLabel } from '../components/RagSourceLabel';\nimport {\n ConversationList,\n ConversationSummary,\n ReferencedDocuments,\n} from '../types';\nimport {\n transformDocumentsToSources as transformDocumentsToSourcesBase,\n type SourceWithRagId,\n} from './lightspeed-chatbox-message-utils';\n\nexport {\n createBotMessage,\n createMessage,\n createUserMessage,\n getConversationsData,\n getTimestamp,\n getTimestampVariablesString,\n normalizeChatUserInput,\n} from './lightspeed-chatbox-message-utils';\nexport type { SourceWithRagId } from './lightspeed-chatbox-message-utils';\n\n/**\n * Chat UI wrapper: adds SourcesCard `headerContent` pills from `ragSource`.\n * Pure mapping stays in message-utils so notebookStreamStore stays CSS-clean.\n */\nexport const transformDocumentsToSources = (\n referenced_documents: ReferencedDocuments,\n): SourcesCardProps | undefined => {\n const result = transformDocumentsToSourcesBase(referenced_documents);\n if (!result) {\n return undefined;\n }\n return {\n sources: result.sources.map((source: SourceWithRagId) => {\n if (!source.ragSource) {\n return source;\n }\n return {\n ...source,\n headerContent: <RagSourceLabel source={source.ragSource} />,\n };\n }),\n };\n};\n\nexport const getFootnoteProps = (\n t?: (key: string, params?: any) => string,\n) => ({\n label:\n t?.('footer.accuracy.label') ||\n 'Always review AI generated content prior to use.',\n});\n\nexport const ChatbotFootnoteWithIcon = ({ label }: { label: string }) => (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '4px',\n }}\n >\n <RhUiAiInfoIcon style={{ width: '14px', height: '14px', flexShrink: 0 }} />\n <ChatbotFootnote label={label} />\n </div>\n);\n\nexport const splitJsonStrings = (jsonString: string): string[] => {\n const chunks = jsonString.split('}{');\n\n if (chunks.length <= 1) {\n return [jsonString];\n }\n\n return chunks.map((chunk, index, arr) => {\n if (index === 0) {\n return `${chunk}}`;\n } else if (index === arr.length - 1) {\n return `{${chunk}`;\n }\n return `{${chunk}}`;\n });\n};\n\nexport type SortOption =\n 'newest' | 'oldest' | 'alphabeticalAsc' | 'alphabeticalDesc';\n\nconst sortConversations = (\n messages: ConversationList,\n sortOption: SortOption,\n): ConversationList => {\n return [...messages].sort((a, b) => {\n const aTopicSummary = a.topic_summary || '';\n const bTopicSummary = b.topic_summary || '';\n switch (sortOption) {\n case 'oldest':\n return a.last_message_timestamp - b.last_message_timestamp;\n case 'alphabeticalAsc':\n return aTopicSummary.localeCompare(bTopicSummary, undefined, {\n sensitivity: 'base',\n });\n case 'alphabeticalDesc':\n return bTopicSummary.localeCompare(aTopicSummary, undefined, {\n sensitivity: 'base',\n });\n case 'newest':\n default:\n return b.last_message_timestamp - a.last_message_timestamp;\n }\n });\n};\n\nexport const getCategorizeMessages = (\n messages: ConversationList,\n pinnedChats: string[],\n addProps: (c: ConversationSummary) => { [k: string]: any },\n t?: (key: string, params?: any) => string,\n sortOption: SortOption = 'newest',\n): { [k: string]: Conversation[] } => {\n const pinnedChatsKey =\n t?.('conversation.category.pinnedChats') || 'Pinned chats';\n const recentKey = t?.('conversation.category.recent') || 'Chats';\n const categorizedMessages: { [k: string]: Conversation[] } = {\n [pinnedChatsKey]: [],\n [recentKey]: [],\n };\n const sortedMessages = sortConversations(messages, sortOption);\n sortedMessages.forEach(c => {\n const message: Conversation = {\n id: c.conversation_id,\n text: c.topic_summary ?? '',\n icon: c.topic_summary ? undefined : <Spinner size=\"sm\" />,\n label: t?.('message.options.label') || 'Options',\n additionalProps: {\n 'aria-label': t?.('aria.options.label') || 'Options',\n },\n ...addProps(c),\n };\n\n if (pinnedChats.includes(c.conversation_id)) {\n categorizedMessages[pinnedChatsKey].push({\n ...message,\n icon: (\n <ThumbtackIcon\n style={{\n width: '1rem',\n height: '1rem',\n display: 'flex',\n alignItems: 'center',\n }}\n />\n ),\n });\n } else {\n categorizedMessages[recentKey].push(message);\n }\n });\n\n const filteredCategories = Object.keys(categorizedMessages).reduce(\n (result, category) => {\n result[category] = categorizedMessages[category];\n return result;\n },\n {} as any,\n );\n\n return filteredCategories;\n};\n"],"names":["transformDocumentsToSourcesBase"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@red-hat-developer-hub/backstage-plugin-intelligent-assistant",
3
- "version": "5.3.0",
3
+ "version": "5.3.1",
4
4
  "main": "./dist/index.esm.js",
5
5
  "types": "./dist/index.d.ts",
6
6
  "license": "Apache-2.0",
@@ -111,7 +111,7 @@
111
111
  "@patternfly/react-icons": "^6.5.0",
112
112
  "@patternfly/react-table": "^6.4.1",
113
113
  "@red-hat-developer-hub/backstage-plugin-app-react": "^1.0.0",
114
- "@red-hat-developer-hub/backstage-plugin-intelligent-assistant-common": "^5.3.0",
114
+ "@red-hat-developer-hub/backstage-plugin-intelligent-assistant-common": "^5.3.1",
115
115
  "@red-hat-developer-hub/backstage-plugin-theme": "^0.14.10",
116
116
  "@tanstack/react-query": "^5.59.15",
117
117
  "html2canvas-pro": "^1.5.0",