hermium 0.1.10 → 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 (216) hide show
  1. package/README.md +56 -0
  2. package/bin/hermium.mjs +201 -136
  3. package/dist/api.mjs +3513 -0
  4. package/dist/{web-server → server}/_chunks/ssr-renderer.mjs +1 -1
  5. package/dist/{web-server → server}/_libs/base-ui__react.mjs +338 -34
  6. package/dist/{web-server → server}/_libs/base-ui__utils.mjs +38 -33
  7. package/dist/server/_libs/comma-separated-tokens.mjs +10 -0
  8. package/dist/{web-server → server}/_libs/floating-ui__core.mjs +3 -3
  9. package/dist/{web-server → server}/_libs/floating-ui__dom.mjs +4 -4
  10. package/dist/{web-server → server}/_libs/floating-ui__react-dom.mjs +3 -3
  11. package/dist/{web-server → server}/_libs/floating-ui__utils.mjs +38 -38
  12. package/dist/{web-server → server}/_libs/h3.mjs +3 -3
  13. package/dist/server/_libs/hast-util-is-element.mjs +75 -0
  14. package/dist/{web-server → server}/_libs/hast-util-to-jsx-runtime.mjs +2 -2
  15. package/dist/server/_libs/hast-util-to-text.mjs +305 -0
  16. package/dist/server/_libs/highlight.js.mjs +14756 -0
  17. package/dist/server/_libs/lowlight.mjs +262 -0
  18. package/dist/{web-server → server}/_libs/mdast-util-from-markdown.mjs +1 -1
  19. package/dist/{web-server → server}/_libs/mdast-util-gfm-autolink-literal+[...].mjs +2 -2
  20. package/dist/{web-server → server}/_libs/mdast-util-to-hast.mjs +1 -1
  21. package/dist/{web-server → server}/_libs/micromark-core-commonmark.mjs +24 -24
  22. package/dist/{web-server → server}/_libs/micromark-extension-gfm-autolink-literal+[...].mjs +1 -1
  23. package/dist/{web-server → server}/_libs/micromark-extension-gfm-footnote+[...].mjs +2 -2
  24. package/dist/{web-server → server}/_libs/micromark-extension-gfm-table.mjs +1 -1
  25. package/dist/{web-server → server}/_libs/micromark-extension-gfm-task-list-item+[...].mjs +1 -1
  26. package/dist/{web-server → server}/_libs/micromark-factory-destination.mjs +1 -1
  27. package/dist/{web-server → server}/_libs/micromark-factory-label.mjs +1 -1
  28. package/dist/{web-server → server}/_libs/micromark-factory-space.mjs +1 -1
  29. package/dist/{web-server → server}/_libs/micromark-factory-whitespace.mjs +1 -1
  30. package/dist/{web-server → server}/_libs/micromark-util-character.mjs +12 -12
  31. package/dist/{web-server → server}/_libs/micromark-util-classify-character+[...].mjs +1 -1
  32. package/dist/{web-server → server}/_libs/micromark-util-html-tag-name.mjs +2 -2
  33. package/dist/{web-server → server}/_libs/micromark-util-sanitize-uri.mjs +1 -1
  34. package/dist/{web-server → server}/_libs/micromark.mjs +3 -3
  35. package/dist/{web-server → server}/_libs/property-information.mjs +2 -3
  36. package/dist/{web-server → server}/_libs/react-dom.mjs +1 -1
  37. package/dist/{web-server → server}/_libs/react.mjs +42 -42
  38. package/dist/server/_libs/rehype-highlight.mjs +94 -0
  39. package/dist/server/_libs/space-separated-tokens.mjs +6 -0
  40. package/dist/server/_libs/tabler__icons-react.mjs +140 -0
  41. package/dist/server/_libs/tailwind-merge.mjs +3255 -0
  42. package/dist/server/_libs/tanstack__history.mjs +29 -0
  43. package/dist/{web-server → server}/_libs/tanstack__react-router.mjs +3 -3
  44. package/dist/{web-server → server}/_libs/tanstack__router-core.mjs +47 -741
  45. package/dist/server/_libs/unist-util-find-after.mjs +41 -0
  46. package/dist/{web-server → server}/_libs/unist-util-position.mjs +2 -2
  47. package/dist/{web-server → server}/_libs/use-sync-external-store.mjs +1 -1
  48. package/dist/server/_libs/zustand.mjs +43 -0
  49. package/dist/server/_ssr/ChatInputBlock-Bu2-iop_.mjs +220 -0
  50. package/dist/server/_ssr/MarkdownMessage-CNS7OSKN.mjs +68 -0
  51. package/dist/server/_ssr/chat._sessionId-P02iSfut.mjs +477 -0
  52. package/dist/{web-server/_ssr/index-CoDfv1vI.mjs → server/_ssr/chat.index-BYB_48NC.mjs} +6 -8
  53. package/dist/server/_ssr/index-C1mT_2d8.mjs +4890 -0
  54. package/dist/server/_ssr/index-DFV9_oCk.mjs +43 -0
  55. package/dist/server/_ssr/memory-CW_fSOG9.mjs +257 -0
  56. package/dist/{web-server/_ssr/router-CS6Zq3md.mjs → server/_ssr/router-CUAfx91O.mjs} +1009 -1108
  57. package/dist/server/_ssr/settings-DoXurzvn.mjs +10 -0
  58. package/dist/server/_ssr/skills-Cs7A5ZwO.mjs +422 -0
  59. package/dist/server/_ssr/theme-BK4-7E2h.mjs +42 -0
  60. package/dist/server/_ssr/usage-Bs2-LXGz.mjs +298 -0
  61. package/dist/server/_tanstack-start-manifest_v-C7Upe2TI.mjs +4 -0
  62. package/dist/server/index.mjs +502 -240
  63. package/package.json +4 -3
  64. package/dist/public/assets/IconAlertCircle-BW147gsG.js +0 -1
  65. package/dist/public/assets/IconAlertTriangle-DCoTLVSd.js +0 -1
  66. package/dist/public/assets/IconCheck-DAO7Fpl9.js +0 -1
  67. package/dist/public/assets/IconCode-BqfTl5wU.js +0 -1
  68. package/dist/public/assets/IconLoader2-B_pehSXN.js +0 -1
  69. package/dist/public/assets/IconRefresh-BbMGoMV8.js +0 -1
  70. package/dist/public/assets/geist-cyrillic-wght-normal-CHSlOQsW.woff2 +0 -0
  71. package/dist/public/assets/geist-latin-ext-wght-normal-DMtmJ5ZE.woff2 +0 -0
  72. package/dist/public/assets/geist-latin-wght-normal-Dm3htQBi.woff2 +0 -0
  73. package/dist/public/assets/index-BL9a2Xg9.js +0 -1
  74. package/dist/public/assets/index-BSwXjgjr.js +0 -1
  75. package/dist/public/assets/index-BWl8tn18.js +0 -1
  76. package/dist/public/assets/index-CQh8SXb2.js +0 -94
  77. package/dist/public/assets/index-Cxd-kSUY.js +0 -1
  78. package/dist/public/assets/index-DA5SH--7.js +0 -2
  79. package/dist/public/assets/index-DCHbvtBS.js +0 -1
  80. package/dist/public/assets/index-DCYXJZEe.js +0 -1
  81. package/dist/public/assets/index-DFDfp0ca.js +0 -1
  82. package/dist/public/assets/index-GuAAqSCJ.js +0 -14
  83. package/dist/public/assets/index-WIDirTHx.js +0 -29
  84. package/dist/public/assets/index-X3XZcAzy.js +0 -1
  85. package/dist/public/assets/input-7TQEEJq6.js +0 -1
  86. package/dist/public/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  87. package/dist/public/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  88. package/dist/public/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  89. package/dist/public/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  90. package/dist/public/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  91. package/dist/public/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  92. package/dist/public/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  93. package/dist/public/assets/models-BlUb1eaf.js +0 -1
  94. package/dist/public/assets/styles-PHtUFHUr.css +0 -1
  95. package/dist/public/assets/switch-B_iYUUM3.js +0 -1
  96. package/dist/public/assets/syntax-highlighter-DcBYfnEK.js +0 -6
  97. package/dist/public/assets/textarea-Dm4aaRqS.js +0 -1
  98. package/dist/public/favicon.ico +0 -0
  99. package/dist/public/favicon.png +0 -0
  100. package/dist/public/manifest.json +0 -25
  101. package/dist/public/nous-logo.png +0 -0
  102. package/dist/public/robots.txt +0 -3
  103. package/dist/web-server/_libs/babel__runtime.mjs +0 -237
  104. package/dist/web-server/_libs/character-entities-legacy.mjs +0 -111
  105. package/dist/web-server/_libs/character-reference-invalid.mjs +0 -33
  106. package/dist/web-server/_libs/comma-separated-tokens.mjs +0 -31
  107. package/dist/web-server/_libs/cookie-es.mjs +0 -44
  108. package/dist/web-server/_libs/hast-util-parse-selector.mjs +0 -39
  109. package/dist/web-server/_libs/hastscript.mjs +0 -200
  110. package/dist/web-server/_libs/is-alphabetical.mjs +0 -7
  111. package/dist/web-server/_libs/is-alphanumerical.mjs +0 -8
  112. package/dist/web-server/_libs/is-decimal.mjs +0 -7
  113. package/dist/web-server/_libs/is-hexadecimal.mjs +0 -7
  114. package/dist/web-server/_libs/lowlight.mjs +0 -1
  115. package/dist/web-server/_libs/parse-entities.mjs +0 -245
  116. package/dist/web-server/_libs/react-syntax-highlighter.mjs +0 -941
  117. package/dist/web-server/_libs/refractor.mjs +0 -2425
  118. package/dist/web-server/_libs/seroval-plugins.mjs +0 -58
  119. package/dist/web-server/_libs/seroval.mjs +0 -1775
  120. package/dist/web-server/_libs/space-separated-tokens.mjs +0 -11
  121. package/dist/web-server/_libs/tabler__icons-react.mjs +0 -233
  122. package/dist/web-server/_libs/tanstack__history.mjs +0 -204
  123. package/dist/web-server/_libs/tanstack__query-core.mjs +0 -2552
  124. package/dist/web-server/_libs/tanstack__react-query.mjs +0 -190
  125. package/dist/web-server/_libs/zod.mjs +0 -3915
  126. package/dist/web-server/_libs/zustand.mjs +0 -343
  127. package/dist/web-server/_ssr/index--Bo2_ipW.mjs +0 -277
  128. package/dist/web-server/_ssr/index-BEvygh5x.mjs +0 -612
  129. package/dist/web-server/_ssr/index-BFaKxYfN.mjs +0 -40
  130. package/dist/web-server/_ssr/index-BdrMzRTd.mjs +0 -513
  131. package/dist/web-server/_ssr/index-Cwp8Gyl1.mjs +0 -1812
  132. package/dist/web-server/_ssr/index-DQsfKYjV.mjs +0 -449
  133. package/dist/web-server/_ssr/index-Dbs9k8Ea.mjs +0 -251
  134. package/dist/web-server/_ssr/index-Dk93oyZD.mjs +0 -213
  135. package/dist/web-server/_ssr/index-KNJ7huw_.mjs +0 -369
  136. package/dist/web-server/_ssr/index.mjs +0 -1558
  137. package/dist/web-server/_ssr/input-BV1DMASc.mjs +0 -20
  138. package/dist/web-server/_ssr/models-MzrvbL2i.mjs +0 -43
  139. package/dist/web-server/_ssr/start-HYkvq4Ni.mjs +0 -4
  140. package/dist/web-server/_ssr/switch-Bd-Sg0HG.mjs +0 -33
  141. package/dist/web-server/_ssr/syntax-highlighter-5vezNTce.mjs +0 -62
  142. package/dist/web-server/_ssr/textarea-CB4kQp9w.mjs +0 -18
  143. package/dist/web-server/_tanstack-start-manifest_v-m5lY48LR.mjs +0 -4
  144. package/dist/web-server/index.mjs +0 -611
  145. /package/dist/{web-server → server}/__23tanstack-start-plugin-adapters-Cwee5PKy.mjs +0 -0
  146. /package/dist/{web-server → server}/_libs/bail.mjs +0 -0
  147. /package/dist/{web-server → server}/_libs/ccount.mjs +0 -0
  148. /package/dist/{web-server → server}/_libs/character-entities.mjs +0 -0
  149. /package/dist/{web-server → server}/_libs/class-variance-authority.mjs +0 -0
  150. /package/dist/{web-server → server}/_libs/clsx.mjs +0 -0
  151. /package/dist/{web-server/_libs/croner.mjs → server/_libs/cookie-es.mjs} +0 -0
  152. /package/dist/{web-server/_libs/crossws.mjs → server/_libs/croner.mjs} +0 -0
  153. /package/dist/{web-server/_libs/fault.mjs → server/_libs/crossws.mjs} +0 -0
  154. /package/dist/{web-server → server}/_libs/decode-named-character-reference+[...].mjs +0 -0
  155. /package/dist/{web-server → server}/_libs/devlop.mjs +0 -0
  156. /package/dist/{web-server → server}/_libs/escape-string-regexp.mjs +0 -0
  157. /package/dist/{web-server → server}/_libs/estree-util-is-identifier-name.mjs +0 -0
  158. /package/dist/{web-server → server}/_libs/extend.mjs +0 -0
  159. /package/dist/{web-server → server}/_libs/hast-util-whitespace.mjs +0 -0
  160. /package/dist/{web-server → server}/_libs/hookable.mjs +0 -0
  161. /package/dist/{web-server → server}/_libs/html-url-attributes.mjs +0 -0
  162. /package/dist/{web-server → server}/_libs/inline-style-parser.mjs +0 -0
  163. /package/dist/{web-server → server}/_libs/is-plain-obj.mjs +0 -0
  164. /package/dist/{web-server → server}/_libs/isbot.mjs +0 -0
  165. /package/dist/{web-server → server}/_libs/longest-streak.mjs +0 -0
  166. /package/dist/{web-server → server}/_libs/markdown-table.mjs +0 -0
  167. /package/dist/{web-server → server}/_libs/mdast-util-find-and-replace.mjs +0 -0
  168. /package/dist/{web-server → server}/_libs/mdast-util-gfm-footnote.mjs +0 -0
  169. /package/dist/{web-server → server}/_libs/mdast-util-gfm-strikethrough.mjs +0 -0
  170. /package/dist/{web-server → server}/_libs/mdast-util-gfm-table.mjs +0 -0
  171. /package/dist/{web-server → server}/_libs/mdast-util-gfm-task-list-item.mjs +0 -0
  172. /package/dist/{web-server → server}/_libs/mdast-util-gfm.mjs +0 -0
  173. /package/dist/{web-server → server}/_libs/mdast-util-phrasing.mjs +0 -0
  174. /package/dist/{web-server → server}/_libs/mdast-util-to-markdown.mjs +0 -0
  175. /package/dist/{web-server → server}/_libs/mdast-util-to-string.mjs +0 -0
  176. /package/dist/{web-server → server}/_libs/micromark-extension-gfm-strikethrough+[...].mjs +0 -0
  177. /package/dist/{web-server → server}/_libs/micromark-extension-gfm-tagfilter+[...].mjs +0 -0
  178. /package/dist/{web-server → server}/_libs/micromark-extension-gfm.mjs +0 -0
  179. /package/dist/{web-server → server}/_libs/micromark-factory-title.mjs +0 -0
  180. /package/dist/{web-server → server}/_libs/micromark-util-chunked.mjs +0 -0
  181. /package/dist/{web-server → server}/_libs/micromark-util-combine-extensions+[...].mjs +0 -0
  182. /package/dist/{web-server → server}/_libs/micromark-util-decode-numeric-character-reference+[...].mjs +0 -0
  183. /package/dist/{web-server → server}/_libs/micromark-util-decode-string.mjs +0 -0
  184. /package/dist/{web-server → server}/_libs/micromark-util-encode.mjs +0 -0
  185. /package/dist/{web-server → server}/_libs/micromark-util-normalize-identifier+[...].mjs +0 -0
  186. /package/dist/{web-server → server}/_libs/micromark-util-resolve-all.mjs +0 -0
  187. /package/dist/{web-server → server}/_libs/micromark-util-subtokenize.mjs +0 -0
  188. /package/dist/{web-server → server}/_libs/ocache.mjs +0 -0
  189. /package/dist/{web-server → server}/_libs/ohash.mjs +0 -0
  190. /package/dist/{web-server → server}/_libs/react-markdown.mjs +0 -0
  191. /package/dist/{web-server → server}/_libs/remark-gfm.mjs +0 -0
  192. /package/dist/{web-server → server}/_libs/remark-parse.mjs +0 -0
  193. /package/dist/{web-server → server}/_libs/remark-rehype.mjs +0 -0
  194. /package/dist/{web-server → server}/_libs/reselect.mjs +0 -0
  195. /package/dist/{web-server → server}/_libs/rou3.mjs +0 -0
  196. /package/dist/{web-server/_libs/format.mjs → server/_libs/seroval-plugins.mjs} +0 -0
  197. /package/dist/{web-server/_libs/highlight.js.mjs → server/_libs/seroval.mjs} +0 -0
  198. /package/dist/{web-server → server}/_libs/srvx.mjs +0 -0
  199. /package/dist/{web-server → server}/_libs/style-to-js.mjs +0 -0
  200. /package/dist/{web-server → server}/_libs/style-to-object.mjs +0 -0
  201. /package/dist/{web-server → server}/_libs/tanstack__react-store.mjs +0 -0
  202. /package/dist/{web-server → server}/_libs/tanstack__store.mjs +0 -0
  203. /package/dist/{web-server → server}/_libs/trim-lines.mjs +0 -0
  204. /package/dist/{web-server → server}/_libs/trough.mjs +0 -0
  205. /package/dist/{web-server → server}/_libs/ufo.mjs +0 -0
  206. /package/dist/{web-server → server}/_libs/unctx.mjs +0 -0
  207. /package/dist/{web-server → server}/_libs/ungap__structured-clone.mjs +0 -0
  208. /package/dist/{web-server → server}/_libs/unified.mjs +0 -0
  209. /package/dist/{web-server → server}/_libs/unist-util-is.mjs +0 -0
  210. /package/dist/{web-server → server}/_libs/unist-util-stringify-position.mjs +0 -0
  211. /package/dist/{web-server → server}/_libs/unist-util-visit-parents.mjs +0 -0
  212. /package/dist/{web-server → server}/_libs/unist-util-visit.mjs +0 -0
  213. /package/dist/{web-server → server}/_libs/unstorage.mjs +0 -0
  214. /package/dist/{web-server → server}/_libs/vfile-message.mjs +0 -0
  215. /package/dist/{web-server → server}/_libs/vfile.mjs +0 -0
  216. /package/dist/{web-server → server}/_libs/zwitch.mjs +0 -0
