From 2e54ba27f860fea260aeed162d7c1b0e0ef06982 Mon Sep 17 00:00:00 2001 From: Chris Nicholas Date: Tue, 26 Aug 2025 15:13:32 +0100 Subject: [PATCH 1/3] Fix changelog markdown (#2619) --- CHANGELOG_PUBLIC.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG_PUBLIC.md b/CHANGELOG_PUBLIC.md index 1b65b65423c..9fca7705be2 100644 --- a/CHANGELOG_PUBLIC.md +++ b/CHANGELOG_PUBLIC.md @@ -28,7 +28,7 @@ Tool calls will now stream in while under construction. This means that tools will render sooner and more often re-render, while `partialArgs` are streaming in. -> New behavior (>=3.4): +> New behavior (v3.4 and higher): > > - 1st render: `{ stage: "receiving", partialArgs: {} }` > - 2nd render: `{ stage: "receiving", partialArgs: { cities: [] } }` @@ -39,7 +39,7 @@ in. > - Then `{ stage: "executing", args: { cities: "Paris" } }` (same as before) > - And `{ stage: "executed", args, result }` (same as before) > -> Before (<3.4): +> Before (v3.3 and lower): > > - Stage "receiving" would never happen > - 1st render would be with From 924be56df9183dae54dd1a3577f871e87def6a3f Mon Sep 17 00:00:00 2001 From: Nimesh Nayaju Date: Tue, 26 Aug 2025 12:42:34 -0400 Subject: [PATCH 2/3] Update `useSendAiMessage` to use the last used copilot id when no copilot id is provided (#2618) 1. Update `useSendAiMessage` to use the last used copilot id when no copilot id is provided 2. Remove `onDidDisconnect` console warning 3. Fix copilot id not being passed when setting tool call result in `execute` callback of a tool --- CHANGELOG.md | 12 +++++++ packages/liveblocks-core/src/ai.ts | 31 ++++++++++++++----- packages/liveblocks-core/src/types/ai.ts | 4 +++ .../src/components/AiChat.tsx | 4 --- .../internal/AiChatAssistantMessage.tsx | 30 ++---------------- .../src/primitives/AiMessage/index.tsx | 3 +- .../primitives/AiMessage/tool-invocation.tsx | 7 ++--- .../src/primitives/AiMessage/types.ts | 8 ----- packages/liveblocks-react/src/liveblocks.tsx | 30 +++++++++++++++--- 9 files changed, 71 insertions(+), 58 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index aca3b6f59f5..d2830eb858a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ ## vNEXT (not yet published) +## v3.4.1 + +### `@liveblocks/core` + +- Fix a bug where copilot id wasn't passed when setting tool call result if a + tool call was defined with `execute` callback. + +### `@liveblocks/react` + +- Update `useSendAiMessage` to use the the last used copilot id in a chat when + no copilot id is passed to the hook or the method returned by the hook. + ## v3.4.0 ### `@liveblocks/react` diff --git a/packages/liveblocks-core/src/ai.ts b/packages/liveblocks-core/src/ai.ts index 28c4a2693a6..f2e86588a3c 100644 --- a/packages/liveblocks-core/src/ai.ts +++ b/packages/liveblocks-core/src/ai.ts @@ -44,6 +44,7 @@ import type { ClearChatResponse, ClientAiMsg, CmdId, + CopilotId, CreateChatOptions, DeleteChatResponse, DeleteMessageResponse, @@ -438,18 +439,19 @@ function createStore_forChatMessages( function createOptimistically( chatId: string, role: "assistant", - parentId: MessageId | null + parentId: MessageId | null, + copilotId?: CopilotId ): MessageId; function createOptimistically( chatId: string, role: "user" | "assistant", parentId: MessageId | null, - third?: AiUserContentPart[] + third?: AiUserContentPart[] | CopilotId ) { const id = `ms_${nanoid()}` as MessageId; const createdAt = now(); if (role === "user") { - const content = third!; // eslint-disable-line + const content = third as AiUserContentPart[]; upsert({ id, chatId, @@ -460,6 +462,7 @@ function createStore_forChatMessages( _optimistic: true, } satisfies AiUserMessage); } else { + const copilotId = third as CopilotId | undefined; upsert({ id, chatId, @@ -468,6 +471,7 @@ function createStore_forChatMessages( createdAt, status: "generating", contentSoFar: [], + copilotId, _optimistic: true, } satisfies AiGeneratingAssistantMessage); } @@ -554,8 +558,8 @@ function createStore_forChatMessages( message.chatId, message.id, toolInvocation.invocationId, - result ?? { data: {} } - // TODO Pass in AiGenerationOptions here, or make the backend use the same options + result ?? { data: {} }, + { copilotId: message.copilotId } // TODO: Should we pass the other generation options (tools, knowledge) as well? ); })().catch((err) => { console.error( @@ -754,10 +758,20 @@ function createStore_forChatMessages( .getOrCreate(branch || null); } + function getLastUsedCopilotId(chatId: string): CopilotId | undefined { + const pool = messagePoolByChatIdΣ.getOrCreate(chatId).get(); + // Find the most recent non-deleted assistant message + const latest = pool.sorted.findRight( + (m) => m.role === "assistant" && !m.deletedAt + ); + return latest?.copilotId; + } + return { // Readers getMessageById, getChatMessagesForBranchΣ, + getLastUsedCopilotId, // Mutations createOptimistically, @@ -887,6 +901,8 @@ export type Ai = { /** @private This API will change, and is not considered stable. DO NOT RELY on it. */ queryChats: (query: AiChatsQuery) => AiChat[]; /** @private This API will change, and is not considered stable. DO NOT RELY on it. */ + getLastUsedCopilotId: (chatId: string) => CopilotId | undefined; + /** @private This API will change, and is not considered stable. DO NOT RELY on it. */ registerKnowledgeLayer: (uniqueLayerId: string) => LayerKey; /** @private This API will change, and is not considered stable. DO NOT RELY on it. */ deregisterKnowledgeLayer: (layerKey: LayerKey) => void; @@ -982,9 +998,7 @@ export function createAi(config: AiConfig): Ai { // NoOp for now, but we should maybe fetch messages or something? } - function onDidDisconnect() { - console.warn("onDidDisconnect"); - } + function onDidDisconnect() {} function handleServerMessage(event: IWebSocketMessageEvent) { if (typeof event.data !== "string") @@ -1335,6 +1349,7 @@ export function createAi(config: AiConfig): Ai { getChatById: context.chatsStore.getChatById, queryChats: context.chatsStore.findMany, + getLastUsedCopilotId: context.messagesStore.getLastUsedCopilotId, registerKnowledgeLayer, deregisterKnowledgeLayer, updateKnowledge, diff --git a/packages/liveblocks-core/src/types/ai.ts b/packages/liveblocks-core/src/types/ai.ts index b716725168c..63f5f82030e 100644 --- a/packages/liveblocks-core/src/types/ai.ts +++ b/packages/liveblocks-core/src/types/ai.ts @@ -454,6 +454,7 @@ export type AiGeneratingAssistantMessage = { role: "assistant"; createdAt: ISODateString; deletedAt?: ISODateString; + copilotId?: CopilotId; status: "generating"; contentSoFar: AiAssistantContentPart[]; @@ -468,6 +469,7 @@ export type AiAwaitingToolAssistantMessage = { role: "assistant"; createdAt: ISODateString; deletedAt?: ISODateString; + copilotId?: CopilotId; status: "awaiting-tool"; contentSoFar: AiAssistantContentPart[]; @@ -483,6 +485,7 @@ export type AiCompletedAssistantMessage = { content: AiAssistantContentPart[]; createdAt: ISODateString; deletedAt?: ISODateString; + copilotId?: CopilotId; status: "completed"; /** @internal */ @@ -496,6 +499,7 @@ export type AiFailedAssistantMessage = { role: "assistant"; createdAt: ISODateString; deletedAt?: ISODateString; + copilotId?: CopilotId; status: "failed"; contentSoFar: AiAssistantContentPart[]; diff --git a/packages/liveblocks-react-ui/src/components/AiChat.tsx b/packages/liveblocks-react-ui/src/components/AiChat.tsx index 0546c682028..dd2649951a8 100644 --- a/packages/liveblocks-react-ui/src/components/AiChat.tsx +++ b/packages/liveblocks-react-ui/src/components/AiChat.tsx @@ -128,7 +128,6 @@ export interface AiChatProps extends ComponentProps<"div"> { interface AiChatMessagesProps extends ComponentProps<"div"> { messages: NonNullable["messages"]>; - copilotId: AiChatProps["copilotId"]; overrides: AiChatProps["overrides"]; components: AiChatProps["components"]; lastSentMessageId: MessageId | null; @@ -158,7 +157,6 @@ const AiChatMessages = forwardRef( ( { messages, - copilotId, overrides, components, lastSentMessageId, @@ -403,7 +401,6 @@ const AiChatMessages = forwardRef( message={message} overrides={overrides} components={components} - copilotId={copilotId} /> ); } else { @@ -511,7 +508,6 @@ export const AiChat = forwardRef( <> { */ overrides?: Partial; - /** - * @internal - * The id of the copilot to use to set tool call result. - */ - copilotId?: string; - /** * Override the component's components. */ @@ -75,10 +69,7 @@ interface ReasoningPartProps extends AiMessageContentReasoningPartProps { export const AiChatAssistantMessage = memo( forwardRef( - ( - { message, className, overrides, components, copilotId, ...props }, - forwardedRef - ) => { + ({ message, className, overrides, components, ...props }, forwardedRef) => { const $ = useOverrides(overrides); let children: ReactNode = null; @@ -104,17 +95,12 @@ export const AiChatAssistantMessage = memo( ); } } else if (message.status === "completed") { children = ( - + ); } else if (message.status === "failed") { // Do not include the error message if the user aborted the request. @@ -123,7 +109,6 @@ export const AiChatAssistantMessage = memo( ); } else { @@ -132,7 +117,6 @@ export const AiChatAssistantMessage = memo(
@@ -167,11 +151,9 @@ export const AiChatAssistantMessage = memo( function AssistantMessageContent({ message, components, - copilotId, }: { message: UiAssistantMessage; components?: Partial; - copilotId?: string; }) { return ( ); @@ -254,7 +235,6 @@ function ReasoningPart({ part, isStreaming, components }: ReasoningPartProps) { function ToolInvocationPart({ part, message, - copilotId, }: AiMessageContentToolInvocationPartProps) { return (
@@ -271,11 +251,7 @@ function ToolInvocationPart({
} > - +
); diff --git a/packages/liveblocks-react-ui/src/primitives/AiMessage/index.tsx b/packages/liveblocks-react-ui/src/primitives/AiMessage/index.tsx index db4a1ad3309..3042bdd53a9 100644 --- a/packages/liveblocks-react-ui/src/primitives/AiMessage/index.tsx +++ b/packages/liveblocks-react-ui/src/primitives/AiMessage/index.tsx @@ -39,7 +39,7 @@ const defaultMessageContentComponents: AiMessageContentComponents = { * */ const AiMessageContent = forwardRef( - ({ message, components, asChild, copilotId, ...props }, forwardedRef) => { + ({ message, components, asChild, ...props }, forwardedRef) => { const Component = asChild ? Slot : "div"; const { TextPart, ReasoningPart, ToolInvocationPart } = useMemo( () => ({ ...defaultMessageContentComponents, ...components }), @@ -70,7 +70,6 @@ const AiMessageContent = forwardRef( part={part} {...extra} message={message} - copilotId={copilotId} /> ); default: diff --git a/packages/liveblocks-react-ui/src/primitives/AiMessage/tool-invocation.tsx b/packages/liveblocks-react-ui/src/primitives/AiMessage/tool-invocation.tsx index 581a551d9c9..0ba0c7b725e 100644 --- a/packages/liveblocks-react-ui/src/primitives/AiMessage/tool-invocation.tsx +++ b/packages/liveblocks-react-ui/src/primitives/AiMessage/tool-invocation.tsx @@ -2,7 +2,6 @@ import type { AiChatMessage, AiToolInvocationPart, AiToolInvocationProps, - CopilotId, JsonObject, ToolResultResponse, } from "@liveblocks/core"; @@ -35,11 +34,9 @@ function StableRenderFn(props: { export function AiMessageToolInvocation({ message, part, - copilotId, }: { message: AiChatMessage; part: AiToolInvocationPart; - copilotId?: string; }) { const client = useClient(); const ai = client[kInternal].ai; @@ -63,7 +60,7 @@ export function AiMessageToolInvocation({ message.id, part.invocationId, result ?? { data: {} }, - { copilotId: copilotId as CopilotId } + { copilotId: message.copilotId } ); } }, @@ -75,7 +72,7 @@ export function AiMessageToolInvocation({ part.invocationId, part.name, part.stage, - copilotId, + message.copilotId, ] ); diff --git a/packages/liveblocks-react-ui/src/primitives/AiMessage/types.ts b/packages/liveblocks-react-ui/src/primitives/AiMessage/types.ts index 521e3f5e510..2a018acaf47 100644 --- a/packages/liveblocks-react-ui/src/primitives/AiMessage/types.ts +++ b/packages/liveblocks-react-ui/src/primitives/AiMessage/types.ts @@ -33,8 +33,6 @@ export type AiMessageContentToolInvocationPartProps = { /** @internal */ message: AiChatMessage; part: AiToolInvocationPart; - /** @internal */ - copilotId?: string; }; export interface AiMessageContentComponents { @@ -67,10 +65,4 @@ export interface AiMessageContentProps extends ComponentPropsWithSlot<"div"> { * the message content. */ components?: Partial; - - /** - * @internal - * The id of the copilot to use to set tool call result. - */ - copilotId?: string; } diff --git a/packages/liveblocks-react/src/liveblocks.tsx b/packages/liveblocks-react/src/liveblocks.tsx index 7eb086fb0ef..c7fc9d8d680 100644 --- a/packages/liveblocks-react/src/liveblocks.tsx +++ b/packages/liveblocks-react/src/liveblocks.tsx @@ -21,6 +21,7 @@ import type { } from "@liveblocks/core"; import { assert, + console, createClient, HttpError, kInternal, @@ -1259,6 +1260,7 @@ function useSendAiMessage( const { text: messageText, chatId: messageOptionsChatId, + copilotId: messageOptionsCopilotId, ...messageOptions } = typeof message === "string" ? { text: message } : message; const resolvedChatId = @@ -1274,6 +1276,27 @@ function useSendAiMessage( .getChatMessagesForBranchΣ(resolvedChatId) .get(); + if ( + process.env.NODE_ENV !== "production" && + !messageOptionsCopilotId && + !options?.copilotId + ) { + console.warn( + `No copilot ID was provided to useSendAiMessage when sending the message "${messageText.slice( + 0, + 20 + )}…". As a result, the message will use the chat's previous copilot ID, which could lead to unexpected behavior.\nTo ensure the correct copilot ID is used, specify it either through the hook as 'useSendAiMessage("${resolvedChatId}", { copilotId: "co_xxx" })' or via the function as 'sendAiMessage({ text: "${messageText.slice( + 0, + 20 + )}…", copilotId: "co_xxx" })'` + ); + } + const resolvedCopilotId = (messageOptionsCopilotId ?? + options?.copilotId ?? + client[kInternal].ai.getLastUsedCopilotId(resolvedChatId)) as + | CopilotId + | undefined; + const lastMessageId = messages[messages.length - 1]?.id ?? null; const content = [{ type: "text" as const, text: messageText }]; @@ -1294,7 +1317,8 @@ function useSendAiMessage( ].context.messagesStore.createOptimistically( resolvedChatId, "assistant", - newMessageId + newMessageId, + resolvedCopilotId as CopilotId ); void client[kInternal].ai.askUserMessageInChat( @@ -1303,9 +1327,7 @@ function useSendAiMessage( targetMessageId, { stream: messageOptions.stream ?? options?.stream, - copilotId: (messageOptions.copilotId ?? options?.copilotId) as - | CopilotId - | undefined, + copilotId: resolvedCopilotId, timeout: messageOptions.timeout ?? options?.timeout, knowledge: messageOptions.knowledge ?? options?.knowledge, } From 2d1a5f22b4b7e5f15b6489774adb485fd0491c2e Mon Sep 17 00:00:00 2001 From: GitHub Actions Bot <> Date: Tue, 26 Aug 2025 16:48:36 +0000 Subject: [PATCH 3/3] Bump to 3.4.1 --- package-lock.json | 98 +++++++++---------- packages/liveblocks-client/package.json | 4 +- packages/liveblocks-core/package.json | 2 +- packages/liveblocks-emails/package.json | 6 +- packages/liveblocks-node-lexical/package.json | 6 +- .../liveblocks-node-prosemirror/package.json | 6 +- packages/liveblocks-node/package.json | 4 +- .../liveblocks-react-blocknote/package.json | 14 +-- .../liveblocks-react-lexical/package.json | 12 +-- packages/liveblocks-react-tiptap/package.json | 12 +-- packages/liveblocks-react-ui/package.json | 8 +- packages/liveblocks-react/package.json | 6 +- packages/liveblocks-redux/package.json | 6 +- packages/liveblocks-yjs/package.json | 6 +- packages/liveblocks-zustand/package.json | 6 +- 15 files changed, 98 insertions(+), 98 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9ede00e7090..87028274b6f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -37111,10 +37111,10 @@ }, "packages/liveblocks-client": { "name": "@liveblocks/client", - "version": "3.4.0", + "version": "3.4.1", "license": "Apache-2.0", "dependencies": { - "@liveblocks/core": "3.4.0" + "@liveblocks/core": "3.4.1" }, "devDependencies": { "@liveblocks/eslint-config": "*", @@ -37123,7 +37123,7 @@ }, "packages/liveblocks-core": { "name": "@liveblocks/core", - "version": "3.4.0", + "version": "3.4.1", "license": "Apache-2.0", "devDependencies": { "@liveblocks/eslint-config": "*", @@ -37141,11 +37141,11 @@ }, "packages/liveblocks-emails": { "name": "@liveblocks/emails", - "version": "3.4.0", + "version": "3.4.1", "license": "Apache-2.0", "dependencies": { - "@liveblocks/core": "3.4.0", - "@liveblocks/node": "3.4.0" + "@liveblocks/core": "3.4.1", + "@liveblocks/node": "3.4.1" }, "devDependencies": { "@liveblocks/eslint-config": "*", @@ -37164,10 +37164,10 @@ }, "packages/liveblocks-node": { "name": "@liveblocks/node", - "version": "3.4.0", + "version": "3.4.1", "license": "Apache-2.0", "dependencies": { - "@liveblocks/core": "3.4.0", + "@liveblocks/core": "3.4.1", "@stablelib/base64": "^1.0.1", "fast-sha256": "^1.3.0", "node-fetch": "^2.6.1" @@ -37182,11 +37182,11 @@ }, "packages/liveblocks-node-lexical": { "name": "@liveblocks/node-lexical", - "version": "3.4.0", + "version": "3.4.1", "license": "Apache-2.0", "dependencies": { - "@liveblocks/core": "3.4.0", - "@liveblocks/node": "3.4.0", + "@liveblocks/core": "3.4.1", + "@liveblocks/node": "3.4.1", "yjs": "^13.6.18" }, "devDependencies": { @@ -37203,11 +37203,11 @@ }, "packages/liveblocks-node-prosemirror": { "name": "@liveblocks/node-prosemirror", - "version": "3.4.0", + "version": "3.4.1", "license": "Apache-2.0", "dependencies": { - "@liveblocks/core": "3.4.0", - "@liveblocks/node": "3.4.0", + "@liveblocks/core": "3.4.1", + "@liveblocks/node": "3.4.1", "yjs": "^13.6.20" }, "devDependencies": { @@ -37227,11 +37227,11 @@ }, "packages/liveblocks-react": { "name": "@liveblocks/react", - "version": "3.4.0", + "version": "3.4.1", "license": "Apache-2.0", "dependencies": { - "@liveblocks/client": "3.4.0", - "@liveblocks/core": "3.4.0" + "@liveblocks/client": "3.4.1", + "@liveblocks/core": "3.4.1" }, "devDependencies": { "@liveblocks/eslint-config": "*", @@ -37261,15 +37261,15 @@ }, "packages/liveblocks-react-blocknote": { "name": "@liveblocks/react-blocknote", - "version": "3.4.0", + "version": "3.4.1", "license": "Apache-2.0", "dependencies": { - "@liveblocks/client": "3.4.0", - "@liveblocks/core": "3.4.0", - "@liveblocks/react": "3.4.0", - "@liveblocks/react-tiptap": "3.4.0", - "@liveblocks/react-ui": "3.4.0", - "@liveblocks/yjs": "3.4.0", + "@liveblocks/client": "3.4.1", + "@liveblocks/core": "3.4.1", + "@liveblocks/react": "3.4.1", + "@liveblocks/react-tiptap": "3.4.1", + "@liveblocks/react-ui": "3.4.1", + "@liveblocks/yjs": "3.4.1", "@tiptap/core": "^2.7.2", "vitest-tsconfig-paths": "^3.4.1" }, @@ -37306,15 +37306,15 @@ }, "packages/liveblocks-react-lexical": { "name": "@liveblocks/react-lexical", - "version": "3.4.0", + "version": "3.4.1", "license": "Apache-2.0", "dependencies": { "@floating-ui/react-dom": "^2.1.1", - "@liveblocks/client": "3.4.0", - "@liveblocks/core": "3.4.0", - "@liveblocks/react": "3.4.0", - "@liveblocks/react-ui": "3.4.0", - "@liveblocks/yjs": "3.4.0", + "@liveblocks/client": "3.4.1", + "@liveblocks/core": "3.4.1", + "@liveblocks/react": "3.4.1", + "@liveblocks/react-ui": "3.4.1", + "@liveblocks/yjs": "3.4.1", "@radix-ui/react-select": "^2.1.2", "@radix-ui/react-toggle": "^1.1.0", "yjs": "^13.6.18" @@ -37843,15 +37843,15 @@ }, "packages/liveblocks-react-tiptap": { "name": "@liveblocks/react-tiptap", - "version": "3.4.0", + "version": "3.4.1", "license": "Apache-2.0", "dependencies": { "@floating-ui/react-dom": "^2.1.2", - "@liveblocks/client": "3.4.0", - "@liveblocks/core": "3.4.0", - "@liveblocks/react": "3.4.0", - "@liveblocks/react-ui": "3.4.0", - "@liveblocks/yjs": "3.4.0", + "@liveblocks/client": "3.4.1", + "@liveblocks/core": "3.4.1", + "@liveblocks/react": "3.4.1", + "@liveblocks/react-ui": "3.4.1", + "@liveblocks/yjs": "3.4.1", "@radix-ui/react-select": "^2.1.2", "@radix-ui/react-toggle": "^1.1.0", "@tiptap/core": "^2.7.2", @@ -38376,13 +38376,13 @@ }, "packages/liveblocks-react-ui": { "name": "@liveblocks/react-ui", - "version": "3.4.0", + "version": "3.4.1", "license": "Apache-2.0", "dependencies": { "@floating-ui/react-dom": "^2.1.2", - "@liveblocks/client": "3.4.0", - "@liveblocks/core": "3.4.0", - "@liveblocks/react": "3.4.0", + "@liveblocks/client": "3.4.1", + "@liveblocks/core": "3.4.1", + "@liveblocks/react": "3.4.1", "@radix-ui/react-dropdown-menu": "^2.1.2", "@radix-ui/react-popover": "^1.1.2", "@radix-ui/react-slot": "^1.1.0", @@ -39710,11 +39710,11 @@ }, "packages/liveblocks-redux": { "name": "@liveblocks/redux", - "version": "3.4.0", + "version": "3.4.1", "license": "Apache-2.0", "dependencies": { - "@liveblocks/client": "3.4.0", - "@liveblocks/core": "3.4.0" + "@liveblocks/client": "3.4.1", + "@liveblocks/core": "3.4.1" }, "devDependencies": { "@liveblocks/eslint-config": "*", @@ -39871,10 +39871,10 @@ }, "packages/liveblocks-yjs": { "name": "@liveblocks/yjs", - "version": "3.4.0", + "version": "3.4.1", "dependencies": { - "@liveblocks/client": "3.4.0", - "@liveblocks/core": "3.4.0", + "@liveblocks/client": "3.4.1", + "@liveblocks/core": "3.4.1", "@noble/hashes": "^1.8.0", "js-base64": "^3.7.7", "y-indexeddb": "^9.0.12" @@ -39940,11 +39940,11 @@ }, "packages/liveblocks-zustand": { "name": "@liveblocks/zustand", - "version": "3.4.0", + "version": "3.4.1", "license": "Apache-2.0", "dependencies": { - "@liveblocks/client": "3.4.0", - "@liveblocks/core": "3.4.0" + "@liveblocks/client": "3.4.1", + "@liveblocks/core": "3.4.1" }, "devDependencies": { "@liveblocks/eslint-config": "*", diff --git a/packages/liveblocks-client/package.json b/packages/liveblocks-client/package.json index 06b4807886c..b0bd354d772 100644 --- a/packages/liveblocks-client/package.json +++ b/packages/liveblocks-client/package.json @@ -1,6 +1,6 @@ { "name": "@liveblocks/client", - "version": "3.4.0", + "version": "3.4.1", "description": "A client that lets you interact with Liveblocks servers. Liveblocks is the all-in-one toolkit to build collaborative products like Figma, Notion, and more.", "license": "Apache-2.0", "type": "module", @@ -34,7 +34,7 @@ "test:watch": "NODE_OPTIONS=\"--no-deprecation\" vitest" }, "dependencies": { - "@liveblocks/core": "3.4.0" + "@liveblocks/core": "3.4.1" }, "devDependencies": { "@liveblocks/eslint-config": "*", diff --git a/packages/liveblocks-core/package.json b/packages/liveblocks-core/package.json index 47739733d53..f937385766f 100644 --- a/packages/liveblocks-core/package.json +++ b/packages/liveblocks-core/package.json @@ -1,6 +1,6 @@ { "name": "@liveblocks/core", - "version": "3.4.0", + "version": "3.4.1", "description": "Private internals for Liveblocks. DO NOT import directly from this package!", "type": "module", "main": "./dist/index.cjs", diff --git a/packages/liveblocks-emails/package.json b/packages/liveblocks-emails/package.json index e416425343d..73a5f2288cb 100644 --- a/packages/liveblocks-emails/package.json +++ b/packages/liveblocks-emails/package.json @@ -1,6 +1,6 @@ { "name": "@liveblocks/emails", - "version": "3.4.0", + "version": "3.4.1", "description": "A set of functions and utilities to make sending emails based on Liveblocks notification events easy. Liveblocks is the all-in-one toolkit to build collaborative products like Figma, Notion, and more.", "license": "Apache-2.0", "type": "module", @@ -35,8 +35,8 @@ "test:watch": "NODE_OPTIONS=\"--no-deprecation\" vitest" }, "dependencies": { - "@liveblocks/core": "3.4.0", - "@liveblocks/node": "3.4.0" + "@liveblocks/core": "3.4.1", + "@liveblocks/node": "3.4.1" }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc" diff --git a/packages/liveblocks-node-lexical/package.json b/packages/liveblocks-node-lexical/package.json index d14d928bec6..85bdf796d5c 100644 --- a/packages/liveblocks-node-lexical/package.json +++ b/packages/liveblocks-node-lexical/package.json @@ -1,6 +1,6 @@ { "name": "@liveblocks/node-lexical", - "version": "3.4.0", + "version": "3.4.1", "description": "A server-side utility that lets you modify lexical documents hosted in Liveblocks.", "license": "Apache-2.0", "type": "module", @@ -34,8 +34,8 @@ "test:watch": "NODE_OPTIONS=\"--no-deprecation\" vitest" }, "dependencies": { - "@liveblocks/core": "3.4.0", - "@liveblocks/node": "3.4.0", + "@liveblocks/core": "3.4.1", + "@liveblocks/node": "3.4.1", "yjs": "^13.6.18" }, "peerDependencies": { diff --git a/packages/liveblocks-node-prosemirror/package.json b/packages/liveblocks-node-prosemirror/package.json index 68f44f0fb8e..edb4cd44d8b 100644 --- a/packages/liveblocks-node-prosemirror/package.json +++ b/packages/liveblocks-node-prosemirror/package.json @@ -1,6 +1,6 @@ { "name": "@liveblocks/node-prosemirror", - "version": "3.4.0", + "version": "3.4.1", "description": "A server-side utility that lets you modify prosemirror and tiptap documents hosted in Liveblocks.", "license": "Apache-2.0", "type": "module", @@ -34,8 +34,8 @@ "test:watch": "NODE_OPTIONS=\"--no-deprecation\" vitest" }, "dependencies": { - "@liveblocks/core": "3.4.0", - "@liveblocks/node": "3.4.0", + "@liveblocks/core": "3.4.1", + "@liveblocks/node": "3.4.1", "yjs": "^13.6.20" }, "peerDependencies": { diff --git a/packages/liveblocks-node/package.json b/packages/liveblocks-node/package.json index 60396ef9f9b..a28e42ed7e2 100644 --- a/packages/liveblocks-node/package.json +++ b/packages/liveblocks-node/package.json @@ -1,6 +1,6 @@ { "name": "@liveblocks/node", - "version": "3.4.0", + "version": "3.4.1", "description": "A server-side utility that lets you set up a Liveblocks authentication endpoint. Liveblocks is the all-in-one toolkit to build collaborative products like Figma, Notion, and more.", "license": "Apache-2.0", "type": "module", @@ -34,7 +34,7 @@ "test:watch": "NODE_OPTIONS=\"--no-deprecation\" vitest" }, "dependencies": { - "@liveblocks/core": "3.4.0", + "@liveblocks/core": "3.4.1", "@stablelib/base64": "^1.0.1", "fast-sha256": "^1.3.0", "node-fetch": "^2.6.1" diff --git a/packages/liveblocks-react-blocknote/package.json b/packages/liveblocks-react-blocknote/package.json index 45f0b1ab8be..d1dfaf10e58 100644 --- a/packages/liveblocks-react-blocknote/package.json +++ b/packages/liveblocks-react-blocknote/package.json @@ -1,6 +1,6 @@ { "name": "@liveblocks/react-blocknote", - "version": "3.4.0", + "version": "3.4.1", "description": "An integration of BlockNote + React to enable collaboration, comments, live cursors, and more with Liveblocks.", "license": "Apache-2.0", "type": "module", @@ -42,12 +42,12 @@ "test:watch": "NODE_OPTIONS=\"--no-deprecation\" vitest" }, "dependencies": { - "@liveblocks/client": "3.4.0", - "@liveblocks/core": "3.4.0", - "@liveblocks/react": "3.4.0", - "@liveblocks/react-tiptap": "3.4.0", - "@liveblocks/react-ui": "3.4.0", - "@liveblocks/yjs": "3.4.0", + "@liveblocks/client": "3.4.1", + "@liveblocks/core": "3.4.1", + "@liveblocks/react": "3.4.1", + "@liveblocks/react-tiptap": "3.4.1", + "@liveblocks/react-ui": "3.4.1", + "@liveblocks/yjs": "3.4.1", "@tiptap/core": "^2.7.2", "vitest-tsconfig-paths": "^3.4.1" }, diff --git a/packages/liveblocks-react-lexical/package.json b/packages/liveblocks-react-lexical/package.json index 9d1f148d63b..22ea0d66935 100644 --- a/packages/liveblocks-react-lexical/package.json +++ b/packages/liveblocks-react-lexical/package.json @@ -1,6 +1,6 @@ { "name": "@liveblocks/react-lexical", - "version": "3.4.0", + "version": "3.4.1", "description": "An integration of Lexical + React to enable collaboration, comments, live cursors, and more with Liveblocks.", "license": "Apache-2.0", "type": "module", @@ -43,11 +43,11 @@ }, "dependencies": { "@floating-ui/react-dom": "^2.1.1", - "@liveblocks/client": "3.4.0", - "@liveblocks/core": "3.4.0", - "@liveblocks/react": "3.4.0", - "@liveblocks/react-ui": "3.4.0", - "@liveblocks/yjs": "3.4.0", + "@liveblocks/client": "3.4.1", + "@liveblocks/core": "3.4.1", + "@liveblocks/react": "3.4.1", + "@liveblocks/react-ui": "3.4.1", + "@liveblocks/yjs": "3.4.1", "@radix-ui/react-select": "^2.1.2", "@radix-ui/react-toggle": "^1.1.0", "yjs": "^13.6.18" diff --git a/packages/liveblocks-react-tiptap/package.json b/packages/liveblocks-react-tiptap/package.json index 95ae6de8f4a..f9ddd661e41 100644 --- a/packages/liveblocks-react-tiptap/package.json +++ b/packages/liveblocks-react-tiptap/package.json @@ -1,6 +1,6 @@ { "name": "@liveblocks/react-tiptap", - "version": "3.4.0", + "version": "3.4.1", "description": "An integration of TipTap + React to enable collaboration, comments, live cursors, and more with Liveblocks.", "license": "Apache-2.0", "type": "module", @@ -43,11 +43,11 @@ }, "dependencies": { "@floating-ui/react-dom": "^2.1.2", - "@liveblocks/client": "3.4.0", - "@liveblocks/core": "3.4.0", - "@liveblocks/react": "3.4.0", - "@liveblocks/react-ui": "3.4.0", - "@liveblocks/yjs": "3.4.0", + "@liveblocks/client": "3.4.1", + "@liveblocks/core": "3.4.1", + "@liveblocks/react": "3.4.1", + "@liveblocks/react-ui": "3.4.1", + "@liveblocks/yjs": "3.4.1", "@radix-ui/react-select": "^2.1.2", "@radix-ui/react-toggle": "^1.1.0", "@tiptap/core": "^2.7.2", diff --git a/packages/liveblocks-react-ui/package.json b/packages/liveblocks-react-ui/package.json index 8bc8e7dc082..66fdceca123 100644 --- a/packages/liveblocks-react-ui/package.json +++ b/packages/liveblocks-react-ui/package.json @@ -1,6 +1,6 @@ { "name": "@liveblocks/react-ui", - "version": "3.4.0", + "version": "3.4.1", "description": "A set of React pre-built components for the Liveblocks products. Liveblocks is the all-in-one toolkit to build collaborative products like Figma, Notion, and more.", "license": "Apache-2.0", "type": "module", @@ -76,9 +76,9 @@ }, "dependencies": { "@floating-ui/react-dom": "^2.1.2", - "@liveblocks/client": "3.4.0", - "@liveblocks/core": "3.4.0", - "@liveblocks/react": "3.4.0", + "@liveblocks/client": "3.4.1", + "@liveblocks/core": "3.4.1", + "@liveblocks/react": "3.4.1", "@radix-ui/react-dropdown-menu": "^2.1.2", "@radix-ui/react-popover": "^1.1.2", "@radix-ui/react-slot": "^1.1.0", diff --git a/packages/liveblocks-react/package.json b/packages/liveblocks-react/package.json index 2da8d337431..e7aa796f6be 100644 --- a/packages/liveblocks-react/package.json +++ b/packages/liveblocks-react/package.json @@ -1,6 +1,6 @@ { "name": "@liveblocks/react", - "version": "3.4.0", + "version": "3.4.1", "description": "A set of React hooks and providers to use Liveblocks declaratively. Liveblocks is the all-in-one toolkit to build collaborative products like Figma, Notion, and more.", "license": "Apache-2.0", "type": "module", @@ -61,8 +61,8 @@ "showdeps": "depcruise src --include-only '^src' --exclude='__tests__' --output-type dot | dot -T svg > /tmp/dependency-graph.svg && open /tmp/dependency-graph.svg" }, "dependencies": { - "@liveblocks/client": "3.4.0", - "@liveblocks/core": "3.4.0" + "@liveblocks/client": "3.4.1", + "@liveblocks/core": "3.4.1" }, "peerDependencies": { "@types/react": "*", diff --git a/packages/liveblocks-redux/package.json b/packages/liveblocks-redux/package.json index 24bb81ff111..fb6fa610288 100644 --- a/packages/liveblocks-redux/package.json +++ b/packages/liveblocks-redux/package.json @@ -1,6 +1,6 @@ { "name": "@liveblocks/redux", - "version": "3.4.0", + "version": "3.4.1", "description": "A store enhancer to integrate Liveblocks into Redux stores. Liveblocks is the all-in-one toolkit to build collaborative products like Figma, Notion, and more.", "license": "Apache-2.0", "type": "module", @@ -33,8 +33,8 @@ "test:watch": "NODE_OPTIONS=\"--no-deprecation\" vitest" }, "dependencies": { - "@liveblocks/client": "3.4.0", - "@liveblocks/core": "3.4.0" + "@liveblocks/client": "3.4.1", + "@liveblocks/core": "3.4.1" }, "peerDependencies": { "redux": "^4 || ^5" diff --git a/packages/liveblocks-yjs/package.json b/packages/liveblocks-yjs/package.json index c61258a9113..4bd58f3b5f1 100644 --- a/packages/liveblocks-yjs/package.json +++ b/packages/liveblocks-yjs/package.json @@ -1,6 +1,6 @@ { "name": "@liveblocks/yjs", - "version": "3.4.0", + "version": "3.4.1", "description": "Integrate your existing or new Yjs documents with Liveblocks.", "icense": "Apache-2.0", "type": "module", @@ -33,8 +33,8 @@ "test:watch": "NODE_OPTIONS=\"--no-deprecation\" vitest" }, "dependencies": { - "@liveblocks/client": "3.4.0", - "@liveblocks/core": "3.4.0", + "@liveblocks/client": "3.4.1", + "@liveblocks/core": "3.4.1", "@noble/hashes": "^1.8.0", "js-base64": "^3.7.7", "y-indexeddb": "^9.0.12" diff --git a/packages/liveblocks-zustand/package.json b/packages/liveblocks-zustand/package.json index 3699c24d1c0..13db400ca46 100644 --- a/packages/liveblocks-zustand/package.json +++ b/packages/liveblocks-zustand/package.json @@ -1,6 +1,6 @@ { "name": "@liveblocks/zustand", - "version": "3.4.0", + "version": "3.4.1", "description": "A middleware for Zustand to automatically synchronize your stores with Liveblocks. Liveblocks is the all-in-one toolkit to build collaborative products like Figma, Notion, and more.", "license": "Apache-2.0", "type": "module", @@ -34,8 +34,8 @@ "test:watch": "NODE_OPTIONS=\"--no-deprecation\" vitest" }, "dependencies": { - "@liveblocks/client": "3.4.0", - "@liveblocks/core": "3.4.0" + "@liveblocks/client": "3.4.1", + "@liveblocks/core": "3.4.1" }, "peerDependencies": { "zustand": "^5.0.1"