@admin-layout/ai-chat-ext-browser 12.2.4-alpha.103
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/LICENSE +21 -0
- package/lib/components/ChatSettingsPanel/ChatSettingsPanel.d.ts +39 -0
- package/lib/components/ChatSettingsPanel/ChatSettingsPanel.d.ts.map +1 -0
- package/lib/components/ChatSettingsPanel/ChatSettingsPanel.js +1191 -0
- package/lib/components/ChatSettingsPanel/ChatSettingsPanel.js.map +1 -0
- package/lib/components/ChatSettingsPanel/ConnectedChatSettingsPanel.d.ts +19 -0
- package/lib/components/ChatSettingsPanel/ConnectedChatSettingsPanel.d.ts.map +1 -0
- package/lib/components/ChatSettingsPanel/ConnectedChatSettingsPanel.js +83 -0
- package/lib/components/ChatSettingsPanel/ConnectedChatSettingsPanel.js.map +1 -0
- package/lib/components/ChatSettingsPanel/index.d.ts +5 -0
- package/lib/components/ChatSettingsPanel/index.d.ts.map +1 -0
- package/lib/components/MessageWidgets/MessageAiAssistant.d.ts +13 -0
- package/lib/components/MessageWidgets/MessageAiAssistant.d.ts.map +1 -0
- package/lib/components/MessageWidgets/MessageAiAssistant.js +79 -0
- package/lib/components/MessageWidgets/MessageAiAssistant.js.map +1 -0
- package/lib/components/MessageWidgets/MessageCodeBlock.d.ts +14 -0
- package/lib/components/MessageWidgets/MessageCodeBlock.d.ts.map +1 -0
- package/lib/components/MessageWidgets/MessageCodeBlock.js +78 -0
- package/lib/components/MessageWidgets/MessageCodeBlock.js.map +1 -0
- package/lib/components/MessageWidgets/MessageConnector.d.ts +13 -0
- package/lib/components/MessageWidgets/MessageConnector.d.ts.map +1 -0
- package/lib/components/MessageWidgets/MessageConnector.js +71 -0
- package/lib/components/MessageWidgets/MessageConnector.js.map +1 -0
- package/lib/components/MessageWidgets/MessageGeneric.d.ts +20 -0
- package/lib/components/MessageWidgets/MessageGeneric.d.ts.map +1 -0
- package/lib/components/MessageWidgets/MessageGeneric.js +74 -0
- package/lib/components/MessageWidgets/MessageGeneric.js.map +1 -0
- package/lib/components/MessageWidgets/MessageMedia.d.ts +17 -0
- package/lib/components/MessageWidgets/MessageMedia.d.ts.map +1 -0
- package/lib/components/MessageWidgets/MessageMedia.js +91 -0
- package/lib/components/MessageWidgets/MessageMedia.js.map +1 -0
- package/lib/components/MessageWidgets/MessageService.d.ts +13 -0
- package/lib/components/MessageWidgets/MessageService.d.ts.map +1 -0
- package/lib/components/MessageWidgets/MessageService.js +74 -0
- package/lib/components/MessageWidgets/MessageService.js.map +1 -0
- package/lib/components/MessageWidgets/MessageThinking.d.ts +13 -0
- package/lib/components/MessageWidgets/MessageThinking.d.ts.map +1 -0
- package/lib/components/MessageWidgets/MessageThinking.js +41 -0
- package/lib/components/MessageWidgets/MessageThinking.js.map +1 -0
- package/lib/components/MessageWidgets/MessageToolUse.d.ts +14 -0
- package/lib/components/MessageWidgets/MessageToolUse.d.ts.map +1 -0
- package/lib/components/MessageWidgets/MessageToolUse.js +92 -0
- package/lib/components/MessageWidgets/MessageToolUse.js.map +1 -0
- package/lib/components/MessageWidgets/MessageTravel.d.ts +14 -0
- package/lib/components/MessageWidgets/MessageTravel.d.ts.map +1 -0
- package/lib/components/MessageWidgets/MessageTravel.js +110 -0
- package/lib/components/MessageWidgets/MessageTravel.js.map +1 -0
- package/lib/components/MessageWidgets/MessageWorkflow.d.ts +17 -0
- package/lib/components/MessageWidgets/MessageWorkflow.d.ts.map +1 -0
- package/lib/components/MessageWidgets/MessageWorkflow.js +82 -0
- package/lib/components/MessageWidgets/MessageWorkflow.js.map +1 -0
- package/lib/components/MessageWidgets/index.d.ts +21 -0
- package/lib/components/MessageWidgets/index.d.ts.map +1 -0
- package/lib/components/MessageWidgets/workflowUtils.d.ts +10 -0
- package/lib/components/MessageWidgets/workflowUtils.d.ts.map +1 -0
- package/lib/components/MessageWidgets/workflowUtils.js +15 -0
- package/lib/components/MessageWidgets/workflowUtils.js.map +1 -0
- package/lib/components/index.d.ts +4 -0
- package/lib/components/index.d.ts.map +1 -0
- package/lib/index.d.ts +3 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -0
- package/lib/interfaces/ai-chat.interface.d.ts +266 -0
- package/lib/interfaces/ai-chat.interface.d.ts.map +1 -0
- package/lib/interfaces/index.d.ts +2 -0
- package/lib/interfaces/index.d.ts.map +1 -0
- package/lib/module.d.ts +3 -0
- package/lib/module.d.ts.map +1 -0
- package/lib/module.js +36 -0
- package/lib/module.js.map +1 -0
- package/lib/routes.json +1 -0
- package/lib/slot-fill/chat-settings-fill.d.ts +3 -0
- package/lib/slot-fill/chat-settings-fill.d.ts.map +1 -0
- package/lib/slot-fill/chat-settings-fill.js +22 -0
- package/lib/slot-fill/chat-settings-fill.js.map +1 -0
- package/lib/slot-fill/index.d.ts +12 -0
- package/lib/slot-fill/index.d.ts.map +1 -0
- package/lib/slot-fill/message-ai-assistant-fill.d.ts +3 -0
- package/lib/slot-fill/message-ai-assistant-fill.d.ts.map +1 -0
- package/lib/slot-fill/message-ai-assistant-fill.js +12 -0
- package/lib/slot-fill/message-ai-assistant-fill.js.map +1 -0
- package/lib/slot-fill/message-codeblock-fill.d.ts +3 -0
- package/lib/slot-fill/message-codeblock-fill.d.ts.map +1 -0
- package/lib/slot-fill/message-codeblock-fill.js +18 -0
- package/lib/slot-fill/message-codeblock-fill.js.map +1 -0
- package/lib/slot-fill/message-connector-fill.d.ts +5 -0
- package/lib/slot-fill/message-connector-fill.d.ts.map +1 -0
- package/lib/slot-fill/message-connector-fill.js +14 -0
- package/lib/slot-fill/message-connector-fill.js.map +1 -0
- package/lib/slot-fill/message-generic-fill.d.ts +3 -0
- package/lib/slot-fill/message-generic-fill.d.ts.map +1 -0
- package/lib/slot-fill/message-generic-fill.js +21 -0
- package/lib/slot-fill/message-generic-fill.js.map +1 -0
- package/lib/slot-fill/message-media-fill.d.ts +3 -0
- package/lib/slot-fill/message-media-fill.d.ts.map +1 -0
- package/lib/slot-fill/message-media-fill.js +18 -0
- package/lib/slot-fill/message-media-fill.js.map +1 -0
- package/lib/slot-fill/message-service-fill.d.ts +3 -0
- package/lib/slot-fill/message-service-fill.d.ts.map +1 -0
- package/lib/slot-fill/message-service-fill.js +12 -0
- package/lib/slot-fill/message-service-fill.js.map +1 -0
- package/lib/slot-fill/message-thinking-fill.d.ts +3 -0
- package/lib/slot-fill/message-thinking-fill.d.ts.map +1 -0
- package/lib/slot-fill/message-thinking-fill.js +18 -0
- package/lib/slot-fill/message-thinking-fill.js.map +1 -0
- package/lib/slot-fill/message-tooluse-fill.d.ts +3 -0
- package/lib/slot-fill/message-tooluse-fill.d.ts.map +1 -0
- package/lib/slot-fill/message-tooluse-fill.js +18 -0
- package/lib/slot-fill/message-tooluse-fill.js.map +1 -0
- package/lib/slot-fill/message-travel-fill.d.ts +3 -0
- package/lib/slot-fill/message-travel-fill.d.ts.map +1 -0
- package/lib/slot-fill/message-travel-fill.js +18 -0
- package/lib/slot-fill/message-travel-fill.js.map +1 -0
- package/lib/slot-fill/message-workflow-fill.d.ts +3 -0
- package/lib/slot-fill/message-workflow-fill.d.ts.map +1 -0
- package/lib/slot-fill/message-workflow-fill.js +19 -0
- package/lib/slot-fill/message-workflow-fill.js.map +1 -0
- package/lib/utils/parseWidgetPost.d.ts +14 -0
- package/lib/utils/parseWidgetPost.d.ts.map +1 -0
- package/lib/utils/parseWidgetPost.js +68 -0
- package/lib/utils/parseWidgetPost.js.map +1 -0
- package/lib/utils/parseWidgetPost.spec.d.ts +2 -0
- package/lib/utils/parseWidgetPost.spec.d.ts.map +1 -0
- package/package.json +43 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import React from'react';import {FiImage}from'@react-icons/all-files/fi/FiImage.js';import {FiVideo}from'@react-icons/all-files/fi/FiVideo.js';import {FiMusic}from'@react-icons/all-files/fi/FiMusic.js';import {FiDownload}from'@react-icons/all-files/fi/FiDownload.js';import {FiExternalLink}from'@react-icons/all-files/fi/FiExternalLink.js';import {MediaAsset}from'@admin-layout/connector-widgets-browser';const KIND_META = {
|
|
2
|
+
image: {
|
|
3
|
+
icon: React.createElement(FiImage, {
|
|
4
|
+
className: "w-4 h-4"
|
|
5
|
+
}),
|
|
6
|
+
label: 'Image'
|
|
7
|
+
},
|
|
8
|
+
video: {
|
|
9
|
+
icon: React.createElement(FiVideo, {
|
|
10
|
+
className: "w-4 h-4"
|
|
11
|
+
}),
|
|
12
|
+
label: 'Video'
|
|
13
|
+
},
|
|
14
|
+
audio: {
|
|
15
|
+
icon: React.createElement(FiMusic, {
|
|
16
|
+
className: "w-4 h-4"
|
|
17
|
+
}),
|
|
18
|
+
label: 'Audio'
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Media card — renders the image / video / audio a cdecli generation connector
|
|
23
|
+
* (yantra-image-generation, yantra-video-generation, audio / TTS, …) returned,
|
|
24
|
+
* inline in the chat. Shows the asset(s), the prompt as a caption, an
|
|
25
|
+
* attribution line (connector · model), and open / download actions. The asset
|
|
26
|
+
* URLs live on the message's propsConfiguration, so they persist with the chat.
|
|
27
|
+
*/
|
|
28
|
+
const MessageMedia = props => {
|
|
29
|
+
const {
|
|
30
|
+
message,
|
|
31
|
+
index,
|
|
32
|
+
onMessageClick
|
|
33
|
+
} = props;
|
|
34
|
+
const {
|
|
35
|
+
attachment
|
|
36
|
+
} = message.propsConfiguration?.contents ?? {};
|
|
37
|
+
if (!attachment || !attachment.url) return null;
|
|
38
|
+
const items = attachment.items && attachment.items.length > 0 ? attachment.items : [{
|
|
39
|
+
kind: attachment.kind,
|
|
40
|
+
url: attachment.url,
|
|
41
|
+
title: attachment.title,
|
|
42
|
+
mimeType: attachment.mimeType,
|
|
43
|
+
posterUrl: attachment.posterUrl
|
|
44
|
+
}];
|
|
45
|
+
const meta = KIND_META[attachment.kind] ?? KIND_META.image;
|
|
46
|
+
const title = attachment.title || `${meta.label} generated`;
|
|
47
|
+
const attribution = [attachment.connector, attachment.model].filter(Boolean).join(' · ');
|
|
48
|
+
const isGrid = items.length > 1 && attachment.kind === 'image';
|
|
49
|
+
const open = () => onMessageClick?.(message);
|
|
50
|
+
return React.createElement("div", {
|
|
51
|
+
key: `${index}`,
|
|
52
|
+
className: "my-2 mx-2 rounded-xl border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800/60 overflow-hidden"
|
|
53
|
+
}, React.createElement("div", {
|
|
54
|
+
className: "flex items-center gap-2 px-3 py-2 border-b border-gray-100 dark:border-gray-700"
|
|
55
|
+
}, React.createElement("span", {
|
|
56
|
+
className: "flex-shrink-0 text-blue-500"
|
|
57
|
+
}, meta.icon), React.createElement("p", {
|
|
58
|
+
className: "flex-1 min-w-0 text-sm font-semibold text-gray-900 dark:text-gray-100 truncate"
|
|
59
|
+
}, title), attribution && React.createElement("span", {
|
|
60
|
+
className: "flex-shrink-0 text-[10px] text-gray-400 dark:text-gray-500 truncate max-w-[55%]"
|
|
61
|
+
}, attribution)), React.createElement("div", {
|
|
62
|
+
className: `p-2 ${isGrid ? 'grid grid-cols-2 gap-2' : 'flex flex-col gap-2'}`,
|
|
63
|
+
onClick: open,
|
|
64
|
+
role: onMessageClick ? 'button' : undefined
|
|
65
|
+
}, items.map((item, i) => React.createElement(MediaAsset, {
|
|
66
|
+
key: (item.url ?? '') + i,
|
|
67
|
+
item: item
|
|
68
|
+
}))), React.createElement("div", {
|
|
69
|
+
className: "px-3 pb-3 pt-1"
|
|
70
|
+
}, attachment.prompt && React.createElement("p", {
|
|
71
|
+
className: "text-xs text-gray-500 dark:text-gray-400 line-clamp-2",
|
|
72
|
+
title: attachment.prompt
|
|
73
|
+
}, attachment.prompt), React.createElement("div", {
|
|
74
|
+
className: "mt-2 flex items-center gap-3"
|
|
75
|
+
}, React.createElement("a", {
|
|
76
|
+
href: attachment.url,
|
|
77
|
+
target: "_blank",
|
|
78
|
+
rel: "noopener noreferrer",
|
|
79
|
+
onClick: e => e.stopPropagation(),
|
|
80
|
+
className: "inline-flex items-center gap-1 text-xs font-medium text-blue-600 dark:text-blue-400 hover:underline"
|
|
81
|
+
}, "Open ", React.createElement(FiExternalLink, {
|
|
82
|
+
className: "w-3 h-3"
|
|
83
|
+
})), React.createElement("a", {
|
|
84
|
+
href: attachment.url,
|
|
85
|
+
download: attachment.fileName || true,
|
|
86
|
+
onClick: e => e.stopPropagation(),
|
|
87
|
+
className: "inline-flex items-center gap-1 text-xs font-medium text-gray-600 dark:text-gray-300 hover:underline"
|
|
88
|
+
}, "Download ", React.createElement(FiDownload, {
|
|
89
|
+
className: "w-3 h-3"
|
|
90
|
+
})))));
|
|
91
|
+
};export{MessageMedia};//# sourceMappingURL=MessageMedia.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessageMedia.js","sources":["../../../src/components/MessageWidgets/MessageMedia.tsx"],"sourcesContent":[null],"names":[],"mappings":"qZAiBA,MAAM,SAAS,GAAwE;AACnF,EAAA,KAAA,EAAK;AACL,IAAA,IAAA,EAAK,KAAI,CAAA,uBAAO;AAChB,MAAA,SAAS,EAAI;KACf,CAAA;AAEF,IAAA,KAAA,EAAA;;;;;;AAMG,IAAA,KAAA,EAAA;AACH,GAAA;OACI,EAAA;AACA,IAAA,IAAA,EAAM,KAAE,CAAA,aAAgB,CAAA,OAAQ,EAAA;AAIhC,MAAA,SAAK,EAAA;AAA+B,KAAA,CAAA;AAEpC,IAAA,KAAA,EAAM;;AAGE,CAAA;AACM;;;;;;AAMC;AACH,MAAA,YAAA,GAAA,KAAA,IAAA;AAEZ,EAAA,MAAA;IACA,OAAM;IACN,KAAA;AACA,IAAA;MAEA,KAAM;QAEN;;AAOY,GAAA,GAAA,OAAA,CAAA,kBAAA,EAAA,QAAM;AACN,EAAA,IAAA,CAAA,UAAA,IAAA,CAAA,UAAA,CAAA,GAAA,EAAA,OAAG,IAAS;aAGX,GAAA,UAAW,CAAI,KACZ,IAAA,UAAA,CAAA,KAAA,CAAA,MAAM,GAAA,CAAA,GAAA;AAOd,IAAA,IAAA,EAAA,UAAA,CAAA,IAAA;SAWA,UAAA,CAAA,GAAA;AACK,IAAA,KAAA,EAAA,UAAA,CAAU,KAAC;YAKZ,EAAA,UAAA,CAAA,QAAA;AACI,IAAA,SAAA,EAAA,UAAA,CAAA;;AAOS,EAAA,MAAA,IAAA,GAAA,SAAA,CAAA,UAAA,CAAA,IAAC,cAAc,CAAA,KAAC;AAEzB,EAAA,MAAA,KAAA,GAAA,UAAA,CAAA,KAAA,IAAA,CAAA,EAAA,IACI,CAAA,KAAM,CAAA,UAAW,CAAA;;sBAKR,CAAA,MAAA,GAAA,CAAA,IAAA,UAAC,CAAA,IAAU,KAAC,OAAS;AAMtD,EAAE,MAAA,IAAA,GAAA,MAAA,cAAA,GAAA,OAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { IPost } from 'common';
|
|
3
|
+
export interface IMessageServiceProps {
|
|
4
|
+
message: IPost;
|
|
5
|
+
index: number;
|
|
6
|
+
onMessageClick?: (ref: IPost) => void;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Service / System notification message — like system messages in Slack,
|
|
10
|
+
* info banners in VS Code, or notification toasts in chat apps.
|
|
11
|
+
*/
|
|
12
|
+
export declare const MessageService: (props: IMessageServiceProps) => React.JSX.Element;
|
|
13
|
+
//# sourceMappingURL=MessageService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessageService.d.ts","sourceRoot":"","sources":["../../../src/components/MessageWidgets/MessageService.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAO1B,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAG/B,MAAM,WAAW,oBAAoB;IACjC,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;CACzC;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,GAAI,OAAO,oBAAoB,sBAwEzD,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import React from'react';import {FiInfo}from'@react-icons/all-files/fi/FiInfo.js';import {FiAlertTriangle}from'@react-icons/all-files/fi/FiAlertTriangle.js';import {FiAlertCircle}from'@react-icons/all-files/fi/FiAlertCircle.js';import {FiCheckCircle}from'@react-icons/all-files/fi/FiCheckCircle.js';import {FiExternalLink}from'@react-icons/all-files/fi/FiExternalLink.js';import parse from'html-react-parser';/**
|
|
2
|
+
* Service / System notification message — like system messages in Slack,
|
|
3
|
+
* info banners in VS Code, or notification toasts in chat apps.
|
|
4
|
+
*/
|
|
5
|
+
const MessageService = props => {
|
|
6
|
+
const {
|
|
7
|
+
message,
|
|
8
|
+
index
|
|
9
|
+
} = props;
|
|
10
|
+
const {
|
|
11
|
+
attachment
|
|
12
|
+
} = message.propsConfiguration?.contents ?? {};
|
|
13
|
+
if (!attachment) return null;
|
|
14
|
+
const severityConfig = {
|
|
15
|
+
info: {
|
|
16
|
+
icon: React.createElement(FiInfo, {
|
|
17
|
+
className: "w-5 h-5"
|
|
18
|
+
}),
|
|
19
|
+
border: 'border-l-blue-500',
|
|
20
|
+
bg: 'bg-blue-50 dark:bg-blue-900/20',
|
|
21
|
+
text: 'text-blue-700 dark:text-blue-300',
|
|
22
|
+
iconColor: 'text-blue-500'
|
|
23
|
+
},
|
|
24
|
+
warning: {
|
|
25
|
+
icon: React.createElement(FiAlertTriangle, {
|
|
26
|
+
className: "w-5 h-5"
|
|
27
|
+
}),
|
|
28
|
+
border: 'border-l-amber-500',
|
|
29
|
+
bg: 'bg-amber-50 dark:bg-amber-900/20',
|
|
30
|
+
text: 'text-amber-700 dark:text-amber-300',
|
|
31
|
+
iconColor: 'text-amber-500'
|
|
32
|
+
},
|
|
33
|
+
error: {
|
|
34
|
+
icon: React.createElement(FiAlertCircle, {
|
|
35
|
+
className: "w-5 h-5"
|
|
36
|
+
}),
|
|
37
|
+
border: 'border-l-red-500',
|
|
38
|
+
bg: 'bg-red-50 dark:bg-red-900/20',
|
|
39
|
+
text: 'text-red-700 dark:text-red-300',
|
|
40
|
+
iconColor: 'text-red-500'
|
|
41
|
+
},
|
|
42
|
+
success: {
|
|
43
|
+
icon: React.createElement(FiCheckCircle, {
|
|
44
|
+
className: "w-5 h-5"
|
|
45
|
+
}),
|
|
46
|
+
border: 'border-l-green-500',
|
|
47
|
+
bg: 'bg-green-50 dark:bg-green-900/20',
|
|
48
|
+
text: 'text-green-700 dark:text-green-300',
|
|
49
|
+
iconColor: 'text-green-500'
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
const cfg = severityConfig[attachment.severity] || severityConfig.info;
|
|
53
|
+
return React.createElement("div", {
|
|
54
|
+
key: `${index}`,
|
|
55
|
+
className: `my-2 mx-2 p-3 rounded-lg border-l-4 ${cfg.border} ${cfg.bg} flex items-start gap-3`
|
|
56
|
+
}, React.createElement("div", {
|
|
57
|
+
className: `flex-shrink-0 mt-0.5 ${cfg.iconColor}`
|
|
58
|
+
}, cfg.icon), React.createElement("div", {
|
|
59
|
+
className: "flex-1 min-w-0"
|
|
60
|
+
}, React.createElement("p", {
|
|
61
|
+
className: `text-sm font-medium ${cfg.text}`
|
|
62
|
+
}, attachment.isTitleHtml ? parse(attachment.title) : attachment.title), attachment.body && React.createElement("p", {
|
|
63
|
+
className: "mt-1 text-xs text-gray-600 dark:text-gray-400 whitespace-pre-wrap"
|
|
64
|
+
}, attachment.body), attachment.action && React.createElement("a", {
|
|
65
|
+
href: attachment.action.link,
|
|
66
|
+
target: "_blank",
|
|
67
|
+
rel: "noopener noreferrer",
|
|
68
|
+
className: "inline-flex items-center gap-1 mt-2 text-xs font-medium text-blue-600 dark:text-blue-400 hover:underline"
|
|
69
|
+
}, attachment.action.title, " ", React.createElement(FiExternalLink, {
|
|
70
|
+
className: "w-3 h-3"
|
|
71
|
+
})), attachment.timestamp && React.createElement("p", {
|
|
72
|
+
className: "mt-1 text-[10px] text-gray-400 dark:text-gray-500"
|
|
73
|
+
}, attachment.timestamp)));
|
|
74
|
+
};export{MessageService};//# sourceMappingURL=MessageService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessageService.js","sources":["../../../src/components/MessageWidgets/MessageService.tsx"],"sourcesContent":[null],"names":[],"mappings":"yZAgBA;;;AAGG;AACI,MAAM,cAAc,GAAG,KAAC,IAA6B;AACxD,EAAA,MAAA;AACA,IAAA,OAAM;AAIN,IAAA;AAAiB,GAAA,GAAA,KAAA;AAEjB,EAAA,MAAA;AACI,IAAA;AACI,GAAA,GAAA,OAAA,CAAA,kBAAM,EAAA,QAAC,MAAO;AACd,EAAA,IAAA,CAAA,UAAA,SAAQ,IAAA;AACR,EAAA,MAAA,cAAI,GAAA;AACJ,IAAA,IAAA,EAAA;AACA,MAAA,IAAA,EAAA,KAAA,CAAA,aAAW,CAAA,MAAe,EAAA;AAC7B,QAAA,SAAA,EAAA;AACD,OAAA,CAAA;AACI,MAAA,MAAA,EAAA,mBAAM;AACN,MAAA,EAAA,EAAA,gCAA4B;AAC5B,MAAA,IAAA,EAAA,kCAAI;AACJ,MAAA,SAAA;AACA,KAAA;AACH,IAAA,OAAA,EAAA;AACD,MAAA,IAAA,EAAA,KAAO,CAAA,aAAA,CAAA,eAAA,EAAA;AACH,QAAA,WAAM;AACN,OAAA,CAAA;AACA,MAAA,MAAA,EAAE,oBAAE;AACJ,MAAA,EAAA,EAAA,kCAAM;AACN,MAAA,IAAA,EAAA,oCAAyB;AAC5B,MAAA,SAAA,EAAA;AACD,KAAA;AACI,IAAA,KAAA,EAAA;AACA,MAAA,IAAA,EAAA,KAAA,CAAM,aAAE,CAAA,aAAoB,EAAA;AAC5B,QAAA,SAAI,EAAA;AACJ,OAAA,CAAA;AACA,MAAA,MAAA,EAAA,kBAAW;AACd,MAAA,EAAA,EAAA,8BAAA;MACH,IAAA,EAAA,gCAAA;AAEF,MAAA,SAAS,EAAG;AAEZ,KAAA;WAKQ,EAAA;UACA,EAAA,KAAA,CAAA,aAAA,CAAA,aAAK;iBACD,EAAA;AAGC,OAAA,CAAA;YAKA,EAAA,oBACG;4CAM4B;;AAAE,MAAA,SAAA,EAAA;AAGjC;AAMjB,GAAE;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { IPost } from 'common';
|
|
3
|
+
export interface IMessageThinkingProps {
|
|
4
|
+
message: IPost;
|
|
5
|
+
index: number;
|
|
6
|
+
onMessageClick?: (ref: IPost) => void;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Thinking / Reasoning block — like Claude's extended thinking, DeepSeek's reasoning,
|
|
10
|
+
* or Kimi's "thought process" section. Expanded by default to show thought content.
|
|
11
|
+
*/
|
|
12
|
+
export declare const MessageThinking: (props: IMessageThinkingProps) => React.JSX.Element;
|
|
13
|
+
//# sourceMappingURL=MessageThinking.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessageThinking.d.ts","sourceRoot":"","sources":["../../../src/components/MessageWidgets/MessageThinking.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAExC,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAG/B,MAAM,WAAW,qBAAqB;IAClC,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;CACzC;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,GAAI,OAAO,qBAAqB,sBAmD3D,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import React,{useState}from'react';import {FiChevronDown}from'@react-icons/all-files/fi/FiChevronDown.js';/**
|
|
2
|
+
* Thinking / Reasoning block — like Claude's extended thinking, DeepSeek's reasoning,
|
|
3
|
+
* or Kimi's "thought process" section. Expanded by default to show thought content.
|
|
4
|
+
*/
|
|
5
|
+
const MessageThinking = props => {
|
|
6
|
+
const {
|
|
7
|
+
message,
|
|
8
|
+
index
|
|
9
|
+
} = props;
|
|
10
|
+
const {
|
|
11
|
+
attachment
|
|
12
|
+
} = message.propsConfiguration?.contents ?? {};
|
|
13
|
+
const [expanded, setExpanded] = useState(true);
|
|
14
|
+
if (!attachment) return null;
|
|
15
|
+
const label = attachment.label || (attachment.isThinking ? 'Thinking...' : 'Thought process');
|
|
16
|
+
const formatDuration = ms => {
|
|
17
|
+
if (ms < 1000) return `${ms}ms`;
|
|
18
|
+
return `${(ms / 1000).toFixed(1)}s`;
|
|
19
|
+
};
|
|
20
|
+
return React.createElement("div", {
|
|
21
|
+
key: `${index}`,
|
|
22
|
+
className: "my-2 mx-2"
|
|
23
|
+
}, React.createElement("button", {
|
|
24
|
+
className: "flex items-center gap-2 w-full text-left px-3 py-1.5 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors group",
|
|
25
|
+
onClick: () => setExpanded(!expanded)
|
|
26
|
+
}, React.createElement(FiChevronDown, {
|
|
27
|
+
className: `w-3.5 h-3.5 text-gray-400 transition-transform ${expanded ? '' : '-rotate-90'}`
|
|
28
|
+
}), attachment.isThinking && React.createElement("span", {
|
|
29
|
+
className: "inline-block w-1.5 h-1.5 rounded-full bg-amber-500 animate-pulse"
|
|
30
|
+
}), React.createElement("span", {
|
|
31
|
+
className: "text-xs font-medium text-gray-500 dark:text-gray-400 italic"
|
|
32
|
+
}, label), attachment.durationMs != null && !attachment.isThinking && React.createElement("span", {
|
|
33
|
+
className: "text-[10px] text-gray-400 dark:text-gray-500 ml-auto"
|
|
34
|
+
}, formatDuration(attachment.durationMs))), expanded && React.createElement("div", {
|
|
35
|
+
className: "ml-4 mt-1 pl-3 border-l-2 border-amber-200 dark:border-amber-800"
|
|
36
|
+
}, React.createElement("div", {
|
|
37
|
+
className: "text-xs text-gray-500 dark:text-gray-400 whitespace-pre-wrap leading-relaxed max-h-64 overflow-y-auto"
|
|
38
|
+
}, attachment.thought, attachment.isThinking && React.createElement("span", {
|
|
39
|
+
className: "inline-block w-1.5 h-3 ml-0.5 bg-amber-400 animate-pulse rounded-sm"
|
|
40
|
+
}))));
|
|
41
|
+
};export{MessageThinking};//# sourceMappingURL=MessageThinking.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessageThinking.js","sources":["../../../src/components/MessageWidgets/MessageThinking.tsx"],"sourcesContent":[null],"names":[],"mappings":"0GAWA;;;AAGG;AACI,MAAM,eAAe,GAAG,KAAC,IAA8B;AAC1D,EAAA,MAAA;AACA,IAAA,OAAM;IAIN;AAEA,GAAA,GAAA,KAAK;AAAY,EAAA,MAAA;AAEjB,IAAA;AAEA,GAAA,GAAA,OAAM,CAAA,kBAA8B,EAAE,QAAA,IAAA,EAAA;QAClC,CAAA,QAAS,EAAA,WAAI,CAAA,GAAA,QAAA,CAAA,IAAA,CAAA;iBAAE,EAAO,OAAK,IAAK;AAChC,EAAA,MAAA,KAAA,GAAO,UAAS,CAAA,KAAM,KAAO,UAAO,CAAA,UAAA,GAAA,aAAA,GAAA,iBAAA,CAAA;AACxC,EAAA,MAAE,cAAA,GAAA,EAAA,IAAA;IAEF,IAAA,EAAA,GACI,IAAA,EAAA,OAAA,CAAA,EAAA,EAAA,CAAA,EAAA,CAAA;AAEI,IAAA,OAAA,CAAA,EAAA,CAAA,EAAA,GAAA,IAAA,EAAA,OAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAII,EAAA,CAAA;cAGC,CAAA,mBAAqB,EAAA;AAGtB,IAAA,GAAA,EAAA,CAAA,EAAA,KAAA,CAAA,CAAA;aACC,EAAA;AAQJ,GAAA,EAAA,KAAA,CAAA,aACG,CAAA,QAAA,EAAA;aACI,EAAA,kIAAe;AACV,IAAA,OAAA,EAAA,MAAA,WAAW,CAAA,CAAA,QAAO;AAClB,GAAA,EAAA,KAAA,CAAA,aAAA,CAAA,aAAqB,EAAA;AAQ9C,IAAE,SAAA,EAAA,CAAA,+CAAA,EAAA,QAAA,GAAA,EAAA,GAAA,YAAA,CAAA;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { IPost } from 'common';
|
|
3
|
+
export interface IMessageToolUseProps {
|
|
4
|
+
message: IPost;
|
|
5
|
+
index: number;
|
|
6
|
+
onMessageClick?: (ref: IPost) => void;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Tool Use / Function Call card — like VS Code Copilot agent tool calls,
|
|
10
|
+
* ChatGPT function calling, or Claude tool use. Shows tool name, status,
|
|
11
|
+
* input args, and output.
|
|
12
|
+
*/
|
|
13
|
+
export declare const MessageToolUse: (props: IMessageToolUseProps) => React.JSX.Element;
|
|
14
|
+
//# sourceMappingURL=MessageToolUse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessageToolUse.d.ts","sourceRoot":"","sources":["../../../src/components/MessageWidgets/MessageToolUse.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAMxC,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAG/B,MAAM,WAAW,oBAAoB;IACjC,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;CACzC;AAED;;;;GAIG;AACH,eAAO,MAAM,cAAc,GAAI,OAAO,oBAAoB,sBA6GzD,CAAC"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import React,{useState}from'react';import {FiTool}from'@react-icons/all-files/fi/FiTool.js';import {FiChevronDown}from'@react-icons/all-files/fi/FiChevronDown.js';import {FiCheck}from'@react-icons/all-files/fi/FiCheck.js';import {FiAlertCircle}from'@react-icons/all-files/fi/FiAlertCircle.js';import {FiLoader}from'@react-icons/all-files/fi/FiLoader.js';/**
|
|
2
|
+
* Tool Use / Function Call card — like VS Code Copilot agent tool calls,
|
|
3
|
+
* ChatGPT function calling, or Claude tool use. Shows tool name, status,
|
|
4
|
+
* input args, and output.
|
|
5
|
+
*/
|
|
6
|
+
const MessageToolUse = props => {
|
|
7
|
+
const {
|
|
8
|
+
message,
|
|
9
|
+
index
|
|
10
|
+
} = props;
|
|
11
|
+
const {
|
|
12
|
+
attachment
|
|
13
|
+
} = message.propsConfiguration?.contents ?? {};
|
|
14
|
+
const [expanded, setExpanded] = useState(false);
|
|
15
|
+
if (!attachment) return null;
|
|
16
|
+
const statusConfig = {
|
|
17
|
+
pending: {
|
|
18
|
+
icon: React.createElement(FiLoader, {
|
|
19
|
+
className: "w-3.5 h-3.5 text-gray-400"
|
|
20
|
+
}),
|
|
21
|
+
label: 'Pending',
|
|
22
|
+
color: 'text-gray-500',
|
|
23
|
+
bg: 'bg-gray-100 dark:bg-gray-800'
|
|
24
|
+
},
|
|
25
|
+
running: {
|
|
26
|
+
icon: React.createElement(FiLoader, {
|
|
27
|
+
className: "w-3.5 h-3.5 text-blue-500 animate-spin"
|
|
28
|
+
}),
|
|
29
|
+
label: 'Running...',
|
|
30
|
+
color: 'text-blue-600 dark:text-blue-400',
|
|
31
|
+
bg: 'bg-blue-50 dark:bg-blue-900/20'
|
|
32
|
+
},
|
|
33
|
+
success: {
|
|
34
|
+
icon: React.createElement(FiCheck, {
|
|
35
|
+
className: "w-3.5 h-3.5 text-green-500"
|
|
36
|
+
}),
|
|
37
|
+
label: 'Success',
|
|
38
|
+
color: 'text-green-600 dark:text-green-400',
|
|
39
|
+
bg: 'bg-green-50 dark:bg-green-900/20'
|
|
40
|
+
},
|
|
41
|
+
error: {
|
|
42
|
+
icon: React.createElement(FiAlertCircle, {
|
|
43
|
+
className: "w-3.5 h-3.5 text-red-500"
|
|
44
|
+
}),
|
|
45
|
+
label: 'Error',
|
|
46
|
+
color: 'text-red-600 dark:text-red-400',
|
|
47
|
+
bg: 'bg-red-50 dark:bg-red-900/20'
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
const cfg = statusConfig[attachment.status] || statusConfig.pending;
|
|
51
|
+
const formatDuration = ms => {
|
|
52
|
+
if (ms < 1000) return `${ms}ms`;
|
|
53
|
+
return `${(ms / 1000).toFixed(1)}s`;
|
|
54
|
+
};
|
|
55
|
+
return React.createElement("div", {
|
|
56
|
+
key: `${index}`,
|
|
57
|
+
className: `my-2 mx-2 rounded-lg border border-gray-200 dark:border-gray-700 overflow-hidden ${cfg.bg}`
|
|
58
|
+
}, React.createElement("button", {
|
|
59
|
+
className: "flex items-center gap-2 w-full text-left px-3 py-2 hover:bg-black/5 dark:hover:bg-white/5 transition-colors",
|
|
60
|
+
onClick: () => setExpanded(!expanded)
|
|
61
|
+
}, React.createElement(FiTool, {
|
|
62
|
+
className: "w-4 h-4 text-gray-500 flex-shrink-0"
|
|
63
|
+
}), React.createElement("span", {
|
|
64
|
+
className: "text-xs font-mono font-semibold text-gray-700 dark:text-gray-300 truncate"
|
|
65
|
+
}, attachment.toolName), attachment.description && React.createElement("span", {
|
|
66
|
+
className: "text-xs text-gray-400 dark:text-gray-500 truncate hidden sm:inline"
|
|
67
|
+
}, "\u2014 ", attachment.description), React.createElement("div", {
|
|
68
|
+
className: "ml-auto flex items-center gap-1.5 flex-shrink-0"
|
|
69
|
+
}, attachment.durationMs != null && React.createElement("span", {
|
|
70
|
+
className: "text-[10px] text-gray-400"
|
|
71
|
+
}, formatDuration(attachment.durationMs)), React.createElement("span", {
|
|
72
|
+
className: `flex items-center gap-1 text-xs ${cfg.color}`
|
|
73
|
+
}, cfg.icon, " ", cfg.label), React.createElement(FiChevronDown, {
|
|
74
|
+
className: `w-3.5 h-3.5 text-gray-400 transition-transform ${expanded ? '' : '-rotate-90'}`
|
|
75
|
+
}))), expanded && React.createElement("div", {
|
|
76
|
+
className: "px-3 pb-3 border-t border-gray-200 dark:border-gray-700"
|
|
77
|
+
}, attachment.input && Object.keys(attachment.input).length > 0 && React.createElement("div", {
|
|
78
|
+
className: "mt-2"
|
|
79
|
+
}, React.createElement("p", {
|
|
80
|
+
className: "text-[10px] font-medium text-gray-400 uppercase tracking-wide mb-1"
|
|
81
|
+
}, "Input"), React.createElement("pre", {
|
|
82
|
+
className: "text-xs font-mono bg-white dark:bg-gray-900 rounded p-2 overflow-x-auto text-gray-700 dark:text-gray-300 max-h-40 overflow-y-auto"
|
|
83
|
+
}, JSON.stringify(attachment.input, null, 2))), attachment.output && React.createElement("div", {
|
|
84
|
+
className: "mt-2"
|
|
85
|
+
}, React.createElement("p", {
|
|
86
|
+
className: "text-[10px] font-medium text-gray-400 uppercase tracking-wide mb-1"
|
|
87
|
+
}, "Output"), React.createElement("pre", {
|
|
88
|
+
className: "text-xs font-mono bg-white dark:bg-gray-900 rounded p-2 overflow-x-auto text-gray-700 dark:text-gray-300 max-h-40 overflow-y-auto whitespace-pre-wrap"
|
|
89
|
+
}, attachment.output)), attachment.error && React.createElement("div", {
|
|
90
|
+
className: "mt-2 text-xs text-red-600 dark:text-red-400 bg-red-50 dark:bg-red-900/20 rounded p-2"
|
|
91
|
+
}, attachment.error)));
|
|
92
|
+
};export{MessageToolUse};//# sourceMappingURL=MessageToolUse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessageToolUse.js","sources":["../../../src/components/MessageWidgets/MessageToolUse.tsx"],"sourcesContent":[null],"names":[],"mappings":"kWAeA;;;;AAIG;AACI,MAAM,cAAc,GAAG,KAAC,IAA6B;AACxD,EAAA,MAAA;AACA,IAAA,OAAM;IAIN;AAEA,GAAA,GAAA,KAAK;AAAY,EAAA,MAAA;AAEjB,IAAA;AACI,GAAA,GAAA,OAAA,CAAA,kBAAS,EAAA,QAAA,IAAA,EAAA;AACL,EAAA,MAAA,CAAA,UAAM,WAAA,CAAA,GAAA,QAAC,CAAA;AACP,EAAA,IAAA,CAAA,UAAK,EAAE,OAAA,IAAS;AAChB,EAAA,MAAA,YAAO,GAAA;AACP,IAAA,OAAA,EAAA;AACH,MAAA,IAAA,EAAA,KAAA,CAAA,aAAA,CAAA,QAAA,EAAA;AACD,QAAA,SAAS,EAAA;AACL,OAAA,CAAA;AACA,MAAA,KAAA,EAAA,SAAO;AACP,MAAA,KAAA,EAAA,eAAO;AACP,MAAA,EAAA,EAAA;AACH,KAAA;AACD,IAAA,OAAA,EAAA;AACI,MAAA,IAAA,EAAA,MAAM,aAAA,CAAA,QAAC,EAAA;AACP,QAAA,SAAK,EAAE;AACP,OAAA,CAAA;AACA,MAAA,KAAA,EAAA,YAAI;AACP,MAAA,KAAA,EAAA,kCAAA;AACD,MAAA,EAAA,EAAA;AACI,KAAA;AACA,IAAA,OAAA,EAAA;AACA,MAAA,IAAA,EAAA,KAAK,cAAE,CAAA,OAAA,EAAA;AACP,QAAA,SAAI,EAAA;AACP,OAAA,CAAA;MACH,KAAA,EAAA,SAAA;AAEF,MAAA,KAAM,EAAG,oCAAkC;AAE3C,MAAA,EAAA,EAAM;;;AAEF,MAAA,IAAA,EAAA,KAAO,CAAG,aAAY,CAAA,aAAc,EAAA;AACxC,QAAE,SAAA,EAAA;AAEF,OAAA,CAAA;AAMQ,MAAA,KAAA,EAAA,OAAA;AAII,MAAA,KAAA,EAAA,gCAAQ;AACR,MAAA,EAAA,EAAA;AAGC;;0BAEoB,CAAC,UAAA,CAAW,MAEhC,CAAA,IAAA,YAAA,CAAA,OAAA;sBACD,GAAA,EAAA,IAAA;AACK,IAAA,IAAA,EAAA,GAAA,IAAA,EAAA,OAAU,CAAC,EAAA,EAAA,CAAA,EAAA,CAAA;AAGZ,IAAA,OAAA,CAAA,EAAA,CAAA,EAAA,GAAA,IAAA,EAAA,OAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACK,EAAA,CAAA;;;AAEL,IAAA,SAAA,EAAA,CAAA,iFACe,EAAA,GAAA,CAAA,EAAA,CAAA;AAMtB,GAAA,EAAA,KAAA,CAAA,aACG,CAAA,QAAA,EAAA;aAEK,EAAA,6GACwB;mBACjB,WAAA,CAAA,CAAA,QAAA;AACA,GAAA,EAAA,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA;AAOP,IAAA,SAAA,EAAA;yBAEO,CAAA,MAAA,EAAA;;AAQP,GAAA,EAAA,UAAA,CAAA,QAAW,CAAA,EAAA,UACR,CAAA,WAAA,IAAA,KAAA,CAAA,cAAe,MAAA,EAAA;AAQvC,IAAE,SAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { IPost } from 'common';
|
|
3
|
+
export interface IMessageTravelProps {
|
|
4
|
+
message: IPost;
|
|
5
|
+
index: number;
|
|
6
|
+
/** Fired when the card is clicked — the consumer opens the travel side panel. */
|
|
7
|
+
onMessageClick?: (ref: IPost) => void;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Travel listings card — summary + property rows from yantra-resortifi connector results.
|
|
11
|
+
* Clicking opens the full results on the travel page (via `onMessageClick`).
|
|
12
|
+
*/
|
|
13
|
+
export declare const MessageTravel: (props: IMessageTravelProps) => React.JSX.Element;
|
|
14
|
+
//# sourceMappingURL=MessageTravel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessageTravel.d.ts","sourceRoot":"","sources":["../../../src/components/MessageWidgets/MessageTravel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAG/B,MAAM,WAAW,mBAAmB;IAChC,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,iFAAiF;IACjF,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;CACzC;AAuBD;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAI,OAAO,mBAAmB,sBAuHvD,CAAC"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import React from'react';import {FiMapPin}from'@react-icons/all-files/fi/FiMapPin.js';import {FiStar}from'@react-icons/all-files/fi/FiStar.js';import {FiChevronRight}from'@react-icons/all-files/fi/FiChevronRight.js';const LIST_PREVIEW = 5;
|
|
2
|
+
const formatPrice = p => p.priceLabel ?? (typeof p.price === 'number' ? `$${Math.round(p.price)}` : undefined);
|
|
3
|
+
const formatSource = source => {
|
|
4
|
+
if (!source) return undefined;
|
|
5
|
+
if (source === 'resortifi') return 'Resortifi';
|
|
6
|
+
return source.charAt(0).toUpperCase() + source.slice(1);
|
|
7
|
+
};
|
|
8
|
+
const priceRange = a => {
|
|
9
|
+
const prices = (a.properties ?? []).map(p => p.price).filter(n => typeof n === 'number' && Number.isFinite(n));
|
|
10
|
+
const from = a.priceFrom ?? (prices.length ? Math.min(...prices) : undefined);
|
|
11
|
+
const to = a.priceTo ?? (prices.length ? Math.max(...prices) : undefined);
|
|
12
|
+
if (from == null) return undefined;
|
|
13
|
+
return to != null && to !== from ? `$${Math.round(from)}–$${Math.round(to)}` : `$${Math.round(from)}`;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Travel listings card — summary + property rows from yantra-resortifi connector results.
|
|
17
|
+
* Clicking opens the full results on the travel page (via `onMessageClick`).
|
|
18
|
+
*/
|
|
19
|
+
const MessageTravel = props => {
|
|
20
|
+
const {
|
|
21
|
+
message,
|
|
22
|
+
onMessageClick
|
|
23
|
+
} = props;
|
|
24
|
+
const {
|
|
25
|
+
attachment
|
|
26
|
+
} = message.propsConfiguration?.contents ?? {};
|
|
27
|
+
if (!attachment || !Array.isArray(attachment.properties) || attachment.properties.length === 0) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
const properties = attachment.properties;
|
|
31
|
+
const count = attachment.totalCount ?? properties.length;
|
|
32
|
+
const city = attachment.city || properties.find(p => p.city)?.city;
|
|
33
|
+
const title = attachment.title || (city ? `Stays in ${city}` : 'Stays');
|
|
34
|
+
const range = priceRange(attachment);
|
|
35
|
+
const actionLabel = attachment.actionLabel || 'View stays';
|
|
36
|
+
const thumbs = properties.filter(p => p.imageUrl).slice(0, 4);
|
|
37
|
+
const listItems = properties.slice(0, LIST_PREVIEW);
|
|
38
|
+
const open = () => onMessageClick?.(message);
|
|
39
|
+
return React.createElement("div", {
|
|
40
|
+
className: "my-2 mx-2 w-[calc(100%-1rem)] rounded-xl border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800/60 overflow-hidden"
|
|
41
|
+
}, thumbs.length > 0 && React.createElement("div", {
|
|
42
|
+
className: "flex gap-0.5"
|
|
43
|
+
}, thumbs.map((p, i) =>
|
|
44
|
+
// eslint-disable-next-line @next/next/no-img-element
|
|
45
|
+
React.createElement("img", {
|
|
46
|
+
key: p.id ?? i,
|
|
47
|
+
src: p.imageUrl,
|
|
48
|
+
alt: p.title,
|
|
49
|
+
className: "h-24 flex-1 object-cover",
|
|
50
|
+
loading: "lazy"
|
|
51
|
+
}))), React.createElement("button", {
|
|
52
|
+
type: "button",
|
|
53
|
+
onClick: open,
|
|
54
|
+
className: "w-full text-left hover:bg-gray-50 dark:hover:bg-gray-800/80 transition-colors"
|
|
55
|
+
}, React.createElement("div", {
|
|
56
|
+
className: "flex items-center gap-3 p-3 border-b border-gray-100 dark:border-gray-700/80"
|
|
57
|
+
}, React.createElement("div", {
|
|
58
|
+
className: "flex-shrink-0 text-blue-500"
|
|
59
|
+
}, React.createElement(FiMapPin, {
|
|
60
|
+
className: "w-5 h-5"
|
|
61
|
+
})), React.createElement("div", {
|
|
62
|
+
className: "flex-1 min-w-0"
|
|
63
|
+
}, React.createElement("p", {
|
|
64
|
+
className: "text-sm font-semibold text-gray-900 dark:text-gray-100 truncate"
|
|
65
|
+
}, title), React.createElement("p", {
|
|
66
|
+
className: "mt-0.5 text-xs text-gray-500 dark:text-gray-400"
|
|
67
|
+
}, count, " ", count === 1 ? 'stay' : 'stays', range ? ` · ${range}/night` : '')), React.createElement("span", {
|
|
68
|
+
className: "flex-shrink-0 inline-flex items-center gap-1 text-xs font-medium text-blue-600 dark:text-blue-400"
|
|
69
|
+
}, actionLabel, " ", React.createElement(FiChevronRight, {
|
|
70
|
+
className: "w-4 h-4"
|
|
71
|
+
})))), React.createElement("ul", {
|
|
72
|
+
className: "divide-y divide-gray-100 dark:divide-gray-700/80"
|
|
73
|
+
}, listItems.map((p, i) => {
|
|
74
|
+
const price = formatPrice(p);
|
|
75
|
+
const unit = p.priceUnit ?? 'night';
|
|
76
|
+
const source = formatSource(p.source);
|
|
77
|
+
return React.createElement("li", {
|
|
78
|
+
key: p.id ?? i
|
|
79
|
+
}, React.createElement("button", {
|
|
80
|
+
type: "button",
|
|
81
|
+
onClick: open,
|
|
82
|
+
className: "w-full flex items-center gap-3 p-3 text-left hover:bg-gray-50 dark:hover:bg-gray-800/80 transition-colors"
|
|
83
|
+
}, p.imageUrl ?
|
|
84
|
+
// eslint-disable-next-line @next/next/no-img-element
|
|
85
|
+
React.createElement("img", {
|
|
86
|
+
src: p.imageUrl,
|
|
87
|
+
alt: "",
|
|
88
|
+
className: "h-12 w-12 rounded-lg object-cover flex-shrink-0",
|
|
89
|
+
loading: "lazy"
|
|
90
|
+
}) : React.createElement("div", {
|
|
91
|
+
className: "h-12 w-12 rounded-lg bg-gray-100 dark:bg-gray-700 flex-shrink-0"
|
|
92
|
+
}), React.createElement("div", {
|
|
93
|
+
className: "flex-1 min-w-0"
|
|
94
|
+
}, React.createElement("p", {
|
|
95
|
+
className: "text-sm font-medium text-gray-900 dark:text-gray-100 line-clamp-2"
|
|
96
|
+
}, p.title), React.createElement("p", {
|
|
97
|
+
className: "mt-0.5 text-xs text-gray-500 dark:text-gray-400 flex flex-wrap items-center gap-x-1.5 gap-y-0.5"
|
|
98
|
+
}, price ? React.createElement("span", {
|
|
99
|
+
className: "font-medium text-gray-700 dark:text-gray-300"
|
|
100
|
+
}, price, "/", unit) : null, typeof p.rating === 'number' ? React.createElement("span", {
|
|
101
|
+
className: "inline-flex items-center gap-0.5"
|
|
102
|
+
}, React.createElement(FiStar, {
|
|
103
|
+
className: "w-3 h-3 text-amber-400"
|
|
104
|
+
}), p.rating.toFixed(1)) : null, source ? React.createElement("span", null, "via ", source) : null))));
|
|
105
|
+
})), count > LIST_PREVIEW ? React.createElement("button", {
|
|
106
|
+
type: "button",
|
|
107
|
+
onClick: open,
|
|
108
|
+
className: "w-full py-2.5 text-xs font-medium text-blue-600 dark:text-blue-400 hover:bg-gray-50 dark:hover:bg-gray-800/80 border-t border-gray-100 dark:border-gray-700/80"
|
|
109
|
+
}, "View all ", count, " stays") : null);
|
|
110
|
+
};export{MessageTravel};//# sourceMappingURL=MessageTravel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessageTravel.js","sources":["../../../src/components/MessageWidgets/MessageTravel.tsx"],"sourcesContent":[null],"names":[],"mappings":"wNAcA,MAAM,YAAY,GAAG,CAAC;AAEtB,MAAM,WAAW,GAAG,CAAC,KAA6C,CAC9D,UAAE,YAAe,CAAA,CAAO,UAAO,QAAK,GAAS,CAAC,CAAC,EAAA,IAAI,CAAA,KAAK,CAAA,CAAK,CAAC,KAAE,CAAA,CAAK,CAAC,GAAG,SAAE,CAAA;AAE/E,MAAM,YAAY,GAAG,MAAC,IAAqC;AACvD,EAAA,IAAA,CAAA,MAAK,EAAM,OAAA,SAAA;AAAE,EAAA,IAAA,MAAA,gBAAiB,EAAA,OAAA,WAAA;SAC1B,aAAW,CAAA,CAAA,CAAA,CAAA,WAAW,EAAA,GAAA,MAAA,CAAA,KAAA,CAAA,CAAA,CAAA;AAAE,CAAA;AAC5B,MAAA,aAAc,CAAA,IAAM;AACxB,EAAE,MAAA,MAAA,GAAA,CAAA,CAAA,CAAA,UAAA,IAAA,EAAA,EAAA,GAAA,CAAA,CAAA,IAAA,CAAA,CAAA,KAAA,CAAA,CAAA,MAAA,CAAA,CAAA,IAAA,OAAA,CAAA,KAAA,QAAA,IAAA,MAAA,CAAA,QAAA,CAAA,CAAA,CAAA,CAAA;AAEF,EAAA,MAAM,IAAA,GAAA,CAAU,CAAA,SAAyD,KAAA,MAAA,CAAA,MAAA,GAAA,IAAA,CAAA,GAAA,CAAA,GAAA,MAAA,CAAA,GAAA,SAAA,CAAA;QACrE,EAAM,GAAA,CAAA,CAAA,OAAY,KAAA,MAAU,CAAA,MAAO,GAAA,IAAA,CAAA,GAAA,CAAA,GAAA,MAAA,CAAA,GAAA,SAAA,CAAA;UAC9B,IAAK,MAAM,OAAO,SAAC;AACnB,EAAA,OAAA,EAAA,IAAM,QAAqB,OAAO,IAAC,GAAK,CAAA,CAAA,EAAA,IAAQ,CAAA,UAAW,CAAA,CAAA,EAAA,EAAA,IAAW,CAAC,KAAC,CAAA,EAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,EAAA,IAAA,CAAA,KAAA,CAAA,IAAA,CAAA,CAAA,CAAA;;;;AAG3D;AAClB;AACF,MAAA,aAAA,GAAA,KAAA,IAAA;AAEF,EAAA,MAAA;;;AAGG,GAAA,GAAA,KAAA;AACH,EAAA,MAAO;AACH,IAAA;AACA,GAAA,GAAA,OAAQ,CAAA,kBAAgB,EAAA,QAAQ,IAAA,EAAA;MAIhC,CAAA,cAAe,CAAA,aAAW,CAAA,UAAQ,CAAA,eAAsB,qBAAe,CAAA,MAAW,KAAM,CAAA,EAAM;AAC1F,IAAA,OAAA,IAAO;;AAGX,EAAA,MAAA,UAAM,GAAU,UAAG,CAAA;QACnB,KAAM,aAAQ,CAAA,cAAqB,UAAI,CAAA,MAAW;QAClD,IAAM,aAAO,CAAA,QAAe,UAAI,CAAA,IAAW,CAAA,CAAI,IAAG,CAAE,KAAK,CAAA,EAAA,IAAO;AAChE,EAAA,MAAA,QAAW,UAAG,CAAA,KAAW,KAAK,IAAK,GAAK,CAAC,SAAC,EAAA,MAAgB,GAAG,OAAE,CAAA;AAC/D,EAAA,MAAA,QAAW,UAAG,CAAA,UAAW,CAAA;AACzB,EAAA,MAAA,cAAiB,UAAG,CAAA,WAAW,IAAW;QAC1C,MAAM,aAAS,CAAA,QAAiB,IAAG,CAAE,CAAA,QAAK,CAAA,CAAA,KAAU,CAAA,CAAA,EAAK,CAAC,CAAC;QAC3D,SAAM,GAAS,UAAG,CAAA,KAAW,CAAA,CAAK,EAAE,YAAE,CAAA;QAEtC,IAAM,GAAI,MAAM,iBAAiB,OAAG,CAAA;AAEpC,EAAA,OAAA,KACI,CAAA,aAAA,CAAA,KAAA,EAAA;aACK,EAAO;WAGI,CAAA,MAAA,GAAA,CAAA,IAAA,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA;AACA,IAAA,SAAA,EAAA;WAWZ,CAAA,GAAA,CAAA,CAAA,CAAA,EAAA,CAAA;;qBAMQ,CAAA,KAAA,EAAA;AACI,IAAA,GAAA,EAAA,CAAA,CAAA,EAAA,IAAA,CAAA;mBAEJ;AACI,IAAA,GAAA,EAAA,CAAA,CAAA,KAAA;yCACA;;;;;;wBAMC,CAAA,KAAA,EAAW;;wBAAE,CAAA,KAAA,EAAA;AAK1B,IAAA,SAAA,EAAA;AAEQ,GAAA,EAAA,KAAA,CAAA,aAAW,CAAA,QAAG,EAAA;AACd,IAAA,SAAA,EAAA;YACA,CAAA,cAAe,KAAA,EAAA;aACf,EAAA;wBAEQ,CAAA,GAAA,EAAA;AAKK,IAAA,SAAA,EAAA;gCACG,CAAA,GAAA,EAAA;AACA,IAAA,SAAA,EAAA;sBASJ,KAAA,CAAA,GAAA,MAAA,GAAA,OAAA,EAAK,KAAA,GAAA,CAAS,GAAC,EAAA,KAAA,CAAA,MAAA,CAAgB,GAAA,EAAA,CAAA,CAAA,EAAA,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA;AAC3B,IAAA,SAAA,EAAA;4BAGA,CAAA,aAAA,CAAA,cAAG,EAAA;AACE,IAAA,SAAA,EAAA;iCAEQ,EAAA;;AAAQ,GAAA,EAAA,SAAA,CAAA,GAAA,CAAA,CAAA,CAAA,EAAA,CAAA,KAAA;AAGhB,IAAA,MAAA,KAAA,GAAA,WAAA,CAAA,CAAA,CAAA;AAEO,IAAA,MAAA,IAAA,GAAA,CAAA,CAAA,SAAA,IAAA,OAAA;AACC,IAAA,MAAA,MAAA,GAAA,YAAA,CAAA,CAAC,CAAC,MAAM,CAAC;8BAGjB,CAAA,IAAO,EAAE;;mCAAW,EAAA;AAM7C,MAAA,IAAE,EACD,QAAA;AAEJ,MAAA,OAAK,MAAG;;iBAMc;AACV;AAIzB,IAAE,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { IPost } from 'common';
|
|
3
|
+
export interface IMessageWorkflowProps {
|
|
4
|
+
message: IPost;
|
|
5
|
+
index: number;
|
|
6
|
+
/** Fired when the card is clicked — the consumer opens the workflow in the side panel / editor. */
|
|
7
|
+
onMessageClick?: (ref: IPost) => void;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Workflow card — a compact summary of a cdecli-created workflow graph
|
|
11
|
+
* (node chips in flow order + step count). Reads the graph from
|
|
12
|
+
* message.propsConfiguration; clicking fires onMessageClick(message) so the
|
|
13
|
+
* consumer opens the full workflow in the side panel / editor. The graph
|
|
14
|
+
* persists on the message, so it lives with the chat.
|
|
15
|
+
*/
|
|
16
|
+
export declare const MessageWorkflow: (props: IMessageWorkflowProps) => React.JSX.Element;
|
|
17
|
+
//# sourceMappingURL=MessageWorkflow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessageWorkflow.d.ts","sourceRoot":"","sources":["../../../src/components/MessageWidgets/MessageWorkflow.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAK1B,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAI/B,MAAM,WAAW,qBAAqB;IAClC,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,mGAAmG;IACnG,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;CACzC;AAgBD;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,GAAI,OAAO,qBAAqB,sBAyE3D,CAAC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import React from'react';import {FiGitBranch}from'@react-icons/all-files/fi/FiGitBranch.js';import {FiArrowRight}from'@react-icons/all-files/fi/FiArrowRight.js';import {FiExternalLink}from'@react-icons/all-files/fi/FiExternalLink.js';import {FiChevronRight}from'@react-icons/all-files/fi/FiChevronRight.js';import {workflowEditorUrl}from'./workflowUtils.js';/** A node chip in the mini-graph. */
|
|
2
|
+
const NodeChip = ({
|
|
3
|
+
node
|
|
4
|
+
}) => React.createElement("span", {
|
|
5
|
+
className: "inline-flex items-center rounded-md border px-2 py-1 text-xs font-medium whitespace-nowrap",
|
|
6
|
+
style: {
|
|
7
|
+
borderColor: (node.color || '#3b4567') + '66',
|
|
8
|
+
color: node.color || undefined
|
|
9
|
+
},
|
|
10
|
+
title: node.type
|
|
11
|
+
}, node.label);
|
|
12
|
+
/**
|
|
13
|
+
* Workflow card — a compact summary of a cdecli-created workflow graph
|
|
14
|
+
* (node chips in flow order + step count). Reads the graph from
|
|
15
|
+
* message.propsConfiguration; clicking fires onMessageClick(message) so the
|
|
16
|
+
* consumer opens the full workflow in the side panel / editor. The graph
|
|
17
|
+
* persists on the message, so it lives with the chat.
|
|
18
|
+
*/
|
|
19
|
+
const MessageWorkflow = props => {
|
|
20
|
+
const {
|
|
21
|
+
message,
|
|
22
|
+
onMessageClick
|
|
23
|
+
} = props;
|
|
24
|
+
const {
|
|
25
|
+
attachment
|
|
26
|
+
} = message.propsConfiguration?.contents ?? message.props ?? {};
|
|
27
|
+
if (!attachment || !Array.isArray(attachment.nodes) || attachment.nodes.length === 0) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
const nodes = attachment.nodes;
|
|
31
|
+
const title = attachment.title || attachment.slug || 'Workflow';
|
|
32
|
+
const count = nodes.length;
|
|
33
|
+
const href = workflowEditorUrl(attachment);
|
|
34
|
+
const actionLabel = attachment.actionLabel || 'Open workflow';
|
|
35
|
+
// Show up to 5 nodes inline; collapse the rest into a "+N" chip.
|
|
36
|
+
const shown = nodes.slice(0, 5);
|
|
37
|
+
const extra = count - shown.length;
|
|
38
|
+
const open = () => onMessageClick?.(message);
|
|
39
|
+
return React.createElement("button", {
|
|
40
|
+
type: "button",
|
|
41
|
+
onClick: open,
|
|
42
|
+
className: "my-2 mx-2 w-[calc(100%-1rem)] text-left rounded-xl border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800/60 hover:border-indigo-400 dark:hover:border-indigo-500 hover:shadow-sm transition-colors overflow-hidden"
|
|
43
|
+
}, React.createElement("div", {
|
|
44
|
+
className: "flex items-center gap-3 px-3 pt-3"
|
|
45
|
+
}, React.createElement("div", {
|
|
46
|
+
className: "flex-shrink-0 text-indigo-500"
|
|
47
|
+
}, React.createElement(FiGitBranch, {
|
|
48
|
+
className: "w-5 h-5"
|
|
49
|
+
})), React.createElement("div", {
|
|
50
|
+
className: "flex-1 min-w-0"
|
|
51
|
+
}, React.createElement("p", {
|
|
52
|
+
className: "text-sm font-semibold text-gray-900 dark:text-gray-100 truncate"
|
|
53
|
+
}, title), React.createElement("p", {
|
|
54
|
+
className: "mt-0.5 text-xs text-gray-500 dark:text-gray-400"
|
|
55
|
+
}, count, " ", count === 1 ? 'step' : 'steps', attachment.version ? ` · ${attachment.version}` : '')), React.createElement("span", {
|
|
56
|
+
className: "flex-shrink-0 inline-flex items-center gap-1 text-xs font-medium text-indigo-600 dark:text-indigo-400"
|
|
57
|
+
}, actionLabel, " ", React.createElement(FiChevronRight, {
|
|
58
|
+
className: "w-4 h-4"
|
|
59
|
+
}))), React.createElement("div", {
|
|
60
|
+
className: "flex items-center gap-1.5 overflow-x-auto px-3 py-3"
|
|
61
|
+
}, shown.map((node, i) => React.createElement(React.Fragment, {
|
|
62
|
+
key: node.nodeId || i
|
|
63
|
+
}, React.createElement(NodeChip, {
|
|
64
|
+
node: node
|
|
65
|
+
}), i < shown.length - 1 && React.createElement(FiArrowRight, {
|
|
66
|
+
className: "w-3.5 h-3.5 flex-shrink-0 text-gray-400"
|
|
67
|
+
}))), extra > 0 && React.createElement(React.Fragment, null, React.createElement(FiArrowRight, {
|
|
68
|
+
className: "w-3.5 h-3.5 flex-shrink-0 text-gray-400"
|
|
69
|
+
}), React.createElement("span", {
|
|
70
|
+
className: "text-xs text-gray-500 dark:text-gray-400 whitespace-nowrap"
|
|
71
|
+
}, "+", extra))), href && React.createElement("div", {
|
|
72
|
+
className: "border-t border-gray-100 dark:border-gray-700/60 px-3 py-2"
|
|
73
|
+
}, React.createElement("a", {
|
|
74
|
+
href: href,
|
|
75
|
+
target: "_blank",
|
|
76
|
+
rel: "noopener noreferrer",
|
|
77
|
+
onClick: e => e.stopPropagation(),
|
|
78
|
+
className: "inline-flex items-center gap-1 text-xs font-medium text-indigo-600 dark:text-indigo-400 hover:underline"
|
|
79
|
+
}, "Open in editor ", React.createElement(FiExternalLink, {
|
|
80
|
+
className: "w-3 h-3"
|
|
81
|
+
}))));
|
|
82
|
+
};export{MessageWorkflow};//# sourceMappingURL=MessageWorkflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessageWorkflow.js","sources":["../../../src/components/MessageWidgets/MessageWorkflow.tsx"],"sourcesContent":[null],"names":["editorUrl"],"mappings":"sWAgBA;AACA,MAAM,QAAQ,GAAG,CAAC;;AAKN,CAAA,KAAA,KAAA,CAAA,aAAiB,OAAI,EAAA;WAEzB,EAAK,4FAIX;AAEF,EAAA,KAAA,EAAA;;;;;;AAMG;AACH;AACI;AACA;;AAKI;;AAGE,MAAA,eAAkB,QAAO,IAAA;QAC/B;AACA,IAAA,OAAM;AACN,IAAA;AACA,GAAA,GAAA;QACA;IACA;AACA,GAAA,GAAA,0BAA4B,UAAO,IAAA,OAAA,CAAA,KAAA,IAAA,EAAA;MAEnC,CAAA,UAAa,IAAG,CAAE,wBAAkB,CAAO,KAAE,CAAA,IAAA,UAAA,CAAA,KAAA,CAAA,MAAA,KAAA,CAAA,EAAA;AAE7C,IAAA,OAAO,IACH;;aAMQ,GAAA,UAAA,CAAA,KAAA;AACI,EAAA,MAAA,KAAA,GAAA,UAAA,CAAA,KAAA,IAAC,WAAW,IAAC,IAAA,UAAU;aAE3B,GAAA,KAAA,CAAA,MAAA;AACI,EAAA,MAAA,IAAA,GAAAA,iBAAA,CAAA,UAAA,CAAA;mBACA,GAAA,UAAA,CAAA,WAAG,IAAA,eAAU;;;qBACA,GAAA,KAAK,CAAK,MAAI;AACtB,EAAA,MAAA,IAAA,GAAA,MAAA,cAAW,GAAO,OAAG,CAAA;cAG9B,CAAA,aAAA,CAAA,QAAA,EAAA;kBACK;;AAAa,IAAA,SAAA,EAAA;UAItB,CAAA,aAAA,CAAA,KAAA,EAAA;aACK,EAAA;AAEO,GAAA,EAAA,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA;AACC,IAAA,SAAA,EAAA;wBAGC,CAAI,WACV,EAAA;AACI,IAAA,SAAA,EAAA;0BACA,CAAA,KAAA,EAAA;;wBAA+E,CAAK,GAE3F,EACC;AAEL,IAAA,SAAI,EAAA;aAEG,KAAA,CAAA,aAAA,CAAA,GAAA,EAAA;;iBAOmB,KAAA,KAAA,CAAA,GAAA,MAAC,GAAA,OAAA,EAAA,UAAe,CAAA,OAAU,GAAA,CAAA,GAAS,EAAA,UAKpE,CAAA,OAAA,CAAA,CAAA,GAAA,EAAA,CAAA,CAAA,EAAA,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA;AACN,IAAE,SAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|