@anvia/react-ui 1.0.0-rc.1 → 1.0.0-rc.11

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 (72) hide show
  1. package/README.md +52 -39
  2. package/dist/attachment/index.d.ts +5 -5
  3. package/dist/attachment/index.js +4 -4
  4. package/dist/{attachment-BP597fV3.d.ts → attachment-mbjsroli.d.ts} +1 -1
  5. package/dist/chat/index.d.ts +13 -12
  6. package/dist/chat/index.js +11 -9
  7. package/dist/chat-tfA570mg.d.ts +86 -0
  8. package/dist/{chunk-7RMRM7W3.js → chunk-647LAYRV.js} +90 -65
  9. package/dist/chunk-647LAYRV.js.map +1 -0
  10. package/dist/chunk-6XOJFLX4.js +22 -0
  11. package/dist/chunk-6XOJFLX4.js.map +1 -0
  12. package/dist/chunk-CKA4CE26.js +25 -0
  13. package/dist/chunk-CKA4CE26.js.map +1 -0
  14. package/dist/{chunk-JWZDNM5D.js → chunk-CRXNFZRW.js} +145 -125
  15. package/dist/chunk-CRXNFZRW.js.map +1 -0
  16. package/dist/{chunk-7HR34SOF.js → chunk-CVXLQCDI.js} +13 -21
  17. package/dist/chunk-CVXLQCDI.js.map +1 -0
  18. package/dist/{chunk-ULGJLLZE.js → chunk-F6AKBUO3.js} +12 -12
  19. package/dist/chunk-F6AKBUO3.js.map +1 -0
  20. package/dist/{chunk-FABSIZZ7.js → chunk-HWJIMLHC.js} +97 -90
  21. package/dist/chunk-HWJIMLHC.js.map +1 -0
  22. package/dist/{chunk-SBYUKODG.js → chunk-MISX4WUT.js} +10 -15
  23. package/dist/chunk-MISX4WUT.js.map +1 -0
  24. package/dist/{chunk-R3NA6BWW.js → chunk-OQE6SHZE.js} +54 -56
  25. package/dist/chunk-OQE6SHZE.js.map +1 -0
  26. package/dist/{chunk-VEYJNQVW.js → chunk-S4XLE2RN.js} +11 -16
  27. package/dist/chunk-S4XLE2RN.js.map +1 -0
  28. package/dist/{chunk-43U2XQP2.js → chunk-SOG2GVE4.js} +69 -25
  29. package/dist/chunk-SOG2GVE4.js.map +1 -0
  30. package/dist/{chunk-56CV6S76.js → chunk-UCBAG42A.js} +9 -21
  31. package/dist/chunk-UCBAG42A.js.map +1 -0
  32. package/dist/completion/index.d.ts +4 -3
  33. package/dist/completion/index.js +4 -4
  34. package/dist/completion-input-DHlwrhxB.d.ts +24 -0
  35. package/dist/{composer-CzsbDFPt.d.ts → composer-CigccTLT.d.ts} +19 -7
  36. package/dist/human-input/index.d.ts +10 -8
  37. package/dist/human-input/index.js +5 -4
  38. package/dist/human-input-D7jgYsfM.d.ts +27 -0
  39. package/dist/image/index.d.ts +6 -6
  40. package/dist/image/index.js +4 -4
  41. package/dist/{image-DanUxcl2.d.ts → image-VZv6Ddsn.d.ts} +1 -1
  42. package/dist/index.d.ts +19 -18
  43. package/dist/index.js +60 -64
  44. package/dist/index.js.map +1 -1
  45. package/dist/message/index.d.ts +12 -11
  46. package/dist/message/index.js +8 -6
  47. package/dist/{message-CkEnKhAn.d.ts → message-CNRnZQwU.d.ts} +1 -1
  48. package/dist/selection-toolbar/index.d.ts +2 -2
  49. package/dist/selection-toolbar/index.js +5 -4
  50. package/dist/shared.d.ts +9 -8
  51. package/dist/shared.js +1 -1
  52. package/dist/stream/index.d.ts +2 -0
  53. package/dist/stream/index.js +1 -1
  54. package/dist/{thread-uEm8hH0s.d.ts → thread-Bz6-1zaJ.d.ts} +1 -0
  55. package/dist/thread-list/index.d.ts +3 -3
  56. package/dist/thread-list/index.js +6 -6
  57. package/package.json +17 -17
  58. package/dist/chat-B3kucz1w.d.ts +0 -13
  59. package/dist/chunk-43U2XQP2.js.map +0 -1
  60. package/dist/chunk-56CV6S76.js.map +0 -1
  61. package/dist/chunk-7HR34SOF.js.map +0 -1
  62. package/dist/chunk-7RMRM7W3.js.map +0 -1
  63. package/dist/chunk-FABSIZZ7.js.map +0 -1
  64. package/dist/chunk-JWZDNM5D.js.map +0 -1
  65. package/dist/chunk-R3NA6BWW.js.map +0 -1
  66. package/dist/chunk-SBYUKODG.js.map +0 -1
  67. package/dist/chunk-ULGJLLZE.js.map +0 -1
  68. package/dist/chunk-VEYJNQVW.js.map +0 -1
  69. package/dist/completion-input-WjK6kUyG.d.ts +0 -23
  70. package/dist/human-input-CydeYm_7.d.ts +0 -20
  71. package/dist/stream/styles.css +0 -17
  72. package/dist/styles.css +0 -130
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/thread-list/parts.tsx","../src/thread-list/index.ts"],"sourcesContent":["import {\n forwardRef,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n useCallback,\n useMemo,\n useRef,\n} from \"react\";\n\nimport {\n InternalThreadListItemProvider,\n InternalThreadListRootProvider,\n type ThreadListRecord,\n useInternalThreadListRoot,\n useThreadList,\n useThreadListItem,\n} from \"../contexts\";\nimport { composeRefs, type PrimitiveProps, renderPrimitive } from \"../primitives\";\n\ntype ThreadListRootProps = PrimitiveProps<\"div\">;\n\nconst ThreadListRoot = forwardRef<HTMLDivElement, ThreadListRootProps>(function ThreadListRoot(\n { onKeyDown, ...props },\n ref,\n) {\n const threadList = useThreadList();\n const rootRef = useRef<HTMLDivElement | null>(null);\n const newButtonRef = useRef<HTMLButtonElement | null>(null);\n const itemElements = useRef(new Map<string, HTMLDivElement>());\n const triggerElements = useRef(new Map<string, HTMLButtonElement>());\n const registerItem = useCallback((threadId: string, element: HTMLDivElement | null) => {\n if (element === null) itemElements.current.delete(threadId);\n else itemElements.current.set(threadId, element);\n }, []);\n const registerTrigger = useCallback((threadId: string, element: HTMLButtonElement | null) => {\n if (element === null) triggerElements.current.delete(threadId);\n else triggerElements.current.set(threadId, element);\n }, []);\n const rootContext = useMemo(\n () => ({\n rootRef,\n newButtonRef,\n itemElements,\n triggerElements,\n registerItem,\n registerTrigger,\n }),\n [registerItem, registerTrigger],\n );\n const composedRef = useMemo(\n () =>\n composeRefs<HTMLDivElement>(ref, (node) => {\n rootRef.current = node;\n }),\n [ref],\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event);\n if (event.defaultPrevented || ![\"ArrowDown\", \"ArrowUp\", \"Home\", \"End\"].includes(event.key)) {\n return;\n }\n const triggers = orderedEnabledTriggers(rootContext);\n if (triggers.length === 0) {\n return;\n }\n event.preventDefault();\n const activeElement = document.activeElement;\n const currentIndex =\n activeElement instanceof HTMLButtonElement ? triggers.indexOf(activeElement) : -1;\n const nextIndex = nextTriggerIndex(event.key, currentIndex, triggers.length);\n triggers[nextIndex]?.focus();\n },\n [onKeyDown, rootContext],\n );\n\n return (\n <InternalThreadListRootProvider value={rootContext}>\n {renderPrimitive(\n \"div\",\n {\n ...props,\n onKeyDown: handleKeyDown,\n \"data-state\": threadList.status ?? \"idle\",\n } as PrimitiveProps<\"div\">,\n composedRef,\n )}\n </InternalThreadListRootProvider>\n );\n});\n\nconst ThreadListNew = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(\n function ThreadListNew({ onClick, ...props }, ref) {\n const threadList = useThreadList();\n const root = useInternalThreadListRoot();\n const composedRef = useMemo(\n () =>\n composeRefs<HTMLButtonElement>(ref, (node) => {\n root.newButtonRef.current = node;\n }),\n [ref, root.newButtonRef],\n );\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || props.disabled) {\n return;\n }\n void threadList.createThread();\n },\n [onClick, props.disabled, threadList],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"New chat\",\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-state\": props.disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n composedRef,\n );\n },\n);\n\ntype ThreadListItemsChildren = ReactNode | ((thread: ThreadListRecord) => ReactNode);\n\ntype ThreadListItemsProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n archived?: boolean;\n children?: ThreadListItemsChildren;\n keepMounted?: boolean;\n};\n\nconst ThreadListItems = forwardRef<HTMLDivElement, ThreadListItemsProps>(function ThreadListItems(\n { archived = false, children, keepMounted = false, ...props },\n ref,\n) {\n const threadList = useThreadList();\n const threads = threadList.threads.filter((thread) => Boolean(thread.archived) === archived);\n const empty = threads.length === 0;\n if (empty && !keepMounted) {\n return null;\n }\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: threads.map((thread) => (\n <InternalThreadListItemProvider\n key={thread.id}\n value={{ thread, active: thread.id === threadList.activeThreadId }}\n >\n {typeof children === \"function\" ? children(thread) : (children ?? <DefaultThreadItem />)}\n </InternalThreadListItemProvider>\n )),\n \"data-state\": empty ? \"empty\" : \"populated\",\n } as PrimitiveProps<\"div\">,\n ref,\n );\n});\n\ntype ThreadListEmptyProps = PrimitiveProps<\"div\"> & {\n archived?: boolean;\n};\n\nconst ThreadListEmpty = forwardRef<HTMLDivElement, ThreadListEmptyProps>(function ThreadListEmpty(\n { archived = false, ...props },\n ref,\n) {\n const threadList = useThreadList();\n const hasVisibleThreads = threadList.threads.some(\n (thread) => Boolean(thread.archived) === archived,\n );\n if (hasVisibleThreads) {\n return null;\n }\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: props.children ?? \"No conversations.\",\n } as PrimitiveProps<\"div\">,\n ref,\n );\n});\n\nconst ThreadListItemRoot = forwardRef<HTMLDivElement, PrimitiveProps<\"div\">>(\n function ThreadListItemRoot(props, ref) {\n const item = useThreadListItem();\n const root = useInternalThreadListRoot();\n const composedRef = useMemo(\n () => composeRefs<HTMLDivElement>(ref, (node) => root.registerItem(item.thread.id, node)),\n [item.thread.id, ref, root],\n );\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n \"data-state\": item.active ? \"active\" : \"inactive\",\n } as PrimitiveProps<\"div\">,\n composedRef,\n );\n },\n);\n\nconst ThreadListItemTrigger = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(\n function ThreadListItemTrigger({ onClick, ...props }, ref) {\n const threadList = useThreadList();\n const item = useThreadListItem();\n const root = useInternalThreadListRoot();\n const disabled = props.disabled ?? false;\n const composedRef = useMemo(\n () =>\n composeRefs<HTMLButtonElement>(ref, (node) => root.registerTrigger(item.thread.id, node)),\n [item.thread.id, ref, root],\n );\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n void threadList.switchThread(item.thread.id);\n },\n [disabled, item.thread.id, onClick, threadList],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? <ThreadListItemTitle />,\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"aria-current\": item.active ? \"true\" : undefined,\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n composedRef,\n );\n },\n);\n\ntype ThreadListItemTitleProps = PrimitiveProps<\"span\"> & {\n fallback?: ReactNode;\n};\n\nconst ThreadListItemTitle = forwardRef<HTMLSpanElement, ThreadListItemTitleProps>(\n function ThreadListItemTitle({ fallback = \"New chat\", ...props }, ref) {\n const { thread } = useThreadListItem();\n\n return renderPrimitive(\n \"span\",\n {\n ...props,\n children: props.children ?? thread.title ?? fallback,\n } as PrimitiveProps<\"span\">,\n ref,\n );\n },\n);\n\ntype ThreadListItemActionKey = \"archiveThread\" | \"unarchiveThread\" | \"deleteThread\";\nfunction createThreadListItemAction(action: ThreadListItemActionKey, defaultLabel: string) {\n return forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(function ThreadListItemAction(\n { onClick, ...props },\n ref,\n ) {\n const threadList = useThreadList();\n const { thread } = useThreadListItem();\n const root = useInternalThreadListRoot();\n const actionHandler = threadList[action];\n const disabled = props.disabled ?? actionHandler === undefined;\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n focusAfterThreadItemRemoval(thread.id, root);\n void actionHandler?.(thread.id);\n },\n [actionHandler, disabled, onClick, root, thread.id],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? defaultLabel,\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n });\n}\n\nconst ThreadListItemArchive = createThreadListItemAction(\"archiveThread\", \"Archive\");\nconst ThreadListItemUnarchive = createThreadListItemAction(\"unarchiveThread\", \"Unarchive\");\nconst ThreadListItemDelete = createThreadListItemAction(\"deleteThread\", \"Delete\");\n\nfunction DefaultThreadItem(): ReactNode {\n return (\n <ThreadListItemRoot>\n <ThreadListItemTrigger />\n </ThreadListItemRoot>\n );\n}\n\nfunction nextTriggerIndex(key: string, currentIndex: number, triggerCount: number): number {\n if (key === \"Home\") {\n return 0;\n }\n if (key === \"End\") {\n return triggerCount - 1;\n }\n if (currentIndex === -1) {\n return key === \"ArrowUp\" ? triggerCount - 1 : 0;\n }\n if (key === \"ArrowUp\") {\n return (currentIndex - 1 + triggerCount) % triggerCount;\n }\n return (currentIndex + 1) % triggerCount;\n}\n\nfunction focusAfterThreadItemRemoval(\n threadId: string,\n rootContext: ReturnType<typeof useInternalThreadListRoot>,\n): void {\n const root = rootContext.rootRef.current;\n const currentItem = rootContext.itemElements.current.get(threadId);\n if (\n root === null ||\n currentItem === undefined ||\n !currentItem.contains(root.ownerDocument.activeElement)\n ) {\n return;\n }\n\n const triggers = orderedEnabledTriggers(rootContext);\n const currentTrigger = rootContext.triggerElements.current.get(threadId);\n const currentIndex = currentTrigger === undefined ? -1 : triggers.indexOf(currentTrigger);\n const remainingTriggers = triggers.filter((trigger) => !currentItem.contains(trigger));\n const fallback = rootContext.newButtonRef.current;\n const focusTarget =\n remainingTriggers[Math.min(Math.max(currentIndex, 0), remainingTriggers.length - 1)] ??\n fallback ??\n root;\n\n if (focusTarget === root && !root.hasAttribute(\"tabindex\")) {\n root.tabIndex = -1;\n }\n focusTarget.focus();\n}\n\nfunction orderedEnabledTriggers(\n rootContext: ReturnType<typeof useInternalThreadListRoot>,\n): HTMLButtonElement[] {\n return [...rootContext.triggerElements.current.values()]\n .filter((trigger) => trigger.isConnected && !trigger.disabled)\n .sort((left, right) =>\n left.compareDocumentPosition(right) & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1,\n );\n}\n\nexport {\n ThreadListEmpty,\n ThreadListItemArchive,\n ThreadListItemDelete,\n ThreadListItemRoot,\n ThreadListItems,\n ThreadListItemTitle,\n ThreadListItemTrigger,\n ThreadListItemUnarchive,\n ThreadListNew,\n ThreadListRoot,\n};\n","import {\n ThreadListEmpty,\n ThreadListItemArchive,\n ThreadListItemDelete,\n ThreadListItemRoot,\n ThreadListItems,\n ThreadListItemTitle,\n ThreadListItemTrigger,\n ThreadListItemUnarchive,\n ThreadListNew,\n ThreadListRoot,\n} from \"./parts\";\n\nexport const ThreadListPrimitive = {\n Root: ThreadListRoot,\n New: ThreadListNew,\n Items: ThreadListItems,\n Empty: ThreadListEmpty,\n} as const;\n\nexport const ThreadListItemPrimitive = {\n Root: ThreadListItemRoot,\n Trigger: ThreadListItemTrigger,\n Title: ThreadListItemTitle,\n Archive: ThreadListItemArchive,\n Unarchive: ThreadListItemUnarchive,\n Delete: ThreadListItemDelete,\n} as const;\n\nexport type {\n ThreadListController,\n ThreadListItemContextValue,\n ThreadListProviderProps,\n ThreadListRecord,\n} from \"../contexts\";\nexport { ThreadListProvider, useThreadList, useThreadListItem } from \"../contexts\";\n"],"mappings":"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","names":["ThreadListRoot","ThreadListNew","ThreadListItems","ThreadListEmpty","ThreadListItemRoot","ThreadListItemTrigger","ThreadListItemTitle"]}
@@ -0,0 +1,22 @@
1
+ // src/message/elements.ts
2
+ var messageIds = /* @__PURE__ */ new WeakMap();
3
+ function registerMessageElement(element, messageId) {
4
+ messageIds.set(element, messageId);
5
+ }
6
+ function messageElementFromNode(node) {
7
+ let element = node?.nodeType === Node.ELEMENT_NODE ? node : node?.parentElement ?? void 0;
8
+ while (element !== void 0 && element !== null) {
9
+ const messageId = messageIds.get(element);
10
+ if (messageId !== void 0) {
11
+ return { element, messageId };
12
+ }
13
+ element = element.parentElement ?? void 0;
14
+ }
15
+ return void 0;
16
+ }
17
+
18
+ export {
19
+ registerMessageElement,
20
+ messageElementFromNode
21
+ };
22
+ //# sourceMappingURL=chunk-6XOJFLX4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/message/elements.ts"],"sourcesContent":["const messageIds = new WeakMap<HTMLElement, string>();\n\nexport function registerMessageElement(element: HTMLElement, messageId: string): void {\n messageIds.set(element, messageId);\n}\n\nexport function messageElementFromNode(\n node: Node | null,\n): { element: HTMLElement; messageId: string } | undefined {\n let element =\n node?.nodeType === Node.ELEMENT_NODE\n ? (node as HTMLElement)\n : (node?.parentElement ?? undefined);\n\n while (element !== undefined && element !== null) {\n const messageId = messageIds.get(element);\n if (messageId !== undefined) {\n return { element, messageId };\n }\n element = element.parentElement ?? undefined;\n }\n return undefined;\n}\n"],"mappings":";AAAA,IAAM,aAAa,oBAAI,QAA6B;AAE7C,SAAS,uBAAuB,SAAsB,WAAyB;AACpF,aAAW,IAAI,SAAS,SAAS;AACnC;AAEO,SAAS,uBACd,MACyD;AACzD,MAAI,UACF,MAAM,aAAa,KAAK,eACnB,OACA,MAAM,iBAAiB;AAE9B,SAAO,YAAY,UAAa,YAAY,MAAM;AAChD,UAAM,YAAY,WAAW,IAAI,OAAO;AACxC,QAAI,cAAc,QAAW;AAC3B,aAAO,EAAE,SAAS,UAAU;AAAA,IAC9B;AACA,cAAU,QAAQ,iBAAiB;AAAA,EACrC;AACA,SAAO;AACT;","names":[]}
@@ -0,0 +1,25 @@
1
+ // src/format/message.ts
2
+ function messageText(message) {
3
+ return message.parts.filter((part) => part.type === "text").map((part) => part.text).join("");
4
+ }
5
+
6
+ // src/format/value.ts
7
+ function stringifyValue(value) {
8
+ if (value === void 0) {
9
+ return "";
10
+ }
11
+ if (typeof value === "string") {
12
+ return value;
13
+ }
14
+ try {
15
+ return JSON.stringify(value, null, 2);
16
+ } catch {
17
+ return String(value);
18
+ }
19
+ }
20
+
21
+ export {
22
+ messageText,
23
+ stringifyValue
24
+ };
25
+ //# sourceMappingURL=chunk-CKA4CE26.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/format/message.ts","../src/format/value.ts"],"sourcesContent":["import type { UIMessage, UIMessagePart } from \"@anvia/client\";\n\nexport function messageText(message: UIMessage): string {\n return message.parts\n .filter((part): part is Extract<UIMessagePart, { type: \"text\" }> => part.type === \"text\")\n .map((part) => part.text)\n .join(\"\");\n}\n","export function stringifyValue(value: unknown): string {\n if (value === undefined) {\n return \"\";\n }\n if (typeof value === \"string\") {\n return value;\n }\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n"],"mappings":";AAEO,SAAS,YAAY,SAA4B;AACtD,SAAO,QAAQ,MACZ,OAAO,CAAC,SAA2D,KAAK,SAAS,MAAM,EACvF,IAAI,CAAC,SAAS,KAAK,IAAI,EACvB,KAAK,EAAE;AACZ;;;ACPO,SAAS,eAAe,OAAwB;AACrD,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AACA,MAAI;AACF,WAAO,KAAK,UAAU,OAAO,MAAM,CAAC;AAAA,EACtC,QAAQ;AACN,WAAO,OAAO,KAAK;AAAA,EACrB;AACF;","names":[]}
@@ -1,10 +1,18 @@
1
+ import {
2
+ registerMessageElement
3
+ } from "./chunk-6XOJFLX4.js";
1
4
  import {
2
5
  StreamMarkdown
3
- } from "./chunk-ULGJLLZE.js";
6
+ } from "./chunk-F6AKBUO3.js";
7
+ import {
8
+ AttachmentPrimitive
9
+ } from "./chunk-MISX4WUT.js";
4
10
  import {
5
- Attachment
6
- } from "./chunk-SBYUKODG.js";
11
+ messageText,
12
+ stringifyValue
13
+ } from "./chunk-CKA4CE26.js";
7
14
  import {
15
+ composeRefs,
8
16
  renderPrimitive
9
17
  } from "./chunk-T3ZFZ3NP.js";
