hermium 0.2.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/hermium.mjs +103 -58
- package/dist/api.mjs +35 -0
- package/dist/public/assets/css/styles-o9LLzp-x.css +1 -0
- package/dist/public/assets/js/{ChatInputBlock-Bw7AL70H.js → ChatInputBlock-BgJMx5nW.js} +1 -1
- package/dist/public/assets/js/{MarkdownMessage-8d7Y6VL-.js → MarkdownMessage-Dd6VsKhk.js} +1 -1
- package/dist/public/assets/js/{base-ui-BvQbAt_1.js → base-ui-Ls-HE_Zl.js} +1 -1
- package/dist/public/assets/js/{chat._sessionId-BG6lVraH.js → chat._sessionId-Yif-J0_7.js} +1 -1
- package/dist/public/assets/js/{chat.index-D2zdMPTT.js → chat.index-QgwoSqOs.js} +1 -1
- package/dist/public/assets/js/{index-C0AK45FU.js → index-BDLsrzTe.js} +26 -26
- package/dist/public/assets/js/{index-Cx5En4FK.js → index-DRH0t4ti.js} +1 -1
- package/dist/public/assets/js/{memory-CeSRdTkW.js → memory-CHpNNtU2.js} +1 -1
- package/dist/public/assets/js/{router-8uDKazL-.js → router-B8BATVn7.js} +1 -1
- package/dist/public/assets/js/{settings-Bc3Y5zXO.js → settings-CRV3Pp8x.js} +1 -1
- package/dist/public/assets/js/{skills-DZv7sA_5.js → skills-C8G72gXr.js} +1 -1
- package/dist/public/assets/js/{usage-DXQsT9_b.js → usage-Bev8hqwh.js} +1 -1
- package/dist/server/__23tanstack-start-plugin-adapters-Cwee5PKy.mjs +6 -0
- package/dist/server/_chunks/ssr-renderer.mjs +22 -0
- package/dist/server/_libs/bail.mjs +8 -0
- package/dist/server/_libs/base-ui__react.mjs +9858 -0
- package/dist/server/_libs/base-ui__utils.mjs +1106 -0
- package/dist/server/_libs/ccount.mjs +16 -0
- package/dist/server/_libs/character-entities.mjs +2130 -0
- package/dist/server/_libs/class-variance-authority.mjs +44 -0
- package/dist/server/_libs/clsx.mjs +16 -0
- package/dist/server/_libs/comma-separated-tokens.mjs +10 -0
- package/dist/server/_libs/cookie-es.mjs +1 -0
- package/dist/server/_libs/croner.mjs +1 -0
- package/dist/server/_libs/crossws.mjs +1 -0
- package/dist/server/_libs/decode-named-character-reference+[...].mjs +8 -0
- package/dist/server/_libs/devlop.mjs +8 -0
- package/dist/server/_libs/escape-string-regexp.mjs +9 -0
- package/dist/server/_libs/estree-util-is-identifier-name.mjs +11 -0
- package/dist/server/_libs/extend.mjs +97 -0
- package/dist/server/_libs/floating-ui__core.mjs +663 -0
- package/dist/server/_libs/floating-ui__dom.mjs +624 -0
- package/dist/server/_libs/floating-ui__react-dom.mjs +279 -0
- package/dist/server/_libs/floating-ui__utils.mjs +322 -0
- package/dist/server/_libs/h3.mjs +408 -0
- package/dist/server/_libs/hast-util-is-element.mjs +75 -0
- package/dist/server/_libs/hast-util-to-jsx-runtime.mjs +388 -0
- package/dist/server/_libs/hast-util-to-text.mjs +305 -0
- package/dist/server/_libs/hast-util-whitespace.mjs +10 -0
- package/dist/server/_libs/highlight.js.mjs +14756 -0
- package/dist/server/_libs/hookable.mjs +1 -0
- package/dist/server/_libs/html-url-attributes.mjs +26 -0
- package/dist/server/_libs/inline-style-parser.mjs +142 -0
- package/dist/server/_libs/is-plain-obj.mjs +10 -0
- package/dist/server/_libs/isbot.mjs +21 -0
- package/dist/server/_libs/longest-streak.mjs +25 -0
- package/dist/server/_libs/lowlight.mjs +262 -0
- package/dist/server/_libs/markdown-table.mjs +142 -0
- package/dist/server/_libs/mdast-util-find-and-replace.mjs +109 -0
- package/dist/server/_libs/mdast-util-from-markdown.mjs +717 -0
- package/dist/server/_libs/mdast-util-gfm-autolink-literal+[...].mjs +156 -0
- package/dist/server/_libs/mdast-util-gfm-footnote.mjs +117 -0
- package/dist/server/_libs/mdast-util-gfm-strikethrough.mjs +54 -0
- package/dist/server/_libs/mdast-util-gfm-table.mjs +157 -0
- package/dist/server/_libs/mdast-util-gfm-task-list-item.mjs +77 -0
- package/dist/server/_libs/mdast-util-gfm.mjs +29 -0
- package/dist/server/_libs/mdast-util-phrasing.mjs +30 -0
- package/dist/server/_libs/mdast-util-to-hast.mjs +710 -0
- package/dist/server/_libs/mdast-util-to-markdown.mjs +798 -0
- package/dist/server/_libs/mdast-util-to-string.mjs +38 -0
- package/dist/server/_libs/micromark-core-commonmark.mjs +2259 -0
- package/dist/server/_libs/micromark-extension-gfm-autolink-literal+[...].mjs +344 -0
- package/dist/server/_libs/micromark-extension-gfm-footnote+[...].mjs +279 -0
- package/dist/server/_libs/micromark-extension-gfm-strikethrough+[...].mjs +98 -0
- package/dist/server/_libs/micromark-extension-gfm-table.mjs +491 -0
- package/dist/server/_libs/micromark-extension-gfm-tagfilter+[...].mjs +1 -0
- package/dist/server/_libs/micromark-extension-gfm-task-list-item+[...].mjs +77 -0
- package/dist/server/_libs/micromark-extension-gfm.mjs +18 -0
- package/dist/server/_libs/micromark-factory-destination.mjs +94 -0
- package/dist/server/_libs/micromark-factory-label.mjs +63 -0
- package/dist/server/_libs/micromark-factory-space.mjs +24 -0
- package/dist/server/_libs/micromark-factory-title.mjs +65 -0
- package/dist/server/_libs/micromark-factory-whitespace.mjs +22 -0
- package/dist/server/_libs/micromark-util-character.mjs +44 -0
- package/dist/server/_libs/micromark-util-chunked.mjs +36 -0
- package/dist/server/_libs/micromark-util-classify-character+[...].mjs +12 -0
- package/dist/server/_libs/micromark-util-combine-extensions+[...].mjs +41 -0
- package/dist/server/_libs/micromark-util-decode-numeric-character-reference+[...].mjs +19 -0
- package/dist/server/_libs/micromark-util-decode-string.mjs +21 -0
- package/dist/server/_libs/micromark-util-encode.mjs +1 -0
- package/dist/server/_libs/micromark-util-html-tag-name.mjs +69 -0
- package/dist/server/_libs/micromark-util-normalize-identifier+[...].mjs +6 -0
- package/dist/server/_libs/micromark-util-resolve-all.mjs +15 -0
- package/dist/server/_libs/micromark-util-sanitize-uri.mjs +41 -0
- package/dist/server/_libs/micromark-util-subtokenize.mjs +346 -0
- package/dist/server/_libs/micromark.mjs +906 -0
- package/dist/server/_libs/ocache.mjs +1 -0
- package/dist/server/_libs/ohash.mjs +1 -0
- package/dist/server/_libs/property-information.mjs +1209 -0
- package/dist/server/_libs/react-dom.mjs +10779 -0
- package/dist/server/_libs/react-markdown.mjs +147 -0
- package/dist/server/_libs/react.mjs +513 -0
- package/dist/server/_libs/rehype-highlight.mjs +94 -0
- package/dist/server/_libs/remark-gfm.mjs +20 -0
- package/dist/server/_libs/remark-parse.mjs +19 -0
- package/dist/server/_libs/remark-rehype.mjs +21 -0
- package/dist/server/_libs/reselect.mjs +1 -0
- package/dist/server/_libs/rou3.mjs +8 -0
- package/dist/server/_libs/seroval-plugins.mjs +1 -0
- package/dist/server/_libs/seroval.mjs +1 -0
- package/dist/server/_libs/space-separated-tokens.mjs +6 -0
- package/dist/server/_libs/srvx.mjs +781 -0
- package/dist/server/_libs/style-to-js.mjs +72 -0
- package/dist/server/_libs/style-to-object.mjs +38 -0
- package/dist/server/_libs/tabler__icons-react.mjs +140 -0
- package/dist/server/_libs/tailwind-merge.mjs +3255 -0
- package/dist/server/_libs/tanstack__history.mjs +29 -0
- package/dist/server/_libs/tanstack__react-router.mjs +1120 -0
- package/dist/server/_libs/tanstack__react-store.mjs +2 -0
- package/dist/server/_libs/tanstack__router-core.mjs +3594 -0
- package/dist/server/_libs/tanstack__store.mjs +1 -0
- package/dist/server/_libs/trim-lines.mjs +41 -0
- package/dist/server/_libs/trough.mjs +85 -0
- package/dist/server/_libs/ufo.mjs +54 -0
- package/dist/server/_libs/unctx.mjs +1 -0
- package/dist/server/_libs/ungap__structured-clone.mjs +224 -0
- package/dist/server/_libs/unified.mjs +661 -0
- package/dist/server/_libs/unist-util-find-after.mjs +41 -0
- package/dist/server/_libs/unist-util-is.mjs +100 -0
- package/dist/server/_libs/unist-util-position.mjs +27 -0
- package/dist/server/_libs/unist-util-stringify-position.mjs +27 -0
- package/dist/server/_libs/unist-util-visit-parents.mjs +83 -0
- package/dist/server/_libs/unist-util-visit.mjs +24 -0
- package/dist/server/_libs/unstorage.mjs +1 -0
- package/dist/server/_libs/use-sync-external-store.mjs +139 -0
- package/dist/server/_libs/vfile-message.mjs +138 -0
- package/dist/server/_libs/vfile.mjs +467 -0
- package/dist/server/_libs/zustand.mjs +43 -0
- package/dist/server/_libs/zwitch.mjs +1 -0
- package/dist/server/_ssr/ChatInputBlock-Bu2-iop_.mjs +220 -0
- package/dist/server/_ssr/MarkdownMessage-CNS7OSKN.mjs +68 -0
- package/dist/server/_ssr/chat._sessionId-P02iSfut.mjs +477 -0
- package/dist/server/_ssr/chat.index-BYB_48NC.mjs +64 -0
- package/dist/server/_ssr/index-C1mT_2d8.mjs +4890 -0
- package/dist/server/_ssr/index-DFV9_oCk.mjs +43 -0
- package/dist/server/_ssr/memory-CW_fSOG9.mjs +257 -0
- package/dist/server/_ssr/router-CUAfx91O.mjs +2035 -0
- package/dist/server/_ssr/settings-DoXurzvn.mjs +10 -0
- package/dist/server/_ssr/skills-Cs7A5ZwO.mjs +422 -0
- package/dist/server/_ssr/theme-BK4-7E2h.mjs +42 -0
- package/dist/server/_ssr/usage-Bs2-LXGz.mjs +298 -0
- package/dist/server/_tanstack-start-manifest_v-C7Upe2TI.mjs +4 -0
- package/dist/server/index.mjs +506 -0
- package/dist/server/public/assets/css/index-Dfs9RUU9.css +1 -0
- package/dist/server/public/assets/css/styles-o9LLzp-x.css +1 -0
- package/dist/server/public/assets/js/ChatInputBlock-BgJMx5nW.js +1 -0
- package/dist/server/public/assets/js/MarkdownMessage-Dd6VsKhk.js +1 -0
- package/dist/server/public/assets/js/base-ui-Ls-HE_Zl.js +1 -0
- package/dist/server/public/assets/js/chat._sessionId-Yif-J0_7.js +1 -0
- package/dist/server/public/assets/js/chat.index-QgwoSqOs.js +1 -0
- package/dist/server/public/assets/js/index-BDLsrzTe.js +60 -0
- package/dist/server/public/assets/js/index-DRH0t4ti.js +1 -0
- package/dist/server/public/assets/js/memory-CHpNNtU2.js +3 -0
- package/dist/server/public/assets/js/router-B8BATVn7.js +1 -0
- package/dist/server/public/assets/js/settings-CRV3Pp8x.js +1 -0
- package/dist/server/public/assets/js/skills-C8G72gXr.js +1 -0
- package/dist/server/public/assets/js/theme-CPkdkpaj.js +1 -0
- package/dist/server/public/assets/js/usage-Bev8hqwh.js +1 -0
- package/dist/server/public/assets/woff2/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
- package/dist/server/public/assets/woff2/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
- package/dist/server/public/assets/woff2/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
- package/dist/server/public/assets/woff2/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
- package/dist/server/public/assets/woff2/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
- package/dist/server/public/favicon.ico +0 -0
- package/dist/server/public/logo.png +0 -0
- package/dist/server/public/manifest.json +25 -0
- package/dist/server/public/robots.txt +3 -0
- package/package.json +4 -3
- package/dist/public/assets/css/styles-B8p6jk5Z.css +0 -1
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
|
|
2
|
+
import { u as useChatStore, B as Button, c as cn } from "./router-CUAfx91O.mjs";
|
|
3
|
+
import { k as IconFile, C as IconX, o as IconPaperclip, q as IconPhotoScan, t as IconPlayerStop, a as IconArrowUp } from "../_libs/tabler__icons-react.mjs";
|
|
4
|
+
function Textarea({ className, ...props }) {
|
|
5
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
6
|
+
"textarea",
|
|
7
|
+
{
|
|
8
|
+
"data-slot": "textarea",
|
|
9
|
+
className: cn(
|
|
10
|
+
"flex field-sizing-content min-h-16 w-full rounded-lg border border-input bg-transparent px-2.5 py-2 text-base transition-colors outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",
|
|
11
|
+
className
|
|
12
|
+
),
|
|
13
|
+
...props
|
|
14
|
+
}
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
function ChatInputBlock({
|
|
18
|
+
onCreateSession
|
|
19
|
+
}) {
|
|
20
|
+
const [inputValue, setInputValue] = reactExports.useState("");
|
|
21
|
+
const [attachments, setAttachments] = reactExports.useState([]);
|
|
22
|
+
const [isDragging, setIsDragging] = reactExports.useState(false);
|
|
23
|
+
const inputRef = reactExports.useRef(null);
|
|
24
|
+
const fileInputRef = reactExports.useRef(null);
|
|
25
|
+
const sendMessage = useChatStore((s) => s.sendMessage);
|
|
26
|
+
const abortStream = useChatStore((s) => s.abortStream);
|
|
27
|
+
const isStreaming = useChatStore((s) => s.isStreaming);
|
|
28
|
+
const activeSessionId = useChatStore((s) => s.activeSessionId);
|
|
29
|
+
const handleFiles = reactExports.useCallback((files) => {
|
|
30
|
+
if (!files) return;
|
|
31
|
+
const newAttachments = [];
|
|
32
|
+
for (const file of Array.from(files)) {
|
|
33
|
+
newAttachments.push({
|
|
34
|
+
id: Math.random().toString(36).slice(2),
|
|
35
|
+
name: file.name,
|
|
36
|
+
type: file.type || "application/octet-stream",
|
|
37
|
+
size: file.size,
|
|
38
|
+
url: URL.createObjectURL(file),
|
|
39
|
+
file
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
setAttachments((prev) => [...prev, ...newAttachments]);
|
|
43
|
+
}, []);
|
|
44
|
+
const removeAttachment = reactExports.useCallback((id) => {
|
|
45
|
+
setAttachments((prev) => {
|
|
46
|
+
const att = prev.find((a) => a.id === id);
|
|
47
|
+
if (att) URL.revokeObjectURL(att.url);
|
|
48
|
+
return prev.filter((a) => a.id !== id);
|
|
49
|
+
});
|
|
50
|
+
}, []);
|
|
51
|
+
const send = async () => {
|
|
52
|
+
const raw = inputValue.trim();
|
|
53
|
+
if (!raw && attachments.length === 0) return;
|
|
54
|
+
if (onCreateSession) {
|
|
55
|
+
const id = await useChatStore.getState().createNewSession();
|
|
56
|
+
if (id) {
|
|
57
|
+
onCreateSession(id);
|
|
58
|
+
setInputValue("");
|
|
59
|
+
if (inputRef.current) inputRef.current.value = "";
|
|
60
|
+
const atts2 = attachments.length > 0 ? attachments : void 0;
|
|
61
|
+
setAttachments([]);
|
|
62
|
+
await sendMessage(raw, void 0, atts2);
|
|
63
|
+
}
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
if (!activeSessionId) {
|
|
67
|
+
const id = await useChatStore.getState().createNewSession();
|
|
68
|
+
if (!id) return;
|
|
69
|
+
}
|
|
70
|
+
setInputValue("");
|
|
71
|
+
if (inputRef.current) inputRef.current.value = "";
|
|
72
|
+
const atts = attachments.length > 0 ? attachments : void 0;
|
|
73
|
+
setAttachments([]);
|
|
74
|
+
await sendMessage(raw, void 0, atts);
|
|
75
|
+
};
|
|
76
|
+
const handleKeyDown = (e) => {
|
|
77
|
+
if (e.key === "Enter" && !e.shiftKey) {
|
|
78
|
+
e.preventDefault();
|
|
79
|
+
send();
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
const handleDragOver = (e) => {
|
|
83
|
+
e.preventDefault();
|
|
84
|
+
setIsDragging(true);
|
|
85
|
+
};
|
|
86
|
+
const handleDragLeave = (e) => {
|
|
87
|
+
e.preventDefault();
|
|
88
|
+
setIsDragging(false);
|
|
89
|
+
};
|
|
90
|
+
const handleDrop = (e) => {
|
|
91
|
+
e.preventDefault();
|
|
92
|
+
setIsDragging(false);
|
|
93
|
+
handleFiles(e.dataTransfer.files);
|
|
94
|
+
};
|
|
95
|
+
const formatSize = (bytes) => {
|
|
96
|
+
if (bytes < 1024) return `${bytes} B`;
|
|
97
|
+
if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;
|
|
98
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
99
|
+
};
|
|
100
|
+
const isImage = (type) => type.startsWith("image/");
|
|
101
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex flex-col gap-2 w-full", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
102
|
+
"div",
|
|
103
|
+
{
|
|
104
|
+
className: cn(
|
|
105
|
+
"flex min-h-[120px] flex-col rounded-2xl cursor-text bg-card border border-border shadow-lg transition-colors",
|
|
106
|
+
isDragging && "border-primary ring-2 ring-primary/20"
|
|
107
|
+
),
|
|
108
|
+
onDragOver: handleDragOver,
|
|
109
|
+
onDragLeave: handleDragLeave,
|
|
110
|
+
onDrop: handleDrop,
|
|
111
|
+
children: [
|
|
112
|
+
attachments.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex flex-wrap gap-2 p-3 pb-0", children: attachments.map((att) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
113
|
+
"div",
|
|
114
|
+
{
|
|
115
|
+
className: "group relative flex items-center gap-2 rounded-lg border bg-muted/50 px-2 py-1.5 pr-7 text-xs",
|
|
116
|
+
children: [
|
|
117
|
+
isImage(att.type) ? /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
118
|
+
"img",
|
|
119
|
+
{
|
|
120
|
+
src: att.url,
|
|
121
|
+
alt: att.name,
|
|
122
|
+
className: "h-6 w-6 rounded object-cover"
|
|
123
|
+
}
|
|
124
|
+
) : /* @__PURE__ */ jsxRuntimeExports.jsx(IconFile, { className: "size-4 text-muted-foreground shrink-0" }),
|
|
125
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "truncate max-w-[120px]", children: att.name }),
|
|
126
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-muted-foreground/60", children: formatSize(att.size) }),
|
|
127
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
128
|
+
"button",
|
|
129
|
+
{
|
|
130
|
+
onClick: () => removeAttachment(att.id),
|
|
131
|
+
className: "absolute right-1 top-1/2 -translate-y-1/2 flex items-center justify-center rounded p-0.5 text-muted-foreground hover:text-foreground opacity-0 group-hover:opacity-100 transition-opacity",
|
|
132
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsx(IconX, { className: "size-3" })
|
|
133
|
+
}
|
|
134
|
+
)
|
|
135
|
+
]
|
|
136
|
+
},
|
|
137
|
+
att.id
|
|
138
|
+
)) }),
|
|
139
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-1 relative overflow-y-auto max-h-[258px]", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
140
|
+
Textarea,
|
|
141
|
+
{
|
|
142
|
+
ref: inputRef,
|
|
143
|
+
value: inputValue,
|
|
144
|
+
onChange: (e) => setInputValue(e.target.value),
|
|
145
|
+
onKeyDown: handleKeyDown,
|
|
146
|
+
placeholder: "Ask anything",
|
|
147
|
+
className: "w-full border-0 p-3 transition-[padding] duration-200 ease-in-out min-h-[48.4px] outline-none text-[16px] text-foreground resize-none shadow-none focus-visible:ring-0 focus-visible:ring-offset-0 bg-transparent! whitespace-pre-wrap break-words"
|
|
148
|
+
}
|
|
149
|
+
) }),
|
|
150
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex min-h-[40px] items-center gap-2 p-2 pb-1", children: [
|
|
151
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-1", children: [
|
|
152
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
153
|
+
"input",
|
|
154
|
+
{
|
|
155
|
+
ref: fileInputRef,
|
|
156
|
+
type: "file",
|
|
157
|
+
multiple: true,
|
|
158
|
+
className: "hidden",
|
|
159
|
+
onChange: (e) => handleFiles(e.target.files)
|
|
160
|
+
}
|
|
161
|
+
),
|
|
162
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
163
|
+
Button,
|
|
164
|
+
{
|
|
165
|
+
variant: "ghost",
|
|
166
|
+
size: "icon-sm",
|
|
167
|
+
className: "text-muted-foreground hover:text-foreground transition-colors duration-100 ease-out",
|
|
168
|
+
title: "Attach files",
|
|
169
|
+
"aria-label": "Attach files",
|
|
170
|
+
onClick: () => fileInputRef.current?.click(),
|
|
171
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsx(IconPaperclip, { className: "h-5 w-5" })
|
|
172
|
+
}
|
|
173
|
+
),
|
|
174
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
175
|
+
Button,
|
|
176
|
+
{
|
|
177
|
+
variant: "ghost",
|
|
178
|
+
size: "icon-sm",
|
|
179
|
+
className: "text-muted-foreground hover:text-foreground transition-colors duration-100 ease-out",
|
|
180
|
+
title: "Attach images",
|
|
181
|
+
"aria-label": "Attach images",
|
|
182
|
+
onClick: () => fileInputRef.current?.click(),
|
|
183
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsx(IconPhotoScan, { className: "h-5 w-5" })
|
|
184
|
+
}
|
|
185
|
+
)
|
|
186
|
+
] }),
|
|
187
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "ml-auto flex items-center gap-3", children: isStreaming ? /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
188
|
+
Button,
|
|
189
|
+
{
|
|
190
|
+
variant: "ghost",
|
|
191
|
+
size: "icon-sm",
|
|
192
|
+
onClick: abortStream,
|
|
193
|
+
className: "rounded-full bg-destructive hover:bg-destructive/90 text-destructive-foreground transition-colors cursor-pointer",
|
|
194
|
+
title: "Stop generating",
|
|
195
|
+
"aria-label": "Stop generating",
|
|
196
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsx(IconPlayerStop, { className: "h-4 w-4" })
|
|
197
|
+
}
|
|
198
|
+
) : /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
199
|
+
Button,
|
|
200
|
+
{
|
|
201
|
+
variant: "ghost",
|
|
202
|
+
size: "icon-sm",
|
|
203
|
+
onClick: send,
|
|
204
|
+
className: cn(
|
|
205
|
+
"rounded-full transition-colors duration-100 ease-out cursor-pointer bg-primary",
|
|
206
|
+
(inputValue || attachments.length > 0) && "bg-primary hover:bg-primary/90!"
|
|
207
|
+
),
|
|
208
|
+
disabled: !inputValue && attachments.length === 0,
|
|
209
|
+
"aria-label": "Send message",
|
|
210
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsx(IconArrowUp, { className: "h-4 w-4 text-primary-foreground" })
|
|
211
|
+
}
|
|
212
|
+
) })
|
|
213
|
+
] })
|
|
214
|
+
]
|
|
215
|
+
}
|
|
216
|
+
) });
|
|
217
|
+
}
|
|
218
|
+
export {
|
|
219
|
+
ChatInputBlock as C
|
|
220
|
+
};
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { j as jsxRuntimeExports } from "../_libs/react.mjs";
|
|
2
|
+
import "./index-C1mT_2d8.mjs";
|
|
3
|
+
import { M as Markdown } from "../_libs/react-markdown.mjs";
|
|
4
|
+
import { r as rehypeHighlight } from "../_libs/rehype-highlight.mjs";
|
|
5
|
+
import { r as remarkGfm } from "../_libs/remark-gfm.mjs";
|
|
6
|
+
function MarkdownMessage({
|
|
7
|
+
content,
|
|
8
|
+
isStreaming
|
|
9
|
+
}) {
|
|
10
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "prose prose-sm dark:prose-invert max-w-none leading-relaxed", children: [
|
|
11
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
12
|
+
Markdown,
|
|
13
|
+
{
|
|
14
|
+
remarkPlugins: [remarkGfm],
|
|
15
|
+
rehypePlugins: [rehypeHighlight],
|
|
16
|
+
components: {
|
|
17
|
+
p: ({ children }) => /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "mb-3 last:mb-0", children }),
|
|
18
|
+
h1: ({ children }) => /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-xl font-semibold mt-4 mb-2", children }),
|
|
19
|
+
h2: ({ children }) => /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-lg font-semibold mt-3 mb-2", children }),
|
|
20
|
+
h3: ({ children }) => /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-base font-semibold mt-2 mb-1", children }),
|
|
21
|
+
ul: ({ children }) => /* @__PURE__ */ jsxRuntimeExports.jsx("ul", { className: "list-disc pl-5 mb-3 space-y-1", children }),
|
|
22
|
+
ol: ({ children }) => /* @__PURE__ */ jsxRuntimeExports.jsx("ol", { className: "list-decimal pl-5 mb-3 space-y-1", children }),
|
|
23
|
+
li: ({ children }) => /* @__PURE__ */ jsxRuntimeExports.jsx("li", { className: "marker:text-muted-foreground", children }),
|
|
24
|
+
code: ({ className, children, ...props }) => {
|
|
25
|
+
const isBlock = className?.includes("hljs") || className?.includes("language-");
|
|
26
|
+
if (!isBlock) {
|
|
27
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
28
|
+
"code",
|
|
29
|
+
{
|
|
30
|
+
className: "rounded bg-muted px-1.5 py-0.5 text-sm font-mono text-foreground",
|
|
31
|
+
...props,
|
|
32
|
+
children
|
|
33
|
+
}
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
const lang = className?.match(/language-(\w+)/)?.[1];
|
|
37
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "relative my-3 rounded-lg border bg-muted/50 overflow-hidden", children: [
|
|
38
|
+
lang && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center justify-between px-3 py-1.5 bg-muted border-b text-[10px] text-muted-foreground font-mono uppercase", children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: lang }) }),
|
|
39
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("pre", { className: "p-3 overflow-x-auto text-sm leading-relaxed m-0", children: /* @__PURE__ */ jsxRuntimeExports.jsx("code", { className, ...props, children }) })
|
|
40
|
+
] });
|
|
41
|
+
},
|
|
42
|
+
blockquote: ({ children }) => /* @__PURE__ */ jsxRuntimeExports.jsx("blockquote", { className: "border-l-2 border-muted-foreground/30 pl-4 italic text-muted-foreground my-3", children }),
|
|
43
|
+
a: ({ href, children }) => /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
44
|
+
"a",
|
|
45
|
+
{
|
|
46
|
+
href,
|
|
47
|
+
target: "_blank",
|
|
48
|
+
rel: "noopener noreferrer",
|
|
49
|
+
className: "text-primary underline underline-offset-2 hover:text-primary/80 transition-colors",
|
|
50
|
+
children
|
|
51
|
+
}
|
|
52
|
+
),
|
|
53
|
+
table: ({ children }) => /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "overflow-x-auto my-3 rounded-lg border", children: /* @__PURE__ */ jsxRuntimeExports.jsx("table", { className: "w-full text-sm border-collapse", children }) }),
|
|
54
|
+
thead: ({ children }) => /* @__PURE__ */ jsxRuntimeExports.jsx("thead", { className: "bg-muted border-b", children }),
|
|
55
|
+
th: ({ children }) => /* @__PURE__ */ jsxRuntimeExports.jsx("th", { className: "px-3 py-2 text-left font-medium text-foreground", children }),
|
|
56
|
+
td: ({ children }) => /* @__PURE__ */ jsxRuntimeExports.jsx("td", { className: "px-3 py-2 border-b border-muted", children }),
|
|
57
|
+
hr: () => /* @__PURE__ */ jsxRuntimeExports.jsx("hr", { className: "my-4 border-border" }),
|
|
58
|
+
strong: ({ children }) => /* @__PURE__ */ jsxRuntimeExports.jsx("strong", { className: "font-semibold text-foreground", children })
|
|
59
|
+
},
|
|
60
|
+
children: content
|
|
61
|
+
}
|
|
62
|
+
),
|
|
63
|
+
isStreaming && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "inline-block w-0.5 h-4 bg-foreground/70 ml-0.5 align-text-bottom animate-pulse" })
|
|
64
|
+
] });
|
|
65
|
+
}
|
|
66
|
+
export {
|
|
67
|
+
MarkdownMessage as M
|
|
68
|
+
};
|