@@ -0,0 +1,41 @@
1
+ import { c as convert } from "./unist-util-is.mjs";
2
+ const findAfter = (
3
+ // Note: overloads like this are needed to support optional generics.
4
+ /**
5
+ * @type {(
6
+ * (<Kind extends UnistParent, Check extends Test>(parent: Kind, index: Child<Kind> | number, test: Check) => Matches<Child<Kind>, Check> | undefined) &
7
+ * (<Kind extends UnistParent>(parent: Kind, index: Child<Kind> | number, test?: null | undefined) => Child<Kind> | undefined)
8
+ * )}
9
+ */
10
+ /**
11
+ * @param {UnistParent} parent
12
+ * @param {UnistNode | number} index
13
+ * @param {Test} [test]
14
+ * @returns {UnistNode | undefined}
15
+ */
16
+ (function(parent, index, test) {
17
+ const is = convert(test);
18
+ if (!parent || !parent.type || !parent.children) {
19
+ throw new Error("Expected parent node");
20
+ }
21
+ if (typeof index === "number") {
22
+ if (index < 0 || index === Number.POSITIVE_INFINITY) {
23
+ throw new Error("Expected positive finite number as index");
24
+ }
25
+ } else {
26
+ index = parent.children.indexOf(index);
27
+ if (index < 0) {
28
+ throw new Error("Expected child node or index");
29
+ }
30
+ }
31
+ while (++index < parent.children.length) {
32
+ if (is(parent.children[index], index, parent)) {
33
+ return parent.children[index];
34
+ }
35
+ }
36
+ return void 0;
37
+ })
38
+ );
39
+ export {
40
+ findAfter as f
41
+ };
@@ -21,7 +21,7 @@ function position(node) {
21
21
  }