10
18
  import {
@@ -14,32 +22,10 @@ import {
14
22
  useMessage,
15
23
  useMessagePart,
16
24
  useOptionalMessagePart
17
- } from "./chunk-43U2XQP2.js";
25
+ } from "./chunk-SOG2GVE4.js";
18
26
 
19
27
  // src/message/actions.tsx
20
28
  import { forwardRef, useCallback, useEffect, useRef, useState } from "react";
21
-
22
- // src/format/message.ts
23
- function messageText(message) {
24
- return message.parts.filter((part) => part.type === "text").map((part) => part.text).join("");
25
- }
26
-
27
- // src/format/value.ts
28
- function stringifyValue(value) {
29
- if (value === void 0) {
30
- return "";
31
- }
32
- if (typeof value === "string") {
33
- return value;
34
- }
35
- try {
36
- return JSON.stringify(value, null, 2);
37
- } catch {
38
- return String(value);
39
- }
40
- }
41
-
42
- // src/message/actions.tsx
43
29
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
44
30
  var MessageActions = forwardRef(
45
31
  function MessageActions2(props, ref) {
@@ -50,8 +36,7 @@ var MessageActions = forwardRef(
50
36
  children: props.children ?? /* @__PURE__ */ jsxs(Fragment, { children: [
51
37
  /* @__PURE__ */ jsx(MessageCopy, {}),
52
38
  /* @__PURE__ */ jsx(MessageRegenerate, {})
53
- ] }),
54
- "data-anvia-message-actions": ""
39
+ ] })
55
40
  },
