@red-hat-developer-hub/backstage-plugin-lightspeed 1.1.1 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +24 -0
- package/README.md +26 -20
- package/dist/alpha.d.ts +24 -0
- package/dist/api/LightspeedApiClient.esm.js.map +1 -1
- package/dist/api/api.esm.js.map +1 -1
- package/dist/components/AttachmentContext.esm.js +12 -2
- package/dist/components/AttachmentContext.esm.js.map +1 -1
- package/dist/components/LightSpeedChat.esm.js +199 -39
- package/dist/components/LightSpeedChat.esm.js.map +1 -1
- package/dist/components/LightspeedChatBox.esm.js +70 -9
- package/dist/components/LightspeedChatBox.esm.js.map +1 -1
- package/dist/components/LightspeedChatBoxHeader.esm.js +84 -26
- package/dist/components/LightspeedChatBoxHeader.esm.js.map +1 -1
- package/dist/components/LightspeedChatContainer.esm.js +118 -0
- package/dist/components/LightspeedChatContainer.esm.js.map +1 -0
- package/dist/components/LightspeedDrawerContext.esm.js +6 -0
- package/dist/components/LightspeedDrawerContext.esm.js.map +1 -0
- package/dist/components/LightspeedDrawerProvider.esm.js +175 -0
- package/dist/components/LightspeedDrawerProvider.esm.js.map +1 -0
- package/dist/components/LightspeedDrawerStateExposer.esm.js +28 -0
- package/dist/components/LightspeedDrawerStateExposer.esm.js.map +1 -0
- package/dist/components/LightspeedFAB.esm.js +68 -0
- package/dist/components/LightspeedFAB.esm.js.map +1 -0
- package/dist/components/LightspeedIcon.esm.js +23 -2
- package/dist/components/LightspeedIcon.esm.js.map +1 -1
- package/dist/components/LightspeedPage.esm.js +5 -110
- package/dist/components/LightspeedPage.esm.js.map +1 -1
- package/dist/components/Router.esm.js +19 -0
- package/dist/components/Router.esm.js.map +1 -0
- package/dist/components/ToolCallContent.esm.js +217 -0
- package/dist/components/ToolCallContent.esm.js.map +1 -0
- package/dist/hooks/useConversationMessages.esm.js +136 -20
- package/dist/hooks/useConversationMessages.esm.js.map +1 -1
- package/dist/hooks/useLightspeedDrawerContext.esm.js +15 -0
- package/dist/hooks/useLightspeedDrawerContext.esm.js.map +1 -0
- package/dist/hooks/usePinnedChatsSettings.esm.js +118 -0
- package/dist/hooks/usePinnedChatsSettings.esm.js.map +1 -0
- package/dist/hooks/useSortSettings.esm.js +60 -0
- package/dist/hooks/useSortSettings.esm.js.map +1 -0
- package/dist/images/logo-black.svg +22 -0
- package/dist/images/rounded-logo.svg +22 -0
- package/dist/index.d.ts +52 -2
- package/dist/index.esm.js +4 -1
- package/dist/index.esm.js.map +1 -1
- package/dist/plugin.esm.js +44 -5
- package/dist/plugin.esm.js.map +1 -1
- package/dist/routes.esm.js +7 -2
- package/dist/routes.esm.js.map +1 -1
- package/dist/translations/de.esm.js +29 -1
- package/dist/translations/de.esm.js.map +1 -1
- package/dist/translations/es.esm.js +29 -1
- package/dist/translations/es.esm.js.map +1 -1
- package/dist/translations/fr.esm.js +120 -115
- package/dist/translations/fr.esm.js.map +1 -1
- package/dist/translations/index.esm.js +3 -1
- package/dist/translations/index.esm.js.map +1 -1
- package/dist/translations/it.esm.js +158 -0
- package/dist/translations/it.esm.js.map +1 -0
- package/dist/translations/ja.esm.js +158 -0
- package/dist/translations/ja.esm.js.map +1 -0
- package/dist/translations/ref.esm.js +29 -1
- package/dist/translations/ref.esm.js.map +1 -1
- package/dist/types.esm.js.map +1 -1
- package/dist/utils/lightspeed-chatbox-utils.esm.js +24 -5
- package/dist/utils/lightspeed-chatbox-utils.esm.js.map +1 -1
- package/dist/utils/reasoningParser.esm.js +46 -0
- package/dist/utils/reasoningParser.esm.js.map +1 -0
- package/dist/utils/toolCallMapper.esm.js +15 -0
- package/dist/utils/toolCallMapper.esm.js.map +1 -0
- package/dist/utils/user-utils.esm.js +7 -0
- package/dist/utils/user-utils.esm.js.map +1 -0
- package/package.json +9 -4
- package/app-config.yaml +0 -18
|
@@ -54,6 +54,7 @@ const createMessage = ({
|
|
|
54
54
|
timestamp,
|
|
55
55
|
error,
|
|
56
56
|
sources,
|
|
57
|
+
toolCalls,
|
|
57
58
|
defaultUserName = "Guest"
|
|
58
59
|
}) => ({
|
|
59
60
|
role,
|
|
@@ -63,7 +64,8 @@ const createMessage = ({
|
|
|
63
64
|
content,
|
|
64
65
|
timestamp,
|
|
65
66
|
error,
|
|
66
|
-
sources
|
|
67
|
+
sources,
|
|
68
|
+
toolCalls
|
|
67
69
|
});
|
|
68
70
|
const createUserMessage = (props) => createMessage({
|
|
69
71
|
...props,
|
|
@@ -105,16 +107,33 @@ const transformDocumentsToSources = (referenced_documents) => {
|
|
|
105
107
|
}))
|
|
106
108
|
};
|
|
107
109
|
};
|
|
108
|
-
const
|
|
110
|
+
const sortConversations = (messages, sortOption) => {
|
|
111
|
+
return [...messages].sort((a, b) => {
|
|
112
|
+
switch (sortOption) {
|
|
113
|
+
case "oldest":
|
|
114
|
+
return a.last_message_timestamp - b.last_message_timestamp;
|
|
115
|
+
case "alphabeticalAsc":
|
|
116
|
+
return a.topic_summary.localeCompare(b.topic_summary, undefined, {
|
|
117
|
+
sensitivity: "base"
|
|
118
|
+
});
|
|
119
|
+
case "alphabeticalDesc":
|
|
120
|
+
return b.topic_summary.localeCompare(a.topic_summary, undefined, {
|
|
121
|
+
sensitivity: "base"
|
|
122
|
+
});
|
|
123
|
+
case "newest":
|
|
124
|
+
default:
|
|
125
|
+
return b.last_message_timestamp - a.last_message_timestamp;
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
};
|
|
129
|
+
const getCategorizeMessages = (messages, pinnedChats, addProps, t, sortOption = "newest") => {
|
|
109
130
|
const pinnedChatsKey = t?.("conversation.category.pinnedChats") || "Pinned";
|
|
110
131
|
const recentKey = t?.("conversation.category.recent") || "Recent";
|
|
111
132
|
const categorizedMessages = {
|
|
112
133
|
[pinnedChatsKey]: [],
|
|
113
134
|
[recentKey]: []
|
|
114
135
|
};
|
|
115
|
-
const sortedMessages =
|
|
116
|
-
(a, b) => b.last_message_timestamp - a.last_message_timestamp
|
|
117
|
-
);
|
|
136
|
+
const sortedMessages = sortConversations(messages, sortOption);
|
|
118
137
|
sortedMessages.forEach((c) => {
|
|
119
138
|
const message = {
|
|
120
139
|
id: c.conversation_id,
|
|
@@ -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 PushPinIcon from '@mui/icons-material/PushPin';\nimport { Conversation, SourcesCardProps } from '@patternfly/chatbot';\nimport { PopoverProps } from '@patternfly/react-core';\n\nimport {\n BaseMessage,\n ConversationList,\n ConversationSummary,\n LCSConversation,\n ReferencedDocument,\n ReferencedDocuments,\n} from '../types';\n\nexport const getFootnoteProps = (\n additionalClassName: string,\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 popover: {\n popoverProps: {\n className: additionalClassName ?? '',\n } as PopoverProps,\n title: t?.('footer.accuracy.popover.title') || 'Verify accuracy',\n description:\n t?.('footer.accuracy.popover.description') ||\n `While Developer Lightspeed strives for accuracy, there's always a possibility of errors. It's a good practice to verify critical information from reliable sources, especially if it's crucial for decision-making or actions.`,\n bannerImage: {\n src: 'https://cdn.dribbble.com/userupload/10651749/file/original-8a07b8e39d9e8bf002358c66fce1223e.gif',\n alt:\n t?.('footer.accuracy.popover.image.alt') ||\n 'Example image for footnote popover',\n },\n cta: {\n label: t?.('footer.accuracy.popover.cta.label') || 'Got it',\n onClick: () => {},\n },\n link: {\n label: t?.('footer.accuracy.popover.link.label') || 'Learn more',\n url: 'https://www.redhat.com/',\n },\n },\n});\n\nexport const getTimestampVariablesString = (v: number) => {\n if (v < 10) {\n return `0${v}`;\n }\n return `${v}`;\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};\n\nexport const createMessage = ({\n role,\n name,\n avatar,\n isLoading = false,\n content,\n timestamp,\n error,\n sources,\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});\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 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((doc: ReferencedDocument) => ({\n body: doc.doc_description,\n title: doc.doc_title,\n link: doc?.doc_url,\n isExternal: true,\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): { [k: string]: Conversation[] } => {\n const pinnedChatsKey = t?.('conversation.category.pinnedChats') || 'Pinned';\n const recentKey = t?.('conversation.category.recent') || 'Recent';\n const categorizedMessages: { [k: string]: Conversation[] } = {\n [pinnedChatsKey]: [],\n [recentKey]: [],\n };\n const sortedMessages = [...messages].sort(\n (a, b) => b.last_message_timestamp - a.last_message_timestamp,\n );\n sortedMessages.forEach(c => {\n const message: Conversation = {\n id: c.conversation_id,\n text: c.topic_summary,\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: <PushPinIcon />,\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 PushPinIcon from '@mui/icons-material/PushPin';\nimport { Conversation, SourcesCardProps } from '@patternfly/chatbot';\nimport { PopoverProps } from '@patternfly/react-core';\n\nimport {\n BaseMessage,\n ConversationList,\n ConversationSummary,\n LCSConversation,\n ReferencedDocument,\n ReferencedDocuments,\n ToolCall,\n} from '../types';\n\nexport const getFootnoteProps = (\n additionalClassName: string,\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 popover: {\n popoverProps: {\n className: additionalClassName ?? '',\n } as PopoverProps,\n title: t?.('footer.accuracy.popover.title') || 'Verify accuracy',\n description:\n t?.('footer.accuracy.popover.description') ||\n `While Developer Lightspeed strives for accuracy, there's always a possibility of errors. It's a good practice to verify critical information from reliable sources, especially if it's crucial for decision-making or actions.`,\n bannerImage: {\n src: 'https://cdn.dribbble.com/userupload/10651749/file/original-8a07b8e39d9e8bf002358c66fce1223e.gif',\n alt:\n t?.('footer.accuracy.popover.image.alt') ||\n 'Example image for footnote popover',\n },\n cta: {\n label: t?.('footer.accuracy.popover.cta.label') || 'Got it',\n onClick: () => {},\n },\n link: {\n label: t?.('footer.accuracy.popover.link.label') || 'Learn more',\n url: 'https://www.redhat.com/',\n },\n },\n});\n\nexport const getTimestampVariablesString = (v: number) => {\n if (v < 10) {\n return `0${v}`;\n }\n return `${v}`;\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 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((doc: ReferencedDocument) => ({\n body: doc.doc_description,\n title: doc.doc_title,\n link: doc?.doc_url,\n isExternal: true,\n })),\n };\n};\n\nexport type SortOption =\n | 'newest'\n | 'oldest'\n | 'alphabeticalAsc'\n | 'alphabeticalDesc';\n\nconst sortConversations = (\n messages: ConversationList,\n sortOption: SortOption,\n): ConversationList => {\n return [...messages].sort((a, b) => {\n switch (sortOption) {\n case 'oldest':\n return a.last_message_timestamp - b.last_message_timestamp;\n case 'alphabeticalAsc':\n return a.topic_summary.localeCompare(b.topic_summary, undefined, {\n sensitivity: 'base',\n });\n case 'alphabeticalDesc':\n return b.topic_summary.localeCompare(a.topic_summary, 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 = t?.('conversation.category.pinnedChats') || 'Pinned';\n const recentKey = t?.('conversation.category.recent') || 'Recent';\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 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: <PushPinIcon />,\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":";;;AA6Ba,MAAA,gBAAA,GAAmB,CAC9B,mBAAA,EACA,CACI,MAAA;AAAA,EACJ,KAAA,EACE,CAAI,GAAA,uBAAuB,CAC3B,IAAA,kDAAA;AAAA,EACF,OAAS,EAAA;AAAA,IACP,YAAc,EAAA;AAAA,MACZ,WAAW,mBAAuB,IAAA;AAAA,KACpC;AAAA,IACA,KAAA,EAAO,CAAI,GAAA,+BAA+B,CAAK,IAAA,iBAAA;AAAA,IAC/C,WAAA,EACE,CAAI,GAAA,qCAAqC,CACzC,IAAA,CAAA,8NAAA,CAAA;AAAA,IACF,WAAa,EAAA;AAAA,MACX,GAAK,EAAA,iGAAA;AAAA,MACL,GAAA,EACE,CAAI,GAAA,mCAAmC,CACvC,IAAA;AAAA,KACJ;AAAA,IACA,GAAK,EAAA;AAAA,MACH,KAAA,EAAO,CAAI,GAAA,mCAAmC,CAAK,IAAA,QAAA;AAAA,MACnD,SAAS,MAAM;AAAA;AAAC,KAClB;AAAA,IACA,IAAM,EAAA;AAAA,MACJ,KAAA,EAAO,CAAI,GAAA,oCAAoC,CAAK,IAAA,YAAA;AAAA,MACpD,GAAK,EAAA;AAAA;AACP;AAEJ,CAAA;AAEa,MAAA,2BAAA,GAA8B,CAAC,CAAc,KAAA;AACxD,EAAA,IAAI,IAAI,EAAI,EAAA;AACV,IAAA,OAAO,IAAI,CAAC,CAAA,CAAA;AAAA;AAEd,EAAA,OAAO,GAAG,CAAC,CAAA,CAAA;AACb;AAEa,MAAA,YAAA,GAAe,CAAC,cAA2B,KAAA;AACtD,EAAA,IAAI,OAAO,cAAmB,KAAA,QAAA,IAAY,MAAO,CAAA,KAAA,CAAM,cAAc,CAAG,EAAA;AAEtE,IAAA,OAAA,CAAQ,MAAM,iCAAiC,CAAA;AAC/C,IAAO,OAAA,EAAA;AAAA;AAGT,EAAM,MAAA,CAAA,GAAI,IAAI,IAAA,CAAK,cAAc,CAAA;AACjC,EAAA,MAAM,KAAQ,GAAA,2BAAA,CAA4B,CAAE,CAAA,QAAA,KAAa,CAAC,CAAA;AAC1D,EAAM,MAAA,IAAA,GAAO,EAAE,WAAY,EAAA;AAC3B,EAAA,MAAM,IAAO,GAAA,2BAAA,CAA4B,CAAE,CAAA,OAAA,EAAS,CAAA;AACpD,EAAA,MAAM,IAAO,GAAA,2BAAA,CAA4B,CAAE,CAAA,QAAA,EAAU,CAAA;AACrD,EAAA,MAAM,GAAM,GAAA,2BAAA,CAA4B,CAAE,CAAA,UAAA,EAAY,CAAA;AACtD,EAAA,MAAM,GAAM,GAAA,2BAAA,CAA4B,CAAE,CAAA,UAAA,EAAY,CAAA;AACtD,EAAA,MAAM,IAAO,GAAA,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AAC5D,EAAO,OAAA,IAAA;AACT;AAgCO,MAAM,gBAAgB,CAAC;AAAA,EAC5B,IAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAY,GAAA,KAAA;AAAA,EACZ,OAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAkB,GAAA;AACpB,CAA0E,MAAA;AAAA,EACxE,IAAA;AAAA,EACA,MAAM,IAAQ,IAAA,eAAA;AAAA,EACd,MAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA;AAEa,MAAA,iBAAA,GAAoB,CAC/B,KAAA,KAEA,aAAc,CAAA;AAAA,EACZ,GAAG,KAAA;AAAA,EACH,IAAM,EAAA,MAAA;AAAA,EACN,iBAAiB,KAAM,CAAA;AACzB,CAAC;AAEU,MAAA,gBAAA,GAAmB,CAAC,KAAA,KAC/B,aAAc,CAAA;AAAA,EACZ,GAAG,KAAA;AAAA,EACH,IAAM,EAAA;AACR,CAAC;AAEU,MAAA,oBAAA,GAAuB,CAClC,YAC+B,KAAA;AAC/B,EAAA,MAAM,CAAC,WAAa,EAAA,UAAU,CAAI,GAAA,YAAA,CAAa,YAAY,EAAC;AAC5D,EAAO,OAAA;AAAA,IACL;AAAA,MACE,GAAG,WAAA;AAAA,MACH,SAAW,EAAA,YAAA;AAAA,QACT,YAAA,CAAa,UACT,GAAA,IAAI,IAAK,CAAA,YAAA,CAAa,UAAU,CAAE,CAAA,OAAA,EAClC,GAAA,IAAA,CAAK,GAAI;AAAA;AACf,KACF;AAAA,IACA;AAAA,MACE,GAAG,UAAA;AAAA,MACH,SAAW,EAAA,YAAA;AAAA,QACT,YAAA,CAAa,YACT,GAAA,IAAI,IAAK,CAAA,YAAA,CAAa,YAAY,CAAE,CAAA,OAAA,EACpC,GAAA,IAAA,CAAK,GAAI;AAAA,OACf;AAAA,MACA,oBAAA,EAAsB,UAAY,EAAA,oBAAA,IAAwB;AAAC;AAC7D,GACF;AACF;AAEa,MAAA,2BAAA,GAA8B,CACzC,oBACiC,KAAA;AACjC,EAAA,IAAI,CAAC,oBAAA,IAAwB,oBAAsB,EAAA,MAAA,KAAW,CAAG,EAAA;AAC/D,IAAO,OAAA,SAAA;AAAA;AAET,EAAO,OAAA;AAAA,IACL,OAAS,EAAA,oBAAA,CAAqB,GAAI,CAAA,CAAC,GAA6B,MAAA;AAAA,MAC9D,MAAM,GAAI,CAAA,eAAA;AAAA,MACV,OAAO,GAAI,CAAA,SAAA;AAAA,MACX,MAAM,GAAK,EAAA,OAAA;AAAA,MACX,UAAY,EAAA;AAAA,KACZ,CAAA;AAAA,GACJ;AACF;AAQA,MAAM,iBAAA,GAAoB,CACxB,QAAA,EACA,UACqB,KAAA;AACrB,EAAA,OAAO,CAAC,GAAG,QAAQ,EAAE,IAAK,CAAA,CAAC,GAAG,CAAM,KAAA;AAClC,IAAA,QAAQ,UAAY;AAAA,MAClB,KAAK,QAAA;AACH,QAAO,OAAA,CAAA,CAAE,yBAAyB,CAAE,CAAA,sBAAA;AAAA,MACtC,KAAK,iBAAA;AACH,QAAA,OAAO,CAAE,CAAA,aAAA,CAAc,aAAc,CAAA,CAAA,CAAE,eAAe,SAAW,EAAA;AAAA,UAC/D,WAAa,EAAA;AAAA,SACd,CAAA;AAAA,MACH,KAAK,kBAAA;AACH,QAAA,OAAO,CAAE,CAAA,aAAA,CAAc,aAAc,CAAA,CAAA,CAAE,eAAe,SAAW,EAAA;AAAA,UAC/D,WAAa,EAAA;AAAA,SACd,CAAA;AAAA,MACH,KAAK,QAAA;AAAA,MACL;AACE,QAAO,OAAA,CAAA,CAAE,yBAAyB,CAAE,CAAA,sBAAA;AAAA;AACxC,GACD,CAAA;AACH,CAAA;AAEO,MAAM,wBAAwB,CACnC,QAAA,EACA,aACA,QACA,EAAA,CAAA,EACA,aAAyB,QACW,KAAA;AACpC,EAAM,MAAA,cAAA,GAAiB,CAAI,GAAA,mCAAmC,CAAK,IAAA,QAAA;AACnE,EAAM,MAAA,SAAA,GAAY,CAAI,GAAA,8BAA8B,CAAK,IAAA,QAAA;AACzD,EAAA,MAAM,mBAAuD,GAAA;AAAA,IAC3D,CAAC,cAAc,GAAG,EAAC;AAAA,IACnB,CAAC,SAAS,GAAG;AAAC,GAChB;AACA,EAAM,MAAA,cAAA,GAAiB,iBAAkB,CAAA,QAAA,EAAU,UAAU,CAAA;AAC7D,EAAA,cAAA,CAAe,QAAQ,CAAK,CAAA,KAAA;AAC1B,IAAA,MAAM,OAAwB,GAAA;AAAA,MAC5B,IAAI,CAAE,CAAA,eAAA;AAAA,MACN,MAAM,CAAE,CAAA,aAAA;AAAA,MACR,KAAA,EAAO,CAAI,GAAA,uBAAuB,CAAK,IAAA,SAAA;AAAA,MACvC,eAAiB,EAAA;AAAA,QACf,YAAA,EAAc,CAAI,GAAA,oBAAoB,CAAK,IAAA;AAAA,OAC7C;AAAA,MACA,GAAG,SAAS,CAAC;AAAA,KACf;AAEA,IAAA,IAAI,WAAY,CAAA,QAAA,CAAS,CAAE,CAAA,eAAe,CAAG,EAAA;AAC3C,MAAoB,mBAAA,CAAA,cAAc,EAAE,IAAK,CAAA;AAAA,QACvC,GAAG,OAAA;AAAA,QACH,IAAA,sBAAO,WAAY,EAAA,EAAA;AAAA,OACpB,CAAA;AAAA,KACI,MAAA;AACL,MAAoB,mBAAA,CAAA,SAAS,CAAE,CAAA,IAAA,CAAK,OAAO,CAAA;AAAA;AAC7C,GACD,CAAA;AAED,EAAA,MAAM,kBAAqB,GAAA,MAAA,CAAO,IAAK,CAAA,mBAAmB,CAAE,CAAA,MAAA;AAAA,IAC1D,CAAC,QAAQ,QAAa,KAAA;AACpB,MAAO,MAAA,CAAA,QAAQ,CAAI,GAAA,mBAAA,CAAoB,QAAQ,CAAA;AAC/C,MAAO,OAAA,MAAA;AAAA,KACT;AAAA,IACA;AAAC,GACH;AAEA,EAAO,OAAA,kBAAA;AACT;;;;"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
const isReasoningInProgress = (content) => {
|
|
2
|
+
if (!content) return false;
|
|
3
|
+
const hasOpeningTag = content.includes("<think>");
|
|
4
|
+
const hasClosingTag = content.includes("</think>");
|
|
5
|
+
return hasOpeningTag && !hasClosingTag;
|
|
6
|
+
};
|
|
7
|
+
const parseReasoning = (content) => {
|
|
8
|
+
if (!content) {
|
|
9
|
+
return {
|
|
10
|
+
reasoning: null,
|
|
11
|
+
mainContent: content,
|
|
12
|
+
hasReasoning: false,
|
|
13
|
+
isReasoningInProgress: false
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
const reasoningInProgress = isReasoningInProgress(content);
|
|
17
|
+
const reasoningPattern = /<think>(.*?)<\/think>/s;
|
|
18
|
+
const match = content.match(reasoningPattern);
|
|
19
|
+
if (match) {
|
|
20
|
+
const reasoning = (match[1] || "").trim();
|
|
21
|
+
const mainContent = content.replace(reasoningPattern, "").trim();
|
|
22
|
+
return {
|
|
23
|
+
reasoning,
|
|
24
|
+
mainContent,
|
|
25
|
+
hasReasoning: true,
|
|
26
|
+
isReasoningInProgress: false
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
if (reasoningInProgress) {
|
|
30
|
+
return {
|
|
31
|
+
reasoning: null,
|
|
32
|
+
mainContent: "",
|
|
33
|
+
hasReasoning: false,
|
|
34
|
+
isReasoningInProgress: true
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
reasoning: null,
|
|
39
|
+
mainContent: content,
|
|
40
|
+
hasReasoning: false,
|
|
41
|
+
isReasoningInProgress: false
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
export { isReasoningInProgress, parseReasoning };
|
|
46
|
+
//# sourceMappingURL=reasoningParser.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reasoningParser.esm.js","sources":["../../src/utils/reasoningParser.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 * Parses a message content to extract redacted reasoning and main content.\n * Messages from models with deep thinking support may contain:\n * <think>Some reasoning...</think>Main response\n *\n * @param content - The message content that may contain reasoning tags\n * @returns An object with the extracted reasoning and cleaned main content\n */\nexport interface ParsedReasoning {\n reasoning: string | null;\n mainContent: string;\n hasReasoning: boolean;\n isReasoningInProgress: boolean;\n}\n\nexport const isReasoningInProgress = (content: string): boolean => {\n if (!content) return false;\n\n const hasOpeningTag = content.includes('<think>');\n const hasClosingTag = content.includes('</think>');\n\n return hasOpeningTag && !hasClosingTag;\n};\n\nexport const parseReasoning = (content: string): ParsedReasoning => {\n if (!content) {\n return {\n reasoning: null,\n mainContent: content,\n hasReasoning: false,\n isReasoningInProgress: false,\n };\n }\n\n const reasoningInProgress = isReasoningInProgress(content);\n\n const reasoningPattern = /<think>(.*?)<\\/think>/s;\n const match = content.match(reasoningPattern);\n\n if (match) {\n const reasoning = (match[1] || '').trim();\n const mainContent = content.replace(reasoningPattern, '').trim();\n\n return {\n reasoning,\n mainContent,\n hasReasoning: true,\n isReasoningInProgress: false,\n };\n }\n\n if (reasoningInProgress) {\n return {\n reasoning: null,\n mainContent: '',\n hasReasoning: false,\n isReasoningInProgress: true,\n };\n }\n\n return {\n reasoning: null,\n mainContent: content,\n hasReasoning: false,\n isReasoningInProgress: false,\n };\n};\n"],"names":[],"mappings":"AA+Ba,MAAA,qBAAA,GAAwB,CAAC,OAA6B,KAAA;AACjE,EAAI,IAAA,CAAC,SAAgB,OAAA,KAAA;AAErB,EAAM,MAAA,aAAA,GAAgB,OAAQ,CAAA,QAAA,CAAS,SAAS,CAAA;AAChD,EAAM,MAAA,aAAA,GAAgB,OAAQ,CAAA,QAAA,CAAS,UAAU,CAAA;AAEjD,EAAA,OAAO,iBAAiB,CAAC,aAAA;AAC3B;AAEa,MAAA,cAAA,GAAiB,CAAC,OAAqC,KAAA;AAClE,EAAA,IAAI,CAAC,OAAS,EAAA;AACZ,IAAO,OAAA;AAAA,MACL,SAAW,EAAA,IAAA;AAAA,MACX,WAAa,EAAA,OAAA;AAAA,MACb,YAAc,EAAA,KAAA;AAAA,MACd,qBAAuB,EAAA;AAAA,KACzB;AAAA;AAGF,EAAM,MAAA,mBAAA,GAAsB,sBAAsB,OAAO,CAAA;AAEzD,EAAA,MAAM,gBAAmB,GAAA,wBAAA;AACzB,EAAM,MAAA,KAAA,GAAQ,OAAQ,CAAA,KAAA,CAAM,gBAAgB,CAAA;AAE5C,EAAA,IAAI,KAAO,EAAA;AACT,IAAA,MAAM,SAAa,GAAA,CAAA,KAAA,CAAM,CAAC,CAAA,IAAK,IAAI,IAAK,EAAA;AACxC,IAAA,MAAM,cAAc,OAAQ,CAAA,OAAA,CAAQ,gBAAkB,EAAA,EAAE,EAAE,IAAK,EAAA;AAE/D,IAAO,OAAA;AAAA,MACL,SAAA;AAAA,MACA,WAAA;AAAA,MACA,YAAc,EAAA,IAAA;AAAA,MACd,qBAAuB,EAAA;AAAA,KACzB;AAAA;AAGF,EAAA,IAAI,mBAAqB,EAAA;AACvB,IAAO,OAAA;AAAA,MACL,SAAW,EAAA,IAAA;AAAA,MACX,WAAa,EAAA,EAAA;AAAA,MACb,YAAc,EAAA,KAAA;AAAA,MACd,qBAAuB,EAAA;AAAA,KACzB;AAAA;AAGF,EAAO,OAAA;AAAA,IACL,SAAW,EAAA,IAAA;AAAA,IACX,WAAa,EAAA,OAAA;AAAA,IACb,YAAc,EAAA,KAAA;AAAA,IACd,qBAAuB,EAAA;AAAA,GACzB;AACF;;;;"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { ToolCallContent } from '../components/ToolCallContent.esm.js';
|
|
3
|
+
|
|
4
|
+
const mapToPatternFlyToolCall = (toolCall, t) => {
|
|
5
|
+
return {
|
|
6
|
+
titleText: t("toolCall.header", { toolName: toolCall.toolName }),
|
|
7
|
+
isLoading: toolCall.isLoading,
|
|
8
|
+
loadingText: t("toolCall.executing"),
|
|
9
|
+
expandableContent: !toolCall.isLoading ? /* @__PURE__ */ jsx(ToolCallContent, { toolCall }) : undefined,
|
|
10
|
+
actions: []
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export { mapToPatternFlyToolCall as default, mapToPatternFlyToolCall };
|
|
15
|
+
//# sourceMappingURL=toolCallMapper.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolCallMapper.esm.js","sources":["../../src/utils/toolCallMapper.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 */\n\nimport { ToolCallProps } from '@patternfly/chatbot';\n\nimport { ToolCallContent } from '../components/ToolCallContent';\nimport { ToolCall } from '../types';\n\n/**\n * Maps our internal ToolCall type to PatternFly's ToolCallProps\n */\nexport const mapToPatternFlyToolCall = (\n toolCall: ToolCall,\n t: (key: any, options?: any) => string,\n): ToolCallProps => {\n return {\n titleText: t('toolCall.header' as any, { toolName: toolCall.toolName }),\n isLoading: toolCall.isLoading,\n loadingText: t('toolCall.executing'),\n expandableContent: !toolCall.isLoading ? (\n <ToolCallContent toolCall={toolCall} />\n ) : undefined,\n actions: [],\n };\n};\n\nexport default mapToPatternFlyToolCall;\n"],"names":[],"mappings":";;;AAwBa,MAAA,uBAAA,GAA0B,CACrC,QAAA,EACA,CACkB,KAAA;AAClB,EAAO,OAAA;AAAA,IACL,WAAW,CAAE,CAAA,iBAAA,EAA0B,EAAE,QAAU,EAAA,QAAA,CAAS,UAAU,CAAA;AAAA,IACtE,WAAW,QAAS,CAAA,SAAA;AAAA,IACpB,WAAA,EAAa,EAAE,oBAAoB,CAAA;AAAA,IACnC,mBAAmB,CAAC,QAAA,CAAS,4BAC1B,GAAA,CAAA,eAAA,EAAA,EAAgB,UAAoB,CACnC,GAAA,SAAA;AAAA,IACJ,SAAS;AAAC,GACZ;AACF;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-utils.esm.js","sources":["../../src/utils/user-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 * Check if the user is a guest user.\n * Guest users have userEntityRef like \"user:default/guest\" or \"user:development/guest\"\n *\n * @param user - The user entity ref (e.g., \"user:default/john\")\n * @returns true if the user is a guest user, false otherwise\n */\nexport const isGuestUser = (user: string | undefined): boolean => {\n if (!user) return true;\n return user.endsWith('/guest');\n};\n"],"names":[],"mappings":"AAuBa,MAAA,WAAA,GAAc,CAAC,IAAsC,KAAA;AAChE,EAAI,IAAA,CAAC,MAAa,OAAA,IAAA;AAClB,EAAO,OAAA,IAAA,CAAK,SAAS,QAAQ,CAAA;AAC/B;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@red-hat-developer-hub/backstage-plugin-lightspeed",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"main": "./dist/index.esm.js",
|
|
5
5
|
"types": "./dist/index.d.ts",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -63,13 +63,17 @@
|
|
|
63
63
|
"@backstage/theme": "^0.7.0",
|
|
64
64
|
"@material-ui/core": "^4.9.13",
|
|
65
65
|
"@material-ui/lab": "^4.0.0-alpha.61",
|
|
66
|
+
"@monaco-editor/react": "^4.7.0",
|
|
66
67
|
"@mui/icons-material": "^6.1.8",
|
|
67
68
|
"@mui/material": "^5.12.2",
|
|
68
|
-
"@
|
|
69
|
+
"@mui/styles": "5.18.0",
|
|
70
|
+
"@patternfly/chatbot": "6.5.0",
|
|
69
71
|
"@patternfly/react-core": "6.4.0",
|
|
70
72
|
"@patternfly/react-icons": "^6.3.1",
|
|
71
|
-
"@red-hat-developer-hub/backstage-plugin-lightspeed-common": "^1.
|
|
73
|
+
"@red-hat-developer-hub/backstage-plugin-lightspeed-common": "^1.2.0",
|
|
74
|
+
"@red-hat-developer-hub/backstage-plugin-theme": "^0.10.0",
|
|
72
75
|
"@tanstack/react-query": "^5.59.15",
|
|
76
|
+
"monaco-editor": "^0.54.0",
|
|
73
77
|
"react-markdown": "^9.0.1",
|
|
74
78
|
"react-use": "^17.2.4"
|
|
75
79
|
},
|
|
@@ -123,7 +127,8 @@
|
|
|
123
127
|
"bugs": "https://github.com/redhat-developer/rhdh-plugins/issues",
|
|
124
128
|
"maintainers": [
|
|
125
129
|
"@karthikjeeyar",
|
|
126
|
-
"@rohitkrai03"
|
|
130
|
+
"@rohitkrai03",
|
|
131
|
+
"@debsmita1"
|
|
127
132
|
],
|
|
128
133
|
"author": "Red Hat",
|
|
129
134
|
"module": "./dist/index.esm.js"
|
package/app-config.yaml
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
dynamicPlugins:
|
|
2
|
-
frontend:
|
|
3
|
-
red-hat-developer-hub.backstage-plugin-lightspeed:
|
|
4
|
-
translationResources:
|
|
5
|
-
- importName: lightspeedTranslations
|
|
6
|
-
module: Alpha
|
|
7
|
-
ref: lightspeedTranslationRef
|
|
8
|
-
appIcons:
|
|
9
|
-
- name: LightspeedIcon
|
|
10
|
-
module: LightspeedPlugin
|
|
11
|
-
importName: LightspeedIcon
|
|
12
|
-
dynamicRoutes:
|
|
13
|
-
- path: /lightspeed
|
|
14
|
-
importName: LightspeedPage
|
|
15
|
-
module: LightspeedPlugin
|
|
16
|
-
menuItem:
|
|
17
|
-
icon: LightspeedIcon
|
|
18
|
-
text: Lightspeed
|