22
22
  }
23
23
  export {
24
- pointEnd as a,
24
+ pointStart as a,
25
25
  position as b,
26
- pointStart as p
26
+ pointEnd as p
27
27
  };
@@ -1,4 +1,4 @@
1
- import { a as requireReact } from "./react.mjs";
1
+ import { b as requireReact } from "./react.mjs";
2
2
  var withSelector = { exports: {} };
3
3
  var withSelector_production = {};
4
4
  var shim = { exports: {} };
@@ -0,0 +1,43 @@
1
+ import { R as React } from "./react.mjs";
2
+ const createStoreImpl = (createState) => {
3
+ let state;
4
+ const listeners = /* @__PURE__ */ new Set();
5
+ const setState = (partial, replace) => {
6
+ const nextState = typeof partial === "function" ? partial(state) : partial;
7
+ if (!Object.is(nextState, state)) {
8
+ const previousState = state;
9
+ state = (replace != null ? replace : typeof nextState !== "object" || nextState === null) ? nextState : Object.assign({}, state, nextState);
10
+ listeners.forEach((listener) => listener(state, previousState));
11
+ }
12
+ };
13
+ const getState = () => state;
14
+ const getInitialState = () => initialState;
15
+ const subscribe = (listener) => {
16
+ listeners.add(listener);
17
+ return () => listeners.delete(listener);
18
+ };
19
+ const api = { setState, getState, getInitialState, subscribe };
20
+ const initialState = state = createState(setState, getState, api);
21
+ return api;
22
+ };
23
+ const createStore = ((createState) => createState ? createStoreImpl(createState) : createStoreImpl);
24
+ const identity = (arg) => arg;
25
+ function useStore(api, selector = identity) {
26
+ const slice = React.useSyncExternalStore(
27
+ api.subscribe,
28
+ React.useCallback(() => selector(api.getState()), [api, selector]),
29
+ React.useCallback(() => selector(api.getInitialState()), [api, selector])
30
+ );
31
+ React.useDebugValue(slice);
32
+ return slice;
33
+ }
34
+ const createImpl = (createState) => {
35
+ const api = createStore(createState);
36
+ const useBoundStore = (selector) => useStore(api, selector);
37
+ Object.assign(useBoundStore, api);
38
+ return useBoundStore;
39
+ };
40
+ const create = ((createState) => createState ? createImpl(createState) : createImpl);
41
+ export {
42
+ create as c
43
+ };
@@ -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
+ };