56
41
  ref
57
42
  );
@@ -97,7 +82,6 @@ var MessageCopy = forwardRef(function MessageCopy2({ onClick, ...props }, ref) {
97
82
  disabled,
98
83
  onClick: handleClick,
99
84
  type: props.type ?? "button",
100
- "data-anvia-copy": "",
101
85
  "data-state": copyState
102
86
  },
103
87
  ref
@@ -108,7 +92,7 @@ var MessageRegenerate = forwardRef(
108
92
  const chat = useChatContext();
109
93
  const { message } = useMessage();
110
94
  const latestAssistantMessage = [...chat.messages].reverse().find((item) => item.role === "assistant");
111
- const disabled = props.disabled ?? (chat.status === "streaming" || message.role !== "assistant" || latestAssistantMessage?.id !== message.id);
95
+ const disabled = props.disabled ?? (chat.status === "submitted" || chat.status === "streaming" || message.role !== "assistant" || latestAssistantMessage?.id !== message.id);
112
96
  const handleClick = useCallback(
113
97
  (event) => {
114
98
  onClick?.(event);
@@ -127,7 +111,6 @@ var MessageRegenerate = forwardRef(
127
111
  disabled,
128
112
  onClick: handleClick,
129
113
  type: props.type ?? "button",
130
- "data-anvia-regenerate": "",
131
114
  "data-state": disabled ? "disabled" : "idle"
132
115
  },
133
116
  ref
@@ -139,17 +122,7 @@ var MessageRegenerate = forwardRef(
139
122
  import { forwardRef as forwardRef2 } from "react";
140
123
  import { jsx as jsx2 } from "react/jsx-runtime";
141
124
  var MessageEntity = forwardRef2(function MessageEntity2({ children, entity, ...props }, ref) {
142
- return /* @__PURE__ */ jsx2(
143
- "span",
144
- {
145
- ...props,
146
- "data-anvia-message-entity": "",
147
- "data-entity-id": entity.id,
148
- "data-trigger-id": entity.triggerId,
149
- ref,
150
- children: children ?? entity.text
151
- }
152
- );
125
+ return /* @__PURE__ */ jsx2("span", { ...props, "data-role": "entity", ref, children: children ?? entity.text });
153
126
  });
154
127
 
155
128
  // src/message/parts.tsx
@@ -164,6 +137,55 @@ import {
164
137
  } from "react";
165
138
  import remarkGfm from "remark-gfm";
166
139
 
140
+ // src/strict-json.ts
141
+ function isComposerEntityData(value) {
142
+ return isComposerEntityDataWithAncestors(value, /* @__PURE__ */ new WeakSet());
143
+ }
144
+ function isComposerEntityDataWithAncestors(value, ancestors) {
145
+ if (value === null || typeof value === "string" || typeof value === "boolean") return true;
146
+ if (typeof value === "number") return Number.isFinite(value);
147
+ if (typeof value !== "object" || ancestors.has(value)) return false;
148
+ ancestors.add(value);
149
+ try {
150
+ if (Array.isArray(value)) {
151
+ if (Object.getPrototypeOf(value) !== Array.prototype || !hasOnlyDenseArrayProperties(value)) {
152
+ return false;
153
+ }
154
+ for (let index = 0; index < value.length; index += 1) {
155
+ if (!isComposerEntityDataWithAncestors(value[index], ancestors)) return false;
156
+ }
157
+ return true;
158
+ }
159
+ const prototype = Object.getPrototypeOf(value);
160
+ if (prototype !== Object.prototype && prototype !== null) return false;
161
+ for (const key of Reflect.ownKeys(value)) {
162
+ if (typeof key !== "string") return false;
163
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
164
+ if (descriptor === void 0 || !descriptor.enumerable || !("value" in descriptor) || !isComposerEntityDataWithAncestors(descriptor.value, ancestors)) {
165
+ return false;
166
+ }
167
+ }
168
+ return true;
169
+ } catch {
170
+ return false;
171
+ } finally {
172
+ ancestors.delete(value);
173
+ }
174
+ }
175
+ function hasOnlyDenseArrayProperties(value) {
176
+ const keys = Reflect.ownKeys(value);
177
+ if (keys.length !== value.length + 1 || keys.at(-1) !== "length") return false;
178
+ for (let index = 0; index < value.length; index += 1) {
179
+ const key = String(index);
180
+ if (keys[index] !== key) return false;
181
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
182
+ if (descriptor === void 0 || !descriptor.enumerable || !("value" in descriptor)) {
183
+ return false;
184
+ }
185
+ }
186
+ return true;
187
+ }
188
+
167
189
  // src/entities.ts
168
190
  function messageTextLayout(parts) {
169
191
  const textParts = parts.filter(
@@ -184,9 +206,10 @@ function messageTextLayout(parts) {
184
206
  }
185
207
  function validComposerEntities(text, metadata) {
186
208
  const candidates = composerEntityCandidates(metadata);
187
- const individuallyValid = candidates.flatMap(
188
- (entity, index) => isValidComposerEntity(entity, text) ? [{ entity, index }] : []
189
- );
209
+ const individuallyValid = candidates.flatMap((candidate, index) => {
210
+ const entity = parseComposerEntity(candidate, text);
211
+ return entity === void 0 ? [] : [{ entity, index }];
212
+ });
190
213
  individuallyValid.sort(
191
214
  (left, right) => left.entity.range.from - right.entity.range.from || left.entity.range.to - right.entity.range.to || left.index - right.index
192
215
  );
@@ -249,15 +272,28 @@ function composerEntityCandidates(metadata) {
249
272
  }
250
273
  return Array.isArray(metadata.composer.entities) ? metadata.composer.entities : [];
251
274
  }
252
- function isValidComposerEntity(value, text) {
275
+ function parseComposerEntity(value, text) {
253
276
  if (!isRecord(value) || !isRecord(value.range)) {
254
- return false;
277
+ return void 0;
255
278
  }
256
279
  if (!isNonEmptyString(value.id) || !isNonEmptyString(value.triggerId) || !isNonEmptyString(value.trigger) || !isNonEmptyString(value.label) || !isNonEmptyString(value.text)) {
257
- return false;
280
+ return void 0;
258
281
  }
259
282
  const { from, to } = value.range;
260
- return typeof from === "number" && typeof to === "number" && Number.isInteger(from) && Number.isInteger(to) && from >= 0 && to > from && to <= text.length && text.slice(from, to) === value.text;
283
+ if (typeof from !== "number" || typeof to !== "number" || !Number.isInteger(from) || !Number.isInteger(to) || from < 0 || to <= from || to > text.length || text.slice(from, to) !== value.text) {
284
+ return void 0;
285
+ }
286
+ if (value.data !== void 0 && !isComposerEntityData(value.data)) return void 0;
287
+ const entity = {
288
+ id: value.id,
289
+ triggerId: value.triggerId,
290
+ trigger: value.trigger,
291
+ label: value.label,
292
+ text: value.text,
293
+ range: { from, to }
294
+ };
295
+ if (value.data !== void 0) entity.data = value.data;
296
+ return entity;
261
297
  }
262
298
  function isNonEmptyString(value) {
263
299
  return typeof value === "string" && value.length > 0;
@@ -295,8 +331,7 @@ function messageEntityRehypeOptions() {
295
331
  type: "element",
296
332
  tagName: "span",
297
333
  properties: {
298
- dataAnviaMessageEntity: "",
299
- dataAnviaEntityIndex: entityIndex === void 0 ? "" : String(entityIndex)
334
+ dataEntityIndex: entityIndex === void 0 ? "" : String(entityIndex)
300
335
  },
301
336
  children: [{ type: "text", value: node.value ?? "" }]
302
337
  };
@@ -523,27 +558,29 @@ var MessageParts = forwardRef3(function MessageParts2({ children, filter, stream
523
558
  {
524
559
  ...props,
525
560
  children: renderMessagePartNodes(parts, children),
526
- "data-anvia-message-parts": ""
561
+ "data-role": "parts"
527
562
  },
528
563
  ref
529
564
  );
530
565
  });
531
566
  var SmoothedMessageParts = forwardRef3(
532
567
  function SmoothedMessageParts2({ children, parts, stream, ...props }, ref) {
533
- const smooth = useSmoothStreamItems(parts, {
568
+ const streamOptions = {
534
569
  adapter: messagePartStreamAdapter,
535
570
  isStreaming: stream.isStreaming,
536
- resetKey: stream.resetKey,
537
- ...stream.flushImmediately === void 0 ? {} : { flushImmediately: stream.flushImmediately }
538
- });
571
+ resetKey: stream.resetKey
572
+ };
573
+ if (stream.flushImmediately !== void 0) {
574
+ Object.assign(streamOptions, { flushImmediately: stream.flushImmediately });
575
+ }
576
+ const smooth = useSmoothStreamItems(parts, streamOptions);
539
577
  return renderPrimitive(
540
578
  "div",
541
579
  {
542
580
  ...props,
543
581
  children: renderMessagePartNodes(smooth.items, children, smooth.liveItemKey),
544
- "data-anvia-message-parts": "",
545
- "data-draining": smooth.isDraining ? "" : void 0,
546
- "data-streaming": stream.isStreaming ? "" : void 0
582
+ "data-role": "parts",
583
+ "data-state": smooth.isDraining ? "draining" : stream.isStreaming ? "streaming" : "idle"
547
584
  },
548
585
  ref
549
586
  );
@@ -569,8 +606,7 @@ var MessagePart = forwardRef3(function MessagePart2({ children, ...props }, ref)
569
606
  {
570
607
  ...props,
571
608
  children: renderedChildren,
572
- "data-anvia-part": "",
573
- "data-part": part.type
609
+ "data-role": part.type
574
610
  },
575
611
  ref
576
612
  );
@@ -594,19 +630,21 @@ var MessageText = forwardRef3(function MessageText2(props, ref) {
594
630
  var MessageTextContent = forwardRef3(
595
631
  function MessageTextContent2({ content, partId, stream, streamControlled, ...props }, ref) {
596
632
  const ownsStream = stream !== void 0 && !streamControlled && props.children === void 0;
597
- const smooth = useSmoothStreamText(content, {
633
+ const streamOptions = {
598
634
  isStreaming: ownsStream ? stream.isStreaming : false,
599
- resetKey: ownsStream ? stream.resetKey : partId,
600
- ...ownsStream && stream.flushImmediately !== void 0 ? { flushImmediately: stream.flushImmediately } : {}
601
- });
635
+ resetKey: ownsStream ? stream.resetKey : partId
636
+ };
637
+ if (ownsStream && stream.flushImmediately !== void 0) {
638
+ Object.assign(streamOptions, { flushImmediately: stream.flushImmediately });
639
+ }
640
+ const smooth = useSmoothStreamText(content, streamOptions);
602
641
  return renderPrimitive(
603
642
  "span",
604
643
  {
605
644
  ...props,
606
645
  children: props.children ?? (ownsStream ? smooth.text : content),
607
- "data-anvia-text": "",
608
- "data-draining": ownsStream && smooth.isDraining ? "" : void 0,
609
- "data-streaming": ownsStream && stream.isStreaming ? "" : void 0
646
+ "data-role": "text",
647
+ "data-state": ownsStream ? smooth.isDraining ? "draining" : stream.isStreaming ? "streaming" : "idle" : void 0
610
648
  },
611
649
  ref
612
650
  );
@@ -656,11 +694,14 @@ var MessageMarkdownContent = forwardRef3(
656
694
  ...props
657
695
  }, ref) {
658
696
  const ownsStream = stream !== void 0 && !streamControlled;
659
- const smooth = useSmoothStreamText(markdown, {
697
+ const streamOptions = {
660
698
  isStreaming: ownsStream ? stream.isStreaming : false,
661
- resetKey: ownsStream ? stream.resetKey : resetKey,
662
- ...ownsStream && stream.flushImmediately !== void 0 ? { flushImmediately: stream.flushImmediately } : {}
663
- });
699
+ resetKey: ownsStream ? stream.resetKey : resetKey
700
+ };
701
+ if (ownsStream && stream.flushImmediately !== void 0) {
702
+ Object.assign(streamOptions, { flushImmediately: stream.flushImmediately });
703
+ }
704
+ const smooth = useSmoothStreamText(markdown, streamOptions);
664
705
  const renderedMarkdown = ownsStream ? smooth.text : markdown;
665
706
  const renderedEntities = useMemo(
666
707
  () => entities.length === 0 ? entities : validComposerEntities(renderedMarkdown, {
@@ -686,9 +727,7 @@ var MessageMarkdownContent = forwardRef3(
686
727
  ...props,
687
728
  components: renderedComponents,
688
729
  content: renderedMarkdown,
689
- "data-anvia-markdown": "",
690
- "data-draining": ownsStream && smooth.isDraining ? "" : void 0,
691
- "data-streaming": ownsStream && stream.isStreaming ? "" : void 0,
730
+ "data-state": ownsStream && smooth.isDraining ? "draining" : ownsStream && stream.isStreaming ? "streaming" : "idle",
692
731
  live,
693
732
  ref,
694
733
  remarkPlugins: renderedRemarkPlugins,
@@ -705,20 +744,18 @@ function markdownComponents(components, entities, renderEntity) {
705
744
  ...components,
706
745
  span(spanProps) {
707
746
  const internalProps = spanProps;
708
- const entityIndexValue = internalProps["data-anvia-entity-index"];
747
+ const entityIndexValue = internalProps["data-entity-index"];
709
748
  const entityIndex = typeof entityIndexValue === "string" && /^\d+$/.test(entityIndexValue) ? Number(entityIndexValue) : void 0;
710
749
  const entity = entityIndex === void 0 ? void 0 : entities[entityIndex];
711
750
  const consumerProps = { ...internalProps };
712
- delete consumerProps["data-anvia-entity-index"];
751
+ delete consumerProps["data-entity-index"];
713
752
  if (entity !== void 0) {
714
753
  if (renderEntity !== void 0) {
715
754
  return renderEntity(entity);
716
755
  }
717
756
  const entityProps = {
718
757
  ...consumerProps,
719
- "data-anvia-message-entity": "",
720
- "data-entity-id": entity.id,
721
- "data-trigger-id": entity.triggerId
758
+ "data-role": "entity"
722
759
  };
723
760
  if (consumerSpan !== void 0) {
724
761
  return createElement(consumerSpan, entityProps);
@@ -740,9 +777,8 @@ var MessageCodeBlock = forwardRef3(
740
777
  "pre",
741
778
  {
742
779
  ...props,
743
- children: children ?? /* @__PURE__ */ jsx3("code", { "data-anvia-code": "", "data-language": language, children: code ?? "" }),
744
- "data-anvia-code-block": "",
745
- "data-language": language
780
+ "data-role": "code-block",
781
+ children: children ?? /* @__PURE__ */ jsx3("code", { className: language === void 0 ? void 0 : `language-${language}`, children: code ?? "" })
746
782
  },
747
783
  ref
748
784
  );
@@ -761,8 +797,7 @@ var MessageReasoning = forwardRef3(
761
797
  children: props.children ?? /* @__PURE__ */ jsxs2(Fragment2, { children: [
762
798
  /* @__PURE__ */ jsx3("summary", { children: "Reasoning" }),
763
799
  /* @__PURE__ */ jsx3("pre", { children: part.text })
764
- ] }),
765
- "data-anvia-reasoning": ""
800
+ ] })
766
801
  },
767
802
  ref
768
803
  );
@@ -779,7 +814,7 @@ var MessageTool = forwardRef3(function MessageTool2({ children, renderWhen = "al
779
814
  {
780
815
  ...props,
781
816
  children: renderedChildren,
782
- "data-anvia-tool": "",
817
+ "data-role": "tool",
783
818
  "data-state": part.state
784
819
  },
785
820
  ref
@@ -795,8 +830,7 @@ var MessageToolName = forwardRef3(
795
830
  "span",
796
831
  {
797
832
  ...props,
798
- children: props.children ?? part.toolName,
799
- "data-anvia-tool-name": ""
833
+ children: props.children ?? part.toolName
800
834
  },
801
835
  ref
802
836
  );
@@ -813,7 +847,6 @@ var MessageToolStatus = forwardRef3(
813
847
  {
814
848
  ...props,
815
849
  children: props.children ?? toolStateLabel(part.state),
816
- "data-anvia-tool-status": "",
817
850
  "data-state": part.state
818
851
  },
819
852
  ref
@@ -823,15 +856,14 @@ var MessageToolStatus = forwardRef3(
823
856
  var MessageToolInput = forwardRef3(
824
857
  function MessageToolInput2(props, ref) {
825
858
  const { part } = useMessagePart();
826
- if (part.type !== "tool" || part.input === void 0) {
859
+ if (part.type !== "tool") {
827
860
  return null;
828
861
  }
829
862
  return renderPrimitive(
830
863
  "pre",
831
864
  {
832
865
  ...props,
833
- children: props.children ?? stringifyValue(part.input),
834
- "data-anvia-tool-input": ""
866
+ children: props.children ?? stringifyValue(part.input)
835
867
  },
836
868
  ref
837
869
  );
@@ -840,15 +872,14 @@ var MessageToolInput = forwardRef3(
840
872
  var MessageToolOutput = forwardRef3(
841
873
  function MessageToolOutput2(props, ref) {
842
874
  const { part } = useMessagePart();
843
- if (part.type !== "tool" || part.output === void 0) {
875
+ if (part.type !== "tool" || part.state !== "output-available") {
844
876
  return null;
845
877
  }
846
878
  return renderPrimitive(
847
879
  "pre",
848
880
  {
849
881
  ...props,
850
- children: props.children ?? stringifyValue(part.output),
851
- "data-anvia-tool-output": ""
882
+ children: props.children ?? stringifyValue(part.output)
852
883
  },
853
884
  ref
854
885
  );
@@ -857,7 +888,7 @@ var MessageToolOutput = forwardRef3(
857
888
  var MessageToolError = forwardRef3(
858
889
  function MessageToolError2(props, ref) {
859
890
  const { part } = useMessagePart();
860
- if (part.type !== "tool" || part.error === void 0) {
891
+ if (part.type !== "tool" || part.state !== "error") {
861
892
  return null;
862
893
  }
863
894
  return renderPrimitive(
@@ -865,7 +896,6 @@ var MessageToolError = forwardRef3(
865
896
  {
866
897
  ...props,
867
898
  children: props.children ?? part.error.message,
868
- "data-anvia-tool-error": "",
869
899
  role: props.role ?? "alert"
870
900
  },
871
901
  ref
@@ -878,13 +908,12 @@ var MessageAttachment = forwardRef3(
878
908
  if (part.type !== "attachment") {
879
909
  return null;
880
910
  }
881
- const renderedChildren = typeof children === "function" ? children(part.attachment) : children ?? /* @__PURE__ */ jsx3(Attachment.Root, {});
911
+ const renderedChildren = typeof children === "function" ? children(part.attachment) : children ?? /* @__PURE__ */ jsx3(AttachmentPrimitive.Root, {});
882
912
  return /* @__PURE__ */ jsx3(InternalAttachmentProvider, { value: { attachment: part.attachment }, children: renderPrimitive(
883
913
  "div",
884
914
  {
885
915
  ...props,
886
- children: renderedChildren,
887
- "data-anvia-message-attachment": ""
916
+ children: renderedChildren
888
917
  },
889
918
  ref
890
919
  ) });
@@ -900,9 +929,7 @@ var MessageData = forwardRef3(
900
929
  "pre",
901
930
  {
902
931
  ...props,
903
- children: props.children ?? stringifyValue(part.data),
904
- "data-anvia-data": "",
905
- "data-name": part.name
932
+ children: props.children ?? stringifyValue(part.data)
906
933
  },
907
934
  ref
908
935
  );
@@ -919,7 +946,6 @@ var MessageError = forwardRef3(
919
946
  {
920
947
  ...props,
921
948
  children: props.children ?? part.error.message,
922
- "data-anvia-error": "",
923
949
  role: props.role ?? "alert"
924
950
  },
925
951
  ref
@@ -959,18 +985,7 @@ function defaultCodeComponent({
959
985
  node: _node,
960
986
  ...props
961
987
  }) {
962
- const language = /language-(\S+)/.exec(className ?? "")?.[1];
963
- return /* @__PURE__ */ jsx3(
964
- "code",
965
- {
966
- className,
967
- "data-anvia-code": "",
968
- "data-anvia-inline-code": language === void 0 ? "" : void 0,
969
- "data-language": language,
970
- ...props,
971
- children
972
- }
973
- );
988
+ return /* @__PURE__ */ jsx3("code", { className, ...props, children });
974
989
  }
975
990
  function defaultPreComponent({
976
991
  children,
@@ -999,20 +1014,25 @@ function toolStateLabel(state) {
999
1014
  }
1000
1015
 
1001
1016
  // src/message/root.tsx
1002
- import { forwardRef as forwardRef4 } from "react";
1017
+ import { forwardRef as forwardRef4, useCallback as useCallback2, useMemo as useMemo2 } from "react";
1003
1018
  var MessageRoot = forwardRef4(function MessageRoot2({ children, ...props }, ref) {
1004
1019
  const { message } = useMessage();
1005
1020
  const renderedChildren = typeof children === "function" ? children(message) : children;
1021
+ const registerElement = useCallback2(
1022
+ (element) => {
1023
+ if (element !== null) registerMessageElement(element, message.id);
1024
+ },
1025
+ [message.id]
1026
+ );
1027
+ const composedRef = useMemo2(() => composeRefs(ref, registerElement), [ref, registerElement]);
1006
1028
  return renderPrimitive(
1007
1029
  "article",
1008
1030
  {
1009
1031
  ...props,
1010
1032
  children: renderedChildren,
1011
- "data-anvia-message": "",
1012
- "data-anvia-message-id": message.id,
1013
1033
  "data-role": message.role
1014
1034
  },
1015
- ref
1035
+ composedRef
1016
1036
  );
1017
1037
  });
1018
1038
  var MessageContent = forwardRef4(
@@ -1020,8 +1040,7 @@ var MessageContent = forwardRef4(
1020
1040
  return renderPrimitive(
1021
1041
  "div",
1022
1042
  {
1023
- ...props,
1024
- "data-anvia-message-content": ""
1043
+ ...props
1025
1044
  },
1026
1045
  ref
1027
1046
  );
@@ -1029,7 +1048,7 @@ var MessageContent = forwardRef4(
1029
1048
  );
1030
1049
 
1031
1050
  // src/message/index.ts
1032
- var Message = {
1051
+ var MessagePrimitive = {
1033
1052
  Root: MessageRoot,
1034
1053
  Content: MessageContent,
1035
1054
  Parts: MessageParts,
@@ -1054,7 +1073,8 @@ var Message = {
1054
1073
  };
1055
1074
 
1056
1075
  export {
1076
+ isComposerEntityData,
1057
1077
  shiftComposerEntityRanges,
1058
- Message
1078
+ MessagePrimitive
1059
1079
  };
1060
- //# sourceMappingURL=chunk-JWZDNM5D.js.map
1080
+ //# sourceMappingURL=chunk-CRXNFZRW.js.map