@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
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { useState, useEffect, useCallback } from 'react';
|
|
2
|
+
import { useApi, storageApiRef } from '@backstage/core-plugin-api';
|
|
3
|
+
import { isGuestUser } from '../utils/user-utils.esm.js';
|
|
4
|
+
|
|
5
|
+
const BUCKET_NAME = "lightspeed";
|
|
6
|
+
const PINNED_ENABLED_KEY = "pinnedChatsEnabled";
|
|
7
|
+
const PINNED_CHATS_KEY = "pinnedChats";
|
|
8
|
+
const usePinnedChatsSettings = (user) => {
|
|
9
|
+
const storageApi = useApi(storageApiRef);
|
|
10
|
+
const bucket = storageApi.forBucket(BUCKET_NAME);
|
|
11
|
+
const [isPinningChatsEnabled, setIsPinningChatsEnabled] = useState(true);
|
|
12
|
+
const [pinnedChats, setPinnedChats] = useState([]);
|
|
13
|
+
const shouldPersist = !isGuestUser(user);
|
|
14
|
+
useEffect(() => {
|
|
15
|
+
if (!user) {
|
|
16
|
+
setIsPinningChatsEnabled(true);
|
|
17
|
+
setPinnedChats([]);
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
if (isGuestUser(user)) {
|
|
21
|
+
setIsPinningChatsEnabled(true);
|
|
22
|
+
setPinnedChats([]);
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
const enabledSnapshot = bucket.snapshot(PINNED_ENABLED_KEY);
|
|
27
|
+
const chatsSnapshot = bucket.snapshot(PINNED_CHATS_KEY);
|
|
28
|
+
setIsPinningChatsEnabled(enabledSnapshot.value ?? true);
|
|
29
|
+
setPinnedChats(chatsSnapshot.value ?? []);
|
|
30
|
+
} catch (error) {
|
|
31
|
+
console.error("Error reading pinned chats settings from storage:", error);
|
|
32
|
+
}
|
|
33
|
+
const enabledSubscription = bucket.observe$(PINNED_ENABLED_KEY).subscribe({
|
|
34
|
+
next: (snapshot) => {
|
|
35
|
+
setIsPinningChatsEnabled(snapshot.value ?? true);
|
|
36
|
+
},
|
|
37
|
+
error: (error) => {
|
|
38
|
+
console.error("Error observing pinnedChatsEnabled:", error);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
const chatsSubscription = bucket.observe$(PINNED_CHATS_KEY).subscribe({
|
|
42
|
+
next: (snapshot) => {
|
|
43
|
+
setPinnedChats(snapshot.value ?? []);
|
|
44
|
+
},
|
|
45
|
+
error: (error) => {
|
|
46
|
+
console.error("Error observing pinnedChats:", error);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
return () => {
|
|
50
|
+
enabledSubscription.unsubscribe();
|
|
51
|
+
chatsSubscription.unsubscribe();
|
|
52
|
+
};
|
|
53
|
+
}, [bucket, user]);
|
|
54
|
+
const handlePinningChatsToggle = useCallback(
|
|
55
|
+
(enabled) => {
|
|
56
|
+
if (!user) return;
|
|
57
|
+
setIsPinningChatsEnabled(enabled);
|
|
58
|
+
if (!enabled) {
|
|
59
|
+
setPinnedChats([]);
|
|
60
|
+
}
|
|
61
|
+
if (shouldPersist) {
|
|
62
|
+
try {
|
|
63
|
+
bucket.set(PINNED_ENABLED_KEY, enabled);
|
|
64
|
+
if (!enabled) {
|
|
65
|
+
bucket.set(PINNED_CHATS_KEY, []);
|
|
66
|
+
}
|
|
67
|
+
} catch (error) {
|
|
68
|
+
console.error("Error saving pinning toggle state:", error);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
[bucket, user, shouldPersist]
|
|
73
|
+
);
|
|
74
|
+
const pinChat = useCallback(
|
|
75
|
+
(convId) => {
|
|
76
|
+
if (!user) return;
|
|
77
|
+
setPinnedChats((prev) => {
|
|
78
|
+
const updated = [...prev, convId];
|
|
79
|
+
if (shouldPersist) {
|
|
80
|
+
try {
|
|
81
|
+
bucket.set(PINNED_CHATS_KEY, updated);
|
|
82
|
+
} catch (error) {
|
|
83
|
+
console.error("Error saving pinned chat:", error);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return updated;
|
|
87
|
+
});
|
|
88
|
+
},
|
|
89
|
+
[bucket, user, shouldPersist]
|
|
90
|
+
);
|
|
91
|
+
const unpinChat = useCallback(
|
|
92
|
+
(convId) => {
|
|
93
|
+
if (!user) return;
|
|
94
|
+
setPinnedChats((prev) => {
|
|
95
|
+
const updated = prev.filter((id) => id !== convId);
|
|
96
|
+
if (shouldPersist) {
|
|
97
|
+
try {
|
|
98
|
+
bucket.set(PINNED_CHATS_KEY, updated);
|
|
99
|
+
} catch (error) {
|
|
100
|
+
console.error("Error saving unpinned chat:", error);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return updated;
|
|
104
|
+
});
|
|
105
|
+
},
|
|
106
|
+
[bucket, user, shouldPersist]
|
|
107
|
+
);
|
|
108
|
+
return {
|
|
109
|
+
isPinningChatsEnabled,
|
|
110
|
+
pinnedChats,
|
|
111
|
+
handlePinningChatsToggle,
|
|
112
|
+
pinChat,
|
|
113
|
+
unpinChat
|
|
114
|
+
};
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
export { usePinnedChatsSettings };
|
|
118
|
+
//# sourceMappingURL=usePinnedChatsSettings.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePinnedChatsSettings.esm.js","sources":["../../src/hooks/usePinnedChatsSettings.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 */\nimport { useCallback, useEffect, useState } from 'react';\n\nimport { storageApiRef, useApi } from '@backstage/core-plugin-api';\n\nimport { isGuestUser } from '../utils/user-utils';\n\nconst BUCKET_NAME = 'lightspeed';\nconst PINNED_ENABLED_KEY = 'pinnedChatsEnabled';\nconst PINNED_CHATS_KEY = 'pinnedChats';\n\ntype UsePinnedChatsSettingsReturn = {\n isPinningChatsEnabled: boolean;\n pinnedChats: string[];\n handlePinningChatsToggle: (enabled: boolean) => void;\n pinChat: (convId: string) => void;\n unpinChat: (convId: string) => void;\n};\n\n/**\n * Hook to manage pinned chats settings with persistence using Backstage StorageApi.\n * Settings are automatically scoped per-user by the StorageApi backend when using\n * database persistence. For guest users, settings are only kept in local state\n * and not persisted.\n *\n * @param user - The user entity ref (e.g., \"user:default/john\")\n * @returns Object containing pinned chats state and management functions\n */\nexport const usePinnedChatsSettings = (\n user: string | undefined,\n): UsePinnedChatsSettingsReturn => {\n const storageApi = useApi(storageApiRef);\n const bucket = storageApi.forBucket(BUCKET_NAME);\n\n const [isPinningChatsEnabled, setIsPinningChatsEnabled] = useState(true);\n const [pinnedChats, setPinnedChats] = useState<string[]>([]);\n\n // Determine if we should persist settings (not for guest users)\n const shouldPersist = !isGuestUser(user);\n\n // Initialize from storage and subscribe to changes\n useEffect(() => {\n if (!user) {\n setIsPinningChatsEnabled(true);\n setPinnedChats([]);\n return undefined;\n }\n\n // For guest users, use default values without loading from storage\n if (isGuestUser(user)) {\n setIsPinningChatsEnabled(true);\n setPinnedChats([]);\n return undefined;\n }\n\n // Load initial values from snapshot (works for browser mode)\n try {\n const enabledSnapshot = bucket.snapshot<boolean>(PINNED_ENABLED_KEY);\n const chatsSnapshot = bucket.snapshot<string[]>(PINNED_CHATS_KEY);\n\n setIsPinningChatsEnabled(enabledSnapshot.value ?? true);\n setPinnedChats(chatsSnapshot.value ?? []);\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('Error reading pinned chats settings from storage:', error);\n }\n\n // Subscribe to changes (needed for database mode cross-tab sync)\n const enabledSubscription = bucket\n .observe$<boolean>(PINNED_ENABLED_KEY)\n .subscribe({\n next: snapshot => {\n setIsPinningChatsEnabled(snapshot.value ?? true);\n },\n error: error => {\n // eslint-disable-next-line no-console\n console.error('Error observing pinnedChatsEnabled:', error);\n },\n });\n\n const chatsSubscription = bucket\n .observe$<string[]>(PINNED_CHATS_KEY)\n .subscribe({\n next: snapshot => {\n setPinnedChats(snapshot.value ?? []);\n },\n error: error => {\n // eslint-disable-next-line no-console\n console.error('Error observing pinnedChats:', error);\n },\n });\n\n return () => {\n enabledSubscription.unsubscribe();\n chatsSubscription.unsubscribe();\n };\n }, [bucket, user]);\n\n // Toggle pinning feature on/off\n const handlePinningChatsToggle = useCallback(\n (enabled: boolean) => {\n if (!user) return;\n\n setIsPinningChatsEnabled(enabled);\n\n // Clear pinned chats when disabling\n if (!enabled) {\n setPinnedChats([]);\n }\n\n // Only persist for non-guest users\n if (shouldPersist) {\n try {\n bucket.set(PINNED_ENABLED_KEY, enabled);\n\n // Clear pinned chats in storage when disabling\n if (!enabled) {\n bucket.set(PINNED_CHATS_KEY, []);\n }\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('Error saving pinning toggle state:', error);\n }\n }\n },\n [bucket, user, shouldPersist],\n );\n\n // Pin a chat\n const pinChat = useCallback(\n (convId: string) => {\n if (!user) return;\n\n setPinnedChats(prev => {\n const updated = [...prev, convId];\n\n // Only persist for non-guest users\n if (shouldPersist) {\n try {\n bucket.set(PINNED_CHATS_KEY, updated);\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('Error saving pinned chat:', error);\n }\n }\n\n return updated;\n });\n },\n [bucket, user, shouldPersist],\n );\n\n // Unpin a chat\n const unpinChat = useCallback(\n (convId: string) => {\n if (!user) return;\n\n setPinnedChats(prev => {\n const updated = prev.filter(id => id !== convId);\n\n // Only persist for non-guest users\n if (shouldPersist) {\n try {\n bucket.set(PINNED_CHATS_KEY, updated);\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('Error saving unpinned chat:', error);\n }\n }\n\n return updated;\n });\n },\n [bucket, user, shouldPersist],\n );\n\n return {\n isPinningChatsEnabled,\n pinnedChats,\n handlePinningChatsToggle,\n pinChat,\n unpinChat,\n };\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { useState, useEffect, useCallback } from 'react';
|
|
2
|
+
import { useApi, storageApiRef } from '@backstage/core-plugin-api';
|
|
3
|
+
import { isGuestUser } from '../utils/user-utils.esm.js';
|
|
4
|
+
|
|
5
|
+
const BUCKET_NAME = "lightspeed";
|
|
6
|
+
const SORT_ORDER_KEY = "sortOrder";
|
|
7
|
+
const useSortSettings = (user) => {
|
|
8
|
+
const storageApi = useApi(storageApiRef);
|
|
9
|
+
const bucket = storageApi.forBucket(BUCKET_NAME);
|
|
10
|
+
const [selectedSort, setSelectedSort] = useState("newest");
|
|
11
|
+
const shouldPersist = !isGuestUser(user);
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
if (!user) {
|
|
14
|
+
setSelectedSort("newest");
|
|
15
|
+
return undefined;
|
|
16
|
+
}
|
|
17
|
+
if (isGuestUser(user)) {
|
|
18
|
+
setSelectedSort("newest");
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
try {
|
|
22
|
+
const sortSnapshot = bucket.snapshot(SORT_ORDER_KEY);
|
|
23
|
+
setSelectedSort(sortSnapshot.value ?? "newest");
|
|
24
|
+
} catch (error) {
|
|
25
|
+
console.error("Error reading sort order from storage:", error);
|
|
26
|
+
}
|
|
27
|
+
const sortSubscription = bucket.observe$(SORT_ORDER_KEY).subscribe({
|
|
28
|
+
next: (snapshot) => {
|
|
29
|
+
setSelectedSort(snapshot.value ?? "newest");
|
|
30
|
+
},
|
|
31
|
+
error: (error) => {
|
|
32
|
+
console.error("Error observing sortOrder:", error);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
return () => {
|
|
36
|
+
sortSubscription.unsubscribe();
|
|
37
|
+
};
|
|
38
|
+
}, [bucket, user]);
|
|
39
|
+
const handleSortChange = useCallback(
|
|
40
|
+
(sortOption) => {
|
|
41
|
+
if (!user) return;
|
|
42
|
+
setSelectedSort(sortOption);
|
|
43
|
+
if (shouldPersist) {
|
|
44
|
+
try {
|
|
45
|
+
bucket.set(SORT_ORDER_KEY, sortOption);
|
|
46
|
+
} catch (error) {
|
|
47
|
+
console.error("Error saving sort order:", error);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
[bucket, user, shouldPersist]
|
|
52
|
+
);
|
|
53
|
+
return {
|
|
54
|
+
selectedSort,
|
|
55
|
+
handleSortChange
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
export { useSortSettings };
|
|
60
|
+
//# sourceMappingURL=useSortSettings.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSortSettings.esm.js","sources":["../../src/hooks/useSortSettings.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 */\nimport { useCallback, useEffect, useState } from 'react';\n\nimport { storageApiRef, useApi } from '@backstage/core-plugin-api';\n\nimport { SortOption } from '../utils/lightspeed-chatbox-utils';\nimport { isGuestUser } from '../utils/user-utils';\n\nconst BUCKET_NAME = 'lightspeed';\nconst SORT_ORDER_KEY = 'sortOrder';\n\ntype UseSortSettingsReturn = {\n selectedSort: SortOption;\n handleSortChange: (sortOption: SortOption) => void;\n};\n\n/**\n * Hook to manage sort order settings with persistence using Backstage StorageApi.\n * Settings are automatically scoped per-user by the StorageApi backend when using\n * database persistence. For guest users, settings are only kept in local state\n * and not persisted.\n *\n * @param user - The user entity ref (e.g., \"user:default/john\")\n * @returns Object containing sort state and management function\n */\nexport const useSortSettings = (\n user: string | undefined,\n): UseSortSettingsReturn => {\n const storageApi = useApi(storageApiRef);\n const bucket = storageApi.forBucket(BUCKET_NAME);\n\n const [selectedSort, setSelectedSort] = useState<SortOption>('newest');\n\n // Determine if we should persist settings (not for guest users)\n const shouldPersist = !isGuestUser(user);\n\n // Initialize from storage and subscribe to changes\n useEffect(() => {\n if (!user) {\n setSelectedSort('newest');\n return undefined;\n }\n\n // For guest users, use default values without loading from storage\n if (isGuestUser(user)) {\n setSelectedSort('newest');\n return undefined;\n }\n\n // Load initial value from snapshot (works for browser mode)\n try {\n const sortSnapshot = bucket.snapshot<SortOption>(SORT_ORDER_KEY);\n setSelectedSort(sortSnapshot.value ?? 'newest');\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('Error reading sort order from storage:', error);\n }\n\n // Subscribe to changes (needed for database mode cross-tab sync)\n const sortSubscription = bucket\n .observe$<SortOption>(SORT_ORDER_KEY)\n .subscribe({\n next: snapshot => {\n setSelectedSort(snapshot.value ?? 'newest');\n },\n error: error => {\n // eslint-disable-next-line no-console\n console.error('Error observing sortOrder:', error);\n },\n });\n\n return () => {\n sortSubscription.unsubscribe();\n };\n }, [bucket, user]);\n\n // Change sort order\n const handleSortChange = useCallback(\n (sortOption: SortOption) => {\n if (!user) return;\n\n setSelectedSort(sortOption);\n\n // Only persist for non-guest users\n if (shouldPersist) {\n try {\n bucket.set(SORT_ORDER_KEY, sortOption);\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('Error saving sort order:', error);\n }\n }\n },\n [bucket, user, shouldPersist],\n );\n\n return {\n selectedSort,\n handleSortChange,\n };\n};\n"],"names":[],"mappings":";;;;AAsBA,MAAM,WAAc,GAAA,YAAA;AACpB,MAAM,cAAiB,GAAA,WAAA;AAgBV,MAAA,eAAA,GAAkB,CAC7B,IAC0B,KAAA;AAC1B,EAAM,MAAA,UAAA,GAAa,OAAO,aAAa,CAAA;AACvC,EAAM,MAAA,MAAA,GAAS,UAAW,CAAA,SAAA,CAAU,WAAW,CAAA;AAE/C,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAqB,QAAQ,CAAA;AAGrE,EAAM,MAAA,aAAA,GAAgB,CAAC,WAAA,CAAY,IAAI,CAAA;AAGvC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAM,EAAA;AACT,MAAA,eAAA,CAAgB,QAAQ,CAAA;AACxB,MAAO,OAAA,SAAA;AAAA;AAIT,IAAI,IAAA,WAAA,CAAY,IAAI,CAAG,EAAA;AACrB,MAAA,eAAA,CAAgB,QAAQ,CAAA;AACxB,MAAO,OAAA,SAAA;AAAA;AAIT,IAAI,IAAA;AACF,MAAM,MAAA,YAAA,GAAe,MAAO,CAAA,QAAA,CAAqB,cAAc,CAAA;AAC/D,MAAgB,eAAA,CAAA,YAAA,CAAa,SAAS,QAAQ,CAAA;AAAA,aACvC,KAAO,EAAA;AAEd,MAAQ,OAAA,CAAA,KAAA,CAAM,0CAA0C,KAAK,CAAA;AAAA;AAI/D,IAAA,MAAM,gBAAmB,GAAA,MAAA,CACtB,QAAqB,CAAA,cAAc,EACnC,SAAU,CAAA;AAAA,MACT,MAAM,CAAY,QAAA,KAAA;AAChB,QAAgB,eAAA,CAAA,QAAA,CAAS,SAAS,QAAQ,CAAA;AAAA,OAC5C;AAAA,MACA,OAAO,CAAS,KAAA,KAAA;AAEd,QAAQ,OAAA,CAAA,KAAA,CAAM,8BAA8B,KAAK,CAAA;AAAA;AACnD,KACD,CAAA;AAEH,IAAA,OAAO,MAAM;AACX,MAAA,gBAAA,CAAiB,WAAY,EAAA;AAAA,KAC/B;AAAA,GACC,EAAA,CAAC,MAAQ,EAAA,IAAI,CAAC,CAAA;AAGjB,EAAA,MAAM,gBAAmB,GAAA,WAAA;AAAA,IACvB,CAAC,UAA2B,KAAA;AAC1B,MAAA,IAAI,CAAC,IAAM,EAAA;AAEX,MAAA,eAAA,CAAgB,UAAU,CAAA;AAG1B,MAAA,IAAI,aAAe,EAAA;AACjB,QAAI,IAAA;AACF,UAAO,MAAA,CAAA,GAAA,CAAI,gBAAgB,UAAU,CAAA;AAAA,iBAC9B,KAAO,EAAA;AAEd,UAAQ,OAAA,CAAA,KAAA,CAAM,4BAA4B,KAAK,CAAA;AAAA;AACjD;AACF,KACF;AAAA,IACA,CAAC,MAAQ,EAAA,IAAA,EAAM,aAAa;AAAA,GAC9B;AAEA,EAAO,OAAA;AAAA,IACL,YAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<g clip-path="url(#clip0_2455_5384)">
|
|
3
|
+
<path d="M15 0H5C2.23889 0 0 2.23889 0 5V15C0 17.7611 2.23889 20 5 20H15C17.7611 20 20 17.7611 20 15V5C20 2.23889 17.7611 0 15 0ZM19.3056 15C19.3056 17.3722 17.3722 19.3056 15 19.3056H5C2.62778 19.3056 0.694444 17.3722 0.694444 15V5C0.694444 2.62778 2.62778 0.694444 5 0.694444H15C17.3722 0.694444 19.3056 2.62778 19.3056 5V15Z" fill="#151515"/>
|
|
4
|
+
<path d="M10.5556 8.12223C10.7445 8.12223 10.9 7.96667 10.9 7.77778V3.88889C10.9 3.7 10.7445 3.54445 10.5556 3.54445C10.3667 3.54445 10.2111 3.7 10.2111 3.88889V7.77778C10.2111 7.96667 10.3667 8.12223 10.5556 8.12223Z" fill="#151515"/>
|
|
5
|
+
<path d="M8.67778 10C8.67778 9.81112 8.52223 9.65556 8.33334 9.65556H4.44445C4.25556 9.65556 4.10001 9.81112 4.10001 10C4.10001 10.1889 4.25556 10.3445 4.44445 10.3445H8.33334C8.52223 10.3445 8.67778 10.1889 8.67778 10Z" fill="#151515"/>
|
|
6
|
+
<path d="M10.5556 11.8778C10.3667 11.8778 10.2111 12.0333 10.2111 12.2222V16.1111C10.2111 16.3 10.3667 16.4556 10.5556 16.4556C10.7445 16.4556 10.9 16.3 10.9 16.1111V12.2222C10.9 12.0333 10.7445 11.8778 10.5556 11.8778Z" fill="#151515"/>
|
|
7
|
+
<path d="M16.4333 9.86666C16.4333 9.86666 16.4056 9.81666 16.3889 9.79443C16.3778 9.78332 16.3722 9.76666 16.3611 9.74999L15.25 8.63888C15.1167 8.50555 14.8945 8.50555 14.7611 8.63888C14.6278 8.77221 14.6278 8.99443 14.7611 9.12777L15.2778 9.64444H10.0056C9.81667 9.64444 9.66112 9.79999 9.66112 9.98888C9.66112 10.1778 9.81667 10.3333 10.0056 10.3333H15.2778L14.7611 10.85C14.6278 10.9833 14.6278 11.2055 14.7611 11.3389C14.8278 11.4055 14.9167 11.4389 15.0056 11.4389C15.0945 11.4389 15.1833 11.4055 15.25 11.3389L16.3611 10.2278C16.3611 10.2278 16.3778 10.2 16.3889 10.1833C16.4056 10.1611 16.4222 10.1389 16.4333 10.1111C16.45 10.0722 16.4556 10.0333 16.4556 9.99443C16.4556 9.99443 16.4556 9.98332 16.4556 9.97777C16.4556 9.97221 16.4556 9.96666 16.4556 9.9611C16.4556 9.92221 16.45 9.88332 16.4333 9.84443V9.86666Z" fill="#151515"/>
|
|
8
|
+
<path d="M8.64444 8.57778C8.71111 8.64445 8.8 8.67778 8.88889 8.67778C8.97778 8.67778 9.06666 8.64445 9.13333 8.57778C9.26666 8.44445 9.26666 8.22223 9.13333 8.08889L6.91111 5.86667C6.77777 5.73334 6.55555 5.73334 6.42222 5.86667C6.28889 6 6.28889 6.22223 6.42222 6.35556L8.64444 8.57778Z" fill="#151515"/>
|
|
9
|
+
<path d="M9.13333 11.4222C9 11.2889 8.77778 11.2889 8.64444 11.4222L6.42222 13.6444C6.28889 13.7778 6.28889 14 6.42222 14.1333C6.48889 14.2 6.57778 14.2333 6.66666 14.2333C6.75555 14.2333 6.84444 14.2 6.91111 14.1333L9.13333 11.9111C9.26666 11.7778 9.26666 11.5556 9.13333 11.4222Z" fill="#151515"/>
|
|
10
|
+
<path d="M9.22778 5.48333C9.18889 5.29444 9.00556 5.17222 8.81667 5.21666C8.62778 5.25555 8.51112 5.43888 8.55 5.62777L8.78334 6.73888C8.81667 6.89999 8.96112 7.01666 9.12223 7.01666C9.14445 7.01666 9.17223 7.01666 9.19445 7.0111C9.38334 6.97222 9.5 6.78888 9.46112 6.59999L9.22778 5.48888V5.48333Z" fill="#151515"/>
|
|
11
|
+
<path d="M6.03888 8.67221L7.15 8.90554C7.15 8.90554 7.2 8.9111 7.22222 8.9111C7.38333 8.9111 7.52777 8.79999 7.56111 8.63332C7.6 8.44443 7.48333 8.2611 7.29444 8.22221L6.18333 7.98888C5.99444 7.94443 5.81111 8.06666 5.77222 8.25554C5.73333 8.44443 5.85 8.62777 6.03888 8.66666V8.67221Z" fill="#151515"/>
|
|
12
|
+
<path d="M9.19445 12.9945C9.00556 12.9556 8.82223 13.0722 8.78334 13.2611L8.55 14.3722C8.51112 14.5611 8.62778 14.7445 8.81667 14.7834C8.83889 14.7834 8.86667 14.7889 8.88889 14.7889C9.05 14.7889 9.19445 14.6778 9.22778 14.5111L9.46112 13.4C9.5 13.2111 9.38334 13.0278 9.19445 12.9889V12.9945Z" fill="#151515"/>
|
|
13
|
+
<path d="M7.56111 11.3611C7.52222 11.1722 7.33888 11.05 7.15 11.0944L6.03888 11.3277C5.85 11.3666 5.73333 11.55 5.77222 11.7389C5.80555 11.9 5.95 12.0166 6.11111 12.0166C6.13333 12.0166 6.16111 12.0166 6.18333 12.0111L7.29444 11.7777C7.48333 11.7389 7.6 11.5555 7.56111 11.3666V11.3611Z" fill="#151515"/>
|
|
14
|
+
<path d="M4.19999 8.02226C4.26666 8.08892 4.35555 8.12781 4.44444 8.12781C4.53333 8.12781 4.62221 8.08892 4.68888 8.02226C4.72221 7.98892 4.74999 7.95559 4.76666 7.91115C4.78333 7.8667 4.79444 7.82226 4.79444 7.77781C4.79444 7.68892 4.75555 7.60003 4.68888 7.53337C4.5611 7.40003 4.32777 7.40559 4.19999 7.53337C4.13333 7.60003 4.09444 7.68892 4.09444 7.77781C4.09444 7.82226 4.10555 7.8667 4.12221 7.91115C4.14444 7.95559 4.16666 7.98892 4.19999 8.02226Z" fill="#151515"/>
|
|
15
|
+
<path d="M4.19999 11.9778C4.13333 12.0445 4.09444 12.1334 4.09444 12.2223C4.09444 12.3111 4.13333 12.4056 4.19999 12.4667C4.26666 12.5334 4.35555 12.5723 4.44444 12.5723C4.53333 12.5723 4.62221 12.5334 4.68888 12.4667C4.75555 12.4056 4.79444 12.3111 4.79444 12.2223C4.79444 12.1334 4.75555 12.0445 4.68888 11.9778C4.55555 11.8445 4.32777 11.85 4.19999 11.9778Z" fill="#151515"/>
|
|
16
|
+
</g>
|
|
17
|
+
<defs>
|
|
18
|
+
<clipPath id="clip0_2455_5384">
|
|
19
|
+
<rect width="100" height="100" fill="white"/>
|
|
20
|
+
</clipPath>
|
|
21
|
+
</defs>
|
|
22
|
+
</svg>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<svg width="47" height="47" viewBox="0 0 47 47" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<g clip-path="url(#clip0_2263_6157)">
|
|
3
|
+
<circle cx="23.5" cy="23.5" r="22.75" fill="white" stroke="#E0E0E0" stroke-width="1.5"/>
|
|
4
|
+
<path d="M24.5067 18.9867C24.0533 18.9867 23.68 18.6133 23.68 18.16V8.82667C23.68 8.37333 24.0533 8 24.5067 8C24.96 8 25.3333 8.37333 25.3333 8.82667V18.16C25.3333 18.6133 24.96 18.9867 24.5067 18.9867Z" fill="#EE0000"/>
|
|
5
|
+
<path d="M19.1733 24.32H9.84C9.38667 24.32 9.01334 23.9467 9.01334 23.4933C9.01334 23.04 9.38667 22.6667 9.84 22.6667H19.1733C19.6267 22.6667 20 23.04 20 23.4933C20 23.9467 19.6267 24.32 19.1733 24.32Z" fill="#EE0000"/>
|
|
6
|
+
<path d="M24.5067 38.9867C24.0533 38.9867 23.68 38.6133 23.68 38.16V28.8267C23.68 28.3733 24.0533 28 24.5067 28C24.96 28 25.3333 28.3733 25.3333 28.8267V38.16C25.3333 38.6133 24.96 38.9867 24.5067 38.9867Z" fill="#EE0000"/>
|
|
7
|
+
<path d="M38.6133 23.8133C38.6533 23.72 38.6667 23.6267 38.6667 23.5333C38.6667 23.5333 38.6667 23.5067 38.6667 23.4933C38.6667 23.48 38.6667 23.4667 38.6667 23.4533C38.6667 23.36 38.6533 23.2667 38.6133 23.1733C38.5867 23.1067 38.5467 23.0533 38.5067 23C38.48 22.9733 38.4667 22.9333 38.44 22.8933L35.7733 20.2267C35.4533 19.9067 34.92 19.9067 34.6 20.2267C34.28 20.5467 34.28 21.08 34.6 21.4L35.84 22.64H23.1867C22.7333 22.64 22.36 23.0133 22.36 23.4667C22.36 23.92 22.7333 24.2933 23.1867 24.2933H35.84L34.6 25.5333C34.28 25.8533 34.28 26.3867 34.6 26.7067C34.76 26.8667 34.9733 26.9467 35.1867 26.9467C35.4 26.9467 35.6133 26.8667 35.7733 26.7067L38.44 24.04C38.44 24.04 38.48 23.9733 38.5067 23.9333C38.5467 23.88 38.5867 23.8267 38.6133 23.76V23.8133Z" fill="black"/>
|
|
8
|
+
<path d="M20.5067 20.32C20.2933 20.32 20.08 20.24 19.92 20.08L14.5867 14.7467C14.2667 14.4267 14.2667 13.8933 14.5867 13.5733C14.9067 13.2533 15.44 13.2533 15.76 13.5733L21.0933 18.9067C21.4133 19.2267 21.4133 19.76 21.0933 20.08C20.9333 20.24 20.72 20.32 20.5067 20.32Z" fill="black"/>
|
|
9
|
+
<path d="M15.1733 33.6533C14.96 33.6533 14.7467 33.5733 14.5867 33.4133C14.2667 33.0933 14.2667 32.56 14.5867 32.24L19.92 26.9067C20.24 26.5867 20.7733 26.5867 21.0933 26.9067C21.4133 27.2267 21.4133 27.76 21.0933 28.08L15.76 33.4133C15.6 33.5733 15.3867 33.6533 15.1733 33.6533Z" fill="black"/>
|
|
10
|
+
<path d="M21.0667 16.32C20.68 16.32 20.3333 16.0533 20.2533 15.6533L19.6933 12.9867C19.6 12.5333 19.88 12.0933 20.3333 12C20.7867 11.8933 21.2267 12.1867 21.32 12.64L21.88 15.3067C21.9733 15.76 21.6933 16.2 21.24 16.2933C21.1867 16.2933 21.12 16.3067 21.0667 16.3067V16.32Z" fill="#EE0000"/>
|
|
11
|
+
<path d="M16.5067 20.8933C16.5067 20.8933 16.3867 20.8933 16.3333 20.88L13.6667 20.32C13.2133 20.2267 12.9333 19.7867 13.0267 19.3333C13.12 18.88 13.56 18.5867 14.0133 18.6933L16.68 19.2533C17.1333 19.3467 17.4133 19.7867 17.32 20.24C17.24 20.6267 16.8933 20.9067 16.5067 20.9067V20.8933Z" fill="#EE0000"/>
|
|
12
|
+
<path d="M20.5067 34.9867C20.5067 34.9867 20.3867 34.9867 20.3333 34.9733C19.88 34.88 19.6 34.44 19.6933 33.9867L20.2533 31.32C20.3467 30.8667 20.7867 30.5733 21.24 30.68C21.6933 30.7733 21.9733 31.2133 21.88 31.6667L21.32 34.3333C21.24 34.72 20.8933 35 20.5067 35V34.9867Z" fill="#EE0000"/>
|
|
13
|
+
<path d="M13.84 28.32C13.4533 28.32 13.1067 28.0533 13.0267 27.6533C12.9333 27.2 13.2133 26.76 13.6667 26.6667L16.3333 26.1067C16.7867 26 17.2267 26.2933 17.32 26.7467C17.4133 27.2 17.1333 27.64 16.68 27.7333L14.0133 28.2933C14.0133 28.2933 13.8933 28.3067 13.84 28.3067V28.32Z" fill="#EE0000"/>
|
|
14
|
+
<path d="M9.84 19C9.62667 19 9.41333 18.9067 9.25333 18.7467C9.17333 18.6667 9.12 18.5867 9.06667 18.48C9.02667 18.3733 9 18.2667 9 18.16C9 17.9467 9.09333 17.7333 9.25333 17.5733C9.56 17.2667 10.12 17.2533 10.4267 17.5733C10.5867 17.7333 10.68 17.9467 10.68 18.16C10.68 18.2667 10.6533 18.3733 10.6133 18.48C10.5733 18.5867 10.5067 18.6667 10.4267 18.7467C10.2667 18.9067 10.0533 19 9.84 19Z" fill="black"/>
|
|
15
|
+
<path d="M9.84 29.6667C9.62667 29.6667 9.41333 29.5733 9.25333 29.4133C9.09333 29.2667 9 29.04 9 28.8267C9 28.6133 9.09333 28.4 9.25333 28.24C9.56 27.9333 10.1067 27.92 10.4267 28.24C10.5867 28.4 10.68 28.6133 10.68 28.8267C10.68 29.04 10.5867 29.2667 10.4267 29.4133C10.2667 29.5733 10.0533 29.6667 9.84 29.6667Z" fill="black"/>
|
|
16
|
+
</g>
|
|
17
|
+
<defs>
|
|
18
|
+
<clipPath id="clip0_2263_6157">
|
|
19
|
+
<rect width="47" height="47" fill="white"/>
|
|
20
|
+
</clipPath>
|
|
21
|
+
</defs>
|
|
22
|
+
</svg>
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,37 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
2
|
import * as _backstage_core_plugin_api from '@backstage/core-plugin-api';
|
|
3
|
+
import { PropsWithChildren } from 'react';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @public
|
|
7
|
+
* Partial Lightspeed drawer state exposed to the ApplicationDrawer
|
|
8
|
+
*/
|
|
9
|
+
type DrawerState = {
|
|
10
|
+
id: string;
|
|
11
|
+
isDrawerOpen: boolean;
|
|
12
|
+
drawerWidth: number;
|
|
13
|
+
setDrawerWidth: (width: number) => void;
|
|
14
|
+
closeDrawer: () => void;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* @public
|
|
18
|
+
* Props for drawer state exposer components
|
|
19
|
+
*/
|
|
20
|
+
type DrawerStateExposerProps = {
|
|
21
|
+
/**
|
|
22
|
+
* Callback called whenever the drawer state changes
|
|
23
|
+
*/
|
|
24
|
+
onStateChange: (state: DrawerState) => void;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* @public
|
|
28
|
+
* This exposes LightspeedDrawer's partial context to the ApplicationDrawer
|
|
29
|
+
*
|
|
30
|
+
* It reads the LightspeedDrawerContext and calls the onStateChange callback with the
|
|
31
|
+
* partial state (id, isDrawerOpen, drawerWidth, setDrawerWidth).
|
|
32
|
+
|
|
33
|
+
*/
|
|
34
|
+
declare const LightspeedDrawerStateExposer: ({ onStateChange, }: DrawerStateExposerProps) => null;
|
|
3
35
|
|
|
4
36
|
/**
|
|
5
37
|
* Lightspeed Plugin
|
|
@@ -7,12 +39,19 @@ import * as _backstage_core_plugin_api from '@backstage/core-plugin-api';
|
|
|
7
39
|
*/
|
|
8
40
|
declare const lightspeedPlugin: _backstage_core_plugin_api.BackstagePlugin<{
|
|
9
41
|
root: _backstage_core_plugin_api.RouteRef<undefined>;
|
|
42
|
+
lightspeedConversation: _backstage_core_plugin_api.SubRouteRef<_backstage_core_plugin_api.PathParams<"/conversation/:conversationId">>;
|
|
10
43
|
}, {}, {}>;
|
|
11
44
|
/**
|
|
12
|
-
* Lightspeed Page
|
|
45
|
+
* Lightspeed Page Router
|
|
13
46
|
* @public
|
|
14
47
|
*/
|
|
15
48
|
declare const LightspeedPage: () => react_jsx_runtime.JSX.Element;
|
|
49
|
+
/**
|
|
50
|
+
* Lightspeed Drawer Provider
|
|
51
|
+
*
|
|
52
|
+
* @public
|
|
53
|
+
*/
|
|
54
|
+
declare const LightspeedDrawerProvider: React.ComponentType<PropsWithChildren>;
|
|
16
55
|
|
|
17
56
|
/**
|
|
18
57
|
* @public
|
|
@@ -20,4 +59,15 @@ declare const LightspeedPage: () => react_jsx_runtime.JSX.Element;
|
|
|
20
59
|
*/
|
|
21
60
|
declare const LightspeedIcon: () => react_jsx_runtime.JSX.Element;
|
|
22
61
|
|
|
23
|
-
|
|
62
|
+
/**
|
|
63
|
+
* @public
|
|
64
|
+
* Lightspeed Floating action button to open/close the lightspeed chatbot
|
|
65
|
+
*/
|
|
66
|
+
declare const LightspeedFAB: () => react_jsx_runtime.JSX.Element | null;
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* @public
|
|
70
|
+
*/
|
|
71
|
+
declare const LightspeedChatContainer: () => react_jsx_runtime.JSX.Element;
|
|
72
|
+
|
|
73
|
+
export { type DrawerState, type DrawerStateExposerProps, LightspeedChatContainer, LightspeedDrawerProvider, LightspeedDrawerStateExposer, LightspeedFAB, LightspeedIcon, LightspeedPage, lightspeedPlugin };
|
package/dist/index.esm.js
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
-
export { LightspeedPage, lightspeedPlugin } from './plugin.esm.js';
|
|
1
|
+
export { LightspeedDrawerProvider, LightspeedPage, lightspeedPlugin } from './plugin.esm.js';
|
|
2
2
|
export { LightspeedIcon } from './components/LightspeedIcon.esm.js';
|
|
3
|
+
export { LightspeedFAB } from './components/LightspeedFAB.esm.js';
|
|
4
|
+
export { LightspeedChatContainer } from './components/LightspeedChatContainer.esm.js';
|
|
5
|
+
export { LightspeedDrawerStateExposer } from './components/LightspeedDrawerStateExposer.esm.js';
|
|
3
6
|
//# sourceMappingURL=index.esm.js.map
|
package/dist/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|
package/dist/plugin.esm.js
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import '@patternfly/react-core/dist/styles/base-no-reset.css';
|
|
2
2
|
import '@patternfly/chatbot/dist/css/main.css';
|
|
3
|
-
import { createPlugin, createApiFactory, configApiRef, fetchApiRef, createRoutableExtension } from '@backstage/core-plugin-api';
|
|
3
|
+
import { createPlugin, createApiFactory, configApiRef, fetchApiRef, createRoutableExtension, createComponentExtension } from '@backstage/core-plugin-api';
|
|
4
4
|
import { lightspeedApiRef } from './api/api.esm.js';
|
|
5
5
|
import { LightspeedApiClient } from './api/LightspeedApiClient.esm.js';
|
|
6
|
-
import { rootRouteRef } from './routes.esm.js';
|
|
6
|
+
import { rootRouteRef, addConversationRouteRef } from './routes.esm.js';
|
|
7
7
|
|
|
8
8
|
const lightspeedPlugin = createPlugin({
|
|
9
9
|
id: "lightspeed",
|
|
10
10
|
routes: {
|
|
11
|
-
root: rootRouteRef
|
|
11
|
+
root: rootRouteRef,
|
|
12
|
+
lightspeedConversation: addConversationRouteRef
|
|
12
13
|
},
|
|
13
14
|
apis: [
|
|
14
15
|
createApiFactory({
|
|
@@ -24,10 +25,48 @@ const lightspeedPlugin = createPlugin({
|
|
|
24
25
|
const LightspeedPage = lightspeedPlugin.provide(
|
|
25
26
|
createRoutableExtension({
|
|
26
27
|
name: "LightspeedPage",
|
|
27
|
-
component: () => import('./components/
|
|
28
|
+
component: () => import('./components/Router.esm.js').then((m) => m.Router),
|
|
28
29
|
mountPoint: rootRouteRef
|
|
29
30
|
})
|
|
30
31
|
);
|
|
32
|
+
const LightspeedDrawerProvider = lightspeedPlugin.provide(
|
|
33
|
+
createComponentExtension({
|
|
34
|
+
name: "LightspeedDrawerProvider",
|
|
35
|
+
component: {
|
|
36
|
+
lazy: () => import('./components/LightspeedDrawerProvider.esm.js').then(
|
|
37
|
+
(m) => m.LightspeedDrawerProvider
|
|
38
|
+
)
|
|
39
|
+
}
|
|
40
|
+
})
|
|
41
|
+
);
|
|
42
|
+
lightspeedPlugin.provide(
|
|
43
|
+
createComponentExtension({
|
|
44
|
+
name: "LightspeedFAB",
|
|
45
|
+
component: {
|
|
46
|
+
lazy: () => import('./components/LightspeedFAB.esm.js').then((m) => m.LightspeedFAB)
|
|
47
|
+
}
|
|
48
|
+
})
|
|
49
|
+
);
|
|
50
|
+
lightspeedPlugin.provide(
|
|
51
|
+
createComponentExtension({
|
|
52
|
+
name: "LightspeedDrawerStateExposer",
|
|
53
|
+
component: {
|
|
54
|
+
lazy: () => import('./components/LightspeedDrawerStateExposer.esm.js').then(
|
|
55
|
+
(m) => m.LightspeedDrawerStateExposer
|
|
56
|
+
)
|
|
57
|
+
}
|
|
58
|
+
})
|
|
59
|
+
);
|
|
60
|
+
lightspeedPlugin.provide(
|
|
61
|
+
createComponentExtension({
|
|
62
|
+
name: "LightspeedChatContainer",
|
|
63
|
+
component: {
|
|
64
|
+
lazy: () => import('./components/LightspeedChatContainer.esm.js').then(
|
|
65
|
+
(m) => m.LightspeedChatContainer
|
|
66
|
+
)
|
|
67
|
+
}
|
|
68
|
+
})
|
|
69
|
+
);
|
|
31
70
|
|
|
32
|
-
export { LightspeedPage, lightspeedPlugin };
|
|
71
|
+
export { LightspeedDrawerProvider, LightspeedPage, lightspeedPlugin };
|
|
33
72
|
//# sourceMappingURL=plugin.esm.js.map
|
package/dist/plugin.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.esm.js","sources":["../src/plugin.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\nimport '@patternfly/react-core/dist/styles/base-no-reset.css';\nimport '@patternfly/chatbot/dist/css/main.css';\n\nimport {\n configApiRef,\n createApiFactory,\n createPlugin,\n createRoutableExtension,\n fetchApiRef,\n} from '@backstage/core-plugin-api';\n\nimport { lightspeedApiRef } from './api/api';\nimport { LightspeedApiClient } from './api/LightspeedApiClient';\nimport { rootRouteRef } from './routes';\n\n/**\n * Lightspeed Plugin\n * @public\n */\nexport const lightspeedPlugin = createPlugin({\n id: 'lightspeed',\n routes: {\n root: rootRouteRef,\n },\n apis: [\n createApiFactory({\n api: lightspeedApiRef,\n deps: {\n configApi: configApiRef,\n fetchApi: fetchApiRef,\n },\n factory: ({ configApi, fetchApi }) =>\n new LightspeedApiClient({ configApi, fetchApi }),\n }),\n ],\n});\n\n/**\n * Lightspeed Page\n * @public\n */\nexport const LightspeedPage = lightspeedPlugin.provide(\n createRoutableExtension({\n name: 'LightspeedPage',\n component: () =>\n import('./components/
|
|
1
|
+
{"version":3,"file":"plugin.esm.js","sources":["../src/plugin.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\nimport '@patternfly/react-core/dist/styles/base-no-reset.css';\nimport '@patternfly/chatbot/dist/css/main.css';\n\nimport { PropsWithChildren } from 'react';\n\nimport {\n configApiRef,\n createApiFactory,\n createComponentExtension,\n createPlugin,\n createRoutableExtension,\n fetchApiRef,\n} from '@backstage/core-plugin-api';\n\nimport { lightspeedApiRef } from './api/api';\nimport { LightspeedApiClient } from './api/LightspeedApiClient';\nimport { addConversationRouteRef, rootRouteRef } from './routes';\n\n/**\n * Lightspeed Plugin\n * @public\n */\nexport const lightspeedPlugin = createPlugin({\n id: 'lightspeed',\n routes: {\n root: rootRouteRef,\n lightspeedConversation: addConversationRouteRef,\n },\n apis: [\n createApiFactory({\n api: lightspeedApiRef,\n deps: {\n configApi: configApiRef,\n fetchApi: fetchApiRef,\n },\n factory: ({ configApi, fetchApi }) =>\n new LightspeedApiClient({ configApi, fetchApi }),\n }),\n ],\n});\n\n/**\n * Lightspeed Page Router\n * @public\n */\nexport const LightspeedPage = lightspeedPlugin.provide(\n createRoutableExtension({\n name: 'LightspeedPage',\n component: () => import('./components/Router').then(m => m.Router),\n mountPoint: rootRouteRef,\n }),\n);\n\n/**\n * Lightspeed Drawer Provider\n *\n * @public\n */\nexport const LightspeedDrawerProvider: React.ComponentType<PropsWithChildren> =\n lightspeedPlugin.provide(\n createComponentExtension({\n name: 'LightspeedDrawerProvider',\n component: {\n lazy: () =>\n import('./components/LightspeedDrawerProvider').then(\n m => m.LightspeedDrawerProvider,\n ),\n },\n }),\n );\n\n/**\n * Lightspeed FAB for global floating action button fot LightspeedAI\n *\n * @public\n */\nexport const LightspeedFAB: React.ComponentType = lightspeedPlugin.provide(\n createComponentExtension({\n name: 'LightspeedFAB',\n component: {\n lazy: () =>\n import('./components/LightspeedFAB').then(m => m.LightspeedFAB),\n },\n }),\n);\n\n/**\n * Lightspeed Drawer State Exposer exposes its drawer state\n *\n * @public\n */\nexport const LightspeedDrawerStateExposer = lightspeedPlugin.provide(\n createComponentExtension({\n name: 'LightspeedDrawerStateExposer',\n component: {\n lazy: () =>\n import('./components/LightspeedDrawerStateExposer').then(\n m => m.LightspeedDrawerStateExposer,\n ),\n },\n }),\n);\n\n/**\n * Lightspeed Chat Container component extension\n *\n * @public\n */\nexport const LightspeedChatContainer = lightspeedPlugin.provide(\n createComponentExtension({\n name: 'LightspeedChatContainer',\n component: {\n lazy: () =>\n import('./components/LightspeedChatContainer').then(\n m => m.LightspeedChatContainer,\n ),\n },\n }),\n);\n"],"names":[],"mappings":";;;;;;;AAsCO,MAAM,mBAAmB,YAAa,CAAA;AAAA,EAC3C,EAAI,EAAA,YAAA;AAAA,EACJ,MAAQ,EAAA;AAAA,IACN,IAAM,EAAA,YAAA;AAAA,IACN,sBAAwB,EAAA;AAAA,GAC1B;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,gBAAiB,CAAA;AAAA,MACf,GAAK,EAAA,gBAAA;AAAA,MACL,IAAM,EAAA;AAAA,QACJ,SAAW,EAAA,YAAA;AAAA,QACX,QAAU,EAAA;AAAA,OACZ;AAAA,MACA,OAAA,EAAS,CAAC,EAAE,SAAW,EAAA,QAAA,EACrB,KAAA,IAAI,mBAAoB,CAAA,EAAE,SAAW,EAAA,QAAA,EAAU;AAAA,KAClD;AAAA;AAEL,CAAC;AAMM,MAAM,iBAAiB,gBAAiB,CAAA,OAAA;AAAA,EAC7C,uBAAwB,CAAA;AAAA,IACtB,IAAM,EAAA,gBAAA;AAAA,IACN,SAAA,EAAW,MAAM,OAAO,4BAAqB,EAAE,IAAK,CAAA,CAAA,CAAA,KAAK,EAAE,MAAM,CAAA;AAAA,IACjE,UAAY,EAAA;AAAA,GACb;AACH;AAOO,MAAM,2BACX,gBAAiB,CAAA,OAAA;AAAA,EACf,wBAAyB,CAAA;AAAA,IACvB,IAAM,EAAA,0BAAA;AAAA,IACN,SAAW,EAAA;AAAA,MACT,IAAM,EAAA,MACJ,OAAO,8CAAuC,CAAE,CAAA,IAAA;AAAA,QAC9C,OAAK,CAAE,CAAA;AAAA;AACT;AACJ,GACD;AACH;AAOgD,gBAAiB,CAAA,OAAA;AAAA,EACjE,wBAAyB,CAAA;AAAA,IACvB,IAAM,EAAA,eAAA;AAAA,IACN,SAAW,EAAA;AAAA,MACT,IAAA,EAAM,MACJ,OAAO,mCAA4B,EAAE,IAAK,CAAA,CAAA,CAAA,KAAK,EAAE,aAAa;AAAA;AAClE,GACD;AACH;AAO4C,gBAAiB,CAAA,OAAA;AAAA,EAC3D,wBAAyB,CAAA;AAAA,IACvB,IAAM,EAAA,8BAAA;AAAA,IACN,SAAW,EAAA;AAAA,MACT,IAAM,EAAA,MACJ,OAAO,kDAA2C,CAAE,CAAA,IAAA;AAAA,QAClD,OAAK,CAAE,CAAA;AAAA;AACT;AACJ,GACD;AACH;AAOuC,gBAAiB,CAAA,OAAA;AAAA,EACtD,wBAAyB,CAAA;AAAA,IACvB,IAAM,EAAA,yBAAA;AAAA,IACN,SAAW,EAAA;AAAA,MACT,IAAM,EAAA,MACJ,OAAO,6CAAsC,CAAE,CAAA,IAAA;AAAA,QAC7C,OAAK,CAAE,CAAA;AAAA;AACT;AACJ,GACD;AACH;;;;"}
|
package/dist/routes.esm.js
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
|
-
import { createRouteRef } from '@backstage/core-plugin-api';
|
|
1
|
+
import { createRouteRef, createSubRouteRef } from '@backstage/core-plugin-api';
|
|
2
2
|
|
|
3
3
|
const rootRouteRef = createRouteRef({
|
|
4
4
|
id: "lightspeed"
|
|
5
5
|
});
|
|
6
|
+
const addConversationRouteRef = createSubRouteRef({
|
|
7
|
+
id: "lightspeed-conversation",
|
|
8
|
+
parent: rootRouteRef,
|
|
9
|
+
path: "/conversation/:conversationId"
|
|
10
|
+
});
|
|
6
11
|
|
|
7
|
-
export { rootRouteRef };
|
|
12
|
+
export { addConversationRouteRef, rootRouteRef };
|
|
8
13
|
//# sourceMappingURL=routes.esm.js.map
|
package/dist/routes.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.esm.js","sources":["../src/routes.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\nimport { createRouteRef } from '@backstage/core-plugin-api';\n\nexport const rootRouteRef = createRouteRef({\n id: 'lightspeed',\n});\n"],"names":[],"mappings":";;AAkBO,MAAM,eAAe,cAAe,CAAA;AAAA,EACzC,EAAI,EAAA;AACN,CAAC;;;;"}
|
|
1
|
+
{"version":3,"file":"routes.esm.js","sources":["../src/routes.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\nimport { createRouteRef, createSubRouteRef } from '@backstage/core-plugin-api';\n\nexport const rootRouteRef = createRouteRef({\n id: 'lightspeed',\n});\n\nexport const addConversationRouteRef = createSubRouteRef({\n id: 'lightspeed-conversation',\n parent: rootRouteRef,\n path: '/conversation/:conversationId',\n});\n"],"names":[],"mappings":";;AAkBO,MAAM,eAAe,cAAe,CAAA;AAAA,EACzC,EAAI,EAAA;AACN,CAAC;AAEM,MAAM,0BAA0B,iBAAkB,CAAA;AAAA,EACvD,EAAI,EAAA,yBAAA;AAAA,EACJ,MAAQ,EAAA,YAAA;AAAA,EACR,IAAM,EAAA;AACR,CAAC;;;;"}
|
|
@@ -86,6 +86,7 @@ const lightspeedTranslationDe = createTranslationMessages({
|
|
|
86
86
|
"aria.scroll.down": "Nach unten",
|
|
87
87
|
"aria.scroll.up": "Nach oben",
|
|
88
88
|
"aria.settings.label": "Chatbot-Optionen",
|
|
89
|
+
"aria.close": "Chatbot schlie\xDFen",
|
|
89
90
|
// Modal actions
|
|
90
91
|
"modal.edit": "Bearbeiten",
|
|
91
92
|
"modal.save": "Speichern",
|
|
@@ -111,6 +112,7 @@ const lightspeedTranslationDe = createTranslationMessages({
|
|
|
111
112
|
"tooltip.backToTop": "Nach oben",
|
|
112
113
|
"tooltip.backToBottom": "Nach unten",
|
|
113
114
|
"tooltip.settings": "Chatbot-Optionen",
|
|
115
|
+
"tooltip.close": "Schlie\xDFen",
|
|
114
116
|
// Modal titles
|
|
115
117
|
"modal.title.preview": "Anhang-Vorschau",
|
|
116
118
|
"modal.title.edit": "Anhang bearbeiten",
|
|
@@ -152,7 +154,33 @@ const lightspeedTranslationDe = createTranslationMessages({
|
|
|
152
154
|
"settings.pinned.enable": "Angeheftete Chats aktivieren",
|
|
153
155
|
"settings.pinned.disable": "Angeheftete Chats deaktivieren",
|
|
154
156
|
"settings.pinned.enabled.description": "Angeheftete Chats sind derzeit aktiviert",
|
|
155
|
-
"settings.pinned.disabled.description": "Angeheftete Chats sind derzeit deaktiviert"
|
|
157
|
+
"settings.pinned.disabled.description": "Angeheftete Chats sind derzeit deaktiviert",
|
|
158
|
+
// Tool calling
|
|
159
|
+
"toolCall.header": "Werkzeugantwort: {{toolName}}",
|
|
160
|
+
"toolCall.thinking": "{{seconds}} Sekunden nachgedacht",
|
|
161
|
+
"toolCall.executionTime": "Ausf\xFChrungszeit: ",
|
|
162
|
+
"toolCall.parameters": "Parameter",
|
|
163
|
+
"toolCall.response": "Antwort",
|
|
164
|
+
"toolCall.showMore": "mehr anzeigen",
|
|
165
|
+
"toolCall.showLess": "weniger anzeigen",
|
|
166
|
+
"toolCall.loading": "Werkzeug wird ausgef\xFChrt...",
|
|
167
|
+
"toolCall.executing": "Werkzeug wird ausgef\xFChrt...",
|
|
168
|
+
"toolCall.copyResponse": "Antwort kopieren",
|
|
169
|
+
"toolCall.summary": "Hier ist eine Zusammenfassung Ihrer Antwort",
|
|
170
|
+
"toolCall.mcpServer": "MCP-Server",
|
|
171
|
+
// Display modes
|
|
172
|
+
"settings.displayMode.label": "Anzeigemodus",
|
|
173
|
+
"settings.displayMode.overlay": "\xDCberlagerung",
|
|
174
|
+
"settings.displayMode.docked": "An Fenster andocken",
|
|
175
|
+
"settings.displayMode.fullscreen": "Vollbild",
|
|
176
|
+
// Sort options
|
|
177
|
+
"sort.label": "Konversationen sortieren",
|
|
178
|
+
"sort.newest": "Datum (neueste zuerst)",
|
|
179
|
+
"sort.oldest": "Datum (\xE4lteste zuerst)",
|
|
180
|
+
"sort.alphabeticalAsc": "Name (A-Z)",
|
|
181
|
+
"sort.alphabeticalDesc": "Name (Z-A)",
|
|
182
|
+
// Deep thinking
|
|
183
|
+
"reasoning.thinking": "Denkvorgang anzeigen"
|
|
156
184
|
}
|
|
157
185
|
});
|
|
158
186
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"de.esm.js","sources":["../../src/translations/de.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\nimport { createTranslationMessages } from '@backstage/core-plugin-api/alpha';\n\nimport { lightspeedTranslationRef } from './ref';\n\n/**\n * Deutsch translation for Developer Lightspeed.\n * @public\n */\nconst lightspeedTranslationDe = createTranslationMessages({\n ref: lightspeedTranslationRef,\n messages: {\n // Page titles and headers\n 'page.title': 'Lightspeed',\n 'page.subtitle': 'KI-gestützter Entwicklungsassistent',\n\n // Sample prompts - General Development\n 'prompts.codeReadability.title': 'Hilfe zur Code-Lesbarkeit',\n 'prompts.codeReadability.message':\n 'Können Sie Techniken vorschlagen, die ich verwenden kann, um meinen Code lesbarer und wartbarer zu machen?',\n 'prompts.debugging.title': 'Hilfe beim Debugging',\n 'prompts.debugging.message':\n 'Meine Anwendung wirft einen Fehler beim Versuch, sich mit der Datenbank zu verbinden. Können Sie mir helfen, das Problem zu identifizieren?',\n 'prompts.developmentConcept.title': 'Entwicklungskonzept erklären',\n 'prompts.developmentConcept.message':\n 'Können Sie erklären, wie Microservices-Architektur funktioniert und welche Vorteile sie gegenüber einem monolithischen Design hat?',\n 'prompts.codeOptimization.title': 'Code-Optimierungen vorschlagen',\n 'prompts.codeOptimization.message':\n 'Können Sie gängige Möglichkeiten vorschlagen, Code zu optimieren, um bessere Leistung zu erzielen?',\n 'prompts.documentation.title': 'Dokumentationszusammenfassung',\n 'prompts.documentation.message':\n 'Können Sie die Dokumentation für die Implementierung von OAuth 2.0-Authentifizierung in einer Web-App zusammenfassen?',\n 'prompts.gitWorkflows.title': 'Arbeitsabläufe mit Git',\n 'prompts.gitWorkflows.message':\n 'Ich möchte Änderungen am Code in einem anderen Branch vornehmen, ohne meine bestehende Arbeit zu verlieren. Was ist das Verfahren, um dies mit Git zu tun?',\n 'prompts.testingStrategies.title': 'Teststrategien vorschlagen',\n 'prompts.testingStrategies.message':\n 'Können Sie gängige Teststrategien empfehlen, die meine Anwendung robust und fehlerfrei machen?',\n 'prompts.sortingAlgorithms.title': 'Sortieralgorithmen entmystifizieren',\n 'prompts.sortingAlgorithms.message':\n 'Können Sie den Unterschied zwischen einem Quicksort- und einem Mergesort-Algorithmus erklären und wann man welchen verwendet?',\n 'prompts.eventDriven.title': 'Event-getriebene Architektur verstehen',\n 'prompts.eventDriven.message':\n 'Können Sie erklären, was event-getriebene Architektur ist und wann es vorteilhaft ist, sie in der Softwareentwicklung zu verwenden?',\n\n // Sample prompts - RHDH Specific\n 'prompts.tekton.title': 'Mit Tekton bereitstellen',\n 'prompts.tekton.message':\n 'Können Sie mir helfen, die Bereitstellung meiner Anwendung mit Tekton-Pipelines zu automatisieren?',\n 'prompts.openshift.title': 'OpenShift-Bereitstellung erstellen',\n 'prompts.openshift.message':\n 'Können Sie mich durch die Erstellung einer neuen Bereitstellung in OpenShift für eine containerisierte Anwendung führen?',\n 'prompts.rhdh.title': 'Erste Schritte mit Red Hat Developer Hub',\n 'prompts.rhdh.message':\n 'Können Sie mich durch die ersten Schritte führen, um Developer Hub als Entwickler zu nutzen, wie das Erkunden des Software-Katalogs und das Hinzufügen meines Dienstes?',\n\n // Conversation history\n 'conversation.delete.confirm.title': 'Chat löschen?',\n 'conversation.delete.confirm.message':\n 'Sie werden diesen Chat hier nicht mehr sehen. Dies löscht auch verwandte Aktivitäten wie Prompts, Antworten und Feedback aus Ihrer Lightspeed-Aktivität.',\n 'conversation.delete.confirm.action': 'Löschen',\n 'conversation.rename.confirm.title': 'Chat umbenennen?',\n 'conversation.rename.confirm.action': 'Umbenennen',\n 'conversation.rename.placeholder': 'Chat-Name',\n 'conversation.action.error': 'Fehler aufgetreten: {{error}}',\n\n // Permissions\n 'permission.required.title': 'Fehlende Berechtigungen',\n 'permission.required.description':\n 'Um das Lightspeed-Plugin zu sehen, wenden Sie sich an Ihren Administrator, um die Berechtigungen <b>lightspeed.chat.read</b> und <b>lightspeed.chat.create</b> zu erhalten.',\n\n // Disclaimers\n 'disclaimer.withValidation':\n 'Diese Funktion verwendet KI-Technologie. Geben Sie keine persönlichen Informationen oder andere sensible Informationen in Ihre Eingabe ein. Interaktionen können zur Verbesserung der Produkte oder Dienstleistungen von Red Hat verwendet werden.',\n 'disclaimer.withoutValidation':\n 'Diese Funktion verwendet KI-Technologie. Geben Sie keine persönlichen Informationen oder andere sensible Informationen in Ihre Eingabe ein. Interaktionen können zur Verbesserung der Produkte oder Dienstleistungen von Red Hat verwendet werden.',\n\n // Footer and feedback\n 'footer.accuracy.label':\n 'Überprüfen Sie KI-generierte Inhalte immer vor der Verwendung.',\n 'footer.accuracy.popover.title': 'Genauigkeit überprüfen',\n 'footer.accuracy.popover.description':\n 'Obwohl Developer Lightspeed sich um Genauigkeit bemüht, besteht immer die Möglichkeit von Fehlern. Es ist eine gute Praxis, kritische Informationen aus zuverlässigen Quellen zu überprüfen, besonders wenn sie für Entscheidungsfindung oder Handlungen entscheidend sind.',\n 'footer.accuracy.popover.image.alt': 'Beispielbild für Fußnoten-Popover',\n 'footer.accuracy.popover.cta.label': 'Verstanden',\n 'footer.accuracy.popover.link.label': 'Mehr erfahren',\n\n // Common actions\n 'common.cancel': 'Abbrechen',\n 'common.close': 'Schließen',\n 'common.readMore': 'Mehr erfahren',\n 'common.noSearchResults': 'Kein Ergebnis entspricht der Suche',\n\n // Menu items\n 'menu.newConversation': 'Neuer Chat',\n\n // Chat-specific UI elements\n 'chatbox.header.title': 'Developer Lightspeed',\n 'chatbox.search.placeholder': 'Suchen',\n 'chatbox.provider.other': 'Andere',\n 'chatbox.emptyState.noPinnedChats': 'Keine angehefteten Chats',\n 'chatbox.emptyState.noRecentChats': 'Keine kürzlichen Chats',\n 'chatbox.emptyState.noResults.title': 'Keine Ergebnisse gefunden',\n 'chatbox.emptyState.noResults.body':\n 'Passen Sie Ihre Suchanfrage an und versuchen Sie es erneut. Überprüfen Sie Ihre Rechtschreibung oder versuchen Sie einen allgemeineren Begriff.',\n 'chatbox.welcome.greeting': 'Hallo, {{userName}}',\n 'chatbox.welcome.description': 'Wie kann ich Ihnen heute helfen?',\n 'chatbox.message.placeholder':\n 'Senden Sie eine Nachricht und laden Sie optional eine JSON-, YAML-, oder TXT-Datei hoch...',\n 'chatbox.fileUpload.failed': 'Datei-Upload fehlgeschlagen',\n 'chatbox.fileUpload.infoText':\n 'Unterstützte Dateitypen sind: .txt, .yaml, und .json. Die maximale Dateigröße beträgt 25 MB.',\n\n // Accessibility and ARIA labels\n 'aria.chatbotSelector': 'Chatbot-Auswahl',\n 'aria.important': 'Wichtig',\n 'aria.chatHistoryMenu': 'Chat-Verlauf-Menü',\n 'aria.closeDrawerPanel': 'Seitenleiste schließen',\n 'aria.search.placeholder': 'Suchen',\n 'aria.searchPreviousConversations': 'Frühere Chats durchsuchen',\n 'aria.resize': 'Größe ändern',\n 'aria.options.label': 'Optionen',\n 'aria.scroll.down': 'Nach unten',\n 'aria.scroll.up': 'Nach oben',\n 'aria.settings.label': 'Chatbot-Optionen',\n\n // Modal actions\n 'modal.edit': 'Bearbeiten',\n 'modal.save': 'Speichern',\n 'modal.close': 'Schließen',\n 'modal.cancel': 'Abbrechen',\n\n // Conversation actions\n 'conversation.delete': 'Löschen',\n 'conversation.rename': 'Umbenennen',\n 'conversation.addToPinnedChats': 'Anheften',\n 'conversation.removeFromPinnedChats': 'Loslösen',\n 'conversation.announcement.userMessage':\n 'Nachricht vom Benutzer: {{prompt}}. Nachricht vom Bot wird geladen.',\n\n // User states\n 'user.guest': 'Gast',\n 'user.loading': '...',\n\n // Button tooltips and labels\n 'tooltip.attach': 'Anhängen',\n 'tooltip.send': 'Senden',\n 'tooltip.microphone.active': 'Aufhören zu hören',\n 'tooltip.microphone.inactive': 'Mikrofon verwenden',\n 'button.newChat': 'Neuer Chat',\n 'tooltip.chatHistoryMenu': 'Chat-Verlauf-Menü',\n 'tooltip.responseRecorded': 'Antwort aufgezeichnet',\n 'tooltip.backToTop': 'Nach oben',\n 'tooltip.backToBottom': 'Nach unten',\n 'tooltip.settings': 'Chatbot-Optionen',\n\n // Modal titles\n 'modal.title.preview': 'Anhang-Vorschau',\n 'modal.title.edit': 'Anhang bearbeiten',\n\n // Alt texts for icons\n 'icon.lightspeed.alt': 'Lightspeed-Icon',\n 'icon.permissionRequired.alt': 'Berechtigung erforderlich Icon',\n\n // Message utilities\n 'message.options.label': 'Optionen',\n\n // File attachment errors\n 'file.upload.error.alreadyExists': 'Die Datei existiert bereits.',\n 'file.upload.error.multipleFiles': 'Mehr als eine Datei hochgeladen.',\n 'file.upload.error.unsupportedType':\n 'Nicht unterstützter Dateityp. Unterstützte Typen sind: .txt, .yaml, und .json.',\n 'file.upload.error.fileTooLarge':\n 'Ihre Dateigröße ist zu groß. Bitte stellen Sie sicher, dass Ihre Datei kleiner als 25 MB ist.',\n 'file.upload.error.readFailed':\n 'Fehler beim Lesen der Datei: {{errorMessage}}',\n\n // Developer error messages\n 'error.context.fileAttachment':\n 'useFileAttachmentContext muss innerhalb eines FileAttachmentContextProvider sein',\n\n // Feedback actions\n 'feedback.form.title': 'Warum haben Sie diese Bewertung gewählt?',\n 'feedback.form.textAreaPlaceholder':\n 'Geben Sie optionale zusätzliche Kommentare',\n 'feedback.form.submitWord': 'Absenden',\n 'feedback.tooltips.goodResponse': 'Gute Antwort',\n 'feedback.tooltips.badResponse': 'Schlechte Antwort',\n 'feedback.tooltips.copied': 'Kopiert',\n 'feedback.tooltips.copy': 'Kopieren',\n 'feedback.tooltips.listening': 'Höre zu',\n 'feedback.tooltips.listen': 'Zuhören',\n 'feedback.quickResponses.positive.helpful': 'Hilfreiche Informationen',\n 'feedback.quickResponses.positive.easyToUnderstand': 'Einfach zu verstehen',\n 'feedback.quickResponses.positive.resolvedIssue': 'Hat mein Problem gelöst',\n 'feedback.quickResponses.negative.didntAnswer':\n 'Hat meine Frage nicht beantwortet',\n 'feedback.quickResponses.negative.hardToUnderstand': 'Schwer zu verstehen',\n 'feedback.quickResponses.negative.notHelpful': 'Nicht hilfreich',\n 'feedback.completion.title': 'Feedback übermittelt',\n 'feedback.completion.body':\n 'Wir haben Ihre Antwort erhalten. Vielen Dank für Ihr Feedback!',\n\n // Conversation categorization\n 'conversation.category.pinnedChats': 'Angeheftet',\n 'conversation.category.recent': 'Kürzlich',\n\n // lightspeed settings\n 'settings.pinned.enable': 'Angeheftete Chats aktivieren',\n 'settings.pinned.disable': 'Angeheftete Chats deaktivieren',\n 'settings.pinned.enabled.description':\n 'Angeheftete Chats sind derzeit aktiviert',\n 'settings.pinned.disabled.description':\n 'Angeheftete Chats sind derzeit deaktiviert',\n },\n});\n\nexport default lightspeedTranslationDe;\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"de.esm.js","sources":["../../src/translations/de.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\nimport { createTranslationMessages } from '@backstage/core-plugin-api/alpha';\n\nimport { lightspeedTranslationRef } from './ref';\n\n/**\n * Deutsch translation for Developer Lightspeed.\n * @public\n */\nconst lightspeedTranslationDe = createTranslationMessages({\n ref: lightspeedTranslationRef,\n messages: {\n // Page titles and headers\n 'page.title': 'Lightspeed',\n 'page.subtitle': 'KI-gestützter Entwicklungsassistent',\n\n // Sample prompts - General Development\n 'prompts.codeReadability.title': 'Hilfe zur Code-Lesbarkeit',\n 'prompts.codeReadability.message':\n 'Können Sie Techniken vorschlagen, die ich verwenden kann, um meinen Code lesbarer und wartbarer zu machen?',\n 'prompts.debugging.title': 'Hilfe beim Debugging',\n 'prompts.debugging.message':\n 'Meine Anwendung wirft einen Fehler beim Versuch, sich mit der Datenbank zu verbinden. Können Sie mir helfen, das Problem zu identifizieren?',\n 'prompts.developmentConcept.title': 'Entwicklungskonzept erklären',\n 'prompts.developmentConcept.message':\n 'Können Sie erklären, wie Microservices-Architektur funktioniert und welche Vorteile sie gegenüber einem monolithischen Design hat?',\n 'prompts.codeOptimization.title': 'Code-Optimierungen vorschlagen',\n 'prompts.codeOptimization.message':\n 'Können Sie gängige Möglichkeiten vorschlagen, Code zu optimieren, um bessere Leistung zu erzielen?',\n 'prompts.documentation.title': 'Dokumentationszusammenfassung',\n 'prompts.documentation.message':\n 'Können Sie die Dokumentation für die Implementierung von OAuth 2.0-Authentifizierung in einer Web-App zusammenfassen?',\n 'prompts.gitWorkflows.title': 'Arbeitsabläufe mit Git',\n 'prompts.gitWorkflows.message':\n 'Ich möchte Änderungen am Code in einem anderen Branch vornehmen, ohne meine bestehende Arbeit zu verlieren. Was ist das Verfahren, um dies mit Git zu tun?',\n 'prompts.testingStrategies.title': 'Teststrategien vorschlagen',\n 'prompts.testingStrategies.message':\n 'Können Sie gängige Teststrategien empfehlen, die meine Anwendung robust und fehlerfrei machen?',\n 'prompts.sortingAlgorithms.title': 'Sortieralgorithmen entmystifizieren',\n 'prompts.sortingAlgorithms.message':\n 'Können Sie den Unterschied zwischen einem Quicksort- und einem Mergesort-Algorithmus erklären und wann man welchen verwendet?',\n 'prompts.eventDriven.title': 'Event-getriebene Architektur verstehen',\n 'prompts.eventDriven.message':\n 'Können Sie erklären, was event-getriebene Architektur ist und wann es vorteilhaft ist, sie in der Softwareentwicklung zu verwenden?',\n\n // Sample prompts - RHDH Specific\n 'prompts.tekton.title': 'Mit Tekton bereitstellen',\n 'prompts.tekton.message':\n 'Können Sie mir helfen, die Bereitstellung meiner Anwendung mit Tekton-Pipelines zu automatisieren?',\n 'prompts.openshift.title': 'OpenShift-Bereitstellung erstellen',\n 'prompts.openshift.message':\n 'Können Sie mich durch die Erstellung einer neuen Bereitstellung in OpenShift für eine containerisierte Anwendung führen?',\n 'prompts.rhdh.title': 'Erste Schritte mit Red Hat Developer Hub',\n 'prompts.rhdh.message':\n 'Können Sie mich durch die ersten Schritte führen, um Developer Hub als Entwickler zu nutzen, wie das Erkunden des Software-Katalogs und das Hinzufügen meines Dienstes?',\n\n // Conversation history\n 'conversation.delete.confirm.title': 'Chat löschen?',\n 'conversation.delete.confirm.message':\n 'Sie werden diesen Chat hier nicht mehr sehen. Dies löscht auch verwandte Aktivitäten wie Prompts, Antworten und Feedback aus Ihrer Lightspeed-Aktivität.',\n 'conversation.delete.confirm.action': 'Löschen',\n 'conversation.rename.confirm.title': 'Chat umbenennen?',\n 'conversation.rename.confirm.action': 'Umbenennen',\n 'conversation.rename.placeholder': 'Chat-Name',\n 'conversation.action.error': 'Fehler aufgetreten: {{error}}',\n\n // Permissions\n 'permission.required.title': 'Fehlende Berechtigungen',\n 'permission.required.description':\n 'Um das Lightspeed-Plugin zu sehen, wenden Sie sich an Ihren Administrator, um die Berechtigungen <b>lightspeed.chat.read</b> und <b>lightspeed.chat.create</b> zu erhalten.',\n\n // Disclaimers\n 'disclaimer.withValidation':\n 'Diese Funktion verwendet KI-Technologie. Geben Sie keine persönlichen Informationen oder andere sensible Informationen in Ihre Eingabe ein. Interaktionen können zur Verbesserung der Produkte oder Dienstleistungen von Red Hat verwendet werden.',\n 'disclaimer.withoutValidation':\n 'Diese Funktion verwendet KI-Technologie. Geben Sie keine persönlichen Informationen oder andere sensible Informationen in Ihre Eingabe ein. Interaktionen können zur Verbesserung der Produkte oder Dienstleistungen von Red Hat verwendet werden.',\n\n // Footer and feedback\n 'footer.accuracy.label':\n 'Überprüfen Sie KI-generierte Inhalte immer vor der Verwendung.',\n 'footer.accuracy.popover.title': 'Genauigkeit überprüfen',\n 'footer.accuracy.popover.description':\n 'Obwohl Developer Lightspeed sich um Genauigkeit bemüht, besteht immer die Möglichkeit von Fehlern. Es ist eine gute Praxis, kritische Informationen aus zuverlässigen Quellen zu überprüfen, besonders wenn sie für Entscheidungsfindung oder Handlungen entscheidend sind.',\n 'footer.accuracy.popover.image.alt': 'Beispielbild für Fußnoten-Popover',\n 'footer.accuracy.popover.cta.label': 'Verstanden',\n 'footer.accuracy.popover.link.label': 'Mehr erfahren',\n\n // Common actions\n 'common.cancel': 'Abbrechen',\n 'common.close': 'Schließen',\n 'common.readMore': 'Mehr erfahren',\n 'common.noSearchResults': 'Kein Ergebnis entspricht der Suche',\n\n // Menu items\n 'menu.newConversation': 'Neuer Chat',\n\n // Chat-specific UI elements\n 'chatbox.header.title': 'Developer Lightspeed',\n 'chatbox.search.placeholder': 'Suchen',\n 'chatbox.provider.other': 'Andere',\n 'chatbox.emptyState.noPinnedChats': 'Keine angehefteten Chats',\n 'chatbox.emptyState.noRecentChats': 'Keine kürzlichen Chats',\n 'chatbox.emptyState.noResults.title': 'Keine Ergebnisse gefunden',\n 'chatbox.emptyState.noResults.body':\n 'Passen Sie Ihre Suchanfrage an und versuchen Sie es erneut. Überprüfen Sie Ihre Rechtschreibung oder versuchen Sie einen allgemeineren Begriff.',\n 'chatbox.welcome.greeting': 'Hallo, {{userName}}',\n 'chatbox.welcome.description': 'Wie kann ich Ihnen heute helfen?',\n 'chatbox.message.placeholder':\n 'Senden Sie eine Nachricht und laden Sie optional eine JSON-, YAML-, oder TXT-Datei hoch...',\n 'chatbox.fileUpload.failed': 'Datei-Upload fehlgeschlagen',\n 'chatbox.fileUpload.infoText':\n 'Unterstützte Dateitypen sind: .txt, .yaml, und .json. Die maximale Dateigröße beträgt 25 MB.',\n\n // Accessibility and ARIA labels\n 'aria.chatbotSelector': 'Chatbot-Auswahl',\n 'aria.important': 'Wichtig',\n 'aria.chatHistoryMenu': 'Chat-Verlauf-Menü',\n 'aria.closeDrawerPanel': 'Seitenleiste schließen',\n 'aria.search.placeholder': 'Suchen',\n 'aria.searchPreviousConversations': 'Frühere Chats durchsuchen',\n 'aria.resize': 'Größe ändern',\n 'aria.options.label': 'Optionen',\n 'aria.scroll.down': 'Nach unten',\n 'aria.scroll.up': 'Nach oben',\n 'aria.settings.label': 'Chatbot-Optionen',\n 'aria.close': 'Chatbot schließen',\n\n // Modal actions\n 'modal.edit': 'Bearbeiten',\n 'modal.save': 'Speichern',\n 'modal.close': 'Schließen',\n 'modal.cancel': 'Abbrechen',\n\n // Conversation actions\n 'conversation.delete': 'Löschen',\n 'conversation.rename': 'Umbenennen',\n 'conversation.addToPinnedChats': 'Anheften',\n 'conversation.removeFromPinnedChats': 'Loslösen',\n 'conversation.announcement.userMessage':\n 'Nachricht vom Benutzer: {{prompt}}. Nachricht vom Bot wird geladen.',\n\n // User states\n 'user.guest': 'Gast',\n 'user.loading': '...',\n\n // Button tooltips and labels\n 'tooltip.attach': 'Anhängen',\n 'tooltip.send': 'Senden',\n 'tooltip.microphone.active': 'Aufhören zu hören',\n 'tooltip.microphone.inactive': 'Mikrofon verwenden',\n 'button.newChat': 'Neuer Chat',\n 'tooltip.chatHistoryMenu': 'Chat-Verlauf-Menü',\n 'tooltip.responseRecorded': 'Antwort aufgezeichnet',\n 'tooltip.backToTop': 'Nach oben',\n 'tooltip.backToBottom': 'Nach unten',\n 'tooltip.settings': 'Chatbot-Optionen',\n 'tooltip.close': 'Schließen',\n\n // Modal titles\n 'modal.title.preview': 'Anhang-Vorschau',\n 'modal.title.edit': 'Anhang bearbeiten',\n\n // Alt texts for icons\n 'icon.lightspeed.alt': 'Lightspeed-Icon',\n 'icon.permissionRequired.alt': 'Berechtigung erforderlich Icon',\n\n // Message utilities\n 'message.options.label': 'Optionen',\n\n // File attachment errors\n 'file.upload.error.alreadyExists': 'Die Datei existiert bereits.',\n 'file.upload.error.multipleFiles': 'Mehr als eine Datei hochgeladen.',\n 'file.upload.error.unsupportedType':\n 'Nicht unterstützter Dateityp. Unterstützte Typen sind: .txt, .yaml, und .json.',\n 'file.upload.error.fileTooLarge':\n 'Ihre Dateigröße ist zu groß. Bitte stellen Sie sicher, dass Ihre Datei kleiner als 25 MB ist.',\n 'file.upload.error.readFailed':\n 'Fehler beim Lesen der Datei: {{errorMessage}}',\n\n // Developer error messages\n 'error.context.fileAttachment':\n 'useFileAttachmentContext muss innerhalb eines FileAttachmentContextProvider sein',\n\n // Feedback actions\n 'feedback.form.title': 'Warum haben Sie diese Bewertung gewählt?',\n 'feedback.form.textAreaPlaceholder':\n 'Geben Sie optionale zusätzliche Kommentare',\n 'feedback.form.submitWord': 'Absenden',\n 'feedback.tooltips.goodResponse': 'Gute Antwort',\n 'feedback.tooltips.badResponse': 'Schlechte Antwort',\n 'feedback.tooltips.copied': 'Kopiert',\n 'feedback.tooltips.copy': 'Kopieren',\n 'feedback.tooltips.listening': 'Höre zu',\n 'feedback.tooltips.listen': 'Zuhören',\n 'feedback.quickResponses.positive.helpful': 'Hilfreiche Informationen',\n 'feedback.quickResponses.positive.easyToUnderstand': 'Einfach zu verstehen',\n 'feedback.quickResponses.positive.resolvedIssue': 'Hat mein Problem gelöst',\n 'feedback.quickResponses.negative.didntAnswer':\n 'Hat meine Frage nicht beantwortet',\n 'feedback.quickResponses.negative.hardToUnderstand': 'Schwer zu verstehen',\n 'feedback.quickResponses.negative.notHelpful': 'Nicht hilfreich',\n 'feedback.completion.title': 'Feedback übermittelt',\n 'feedback.completion.body':\n 'Wir haben Ihre Antwort erhalten. Vielen Dank für Ihr Feedback!',\n\n // Conversation categorization\n 'conversation.category.pinnedChats': 'Angeheftet',\n 'conversation.category.recent': 'Kürzlich',\n\n // lightspeed settings\n 'settings.pinned.enable': 'Angeheftete Chats aktivieren',\n 'settings.pinned.disable': 'Angeheftete Chats deaktivieren',\n 'settings.pinned.enabled.description':\n 'Angeheftete Chats sind derzeit aktiviert',\n 'settings.pinned.disabled.description':\n 'Angeheftete Chats sind derzeit deaktiviert',\n\n // Tool calling\n 'toolCall.header': 'Werkzeugantwort: {{toolName}}',\n 'toolCall.thinking': '{{seconds}} Sekunden nachgedacht',\n 'toolCall.executionTime': 'Ausführungszeit: ',\n 'toolCall.parameters': 'Parameter',\n 'toolCall.response': 'Antwort',\n 'toolCall.showMore': 'mehr anzeigen',\n 'toolCall.showLess': 'weniger anzeigen',\n 'toolCall.loading': 'Werkzeug wird ausgeführt...',\n 'toolCall.executing': 'Werkzeug wird ausgeführt...',\n 'toolCall.copyResponse': 'Antwort kopieren',\n 'toolCall.summary': 'Hier ist eine Zusammenfassung Ihrer Antwort',\n 'toolCall.mcpServer': 'MCP-Server',\n // Display modes\n 'settings.displayMode.label': 'Anzeigemodus',\n 'settings.displayMode.overlay': 'Überlagerung',\n 'settings.displayMode.docked': 'An Fenster andocken',\n 'settings.displayMode.fullscreen': 'Vollbild',\n\n // Sort options\n 'sort.label': 'Konversationen sortieren',\n 'sort.newest': 'Datum (neueste zuerst)',\n 'sort.oldest': 'Datum (älteste zuerst)',\n 'sort.alphabeticalAsc': 'Name (A-Z)',\n 'sort.alphabeticalDesc': 'Name (Z-A)',\n\n // Deep thinking\n 'reasoning.thinking': 'Denkvorgang anzeigen',\n },\n});\n\nexport default lightspeedTranslationDe;\n"],"names":[],"mappings":";;;AAwBA,MAAM,0BAA0B,yBAA0B,CAAA;AAAA,EACxD,GAAK,EAAA,wBAAA;AAAA,EACL,QAAU,EAAA;AAAA;AAAA,IAER,YAAc,EAAA,YAAA;AAAA,IACd,eAAiB,EAAA,wCAAA;AAAA;AAAA,IAGjB,+BAAiC,EAAA,2BAAA;AAAA,IACjC,iCACE,EAAA,+GAAA;AAAA,IACF,yBAA2B,EAAA,sBAAA;AAAA,IAC3B,2BACE,EAAA,gJAAA;AAAA,IACF,kCAAoC,EAAA,iCAAA;AAAA,IACpC,oCACE,EAAA,6IAAA;AAAA,IACF,gCAAkC,EAAA,gCAAA;AAAA,IAClC,kCACE,EAAA,6GAAA;AAAA,IACF,6BAA+B,EAAA,+BAAA;AAAA,IAC/B,+BACE,EAAA,6HAAA;AAAA,IACF,4BAA8B,EAAA,2BAAA;AAAA,IAC9B,8BACE,EAAA,kKAAA;AAAA,IACF,iCAAmC,EAAA,4BAAA;AAAA,IACnC,mCACE,EAAA,sGAAA;AAAA,IACF,iCAAmC,EAAA,qCAAA;AAAA,IACnC,mCACE,EAAA,qIAAA;AAAA,IACF,2BAA6B,EAAA,wCAAA;AAAA,IAC7B,6BACE,EAAA,2IAAA;AAAA;AAAA,IAGF,sBAAwB,EAAA,0BAAA;AAAA,IACxB,wBACE,EAAA,uGAAA;AAAA,IACF,yBAA2B,EAAA,oCAAA;AAAA,IAC3B,2BACE,EAAA,mIAAA;AAAA,IACF,oBAAsB,EAAA,0CAAA;AAAA,IACtB,sBACE,EAAA,kLAAA;AAAA;AAAA,IAGF,mCAAqC,EAAA,kBAAA;AAAA,IACrC,qCACE,EAAA,mKAAA;AAAA,IACF,oCAAsC,EAAA,YAAA;AAAA,IACtC,mCAAqC,EAAA,kBAAA;AAAA,IACrC,oCAAsC,EAAA,YAAA;AAAA,IACtC,iCAAmC,EAAA,WAAA;AAAA,IACnC,2BAA6B,EAAA,+BAAA;AAAA;AAAA,IAG7B,2BAA6B,EAAA,yBAAA;AAAA,IAC7B,iCACE,EAAA,6KAAA;AAAA;AAAA,IAGF,2BACE,EAAA,0PAAA;AAAA,IACF,8BACE,EAAA,0PAAA;AAAA;AAAA,IAGF,uBACE,EAAA,sEAAA;AAAA,IACF,+BAAiC,EAAA,8BAAA;AAAA,IACjC,qCACE,EAAA,+RAAA;AAAA,IACF,mCAAqC,EAAA,yCAAA;AAAA,IACrC,mCAAqC,EAAA,YAAA;AAAA,IACrC,oCAAsC,EAAA,eAAA;AAAA;AAAA,IAGtC,eAAiB,EAAA,WAAA;AAAA,IACjB,cAAgB,EAAA,cAAA;AAAA,IAChB,iBAAmB,EAAA,eAAA;AAAA,IACnB,wBAA0B,EAAA,oCAAA;AAAA;AAAA,IAG1B,sBAAwB,EAAA,YAAA;AAAA;AAAA,IAGxB,sBAAwB,EAAA,sBAAA;AAAA,IACxB,4BAA8B,EAAA,QAAA;AAAA,IAC9B,wBAA0B,EAAA,QAAA;AAAA,IAC1B,kCAAoC,EAAA,0BAAA;AAAA,IACpC,kCAAoC,EAAA,2BAAA;AAAA,IACpC,oCAAsC,EAAA,2BAAA;AAAA,IACtC,mCACE,EAAA,uJAAA;AAAA,IACF,0BAA4B,EAAA,qBAAA;AAAA,IAC5B,6BAA+B,EAAA,kCAAA;AAAA,IAC/B,6BACE,EAAA,4FAAA;AAAA,IACF,2BAA6B,EAAA,6BAAA;AAAA,IAC7B,6BACE,EAAA,0GAAA;AAAA;AAAA,IAGF,sBAAwB,EAAA,iBAAA;AAAA,IACxB,gBAAkB,EAAA,SAAA;AAAA,IAClB,sBAAwB,EAAA,sBAAA;AAAA,IACxB,uBAAyB,EAAA,2BAAA;AAAA,IACzB,yBAA2B,EAAA,QAAA;AAAA,IAC3B,kCAAoC,EAAA,8BAAA;AAAA,IACpC,aAAe,EAAA,uBAAA;AAAA,IACf,oBAAsB,EAAA,UAAA;AAAA,IACtB,kBAAoB,EAAA,YAAA;AAAA,IACpB,gBAAkB,EAAA,WAAA;AAAA,IAClB,qBAAuB,EAAA,kBAAA;AAAA,IACvB,YAAc,EAAA,sBAAA;AAAA;AAAA,IAGd,YAAc,EAAA,YAAA;AAAA,IACd,YAAc,EAAA,WAAA;AAAA,IACd,aAAe,EAAA,cAAA;AAAA,IACf,cAAgB,EAAA,WAAA;AAAA;AAAA,IAGhB,qBAAuB,EAAA,YAAA;AAAA,IACvB,qBAAuB,EAAA,YAAA;AAAA,IACvB,+BAAiC,EAAA,UAAA;AAAA,IACjC,oCAAsC,EAAA,aAAA;AAAA,IACtC,uCACE,EAAA,qEAAA;AAAA;AAAA,IAGF,YAAc,EAAA,MAAA;AAAA,IACd,cAAgB,EAAA,KAAA;AAAA;AAAA,IAGhB,gBAAkB,EAAA,aAAA;AAAA,IAClB,cAAgB,EAAA,QAAA;AAAA,IAChB,2BAA6B,EAAA,yBAAA;AAAA,IAC7B,6BAA+B,EAAA,oBAAA;AAAA,IAC/B,gBAAkB,EAAA,YAAA;AAAA,IAClB,yBAA2B,EAAA,sBAAA;AAAA,IAC3B,0BAA4B,EAAA,uBAAA;AAAA,IAC5B,mBAAqB,EAAA,WAAA;AAAA,IACrB,sBAAwB,EAAA,YAAA;AAAA,IACxB,kBAAoB,EAAA,kBAAA;AAAA,IACpB,eAAiB,EAAA,cAAA;AAAA;AAAA,IAGjB,qBAAuB,EAAA,iBAAA;AAAA,IACvB,kBAAoB,EAAA,mBAAA;AAAA;AAAA,IAGpB,qBAAuB,EAAA,iBAAA;AAAA,IACvB,6BAA+B,EAAA,gCAAA;AAAA;AAAA,IAG/B,uBAAyB,EAAA,UAAA;AAAA;AAAA,IAGzB,iCAAmC,EAAA,8BAAA;AAAA,IACnC,iCAAmC,EAAA,kCAAA;AAAA,IACnC,mCACE,EAAA,sFAAA;AAAA,IACF,gCACE,EAAA,wGAAA;AAAA,IACF,8BACE,EAAA,+CAAA;AAAA;AAAA,IAGF,8BACE,EAAA,kFAAA;AAAA;AAAA,IAGF,qBAAuB,EAAA,6CAAA;AAAA,IACvB,mCACE,EAAA,+CAAA;AAAA,IACF,0BAA4B,EAAA,UAAA;AAAA,IAC5B,gCAAkC,EAAA,cAAA;AAAA,IAClC,+BAAiC,EAAA,mBAAA;AAAA,IACjC,0BAA4B,EAAA,SAAA;AAAA,IAC5B,wBAA0B,EAAA,UAAA;AAAA,IAC1B,6BAA+B,EAAA,YAAA;AAAA,IAC/B,0BAA4B,EAAA,YAAA;AAAA,IAC5B,0CAA4C,EAAA,0BAAA;AAAA,IAC5C,mDAAqD,EAAA,sBAAA;AAAA,IACrD,gDAAkD,EAAA,4BAAA;AAAA,IAClD,8CACE,EAAA,mCAAA;AAAA,IACF,mDAAqD,EAAA,qBAAA;AAAA,IACrD,6CAA+C,EAAA,iBAAA;AAAA,IAC/C,2BAA6B,EAAA,yBAAA;AAAA,IAC7B,0BACE,EAAA,mEAAA;AAAA;AAAA,IAGF,mCAAqC,EAAA,YAAA;AAAA,IACrC,8BAAgC,EAAA,aAAA;AAAA;AAAA,IAGhC,wBAA0B,EAAA,8BAAA;AAAA,IAC1B,yBAA2B,EAAA,gCAAA;AAAA,IAC3B,qCACE,EAAA,0CAAA;AAAA,IACF,sCACE,EAAA,4CAAA;AAAA;AAAA,IAGF,iBAAmB,EAAA,+BAAA;AAAA,IACnB,mBAAqB,EAAA,kCAAA;AAAA,IACrB,wBAA0B,EAAA,sBAAA;AAAA,IAC1B,qBAAuB,EAAA,WAAA;AAAA,IACvB,mBAAqB,EAAA,SAAA;AAAA,IACrB,mBAAqB,EAAA,eAAA;AAAA,IACrB,mBAAqB,EAAA,kBAAA;AAAA,IACrB,kBAAoB,EAAA,gCAAA;AAAA,IACpB,oBAAsB,EAAA,gCAAA;AAAA,IACtB,uBAAyB,EAAA,kBAAA;AAAA,IACzB,kBAAoB,EAAA,6CAAA;AAAA,IACpB,oBAAsB,EAAA,YAAA;AAAA;AAAA,IAEtB,4BAA8B,EAAA,cAAA;AAAA,IAC9B,8BAAgC,EAAA,iBAAA;AAAA,IAChC,6BAA+B,EAAA,qBAAA;AAAA,IAC/B,iCAAmC,EAAA,UAAA;AAAA;AAAA,IAGnC,YAAc,EAAA,0BAAA;AAAA,IACd,aAAe,EAAA,wBAAA;AAAA,IACf,aAAe,EAAA,2BAAA;AAAA,IACf,sBAAwB,EAAA,YAAA;AAAA,IACxB,uBAAyB,EAAA,YAAA;AAAA;AAAA,IAGzB,oBAAsB,EAAA;AAAA;AAE1B,CAAC;;;;"}
|