@anvia/react-ui 1.0.0-rc.1 → 1.0.0-rc.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -1
- package/dist/attachment/index.d.ts +3 -3
- package/dist/attachment/index.js +2 -2
- package/dist/{attachment-BP597fV3.d.ts → attachment-mbjsroli.d.ts} +1 -1
- package/dist/chat/index.d.ts +9 -8
- package/dist/chat/index.js +5 -4
- package/dist/chat-BRVgYE68.d.ts +86 -0
- package/dist/{chunk-SBYUKODG.js → chunk-B5JX33SC.js} +2 -2
- package/dist/chunk-B5JX33SC.js.map +1 -0
- package/dist/{chunk-JWZDNM5D.js → chunk-BZZ7MJNM.js} +29 -38
- package/dist/chunk-BZZ7MJNM.js.map +1 -0
- package/dist/chunk-CKA4CE26.js +25 -0
- package/dist/chunk-CKA4CE26.js.map +1 -0
- package/dist/{chunk-43U2XQP2.js → chunk-JMGFSYCR.js} +25 -11
- package/dist/chunk-JMGFSYCR.js.map +1 -0
- package/dist/{chunk-7RMRM7W3.js → chunk-JNPCYX4Z.js} +2 -2
- package/dist/{chunk-56CV6S76.js → chunk-MF7RWETT.js} +2 -2
- package/dist/{chunk-R3NA6BWW.js → chunk-QHOLI3OZ.js} +45 -33
- package/dist/chunk-QHOLI3OZ.js.map +1 -0
- package/dist/{chunk-VEYJNQVW.js → chunk-URQROKGZ.js} +7 -6
- package/dist/chunk-URQROKGZ.js.map +1 -0
- package/dist/{chunk-FABSIZZ7.js → chunk-XZUF27QY.js} +18 -17
- package/dist/chunk-XZUF27QY.js.map +1 -0
- package/dist/{chunk-7HR34SOF.js → chunk-YJNTXNVL.js} +2 -2
- package/dist/chunk-YJNTXNVL.js.map +1 -0
- package/dist/completion/index.d.ts +2 -1
- package/dist/completion/index.js +2 -2
- package/dist/completion-input-DHlwrhxB.d.ts +24 -0
- package/dist/{composer-CzsbDFPt.d.ts → composer-BTT2vzYF.d.ts} +2 -2
- package/dist/human-input/index.d.ts +8 -6
- package/dist/human-input/index.js +3 -2
- package/dist/human-input-DOBCZgqw.d.ts +27 -0
- package/dist/image/index.d.ts +4 -4
- package/dist/image/index.js +2 -2
- package/dist/{image-DanUxcl2.d.ts → image-VZv6Ddsn.d.ts} +1 -1
- package/dist/index.d.ts +8 -7
- package/dist/index.js +18 -17
- package/dist/index.js.map +1 -1
- package/dist/message/index.d.ts +10 -9
- package/dist/message/index.js +4 -3
- package/dist/{message-CkEnKhAn.d.ts → message-CNRnZQwU.d.ts} +1 -1
- package/dist/selection-toolbar/index.js +2 -2
- package/dist/shared.d.ts +8 -7
- package/dist/shared.js +1 -1
- package/dist/thread-list/index.js +2 -2
- package/package.json +15 -13
- package/dist/chat-B3kucz1w.d.ts +0 -13
- package/dist/chunk-43U2XQP2.js.map +0 -1
- package/dist/chunk-7HR34SOF.js.map +0 -1
- package/dist/chunk-FABSIZZ7.js.map +0 -1
- package/dist/chunk-JWZDNM5D.js.map +0 -1
- package/dist/chunk-R3NA6BWW.js.map +0 -1
- package/dist/chunk-SBYUKODG.js.map +0 -1
- package/dist/chunk-VEYJNQVW.js.map +0 -1
- package/dist/completion-input-WjK6kUyG.d.ts +0 -23
- package/dist/human-input-CydeYm_7.d.ts +0 -20
- /package/dist/{chunk-7RMRM7W3.js.map → chunk-JNPCYX4Z.js.map} +0 -0
- /package/dist/{chunk-56CV6S76.js.map → chunk-MF7RWETT.js.map} +0 -0
package/README.md
CHANGED
|
@@ -3,11 +3,14 @@
|
|
|
3
3
|
Composable React UI primitives for Anvia chat and completion experiences.
|
|
4
4
|
|
|
5
5
|
```tsx
|
|
6
|
+
import { createHttpClientTransport } from "@anvia/client";
|
|
6
7
|
import { useChat } from "@anvia/react";
|
|
7
8
|
import { ChatProvider, Composer, Message, Thread } from "@anvia/react-ui";
|
|
8
9
|
|
|
9
10
|
export function SupportChat() {
|
|
10
|
-
const chat = useChat({
|
|
11
|
+
const chat = useChat({
|
|
12
|
+
transport: createHttpClientTransport({ endpoint: "/api/chat" }),
|
|
13
|
+
});
|
|
11
14
|
const triggers = [
|
|
12
15
|
{
|
|
13
16
|
id: "people",
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as _anvia_client from '@anvia/client';
|
|
2
2
|
import * as react from 'react';
|
|
3
|
-
export { A as AttachmentContextValue, u as useAttachment } from '../attachment-
|
|
3
|
+
export { A as AttachmentContextValue, u as useAttachment } from '../attachment-mbjsroli.js';
|
|
4
4
|
import { P as PrimitiveProps } from '../render-CRKWam2v.js';
|
|
5
5
|
|
|
6
6
|
declare const Attachment: {
|
|
7
7
|
readonly Root: react.ForwardRefExoticComponent<Omit<PrimitiveProps<"div">, "children"> & {
|
|
8
|
-
children?: react.ReactNode | ((attachment:
|
|
8
|
+
children?: react.ReactNode | ((attachment: _anvia_client.UIAttachment) => react.ReactNode);
|
|
9
9
|
} & react.RefAttributes<HTMLDivElement>>;
|
|
10
10
|
readonly Name: react.ForwardRefExoticComponent<Omit<Omit<react.DetailedHTMLProps<react.HTMLAttributes<HTMLSpanElement>, HTMLSpanElement>, "ref">, "asChild"> & {
|
|
11
11
|
asChild?: boolean;
|
package/dist/attachment/index.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Attachment
|
|
3
|
-
} from "../chunk-
|
|
3
|
+
} from "../chunk-B5JX33SC.js";
|
|
4
4
|
import "../chunk-T3ZFZ3NP.js";
|
|
5
5
|
import {
|
|
6
6
|
useAttachment
|
|
7
|
-
} from "../chunk-
|
|
7
|
+
} from "../chunk-JMGFSYCR.js";
|
|
8
8
|
export {
|
|
9
9
|
Attachment,
|
|
10
10
|
useAttachment
|
package/dist/chat/index.d.ts
CHANGED
|
@@ -1,22 +1,23 @@
|
|
|
1
|
-
import { C as ChatController } from '../chat-
|
|
2
|
-
export { a as ChatProvider, b as ChatProviderProps, u as useChatContext } from '../chat-
|
|
3
|
-
import { d as ComposerEntity, g as ComposerQuote, h as ComposerTriggerDefinition, l as ComposerTriggerState, i as ComposerTriggerItem } from '../composer-
|
|
4
|
-
export { C as ComposerAttachmentInput, a as ComposerAttachmentsUpdate, b as ComposerContextValue, c as ComposerEntitiesUpdate, e as ComposerEntityData, f as ComposerMessageMetadata, j as ComposerTriggerItems, k as ComposerTriggerItemsArgs, m as ComposerTriggerStateUpdate, u as useComposer } from '../composer-
|
|
1
|
+
import { C as ChatController } from '../chat-BRVgYE68.js';
|
|
2
|
+
export { a as ChatProvider, b as ChatProviderProps, u as useChatContext } from '../chat-BRVgYE68.js';
|
|
3
|
+
import { d as ComposerEntity, g as ComposerQuote, h as ComposerTriggerDefinition, l as ComposerTriggerState, i as ComposerTriggerItem } from '../composer-BTT2vzYF.js';
|
|
4
|
+
export { C as ComposerAttachmentInput, a as ComposerAttachmentsUpdate, b as ComposerContextValue, c as ComposerEntitiesUpdate, e as ComposerEntityData, f as ComposerMessageMetadata, j as ComposerTriggerItems, k as ComposerTriggerItemsArgs, m as ComposerTriggerStateUpdate, u as useComposer } from '../composer-BTT2vzYF.js';
|
|
5
5
|
export { T as ThreadContextValue, u as useThread } from '../thread-uEm8hH0s.js';
|
|
6
6
|
import * as react from 'react';
|
|
7
7
|
import { ReactNode } from 'react';
|
|
8
|
-
import { UIAttachment,
|
|
8
|
+
import { UIAttachment, ClientDataMap, ClientMetadata, UIMessage } from '@anvia/client';
|
|
9
9
|
import { P as PrimitiveProps } from '../render-CRKWam2v.js';
|
|
10
|
+
import { UseChatStatus, ChatSuggestion } from '@anvia/react';
|
|
10
11
|
|
|
11
|
-
type ComposerSubmitMessageArgs<
|
|
12
|
+
type ComposerSubmitMessageArgs<TData extends ClientDataMap = ClientDataMap> = {
|
|
12
13
|
input: string;
|
|
13
14
|
attachments: UIAttachment[];
|
|
14
15
|
entities: ComposerEntity[];
|
|
15
|
-
chat: ChatController<
|
|
16
|
+
chat: ChatController<ClientMetadata, TData>;
|
|
16
17
|
quote?: ComposerQuote | undefined;
|
|
17
18
|
clear(): void;
|
|
18
19
|
};
|
|
19
|
-
type ComposerSubmitMessage<
|
|
20
|
+
type ComposerSubmitMessage<TData extends ClientDataMap = ClientDataMap> = (args: ComposerSubmitMessageArgs<TData>) => Promise<void> | void;
|
|
20
21
|
type ComposerTriggerMenuChildren = ReactNode | ((trigger: ComposerTriggerState) => ReactNode);
|
|
21
22
|
type ComposerTriggerItemChildren = ReactNode | ((item: ComposerTriggerItem, trigger: ComposerTriggerState) => ReactNode);
|
|
22
23
|
type ComposerAttachmentsChildren = ReactNode | ((attachment: UIAttachment) => ReactNode);
|
package/dist/chat/index.js
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Composer,
|
|
3
3
|
Thread
|
|
4
|
-
} from "../chunk-
|
|
5
|
-
import "../chunk-
|
|
4
|
+
} from "../chunk-XZUF27QY.js";
|
|
5
|
+
import "../chunk-BZZ7MJNM.js";
|
|
6
6
|
import "../chunk-ULGJLLZE.js";
|
|
7
|
-
import "../chunk-
|
|
7
|
+
import "../chunk-B5JX33SC.js";
|
|
8
|
+
import "../chunk-CKA4CE26.js";
|
|
8
9
|
import "../chunk-T3ZFZ3NP.js";
|
|
9
10
|
import {
|
|
10
11
|
ChatProvider,
|
|
11
12
|
useChatContext,
|
|
12
13
|
useComposer,
|
|
13
14
|
useThread
|
|
14
|
-
} from "../chunk-
|
|
15
|
+
} from "../chunk-JMGFSYCR.js";
|
|
15
16
|
export {
|
|
16
17
|
ChatProvider,
|
|
17
18
|
Composer,
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { ClientMetadata, ClientDataMap, ClientTransport, ClientStreamRequest } from '@anvia/client';
|
|
2
|
+
import { UseChatResult } from '@anvia/react';
|
|
3
|
+
import { ReactNode, ReactElement } from 'react';
|
|
4
|
+
|
|
5
|
+
type JsonPrimitive = string | number | boolean | null;
|
|
6
|
+
type JsonValue = JsonPrimitive | JsonObject | JsonValue[];
|
|
7
|
+
type JsonObject = {
|
|
8
|
+
[key: string]: JsonValue | undefined;
|
|
9
|
+
};
|
|
10
|
+
type ToolQuestionAnswer = Readonly<{
|
|
11
|
+
questionId: string;
|
|
12
|
+
value: string;
|
|
13
|
+
}>;
|
|
14
|
+
|
|
15
|
+
type AgentQuestionChoice = Readonly<{
|
|
16
|
+
label: string;
|
|
17
|
+
value: string;
|
|
18
|
+
}>;
|
|
19
|
+
type AgentQuestionPrompt = Readonly<{
|
|
20
|
+
id: string;
|
|
21
|
+
text: string;
|
|
22
|
+
choices?: readonly AgentQuestionChoice[];
|
|
23
|
+
allowCustom?: boolean;
|
|
24
|
+
}>;
|
|
25
|
+
type AgentQuestionAnswer = ToolQuestionAnswer;
|
|
26
|
+
type AgentInteractionRequestBase = Readonly<{
|
|
27
|
+
id: string;
|
|
28
|
+
toolName: string;
|
|
29
|
+
toolCallId: string;
|
|
30
|
+
callId?: string;
|
|
31
|
+
internalCallId: string;
|
|
32
|
+
}>;
|
|
33
|
+
type AgentToolApprovalRequest = AgentInteractionRequestBase & Readonly<{
|
|
34
|
+
type: "tool-approval";
|
|
35
|
+
input: JsonValue;
|
|
36
|
+
reason?: string;
|
|
37
|
+
}>;
|
|
38
|
+
type AgentToolQuestionRequest = AgentInteractionRequestBase & Readonly<{
|
|
39
|
+
type: "tool-question";
|
|
40
|
+
questions: readonly AgentQuestionPrompt[];
|
|
41
|
+
}>;
|
|
42
|
+
type AgentInteractionRequest = AgentToolApprovalRequest | AgentToolQuestionRequest;
|
|
43
|
+
|
|
44
|
+
type ChatController<Metadata extends ClientMetadata = ClientMetadata, Data extends ClientDataMap = ClientDataMap> = UseChatResult<ClientTransport<ClientStreamRequest, Data, Metadata>>;
|
|
45
|
+
type ChatProviderProps<Metadata extends ClientMetadata = ClientMetadata, Data extends ClientDataMap = ClientDataMap> = {
|
|
46
|
+
controller: ChatController<Metadata, Data>;
|
|
47
|
+
children?: ReactNode;
|
|
48
|
+
};
|
|
49
|
+
declare function ChatProvider<Metadata extends ClientMetadata = ClientMetadata, Data extends ClientDataMap = ClientDataMap>({ controller, children }: ChatProviderProps<Metadata, Data>): ReactElement;
|
|
50
|
+
declare function useChatContext<Metadata extends ClientMetadata = ClientMetadata, Data extends ClientDataMap = ClientDataMap>(): ChatController<Metadata, Data>;
|
|
51
|
+
declare function useHumanInput(): {
|
|
52
|
+
approvals: {
|
|
53
|
+
all: (Readonly<{
|
|
54
|
+
request: AgentInteractionRequest;
|
|
55
|
+
runId: string;
|
|
56
|
+
status: "pending" | "responded" | "cancelled";
|
|
57
|
+
}> & {
|
|
58
|
+
request: AgentToolApprovalRequest;
|
|
59
|
+
})[];
|
|
60
|
+
pending: (Readonly<{
|
|
61
|
+
request: AgentInteractionRequest;
|
|
62
|
+
runId: string;
|
|
63
|
+
status: "pending" | "responded" | "cancelled";
|
|
64
|
+
}> & {
|
|
65
|
+
request: AgentToolApprovalRequest;
|
|
66
|
+
})[];
|
|
67
|
+
};
|
|
68
|
+
questions: {
|
|
69
|
+
all: (Readonly<{
|
|
70
|
+
request: AgentInteractionRequest;
|
|
71
|
+
runId: string;
|
|
72
|
+
status: "pending" | "responded" | "cancelled";
|
|
73
|
+
}> & {
|
|
74
|
+
request: AgentToolQuestionRequest;
|
|
75
|
+
})[];
|
|
76
|
+
pending: (Readonly<{
|
|
77
|
+
request: AgentInteractionRequest;
|
|
78
|
+
runId: string;
|
|
79
|
+
status: "pending" | "responded" | "cancelled";
|
|
80
|
+
}> & {
|
|
81
|
+
request: AgentToolQuestionRequest;
|
|
82
|
+
})[];
|
|
83
|
+
};
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
export { type AgentToolApprovalRequest as A, type ChatController as C, ChatProvider as a, type ChatProviderProps as b, useHumanInput as c, type AgentToolQuestionRequest as d, type AgentQuestionAnswer as e, type AgentQuestionPrompt as f, useChatContext as u };
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
} from "./chunk-T3ZFZ3NP.js";
|
|
4
4
|
import {
|
|
5
5
|
useAttachment
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-JMGFSYCR.js";
|
|
7
7
|
|
|
8
8
|
// src/attachment/parts.tsx
|
|
9
9
|
import { forwardRef, useCallback } from "react";
|
|
@@ -122,4 +122,4 @@ var Attachment = {
|
|
|
122
122
|
export {
|
|
123
123
|
Attachment
|
|
124
124
|
};
|
|
125
|
-
//# sourceMappingURL=chunk-
|
|
125
|
+
//# sourceMappingURL=chunk-B5JX33SC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/attachment/parts.tsx","../src/attachment/index.ts"],"sourcesContent":["import type { UIAttachment } from \"@anvia/client\";\nimport { forwardRef, type MouseEvent, type ReactNode, useCallback } from \"react\";\n\nimport { useAttachment } from \"../contexts\";\nimport { type PrimitiveProps, renderPrimitive } from \"../primitives\";\n\ntype AttachmentChildren = ReactNode | ((attachment: UIAttachment) => ReactNode);\n\ntype AttachmentRootProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n children?: AttachmentChildren;\n};\n\nconst AttachmentRoot = forwardRef<HTMLDivElement, AttachmentRootProps>(function AttachmentRoot(\n { children, ...props },\n ref,\n) {\n const { attachment, remove } = useAttachment();\n const renderedChildren =\n typeof children === \"function\" ? children(attachment) : (children ?? defaultAttachment(remove));\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: renderedChildren,\n \"data-anvia-attachment\": \"\",\n \"data-type\": attachment.type,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n});\n\nconst AttachmentName = forwardRef<HTMLSpanElement, PrimitiveProps<\"span\">>(\n function AttachmentName(props, ref) {\n const { attachment } = useAttachment();\n\n return renderPrimitive(\n \"span\",\n {\n ...props,\n children: props.children ?? attachmentLabel(attachment),\n \"data-anvia-attachment-name\": \"\",\n } as PrimitiveProps<\"span\">,\n ref,\n );\n },\n);\n\nconst AttachmentPreview = forwardRef<HTMLDivElement, PrimitiveProps<\"div\">>(\n function AttachmentPreview(props, ref) {\n const { attachment } = useAttachment();\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: props.children ?? defaultPreview(attachment),\n \"data-anvia-attachment-preview\": \"\",\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\nconst AttachmentRemove = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(\n function AttachmentRemove({ onClick, ...props }, ref) {\n const { remove } = useAttachment();\n const disabled = props.disabled ?? remove === undefined;\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n remove?.();\n },\n [disabled, onClick, remove],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Remove\",\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-anvia-attachment-remove\": \"\",\n \"data-state\": disabled ? \"disabled\" : \"enabled\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\nfunction defaultAttachment(remove: (() => void) | undefined): ReactNode {\n return (\n <>\n <AttachmentPreview />\n <AttachmentName />\n {remove === undefined ? null : <AttachmentRemove />}\n </>\n );\n}\n\nfunction defaultPreview(attachment: UIAttachment): ReactNode {\n if (isImageAttachment(attachment)) {\n const source = attachment.url ?? attachmentDataUrl(attachment);\n if (source !== undefined) {\n return (\n <img alt={attachment.name ?? \"Attachment\"} data-anvia-attachment-image=\"\" src={source} />\n );\n }\n }\n\n if (attachment.url !== undefined) {\n return (\n <a data-anvia-attachment-link=\"\" href={attachment.url}>\n {attachmentLabel(attachment)}\n </a>\n );\n }\n\n return <span data-anvia-attachment-kind=\"\">{attachment.mediaType ?? attachment.type}</span>;\n}\n\nfunction attachmentLabel(attachment: UIAttachment): string {\n return attachment.name ?? attachment.mediaType ?? attachment.type;\n}\n\nfunction isImageAttachment(attachment: UIAttachment): boolean {\n return attachment.type === \"image\" || attachment.mediaType?.startsWith(\"image/\") === true;\n}\n\nfunction attachmentDataUrl(attachment: UIAttachment): string | undefined {\n if (attachment.data === undefined || attachment.mediaType === undefined) {\n return undefined;\n }\n return `data:${attachment.mediaType};base64,${attachment.data}`;\n}\n\nexport { AttachmentName, AttachmentPreview, AttachmentRemove, AttachmentRoot };\n","import { AttachmentName, AttachmentPreview, AttachmentRemove, AttachmentRoot } from \"./parts\";\n\nexport const Attachment = {\n Root: AttachmentRoot,\n Name: AttachmentName,\n Preview: AttachmentPreview,\n Remove: AttachmentRemove,\n} as const;\n\nexport type { AttachmentContextValue } from \"../contexts\";\nexport { useAttachment } from \"../contexts\";\n"],"mappings":"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","names":["AttachmentRoot","AttachmentName","AttachmentPreview","AttachmentRemove"]}
|
|
@@ -3,7 +3,11 @@ import {
|
|
|
3
3
|
} from "./chunk-ULGJLLZE.js";
|
|
4
4
|
import {
|
|
5
5
|
Attachment
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-B5JX33SC.js";
|
|
7
|
+
import {
|
|
8
|
+
messageText,
|
|
9
|
+
stringifyValue
|
|
10
|
+
} from "./chunk-CKA4CE26.js";
|
|
7
11
|
import {
|
|
8
12
|
renderPrimitive
|
|
9
13
|
} from "./chunk-T3ZFZ3NP.js";
|
|
@@ -14,32 +18,10 @@ import {
|
|
|
14
18
|
useMessage,
|
|
15
19
|
useMessagePart,
|
|
16
20
|
useOptionalMessagePart
|
|
17
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-JMGFSYCR.js";
|
|
18
22
|
|
|
19
23
|
// src/message/actions.tsx
|
|
20
24
|
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
25
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
44
26
|
var MessageActions = forwardRef(
|
|
45
27
|
function MessageActions2(props, ref) {
|
|
@@ -108,7 +90,7 @@ var MessageRegenerate = forwardRef(
|
|
|
108
90
|
const chat = useChatContext();
|
|
109
91
|
const { message } = useMessage();
|
|
110
92
|
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);
|
|
93
|
+
const disabled = props.disabled ?? (chat.status === "submitted" || chat.status === "streaming" || message.role !== "assistant" || latestAssistantMessage?.id !== message.id);
|
|
112
94
|
const handleClick = useCallback(
|
|
113
95
|
(event) => {
|
|
114
96
|
onClick?.(event);
|
|
@@ -530,12 +512,15 @@ var MessageParts = forwardRef3(function MessageParts2({ children, filter, stream
|
|
|
530
512
|
});
|
|
531
513
|
var SmoothedMessageParts = forwardRef3(
|
|
532
514
|
function SmoothedMessageParts2({ children, parts, stream, ...props }, ref) {
|
|
533
|
-
const
|
|
515
|
+
const streamOptions = {
|
|
534
516
|
adapter: messagePartStreamAdapter,
|
|
535
517
|
isStreaming: stream.isStreaming,
|
|
536
|
-
resetKey: stream.resetKey
|
|
537
|
-
|
|
538
|
-
|
|
518
|
+
resetKey: stream.resetKey
|
|
519
|
+
};
|
|
520
|
+
if (stream.flushImmediately !== void 0) {
|
|
521
|
+
Object.assign(streamOptions, { flushImmediately: stream.flushImmediately });
|
|
522
|
+
}
|
|
523
|
+
const smooth = useSmoothStreamItems(parts, streamOptions);
|
|
539
524
|
return renderPrimitive(
|
|
540
525
|
"div",
|
|
541
526
|
{
|
|
@@ -594,11 +579,14 @@ var MessageText = forwardRef3(function MessageText2(props, ref) {
|
|
|
594
579
|
var MessageTextContent = forwardRef3(
|
|
595
580
|
function MessageTextContent2({ content, partId, stream, streamControlled, ...props }, ref) {
|
|
596
581
|
const ownsStream = stream !== void 0 && !streamControlled && props.children === void 0;
|
|
597
|
-
const
|
|
582
|
+
const streamOptions = {
|
|
598
583
|
isStreaming: ownsStream ? stream.isStreaming : false,
|
|
599
|
-
resetKey: ownsStream ? stream.resetKey : partId
|
|
600
|
-
|
|
601
|
-
|
|
584
|
+
resetKey: ownsStream ? stream.resetKey : partId
|
|
585
|
+
};
|
|
586
|
+
if (ownsStream && stream.flushImmediately !== void 0) {
|
|
587
|
+
Object.assign(streamOptions, { flushImmediately: stream.flushImmediately });
|
|
588
|
+
}
|
|
589
|
+
const smooth = useSmoothStreamText(content, streamOptions);
|
|
602
590
|
return renderPrimitive(
|
|
603
591
|
"span",
|
|
604
592
|
{
|
|
@@ -656,11 +644,14 @@ var MessageMarkdownContent = forwardRef3(
|
|
|
656
644
|
...props
|
|
657
645
|
}, ref) {
|
|
658
646
|
const ownsStream = stream !== void 0 && !streamControlled;
|
|
659
|
-
const
|
|
647
|
+
const streamOptions = {
|
|
660
648
|
isStreaming: ownsStream ? stream.isStreaming : false,
|
|
661
|
-
resetKey: ownsStream ? stream.resetKey : resetKey
|
|
662
|
-
|
|
663
|
-
|
|
649
|
+
resetKey: ownsStream ? stream.resetKey : resetKey
|
|
650
|
+
};
|
|
651
|
+
if (ownsStream && stream.flushImmediately !== void 0) {
|
|
652
|
+
Object.assign(streamOptions, { flushImmediately: stream.flushImmediately });
|
|
653
|
+
}
|
|
654
|
+
const smooth = useSmoothStreamText(markdown, streamOptions);
|
|
664
655
|
const renderedMarkdown = ownsStream ? smooth.text : markdown;
|
|
665
656
|
const renderedEntities = useMemo(
|
|
666
657
|
() => entities.length === 0 ? entities : validComposerEntities(renderedMarkdown, {
|
|
@@ -1057,4 +1048,4 @@ export {
|
|
|
1057
1048
|
shiftComposerEntityRanges,
|
|
1058
1049
|
Message
|
|
1059
1050
|
};
|
|
1060
|
-
//# sourceMappingURL=chunk-
|
|
1051
|
+
//# sourceMappingURL=chunk-BZZ7MJNM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/message/actions.tsx","../src/message/entity.tsx","../src/message/parts.tsx","../src/entities.ts","../src/message/markdown-entities.ts","../src/message/root.tsx","../src/message/index.ts"],"sourcesContent":["import { forwardRef, type MouseEvent, useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { useChatContext, useMessage } from \"../contexts\";\nimport { messageText } from \"../format\";\nimport { type PrimitiveProps, renderPrimitive } from \"../primitives\";\n\nconst MessageActions = forwardRef<HTMLDivElement, PrimitiveProps<\"div\">>(\n function MessageActions(props, ref) {\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: props.children ?? (\n <>\n <MessageCopy />\n <MessageRegenerate />\n </>\n ),\n \"data-anvia-message-actions\": \"\",\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\ntype MessageCopyState = \"idle\" | \"copied\" | \"error\";\n\nconst MessageCopy = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(function MessageCopy(\n { onClick, ...props },\n ref,\n) {\n const { message } = useMessage();\n const [copyState, setCopyState] = useState<MessageCopyState>(\"idle\");\n const text = messageText(message);\n const previousTextRef = useRef(text);\n const disabled = props.disabled ?? text.length === 0;\n\n useEffect(() => {\n if (previousTextRef.current !== text) {\n previousTextRef.current = text;\n setCopyState(\"idle\");\n }\n }, [text]);\n\n const handleClick = useCallback(\n async (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n const writeText = navigator.clipboard?.writeText;\n if (writeText === undefined) {\n setCopyState(\"error\");\n return;\n }\n try {\n await writeText.call(navigator.clipboard, text);\n setCopyState(\"copied\");\n } catch {\n setCopyState(\"error\");\n }\n },\n [disabled, onClick, text],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Copy\",\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-anvia-copy\": \"\",\n \"data-state\": copyState,\n } as PrimitiveProps<\"button\">,\n ref,\n );\n});\n\nconst MessageRegenerate = forwardRef<HTMLButtonElement, PrimitiveProps<\"button\">>(\n function MessageRegenerate({ onClick, ...props }, ref) {\n const chat = useChatContext();\n const { message } = useMessage();\n const latestAssistantMessage = [...chat.messages]\n .reverse()\n .find((item) => item.role === \"assistant\");\n const disabled =\n props.disabled ??\n (chat.status === \"submitted\" ||\n chat.status === \"streaming\" ||\n message.role !== \"assistant\" ||\n latestAssistantMessage?.id !== message.id);\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n return;\n }\n void chat.regenerate();\n },\n [chat, disabled, onClick],\n );\n\n return renderPrimitive(\n \"button\",\n {\n ...props,\n children: props.children ?? \"Regenerate\",\n disabled,\n onClick: handleClick,\n type: props.type ?? \"button\",\n \"data-anvia-regenerate\": \"\",\n \"data-state\": disabled ? \"disabled\" : \"idle\",\n } as PrimitiveProps<\"button\">,\n ref,\n );\n },\n);\n\nexport { MessageActions, MessageCopy, MessageRegenerate };\n","import { forwardRef, type HTMLAttributes } from \"react\";\nimport type { ComposerEntity } from \"../contexts\";\n\nexport type MessageEntityProps = HTMLAttributes<HTMLSpanElement> & {\n entity: ComposerEntity;\n};\n\nconst MessageEntity = forwardRef<HTMLSpanElement, MessageEntityProps>(function MessageEntity(\n { children, entity, ...props },\n ref,\n) {\n return (\n <span\n {...props}\n data-anvia-message-entity=\"\"\n data-entity-id={entity.id}\n data-trigger-id={entity.triggerId}\n ref={ref}\n >\n {children ?? entity.text}\n </span>\n );\n});\n\nexport { MessageEntity };\n","import type { UIAttachment, UIMessagePart } from \"@anvia/client\";\nimport {\n type SmoothStreamItemAdapter,\n type StreamSmoothingLifecycle,\n useSmoothStreamItems,\n useSmoothStreamText,\n} from \"@anvia/react\";\nimport {\n type ComponentPropsWithoutRef,\n createElement,\n forwardRef,\n type ReactNode,\n useMemo,\n} from \"react\";\nimport type { Components, Options as ReactMarkdownOptions } from \"react-markdown\";\nimport remarkGfm from \"remark-gfm\";\n\nimport { Attachment } from \"../attachment/index\";\nimport type { ComposerEntity } from \"../contexts\";\nimport {\n InternalAttachmentProvider,\n InternalMessagePartProvider,\n useMessage,\n useMessagePart,\n useOptionalMessagePart,\n} from \"../contexts\";\nimport { entitiesForTextSegment, messageTextLayout, validComposerEntities } from \"../entities\";\nimport { stringifyValue } from \"../format\";\nimport { type PrimitiveProps, renderPrimitive } from \"../primitives\";\nimport { StreamMarkdown } from \"../stream\";\nimport { MessageEntity } from \"./entity\";\nimport { createMessageEntityRemarkPlugin, messageEntityRehypeOptions } from \"./markdown-entities\";\n\ntype MessagePartChildren = ReactNode | ((part: UIMessagePart) => ReactNode);\nexport type MessagePartsFilter = (part: UIMessagePart) => boolean;\nexport type MessageToolPart = Extract<UIMessagePart, { type: \"tool\" }>;\ntype MessageToolChildren = ReactNode | ((part: MessageToolPart) => ReactNode);\nexport type MessageToolRenderWhen = \"always\" | \"pending\" | \"settled\";\nexport type MessageAttachmentPart = Extract<UIMessagePart, { type: \"attachment\" }>;\ntype MessageAttachmentChildren = ReactNode | ((attachment: UIAttachment) => ReactNode);\n\nexport type MessageStreamOptions = StreamSmoothingLifecycle;\n\ntype MessageStreamProps = {\n stream?: MessageStreamOptions;\n};\n\nconst messagePartStreamAdapter: SmoothStreamItemAdapter<UIMessagePart> = {\n getKey: (part) => part.id,\n getText: (part) => (part.type === \"text\" || part.type === \"reasoning\" ? part.text : undefined),\n withText: (part, text) => {\n if (part.type === \"text\" || part.type === \"reasoning\") {\n return part.text === text ? part : { ...part, text };\n }\n return part;\n },\n};\n\ntype MessagePartsProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n children?: MessagePartChildren;\n filter?: MessagePartsFilter;\n} & MessageStreamProps;\n\nconst MessageParts = forwardRef<HTMLDivElement, MessagePartsProps>(function MessageParts(\n { children, filter, stream, ...props },\n ref,\n) {\n const { message } = useMessage();\n const parts = filter === undefined ? message.parts : message.parts.filter(filter);\n if (stream !== undefined) {\n return (\n <SmoothedMessageParts {...props} parts={parts} ref={ref} stream={stream}>\n {children}\n </SmoothedMessageParts>\n );\n }\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: renderMessagePartNodes(parts, children),\n \"data-anvia-message-parts\": \"\",\n } as PrimitiveProps<\"div\">,\n ref,\n );\n});\n\ntype SmoothedMessagePartsProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n children?: MessagePartChildren;\n parts: readonly UIMessagePart[];\n stream: MessageStreamOptions;\n};\n\nconst SmoothedMessageParts = forwardRef<HTMLDivElement, SmoothedMessagePartsProps>(\n function SmoothedMessageParts({ children, parts, stream, ...props }, ref) {\n const streamOptions = {\n adapter: messagePartStreamAdapter,\n isStreaming: stream.isStreaming,\n resetKey: stream.resetKey,\n };\n if (stream.flushImmediately !== undefined) {\n Object.assign(streamOptions, { flushImmediately: stream.flushImmediately });\n }\n const smooth = useSmoothStreamItems(parts, streamOptions);\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: renderMessagePartNodes(smooth.items, children, smooth.liveItemKey),\n \"data-anvia-message-parts\": \"\",\n \"data-draining\": smooth.isDraining ? \"\" : undefined,\n \"data-streaming\": stream.isStreaming ? \"\" : undefined,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\nfunction renderMessagePartNodes(\n parts: readonly UIMessagePart[],\n children: MessagePartChildren | undefined,\n liveItemKey?: string | null,\n): ReactNode[] {\n return parts.map((part) => (\n <InternalMessagePartProvider\n isLive={liveItemKey === part.id}\n key={part.id}\n part={part}\n streamControlled={liveItemKey !== undefined}\n >\n {typeof children === \"function\" ? children(part) : (children ?? <MessagePart />)}\n </InternalMessagePartProvider>\n ));\n}\n\ntype MessagePartProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n children?: MessagePartChildren;\n};\n\nconst MessagePart = forwardRef<HTMLDivElement, MessagePartProps>(function MessagePart(\n { children, ...props },\n ref,\n) {\n const { part } = useMessagePart();\n const renderedChildren =\n typeof children === \"function\" ? children(part) : (children ?? defaultPart(part));\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: renderedChildren,\n \"data-anvia-part\": \"\",\n \"data-part\": part.type,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n});\n\ntype MessageTextProps = PrimitiveProps<\"span\"> & MessageStreamProps;\n\nconst MessageText = forwardRef<HTMLSpanElement, MessageTextProps>(function MessageText(props, ref) {\n const { part, streamControlled } = useMessagePart();\n if (part.type !== \"text\") {\n return null;\n }\n\n return (\n <MessageTextContent\n {...props}\n content={part.text}\n partId={part.id}\n ref={ref}\n streamControlled={streamControlled}\n />\n );\n});\n\ntype MessageTextContentProps = MessageTextProps & {\n content: string;\n partId: string;\n streamControlled: boolean;\n};\n\nconst MessageTextContent = forwardRef<HTMLSpanElement, MessageTextContentProps>(\n function MessageTextContent({ content, partId, stream, streamControlled, ...props }, ref) {\n const ownsStream = stream !== undefined && !streamControlled && props.children === undefined;\n const streamOptions = {\n isStreaming: ownsStream ? stream.isStreaming : false,\n resetKey: ownsStream ? stream.resetKey : partId,\n };\n if (ownsStream && stream.flushImmediately !== undefined) {\n Object.assign(streamOptions, { flushImmediately: stream.flushImmediately });\n }\n const smooth = useSmoothStreamText(content, streamOptions);\n\n return renderPrimitive(\n \"span\",\n {\n ...props,\n children: props.children ?? (ownsStream ? smooth.text : content),\n \"data-anvia-text\": \"\",\n \"data-draining\": ownsStream && smooth.isDraining ? \"\" : undefined,\n \"data-streaming\": ownsStream && stream.isStreaming ? \"\" : undefined,\n } as PrimitiveProps<\"span\">,\n ref,\n );\n },\n);\n\ntype MessageMarkdownProps = Omit<PrimitiveProps<\"div\">, \"children\"> &\n MessageStreamProps & {\n children?: string;\n components?: Components;\n renderEntity?: ((entity: ComposerEntity) => ReactNode) | undefined;\n remarkPlugins?: ReactMarkdownOptions[\"remarkPlugins\"];\n };\n\nconst MessageMarkdown = forwardRef<HTMLDivElement, MessageMarkdownProps>(function MessageMarkdown(\n { children, ...props },\n ref,\n) {\n const { message } = useMessage();\n const partContext = useOptionalMessagePart();\n const part = partContext?.part;\n if (part !== undefined && part.type !== \"text\") {\n return null;\n }\n\n const layout = messageTextLayout(message.parts);\n const markdown = children ?? (part?.type === \"text\" ? part.text : layout.text);\n const expectedMarkdown = part?.type === \"text\" ? part.text : layout.text;\n const validEntities =\n children === undefined || children === expectedMarkdown\n ? validComposerEntities(layout.text, message.metadata)\n : [];\n const segment =\n part?.type === \"text\"\n ? layout.segments.find((candidate) => candidate.part.id === part.id)\n : undefined;\n const entities =\n segment === undefined ? validEntities : entitiesForTextSegment(validEntities, segment);\n const lastPart = message.parts.at(-1);\n const liveEligible = part?.type === \"text\" ? lastPart?.id === part.id : lastPart?.type === \"text\";\n\n return (\n <MessageMarkdownContent\n {...props}\n entities={entities}\n liveEligible={liveEligible}\n markdown={markdown}\n ref={ref}\n resetKey={message.id}\n streamControlled={partContext?.streamControlled ?? false}\n streamLive={partContext?.isLive ?? false}\n />\n );\n});\n\ntype MessageMarkdownContentProps = Omit<MessageMarkdownProps, \"children\"> & {\n entities: ComposerEntity[];\n liveEligible: boolean;\n markdown: string;\n resetKey: string;\n streamControlled: boolean;\n streamLive: boolean;\n};\n\nconst MessageMarkdownContent = forwardRef<HTMLDivElement, MessageMarkdownContentProps>(\n function MessageMarkdownContent(\n {\n components,\n renderEntity,\n remarkPlugins,\n entities,\n liveEligible,\n markdown,\n resetKey,\n stream,\n streamControlled,\n streamLive,\n ...props\n },\n ref,\n ) {\n const ownsStream = stream !== undefined && !streamControlled;\n const streamOptions = {\n isStreaming: ownsStream ? stream.isStreaming : false,\n resetKey: ownsStream ? stream.resetKey : resetKey,\n };\n if (ownsStream && stream.flushImmediately !== undefined) {\n Object.assign(streamOptions, { flushImmediately: stream.flushImmediately });\n }\n const smooth = useSmoothStreamText(markdown, streamOptions);\n const renderedMarkdown = ownsStream ? smooth.text : markdown;\n const renderedEntities = useMemo(\n () =>\n entities.length === 0\n ? entities\n : validComposerEntities(renderedMarkdown, {\n composer: { entities },\n }),\n [entities, renderedMarkdown],\n );\n const renderedComponents = useMemo(\n () => markdownComponents(components, renderedEntities, renderEntity),\n [components, renderEntity, renderedEntities],\n );\n const renderedRemarkPlugins = useMemo(\n () =>\n renderedEntities.length === 0\n ? remarkPlugins\n : [\n createMessageEntityRemarkPlugin(renderedMarkdown, renderedEntities),\n ...(remarkPlugins ?? [remarkGfm]),\n ],\n [remarkPlugins, renderedEntities, renderedMarkdown],\n );\n const live = streamControlled\n ? streamLive\n : ownsStream && liveEligible && (stream.isStreaming || smooth.isDraining);\n\n return (\n <StreamMarkdown\n {...props}\n components={renderedComponents}\n content={renderedMarkdown}\n data-anvia-markdown=\"\"\n data-draining={ownsStream && smooth.isDraining ? \"\" : undefined}\n data-streaming={ownsStream && stream.isStreaming ? \"\" : undefined}\n live={live}\n ref={ref}\n remarkPlugins={renderedRemarkPlugins}\n remarkRehypeOptions={\n renderedEntities.length === 0 ? undefined : messageEntityRehypeOptions()\n }\n />\n );\n },\n);\n\nfunction markdownComponents(\n components: Components | undefined,\n entities: ComposerEntity[],\n renderEntity: ((entity: ComposerEntity) => ReactNode) | undefined,\n): Components {\n const consumerSpan = components?.span;\n return {\n code: defaultCodeComponent,\n pre: defaultPreComponent,\n ...components,\n span(spanProps) {\n const internalProps = spanProps as typeof spanProps & {\n \"data-anvia-entity-index\"?: string | undefined;\n };\n const entityIndexValue = internalProps[\"data-anvia-entity-index\"];\n const entityIndex =\n typeof entityIndexValue === \"string\" && /^\\d+$/.test(entityIndexValue)\n ? Number(entityIndexValue)\n : undefined;\n const entity = entityIndex === undefined ? undefined : entities[entityIndex];\n const consumerProps = { ...internalProps };\n delete consumerProps[\"data-anvia-entity-index\"];\n\n if (entity !== undefined) {\n if (renderEntity !== undefined) {\n return renderEntity(entity);\n }\n const entityProps = {\n ...consumerProps,\n \"data-anvia-message-entity\": \"\",\n \"data-entity-id\": entity.id,\n \"data-trigger-id\": entity.triggerId,\n };\n if (consumerSpan !== undefined) {\n return createElement(consumerSpan, entityProps);\n }\n const { node: _node, ...elementProps } = entityProps;\n return <MessageEntity {...elementProps} entity={entity} />;\n }\n\n if (consumerSpan !== undefined) {\n return createElement(consumerSpan, consumerProps);\n }\n const { node: _node, ...elementProps } = consumerProps;\n return <span {...elementProps} />;\n },\n };\n}\n\ntype MessageCodeBlockProps = Omit<PrimitiveProps<\"pre\">, \"children\"> & {\n children?: ReactNode;\n code?: string;\n language?: string;\n};\n\nconst MessageCodeBlock = forwardRef<HTMLPreElement, MessageCodeBlockProps>(\n function MessageCodeBlock({ children, code, language, ...props }, ref) {\n return renderPrimitive(\n \"pre\",\n {\n ...props,\n children: children ?? (\n <code data-anvia-code=\"\" data-language={language}>\n {code ?? \"\"}\n </code>\n ),\n \"data-anvia-code-block\": \"\",\n \"data-language\": language,\n } as PrimitiveProps<\"pre\">,\n ref,\n );\n },\n);\n\nconst MessageReasoning = forwardRef<HTMLDetailsElement, PrimitiveProps<\"details\">>(\n function MessageReasoning(props, ref) {\n const { part } = useMessagePart();\n if (part.type !== \"reasoning\") {\n return null;\n }\n\n return renderPrimitive(\n \"details\",\n {\n ...props,\n children: props.children ?? (\n <>\n <summary>Reasoning</summary>\n <pre>{part.text}</pre>\n </>\n ),\n \"data-anvia-reasoning\": \"\",\n } as PrimitiveProps<\"details\">,\n ref,\n );\n },\n);\n\ntype MessageToolProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n children?: MessageToolChildren;\n renderWhen?: MessageToolRenderWhen;\n};\n\nconst MessageTool = forwardRef<HTMLDivElement, MessageToolProps>(function MessageTool(\n { children, renderWhen = \"always\", ...props },\n ref,\n) {\n const { part } = useMessagePart();\n if (part.type !== \"tool\" || !shouldRenderTool(part, renderWhen)) {\n return null;\n }\n const renderedChildren =\n typeof children === \"function\" ? children(part) : (children ?? defaultToolContent());\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: renderedChildren,\n \"data-anvia-tool\": \"\",\n \"data-state\": part.state,\n } as PrimitiveProps<\"div\">,\n ref,\n );\n});\n\nconst MessageToolName = forwardRef<HTMLSpanElement, PrimitiveProps<\"span\">>(\n function MessageToolName(props, ref) {\n const { part } = useMessagePart();\n if (part.type !== \"tool\") {\n return null;\n }\n\n return renderPrimitive(\n \"span\",\n {\n ...props,\n children: props.children ?? part.toolName,\n \"data-anvia-tool-name\": \"\",\n } as PrimitiveProps<\"span\">,\n ref,\n );\n },\n);\n\nconst MessageToolStatus = forwardRef<HTMLSpanElement, PrimitiveProps<\"span\">>(\n function MessageToolStatus(props, ref) {\n const { part } = useMessagePart();\n if (part.type !== \"tool\") {\n return null;\n }\n\n return renderPrimitive(\n \"span\",\n {\n ...props,\n children: props.children ?? toolStateLabel(part.state),\n \"data-anvia-tool-status\": \"\",\n \"data-state\": part.state,\n } as PrimitiveProps<\"span\">,\n ref,\n );\n },\n);\n\nconst MessageToolInput = forwardRef<HTMLPreElement, PrimitiveProps<\"pre\">>(\n function MessageToolInput(props, ref) {\n const { part } = useMessagePart();\n if (part.type !== \"tool\" || part.input === undefined) {\n return null;\n }\n\n return renderPrimitive(\n \"pre\",\n {\n ...props,\n children: props.children ?? stringifyValue(part.input),\n \"data-anvia-tool-input\": \"\",\n } as PrimitiveProps<\"pre\">,\n ref,\n );\n },\n);\n\nconst MessageToolOutput = forwardRef<HTMLPreElement, PrimitiveProps<\"pre\">>(\n function MessageToolOutput(props, ref) {\n const { part } = useMessagePart();\n if (part.type !== \"tool\" || part.output === undefined) {\n return null;\n }\n\n return renderPrimitive(\n \"pre\",\n {\n ...props,\n children: props.children ?? stringifyValue(part.output),\n \"data-anvia-tool-output\": \"\",\n } as PrimitiveProps<\"pre\">,\n ref,\n );\n },\n);\n\nconst MessageToolError = forwardRef<HTMLDivElement, PrimitiveProps<\"div\">>(\n function MessageToolError(props, ref) {\n const { part } = useMessagePart();\n if (part.type !== \"tool\" || part.error === undefined) {\n return null;\n }\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: props.children ?? part.error.message,\n \"data-anvia-tool-error\": \"\",\n role: props.role ?? \"alert\",\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\ntype MessageAttachmentProps = Omit<PrimitiveProps<\"div\">, \"children\"> & {\n children?: MessageAttachmentChildren;\n};\n\nconst MessageAttachment = forwardRef<HTMLDivElement, MessageAttachmentProps>(\n function MessageAttachment({ children, ...props }, ref) {\n const { part } = useMessagePart();\n if (part.type !== \"attachment\") {\n return null;\n }\n const renderedChildren =\n typeof children === \"function\"\n ? children(part.attachment)\n : (children ?? <Attachment.Root />);\n\n return (\n <InternalAttachmentProvider value={{ attachment: part.attachment }}>\n {renderPrimitive(\n \"div\",\n {\n ...props,\n children: renderedChildren,\n \"data-anvia-message-attachment\": \"\",\n } as PrimitiveProps<\"div\">,\n ref,\n )}\n </InternalAttachmentProvider>\n );\n },\n);\n\nconst MessageData = forwardRef<HTMLPreElement, PrimitiveProps<\"pre\">>(\n function MessageData(props, ref) {\n const { part } = useMessagePart();\n if (part.type !== \"data\") {\n return null;\n }\n\n return renderPrimitive(\n \"pre\",\n {\n ...props,\n children: props.children ?? stringifyValue(part.data),\n \"data-anvia-data\": \"\",\n \"data-name\": part.name,\n } as PrimitiveProps<\"pre\">,\n ref,\n );\n },\n);\n\nconst MessageError = forwardRef<HTMLDivElement, PrimitiveProps<\"div\">>(\n function MessageError(props, ref) {\n const { part } = useMessagePart();\n if (part.type !== \"error\") {\n return null;\n }\n\n return renderPrimitive(\n \"div\",\n {\n ...props,\n children: props.children ?? part.error.message,\n \"data-anvia-error\": \"\",\n role: props.role ?? \"alert\",\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\nfunction defaultPart(part: UIMessagePart): ReactNode {\n if (part.type === \"text\") {\n return <MessageText />;\n }\n if (part.type === \"reasoning\") {\n return <MessageReasoning />;\n }\n if (part.type === \"tool\") {\n return <MessageTool />;\n }\n if (part.type === \"attachment\") {\n return <MessageAttachment />;\n }\n if (part.type === \"data\") {\n return <MessageData />;\n }\n return <MessageError />;\n}\n\nfunction defaultToolContent(): ReactNode {\n return (\n <>\n <MessageToolName />\n <MessageToolStatus />\n <MessageToolInput />\n <MessageToolOutput />\n <MessageToolError />\n </>\n );\n}\n\nfunction defaultCodeComponent({\n children,\n className,\n node: _node,\n ...props\n}: ComponentPropsWithoutRef<\"code\"> & { node?: unknown }): ReactNode {\n const language = /language-(\\S+)/.exec(className ?? \"\")?.[1];\n\n return (\n <code\n className={className}\n data-anvia-code=\"\"\n data-anvia-inline-code={language === undefined ? \"\" : undefined}\n data-language={language}\n {...props}\n >\n {children}\n </code>\n );\n}\n\nfunction defaultPreComponent({\n children,\n node: _node,\n ...props\n}: ComponentPropsWithoutRef<\"pre\"> & { node?: unknown }): ReactNode {\n return <MessageCodeBlock {...props}>{children}</MessageCodeBlock>;\n}\n\nfunction shouldRenderTool(part: MessageToolPart, renderWhen: MessageToolRenderWhen): boolean {\n if (renderWhen === \"always\") {\n return true;\n }\n if (renderWhen === \"pending\") {\n return part.state === \"input-streaming\" || part.state === \"input-available\";\n }\n return part.state === \"output-available\" || part.state === \"error\";\n}\n\nfunction toolStateLabel(state: MessageToolPart[\"state\"]): string {\n if (state === \"output-available\") {\n return \"Done\";\n }\n if (state === \"error\") {\n return \"Error\";\n }\n return \"Running\";\n}\n\nexport {\n MessageAttachment,\n MessageCodeBlock,\n MessageData,\n MessageError,\n MessageMarkdown,\n MessagePart,\n MessageParts,\n MessageReasoning,\n MessageText,\n MessageTool,\n MessageToolError,\n MessageToolInput,\n MessageToolName,\n MessageToolOutput,\n MessageToolStatus,\n};\n","import type { UIMessagePart } from \"@anvia/client\";\nimport type { ComposerEntity } from \"./contexts/composer\";\n\nexport type MessageTextSegment = {\n part: Extract<UIMessagePart, { type: \"text\" }>;\n from: number;\n to: number;\n};\n\nexport type MessageTextLayout = {\n text: string;\n segments: MessageTextSegment[];\n};\n\nexport function messageTextLayout(parts: readonly UIMessagePart[]): MessageTextLayout {\n const textParts = parts.filter(\n (part): part is Extract<UIMessagePart, { type: \"text\" }> => part.type === \"text\",\n );\n const segments: MessageTextSegment[] = [];\n let offset = 0;\n\n for (const [index, part] of textParts.entries()) {\n const from = offset;\n const to = from + part.text.length;\n segments.push({ part, from, to });\n offset = to + (index === textParts.length - 1 ? 0 : 2);\n }\n\n return {\n text: textParts.map((part) => part.text).join(\"\\n\\n\"),\n segments,\n };\n}\n\nexport function validComposerEntities(text: string, metadata: unknown): ComposerEntity[] {\n const candidates = composerEntityCandidates(metadata);\n const individuallyValid = candidates.flatMap((entity, index) =>\n isValidComposerEntity(entity, text) ? [{ entity, index }] : [],\n );\n individuallyValid.sort(\n (left, right) =>\n left.entity.range.from - right.entity.range.from ||\n left.entity.range.to - right.entity.range.to ||\n left.index - right.index,\n );\n\n const overlapping = new Set<number>();\n let groupStart = 0;\n let groupEnd = individuallyValid[0]?.entity.range.to ?? 0;\n let groupHasOverlap = false;\n for (let index = 1; index <= individuallyValid.length; index += 1) {\n const current = individuallyValid[index];\n if (current !== undefined && current.entity.range.from < groupEnd) {\n groupHasOverlap = true;\n groupEnd = Math.max(groupEnd, current.entity.range.to);\n continue;\n }\n if (groupHasOverlap) {\n for (let groupIndex = groupStart; groupIndex < index; groupIndex += 1) {\n const candidate = individuallyValid[groupIndex];\n if (candidate !== undefined) {\n overlapping.add(candidate.index);\n }\n }\n }\n groupStart = index;\n groupEnd = current?.entity.range.to ?? 0;\n groupHasOverlap = false;\n }\n\n return individuallyValid\n .filter((candidate) => !overlapping.has(candidate.index))\n .map((candidate) => candidate.entity);\n}\n\nexport function entitiesForTextSegment(\n entities: ComposerEntity[],\n segment: MessageTextSegment,\n): ComposerEntity[] {\n return entities.flatMap((entity) => {\n if (entity.range.from < segment.from || entity.range.to > segment.to) {\n return [];\n }\n return [\n {\n ...entity,\n range: {\n from: entity.range.from - segment.from,\n to: entity.range.to - segment.from,\n },\n },\n ];\n });\n}\n\nexport function shiftComposerEntityRanges(\n entities: ComposerEntity[],\n offset: number,\n): ComposerEntity[] {\n if (offset === 0) {\n return entities;\n }\n return entities.map((entity) => ({\n ...entity,\n range: {\n from: entity.range.from + offset,\n to: entity.range.to + offset,\n },\n }));\n}\n\nfunction composerEntityCandidates(metadata: unknown): unknown[] {\n if (!isRecord(metadata) || !isRecord(metadata.composer)) {\n return [];\n }\n return Array.isArray(metadata.composer.entities) ? metadata.composer.entities : [];\n}\n\nfunction isValidComposerEntity(value: unknown, text: string): value is ComposerEntity {\n if (!isRecord(value) || !isRecord(value.range)) {\n return false;\n }\n if (\n !isNonEmptyString(value.id) ||\n !isNonEmptyString(value.triggerId) ||\n !isNonEmptyString(value.trigger) ||\n !isNonEmptyString(value.label) ||\n !isNonEmptyString(value.text)\n ) {\n return false;\n }\n const { from, to } = value.range;\n return (\n typeof from === \"number\" &&\n typeof to === \"number\" &&\n Number.isInteger(from) &&\n Number.isInteger(to) &&\n from >= 0 &&\n to > from &&\n to <= text.length &&\n text.slice(from, to) === value.text\n );\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.length > 0;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import type { Options as ReactMarkdownOptions } from \"react-markdown\";\nimport type { ComposerEntity } from \"../contexts\";\n\ntype MarkdownPoint = {\n offset?: number | undefined;\n};\n\ntype MarkdownPosition = {\n start: MarkdownPoint;\n end: MarkdownPoint;\n};\n\ntype MarkdownNode = {\n type: string;\n value?: string | undefined;\n children?: MarkdownNode[] | undefined;\n position?: MarkdownPosition | undefined;\n entityIndex?: number | undefined;\n};\n\nconst phrasingParentTypes = new Set([\n \"paragraph\",\n \"heading\",\n \"emphasis\",\n \"strong\",\n \"delete\",\n \"link\",\n \"linkReference\",\n \"tableCell\",\n]);\nconst literalNodeTypes = new Set([\"code\", \"inlineCode\", \"html\", \"yaml\"]);\n\nexport function createMessageEntityRemarkPlugin(markdown: string, entities: ComposerEntity[]) {\n return function messageEntityRemarkPlugin() {\n return (tree: MarkdownNode): void => {\n const rendered = new Set<number>();\n transformNode(tree, markdown, entities, rendered);\n };\n };\n}\n\nexport function messageEntityRehypeOptions(): ReactMarkdownOptions[\"remarkRehypeOptions\"] {\n return {\n handlers: {\n messageEntity(_state: unknown, node: MarkdownNode) {\n const entityIndex = node.entityIndex;\n return {\n type: \"element\",\n tagName: \"span\",\n properties: {\n dataAnviaMessageEntity: \"\",\n dataAnviaEntityIndex: entityIndex === undefined ? \"\" : String(entityIndex),\n },\n children: [{ type: \"text\", value: node.value ?? \"\" }],\n };\n },\n } as never,\n };\n}\n\nfunction transformNode(\n node: MarkdownNode,\n markdown: string,\n entities: ComposerEntity[],\n rendered: Set<number>,\n): void {\n if (literalNodeTypes.has(node.type) || node.children === undefined) {\n return;\n }\n\n for (const child of node.children) {\n transformNode(child, markdown, entities, rendered);\n }\n if (!phrasingParentTypes.has(node.type)) {\n return;\n }\n\n for (let entityIndex = entities.length - 1; entityIndex >= 0; entityIndex -= 1) {\n if (rendered.has(entityIndex)) {\n continue;\n }\n const entity = entities[entityIndex];\n if (entity !== undefined && replaceEntity(node, markdown, entity, entityIndex)) {\n rendered.add(entityIndex);\n }\n }\n}\n\nfunction replaceEntity(\n parent: MarkdownNode,\n markdown: string,\n entity: ComposerEntity,\n entityIndex: number,\n): boolean {\n const children = parent.children;\n if (children === undefined) {\n return false;\n }\n const firstIndex = children.findIndex((child) => containsStart(child, entity.range.from));\n const lastIndex = findLastIndex(children, (child) => containsEnd(child, entity.range.to));\n if (firstIndex < 0 || lastIndex < firstIndex) {\n return false;\n }\n\n const first = children[firstIndex];\n const last = children[lastIndex];\n const firstPosition = offsets(first);\n const lastPosition = offsets(last);\n if (\n first === undefined ||\n last === undefined ||\n firstPosition === undefined ||\n lastPosition === undefined ||\n entity.range.from < firstPosition.from ||\n entity.range.to > lastPosition.to\n ) {\n return false;\n }\n\n if (firstIndex === lastIndex && literalNodeTypes.has(first.type)) {\n return false;\n }\n const before = contentBefore(first, markdown, entity);\n const after = contentAfter(last, markdown, entity);\n if (before === undefined || after === undefined) {\n return false;\n }\n\n const replacement: MarkdownNode[] = [];\n replacement.push(...before);\n replacement.push({\n type: \"messageEntity\",\n value: entity.text,\n entityIndex,\n position: {\n start: { offset: entity.range.from },\n end: { offset: entity.range.to },\n },\n });\n replacement.push(...after);\n children.splice(firstIndex, lastIndex - firstIndex + 1, ...replacement);\n return true;\n}\n\nfunction contentBefore(\n node: MarkdownNode,\n markdown: string,\n entity: ComposerEntity,\n): MarkdownNode[] | undefined {\n const position = offsets(node);\n if (position === undefined) {\n return undefined;\n }\n if (entity.range.from === position.from) {\n return [];\n }\n if (node.type !== \"text\" || node.value === undefined) {\n if (node.children === undefined || literalNodeTypes.has(node.type)) {\n return undefined;\n }\n const childIndex = node.children.findIndex((child) => containsStart(child, entity.range.from));\n const child = node.children[childIndex];\n if (child === undefined) {\n return undefined;\n }\n const childContent = contentBefore(child, markdown, entity);\n return childContent === undefined\n ? undefined\n : [...node.children.slice(0, childIndex), ...childContent];\n }\n const split = textValueRange(node, markdown, entity);\n if (split === undefined) {\n return undefined;\n }\n return [\n {\n ...node,\n value: node.value.slice(0, split.from),\n position: {\n start: node.position?.start ?? {},\n end: { offset: entity.range.from },\n },\n },\n ];\n}\n\nfunction contentAfter(\n node: MarkdownNode,\n markdown: string,\n entity: ComposerEntity,\n): MarkdownNode[] | undefined {\n const position = offsets(node);\n if (position === undefined) {\n return undefined;\n }\n if (entity.range.to === position.to) {\n return [];\n }\n if (node.type !== \"text\" || node.value === undefined) {\n if (node.children === undefined || literalNodeTypes.has(node.type)) {\n return undefined;\n }\n const childIndex = findLastIndex(node.children, (child) => containsEnd(child, entity.range.to));\n const child = node.children[childIndex];\n if (child === undefined) {\n return undefined;\n }\n const childContent = contentAfter(child, markdown, entity);\n return childContent === undefined\n ? undefined\n : [...childContent, ...node.children.slice(childIndex + 1)];\n }\n const split = textValueRange(node, markdown, entity);\n if (split === undefined) {\n return undefined;\n }\n return [\n {\n ...node,\n value: node.value.slice(split.to),\n position: {\n start: { offset: entity.range.to },\n end: node.position?.end ?? {},\n },\n },\n ];\n}\n\nfunction textValueRange(\n node: MarkdownNode,\n markdown: string,\n entity: ComposerEntity,\n): { from: number; to: number } | undefined {\n const position = offsets(node);\n const value = node.value;\n if (position === undefined || value === undefined) {\n return undefined;\n }\n const raw = markdown.slice(position.from, position.to);\n const relativeFrom = entity.range.from - position.from;\n const relativeTo = entity.range.to - position.from;\n if (raw === value) {\n return { from: relativeFrom, to: relativeTo };\n }\n\n const occurrence = countOccurrences(raw.slice(0, relativeFrom), entity.text);\n const valueFrom = occurrenceIndex(value, entity.text, occurrence);\n return valueFrom === undefined\n ? undefined\n : { from: valueFrom, to: valueFrom + entity.text.length };\n}\n\nfunction countOccurrences(value: string, search: string): number {\n let count = 0;\n let offset = 0;\n while (offset <= value.length - search.length) {\n const index = value.indexOf(search, offset);\n if (index < 0) {\n break;\n }\n count += 1;\n offset = index + search.length;\n }\n return count;\n}\n\nfunction occurrenceIndex(value: string, search: string, occurrence: number): number | undefined {\n let offset = 0;\n for (let index = 0; index <= occurrence; index += 1) {\n const found = value.indexOf(search, offset);\n if (found < 0) {\n return undefined;\n }\n if (index === occurrence) {\n return found;\n }\n offset = found + search.length;\n }\n return undefined;\n}\n\nfunction containsStart(node: MarkdownNode, offset: number): boolean {\n const position = offsets(node);\n return position !== undefined && offset >= position.from && offset < position.to;\n}\n\nfunction containsEnd(node: MarkdownNode, offset: number): boolean {\n const position = offsets(node);\n return position !== undefined && offset > position.from && offset <= position.to;\n}\n\nfunction offsets(node: MarkdownNode | undefined): { from: number; to: number } | undefined {\n const from = node?.position?.start.offset;\n const to = node?.position?.end.offset;\n return typeof from === \"number\" && typeof to === \"number\" ? { from, to } : undefined;\n}\n\nfunction findLastIndex<T>(items: T[], predicate: (item: T) => boolean): number {\n for (let index = items.length - 1; index >= 0; index -= 1) {\n const item = items[index];\n if (item !== undefined && predicate(item)) {\n return index;\n }\n }\n return -1;\n}\n","import type { UIMessage } from \"@anvia/client\";\nimport { forwardRef, type ReactNode } from \"react\";\n\nimport { useMessage } from \"../contexts\";\nimport { type PrimitiveProps, renderPrimitive } from \"../primitives\";\n\ntype MessageChildren = ReactNode | ((message: UIMessage) => ReactNode);\n\ntype MessageRootProps = Omit<PrimitiveProps<\"article\">, \"children\"> & {\n children?: MessageChildren;\n};\n\nconst MessageRoot = forwardRef<HTMLElement, MessageRootProps>(function MessageRoot(\n { children, ...props },\n ref,\n) {\n const { message } = useMessage();\n const renderedChildren = typeof children === \"function\" ? children(message) : children;\n\n return renderPrimitive(\n \"article\",\n {\n ...props,\n children: renderedChildren,\n \"data-anvia-message\": \"\",\n \"data-anvia-message-id\": message.id,\n \"data-role\": message.role,\n } as PrimitiveProps<\"article\">,\n ref,\n );\n});\n\nconst MessageContent = forwardRef<HTMLDivElement, PrimitiveProps<\"div\">>(\n function MessageContent(props, ref) {\n return renderPrimitive(\n \"div\",\n {\n ...props,\n \"data-anvia-message-content\": \"\",\n } as PrimitiveProps<\"div\">,\n ref,\n );\n },\n);\n\nexport { MessageContent, MessageRoot };\n","import { MessageActions, MessageCopy, MessageRegenerate } from \"./actions\";\nimport { MessageEntity } from \"./entity\";\nimport {\n MessageAttachment,\n MessageCodeBlock,\n MessageData,\n MessageError,\n MessageMarkdown,\n MessagePart,\n MessageParts,\n MessageReasoning,\n MessageText,\n MessageTool,\n MessageToolError,\n MessageToolInput,\n MessageToolName,\n MessageToolOutput,\n MessageToolStatus,\n} from \"./parts\";\nimport { MessageContent, MessageRoot } from \"./root\";\n\nexport const Message = {\n Root: MessageRoot,\n Content: MessageContent,\n Parts: MessageParts,\n Part: MessagePart,\n Text: MessageText,\n Markdown: MessageMarkdown,\n Entity: MessageEntity,\n CodeBlock: MessageCodeBlock,\n Reasoning: MessageReasoning,\n Tool: MessageTool,\n ToolName: MessageToolName,\n ToolInput: MessageToolInput,\n ToolOutput: MessageToolOutput,\n ToolError: MessageToolError,\n ToolStatus: MessageToolStatus,\n Attachment: MessageAttachment,\n Data: MessageData,\n Error: MessageError,\n Actions: MessageActions,\n Copy: MessageCopy,\n Regenerate: MessageRegenerate,\n} as const;\n\nexport type { MessageContextValue, MessagePartContextValue } from \"../contexts\";\nexport { useChatContext, useMessage, useMessagePart } from \"../contexts\";\nexport type { MessageEntityProps } from \"./entity\";\nexport type {\n MessageAttachmentPart,\n MessagePartsFilter,\n MessageStreamOptions,\n MessageToolPart,\n MessageToolRenderWhen,\n} from \"./parts\";\n"],"mappings":"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","names":["MessageActions","MessageCopy","MessageRegenerate","forwardRef","jsx","MessageEntity","forwardRef","child","Fragment","jsx","jsxs","forwardRef","MessageParts","SmoothedMessageParts","MessagePart","MessageText","MessageTextContent","MessageMarkdown","MessageMarkdownContent","_node","elementProps","MessageCodeBlock","MessageReasoning","MessageTool","MessageToolName","MessageToolStatus","MessageToolInput","MessageToolOutput","MessageToolError","MessageAttachment","MessageData","MessageError","forwardRef","forwardRef","MessageRoot","MessageContent"]}
|
|
@@ -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":[]}
|
|
@@ -21,11 +21,12 @@ function useOptionalAttachment() {
|
|
|
21
21
|
// src/contexts/chat.tsx
|
|
22
22
|
import { createContext as createContext2, createElement as createElement2, useContext as useContext2 } from "react";
|
|
23
23
|
var ChatContext = createContext2(void 0);
|
|
24
|
-
function ChatProvider({
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
}
|
|
28
|
-
|
|
24
|
+
function ChatProvider({ controller, children }) {
|
|
25
|
+
return createElement2(
|
|
26
|
+
ChatContext.Provider,
|
|
27
|
+
{ value: controller },
|
|
28
|
+
children
|
|
29
|
+
);
|
|
29
30
|
}
|
|
30
31
|
function useChatContext() {
|
|
31
32
|
const value = useContext2(ChatContext);
|
|
@@ -35,16 +36,29 @@ function useChatContext() {
|
|
|
35
36
|
return value;
|
|
36
37
|
}
|
|
37
38
|
function useHumanInput() {
|
|
38
|
-
|
|
39
|
+
const interactions = useChatContext().interactions;
|
|
40
|
+
const approvals = interactions.all.filter(
|
|
41
|
+
(item) => item.request.type === "tool-approval"
|
|
42
|
+
);
|
|
43
|
+
const questions = interactions.all.filter(
|
|
44
|
+
(item) => item.request.type === "tool-question"
|
|
45
|
+
);
|
|
46
|
+
return {
|
|
47
|
+
approvals: {
|
|
48
|
+
all: approvals,
|
|
49
|
+
pending: approvals.filter((item) => item.status === "pending")
|
|
50
|
+
},
|
|
51
|
+
questions: {
|
|
52
|
+
all: questions,
|
|
53
|
+
pending: questions.filter((item) => item.status === "pending")
|
|
54
|
+
}
|
|
55
|
+
};
|
|
39
56
|
}
|
|
40
57
|
|
|
41
58
|
// src/contexts/completion.tsx
|
|
42
59
|
import { createContext as createContext3, createElement as createElement3, useContext as useContext3 } from "react";
|
|
43
60
|
var CompletionContext = createContext3(void 0);
|
|
44
|
-
function CompletionProvider({
|
|
45
|
-
controller,
|
|
46
|
-
children
|
|
47
|
-
}) {
|
|
61
|
+
function CompletionProvider({ controller, children }) {
|
|
48
62
|
return createElement3(
|
|
49
63
|
CompletionContext.Provider,
|
|
50
64
|
{ value: controller },
|
|
@@ -310,4 +324,4 @@ export {
|
|
|
310
324
|
useThreadList,
|
|
311
325
|
useThreadListItem
|
|
312
326
|
};
|
|
313
|
-
//# sourceMappingURL=chunk-
|
|
327
|
+
//# sourceMappingURL=chunk-JMGFSYCR.js.map
|