hermium 0.2.0 → 0.3.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.
Files changed (157) hide show
  1. package/bin/hermium.mjs +102 -58
  2. package/dist/server/__23tanstack-start-plugin-adapters-Cwee5PKy.mjs +6 -0
  3. package/dist/server/_chunks/ssr-renderer.mjs +22 -0
  4. package/dist/server/_libs/bail.mjs +8 -0
  5. package/dist/server/_libs/base-ui__react.mjs +9858 -0
  6. package/dist/server/_libs/base-ui__utils.mjs +1106 -0
  7. package/dist/server/_libs/ccount.mjs +16 -0
  8. package/dist/server/_libs/character-entities.mjs +2130 -0
  9. package/dist/server/_libs/class-variance-authority.mjs +44 -0
  10. package/dist/server/_libs/clsx.mjs +16 -0
  11. package/dist/server/_libs/comma-separated-tokens.mjs +10 -0
  12. package/dist/server/_libs/cookie-es.mjs +1 -0
  13. package/dist/server/_libs/croner.mjs +1 -0
  14. package/dist/server/_libs/crossws.mjs +1 -0
  15. package/dist/server/_libs/decode-named-character-reference+[...].mjs +8 -0
  16. package/dist/server/_libs/devlop.mjs +8 -0
  17. package/dist/server/_libs/escape-string-regexp.mjs +9 -0
  18. package/dist/server/_libs/estree-util-is-identifier-name.mjs +11 -0
  19. package/dist/server/_libs/extend.mjs +97 -0
  20. package/dist/server/_libs/floating-ui__core.mjs +663 -0
  21. package/dist/server/_libs/floating-ui__dom.mjs +624 -0
  22. package/dist/server/_libs/floating-ui__react-dom.mjs +279 -0
  23. package/dist/server/_libs/floating-ui__utils.mjs +322 -0
  24. package/dist/server/_libs/h3.mjs +408 -0
  25. package/dist/server/_libs/hast-util-is-element.mjs +75 -0
  26. package/dist/server/_libs/hast-util-to-jsx-runtime.mjs +388 -0
  27. package/dist/server/_libs/hast-util-to-text.mjs +305 -0
  28. package/dist/server/_libs/hast-util-whitespace.mjs +10 -0
  29. package/dist/server/_libs/highlight.js.mjs +14756 -0
  30. package/dist/server/_libs/hookable.mjs +1 -0
  31. package/dist/server/_libs/html-url-attributes.mjs +26 -0
  32. package/dist/server/_libs/inline-style-parser.mjs +142 -0
  33. package/dist/server/_libs/is-plain-obj.mjs +10 -0
  34. package/dist/server/_libs/isbot.mjs +21 -0
  35. package/dist/server/_libs/longest-streak.mjs +25 -0
  36. package/dist/server/_libs/lowlight.mjs +262 -0
  37. package/dist/server/_libs/markdown-table.mjs +142 -0
  38. package/dist/server/_libs/mdast-util-find-and-replace.mjs +109 -0
  39. package/dist/server/_libs/mdast-util-from-markdown.mjs +717 -0
  40. package/dist/server/_libs/mdast-util-gfm-autolink-literal+[...].mjs +156 -0
  41. package/dist/server/_libs/mdast-util-gfm-footnote.mjs +117 -0
  42. package/dist/server/_libs/mdast-util-gfm-strikethrough.mjs +54 -0
  43. package/dist/server/_libs/mdast-util-gfm-table.mjs +157 -0
  44. package/dist/server/_libs/mdast-util-gfm-task-list-item.mjs +77 -0
  45. package/dist/server/_libs/mdast-util-gfm.mjs +29 -0
  46. package/dist/server/_libs/mdast-util-phrasing.mjs +30 -0
  47. package/dist/server/_libs/mdast-util-to-hast.mjs +710 -0
  48. package/dist/server/_libs/mdast-util-to-markdown.mjs +798 -0
  49. package/dist/server/_libs/mdast-util-to-string.mjs +38 -0
  50. package/dist/server/_libs/micromark-core-commonmark.mjs +2259 -0
  51. package/dist/server/_libs/micromark-extension-gfm-autolink-literal+[...].mjs +344 -0
  52. package/dist/server/_libs/micromark-extension-gfm-footnote+[...].mjs +279 -0
  53. package/dist/server/_libs/micromark-extension-gfm-strikethrough+[...].mjs +98 -0
  54. package/dist/server/_libs/micromark-extension-gfm-table.mjs +491 -0
  55. package/dist/server/_libs/micromark-extension-gfm-tagfilter+[...].mjs +1 -0
  56. package/dist/server/_libs/micromark-extension-gfm-task-list-item+[...].mjs +77 -0
  57. package/dist/server/_libs/micromark-extension-gfm.mjs +18 -0
  58. package/dist/server/_libs/micromark-factory-destination.mjs +94 -0
  59. package/dist/server/_libs/micromark-factory-label.mjs +63 -0
  60. package/dist/server/_libs/micromark-factory-space.mjs +24 -0
  61. package/dist/server/_libs/micromark-factory-title.mjs +65 -0
  62. package/dist/server/_libs/micromark-factory-whitespace.mjs +22 -0
  63. package/dist/server/_libs/micromark-util-character.mjs +44 -0
  64. package/dist/server/_libs/micromark-util-chunked.mjs +36 -0
  65. package/dist/server/_libs/micromark-util-classify-character+[...].mjs +12 -0
  66. package/dist/server/_libs/micromark-util-combine-extensions+[...].mjs +41 -0
  67. package/dist/server/_libs/micromark-util-decode-numeric-character-reference+[...].mjs +19 -0
  68. package/dist/server/_libs/micromark-util-decode-string.mjs +21 -0
  69. package/dist/server/_libs/micromark-util-encode.mjs +1 -0
  70. package/dist/server/_libs/micromark-util-html-tag-name.mjs +69 -0
  71. package/dist/server/_libs/micromark-util-normalize-identifier+[...].mjs +6 -0
  72. package/dist/server/_libs/micromark-util-resolve-all.mjs +15 -0
  73. package/dist/server/_libs/micromark-util-sanitize-uri.mjs +41 -0
  74. package/dist/server/_libs/micromark-util-subtokenize.mjs +346 -0
  75. package/dist/server/_libs/micromark.mjs +906 -0
  76. package/dist/server/_libs/ocache.mjs +1 -0
  77. package/dist/server/_libs/ohash.mjs +1 -0
  78. package/dist/server/_libs/property-information.mjs +1209 -0
  79. package/dist/server/_libs/react-dom.mjs +10779 -0
  80. package/dist/server/_libs/react-markdown.mjs +147 -0
  81. package/dist/server/_libs/react.mjs +513 -0
  82. package/dist/server/_libs/rehype-highlight.mjs +94 -0
  83. package/dist/server/_libs/remark-gfm.mjs +20 -0
  84. package/dist/server/_libs/remark-parse.mjs +19 -0
  85. package/dist/server/_libs/remark-rehype.mjs +21 -0
  86. package/dist/server/_libs/reselect.mjs +1 -0
  87. package/dist/server/_libs/rou3.mjs +8 -0
  88. package/dist/server/_libs/seroval-plugins.mjs +1 -0
  89. package/dist/server/_libs/seroval.mjs +1 -0
  90. package/dist/server/_libs/space-separated-tokens.mjs +6 -0
  91. package/dist/server/_libs/srvx.mjs +781 -0
  92. package/dist/server/_libs/style-to-js.mjs +72 -0
  93. package/dist/server/_libs/style-to-object.mjs +38 -0
  94. package/dist/server/_libs/tabler__icons-react.mjs +140 -0
  95. package/dist/server/_libs/tailwind-merge.mjs +3255 -0
  96. package/dist/server/_libs/tanstack__history.mjs +29 -0
  97. package/dist/server/_libs/tanstack__react-router.mjs +1120 -0
  98. package/dist/server/_libs/tanstack__react-store.mjs +2 -0
  99. package/dist/server/_libs/tanstack__router-core.mjs +3594 -0
  100. package/dist/server/_libs/tanstack__store.mjs +1 -0
  101. package/dist/server/_libs/trim-lines.mjs +41 -0
  102. package/dist/server/_libs/trough.mjs +85 -0
  103. package/dist/server/_libs/ufo.mjs +54 -0
  104. package/dist/server/_libs/unctx.mjs +1 -0
  105. package/dist/server/_libs/ungap__structured-clone.mjs +224 -0
  106. package/dist/server/_libs/unified.mjs +661 -0
  107. package/dist/server/_libs/unist-util-find-after.mjs +41 -0
  108. package/dist/server/_libs/unist-util-is.mjs +100 -0
  109. package/dist/server/_libs/unist-util-position.mjs +27 -0
  110. package/dist/server/_libs/unist-util-stringify-position.mjs +27 -0
  111. package/dist/server/_libs/unist-util-visit-parents.mjs +83 -0
  112. package/dist/server/_libs/unist-util-visit.mjs +24 -0
  113. package/dist/server/_libs/unstorage.mjs +1 -0
  114. package/dist/server/_libs/use-sync-external-store.mjs +139 -0
  115. package/dist/server/_libs/vfile-message.mjs +138 -0
  116. package/dist/server/_libs/vfile.mjs +467 -0
  117. package/dist/server/_libs/zustand.mjs +43 -0
  118. package/dist/server/_libs/zwitch.mjs +1 -0
  119. package/dist/server/_ssr/ChatInputBlock-Bu2-iop_.mjs +220 -0
  120. package/dist/server/_ssr/MarkdownMessage-CNS7OSKN.mjs +68 -0
  121. package/dist/server/_ssr/chat._sessionId-P02iSfut.mjs +477 -0
  122. package/dist/server/_ssr/chat.index-BYB_48NC.mjs +64 -0
  123. package/dist/server/_ssr/index-C1mT_2d8.mjs +4890 -0
  124. package/dist/server/_ssr/index-DFV9_oCk.mjs +43 -0
  125. package/dist/server/_ssr/memory-CW_fSOG9.mjs +257 -0
  126. package/dist/server/_ssr/router-CUAfx91O.mjs +2035 -0
  127. package/dist/server/_ssr/settings-DoXurzvn.mjs +10 -0
  128. package/dist/server/_ssr/skills-Cs7A5ZwO.mjs +422 -0
  129. package/dist/server/_ssr/theme-BK4-7E2h.mjs +42 -0
  130. package/dist/server/_ssr/usage-Bs2-LXGz.mjs +298 -0
  131. package/dist/server/_tanstack-start-manifest_v-C7Upe2TI.mjs +4 -0
  132. package/dist/server/index.mjs +506 -0
  133. package/package.json +4 -3
  134. package/dist/public/assets/css/index-Dfs9RUU9.css +0 -1
  135. package/dist/public/assets/css/styles-B8p6jk5Z.css +0 -1
  136. package/dist/public/assets/js/ChatInputBlock-Bw7AL70H.js +0 -1
  137. package/dist/public/assets/js/MarkdownMessage-8d7Y6VL-.js +0 -1
  138. package/dist/public/assets/js/base-ui-BvQbAt_1.js +0 -1
  139. package/dist/public/assets/js/chat._sessionId-BG6lVraH.js +0 -1
  140. package/dist/public/assets/js/chat.index-D2zdMPTT.js +0 -1
  141. package/dist/public/assets/js/index-C0AK45FU.js +0 -60
  142. package/dist/public/assets/js/index-Cx5En4FK.js +0 -1
  143. package/dist/public/assets/js/memory-CeSRdTkW.js +0 -3
  144. package/dist/public/assets/js/router-8uDKazL-.js +0 -1
  145. package/dist/public/assets/js/settings-Bc3Y5zXO.js +0 -1
  146. package/dist/public/assets/js/skills-DZv7sA_5.js +0 -1
  147. package/dist/public/assets/js/theme-CPkdkpaj.js +0 -1
  148. package/dist/public/assets/js/usage-DXQsT9_b.js +0 -1
  149. package/dist/public/assets/woff2/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
  150. package/dist/public/assets/woff2/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
  151. package/dist/public/assets/woff2/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
  152. package/dist/public/assets/woff2/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
  153. package/dist/public/assets/woff2/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
  154. package/dist/public/favicon.ico +0 -0
  155. package/dist/public/logo.png +0 -0
  156. package/dist/public/manifest.json +0 -25
  157. package/dist/public/robots.txt +0 -3
@@ -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
+ };