@liveblocks/react-ui
Version:
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.
1 lines • 5.46 kB
Source Map (JSON)
{"version":3,"file":"tool-invocation.cjs","sources":["../../../src/primitives/AiMessage/tool-invocation.tsx"],"sourcesContent":["import type {\n AiAssistantMessage,\n AiToolInvocationPart,\n AiToolInvocationProps,\n JsonObject,\n ToolResultResponse,\n} from \"@liveblocks/core\";\nimport { kInternal } from \"@liveblocks/core\";\nimport { useClient } from \"@liveblocks/react\";\nimport { useSignal } from \"@liveblocks/react/_private\";\nimport { type FunctionComponent, useCallback, useMemo } from \"react\";\n\nimport { AiToolInvocationContext } from \"./contexts\";\n\ntype OpaqueAiToolInvocationProps = AiToolInvocationProps<\n JsonObject,\n JsonObject\n>;\n\nfunction StableRenderFn(props: {\n renderFn: FunctionComponent<OpaqueAiToolInvocationProps>;\n props: OpaqueAiToolInvocationProps;\n}) {\n return props.renderFn(props.props);\n}\n\n/**\n * @internal\n *\n * This could become publicly exposed as <AiMessage.ToolInvocation /> in the future,\n * but because namespace exports can't be marked `@internal`, we're keeping it in its\n * own file for now.\n */\nexport function AiMessageToolInvocation({\n message,\n part,\n}: {\n message: AiAssistantMessage;\n part: AiToolInvocationPart;\n}) {\n const client = useClient();\n const ai = client[kInternal].ai;\n const tool = useSignal(ai.signals.getToolΣ(part.name, message.chatId));\n\n const respond = useCallback(\n (result: ToolResultResponse | undefined) => {\n if (message.status !== \"awaiting-tool\") {\n // console.log(\"Ignoring respond(): message not awaiting tool result\");\n } else if (part.stage === \"receiving\") {\n // console.log(\n // `Ignoring respond(): tool '${part.name}' (${part.invocationId}) is still receiving`\n // );\n } else if (part.stage === \"executed\") {\n console.log(\n `Ignoring respond(): tool '${part.name}' (${part.invocationId}) has already executed`\n );\n } else {\n ai.setToolResult(\n message.chatId,\n message.id,\n part.invocationId,\n result ?? { data: {} },\n { copilotId: message.copilotId }\n );\n }\n },\n [\n ai,\n message.chatId,\n message.id,\n message.status,\n part.invocationId,\n part.name,\n part.stage,\n message.copilotId,\n ]\n );\n\n const partialArgs = part?.partialArgs;\n const props = useMemo(() => {\n // NOTE: Not really used, but necessary to trick useMemo into re-evaluating\n // when it changes. Without this trick, tool call streaming won't\n // re-render. The reason this is needed is that `part` gets mutated\n // in-place by the delta handling, rather than part being replaced by a new\n // object on every chunk.\n partialArgs;\n\n const { type: _, ...rest } = part;\n return {\n ...rest,\n respond,\n types: undefined as never,\n [kInternal]: {\n execute: tool?.execute,\n messageStatus: message.status,\n },\n } satisfies OpaqueAiToolInvocationProps;\n }, [part, respond, tool?.execute, message.status, partialArgs]);\n\n if (tool?.render === undefined) return null;\n return (\n <AiToolInvocationContext.Provider value={props}>\n <StableRenderFn\n renderFn={tool.render as FunctionComponent<OpaqueAiToolInvocationProps>}\n props={props}\n />\n </AiToolInvocationContext.Provider>\n );\n}\n"],"names":["useClient","kInternal","useSignal","useCallback","useMemo","jsx","AiToolInvocationContext"],"mappings":";;;;;;;;;AAmBA,SAAS,eAAe,KAGrB,EAAA;AACD,EAAO,OAAA,KAAA,CAAM,QAAS,CAAA,KAAA,CAAM,KAAK,CAAA,CAAA;AACnC,CAAA;AASO,SAAS,uBAAwB,CAAA;AAAA,EACtC,OAAA;AAAA,EACA,IAAA;AACF,CAGG,EAAA;AACD,EAAA,MAAM,SAASA,eAAU,EAAA,CAAA;AACzB,EAAM,MAAA,EAAA,GAAK,MAAO,CAAAC,cAAS,CAAE,CAAA,EAAA,CAAA;AAC7B,EAAM,MAAA,IAAA,GAAOC,mBAAU,EAAG,CAAA,OAAA,CAAQ,cAAS,IAAK,CAAA,IAAA,EAAM,OAAQ,CAAA,MAAM,CAAC,CAAA,CAAA;AAErE,EAAA,MAAM,OAAU,GAAAC,mBAAA;AAAA,IACd,CAAC,MAA2C,KAAA;AAC1C,MAAI,IAAA,OAAA,CAAQ,WAAW,eAAiB,EAAA;AAAA,OAExC,MAAA,IAAW,IAAK,CAAA,KAAA,KAAU,WAAa,EAAA;AAAA,OAIvC,MAAA,IAAW,IAAK,CAAA,KAAA,KAAU,UAAY,EAAA;AACpC,QAAQ,OAAA,CAAA,GAAA;AAAA,UACN,CAA6B,0BAAA,EAAA,IAAA,CAAK,IAAI,CAAA,GAAA,EAAM,KAAK,YAAY,CAAA,sBAAA,CAAA;AAAA,SAC/D,CAAA;AAAA,OACK,MAAA;AACL,QAAG,EAAA,CAAA,aAAA;AAAA,UACD,OAAQ,CAAA,MAAA;AAAA,UACR,OAAQ,CAAA,EAAA;AAAA,UACR,IAAK,CAAA,YAAA;AAAA,UACL,MAAU,IAAA,EAAE,IAAM,EAAA,EAAG,EAAA;AAAA,UACrB,EAAE,SAAW,EAAA,OAAA,CAAQ,SAAU,EAAA;AAAA,SACjC,CAAA;AAAA,OACF;AAAA,KACF;AAAA,IACA;AAAA,MACE,EAAA;AAAA,MACA,OAAQ,CAAA,MAAA;AAAA,MACR,OAAQ,CAAA,EAAA;AAAA,MACR,OAAQ,CAAA,MAAA;AAAA,MACR,IAAK,CAAA,YAAA;AAAA,MACL,IAAK,CAAA,IAAA;AAAA,MACL,IAAK,CAAA,KAAA;AAAA,MACL,OAAQ,CAAA,SAAA;AAAA,KACV;AAAA,GACF,CAAA;AAEA,EAAA,MAAM,cAAc,IAAM,EAAA,WAAA,CAAA;AAC1B,EAAM,MAAA,KAAA,GAAQC,gBAAQ,MAAM;AAM1B,IAAA,WAAA,CAAA;AAEA,IAAA,MAAM,EAAE,IAAA,EAAM,CAAG,EAAA,GAAG,MAAS,GAAA,IAAA,CAAA;AAC7B,IAAO,OAAA;AAAA,MACL,GAAG,IAAA;AAAA,MACH,OAAA;AAAA,MACA,KAAO,EAAA,KAAA,CAAA;AAAA,MACP,CAACH,cAAS,GAAG;AAAA,QACX,SAAS,IAAM,EAAA,OAAA;AAAA,QACf,eAAe,OAAQ,CAAA,MAAA;AAAA,OACzB;AAAA,KACF,CAAA;AAAA,GACF,EAAG,CAAC,IAAM,EAAA,OAAA,EAAS,MAAM,OAAS,EAAA,OAAA,CAAQ,MAAQ,EAAA,WAAW,CAAC,CAAA,CAAA;AAE9D,EAAA,IAAI,MAAM,MAAW,KAAA,KAAA,CAAA;AAAW,IAAO,OAAA,IAAA,CAAA;AACvC,EAAA,uBACGI,cAAA,CAAAC,gCAAA,CAAwB,QAAxB,EAAA,EAAiC,OAAO,KACvC,EAAA,QAAA,kBAAAD,cAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MACC,UAAU,IAAK,CAAA,MAAA;AAAA,MACf,KAAA;AAAA,KAAA;AAAA,GAEJ,EAAA,CAAA,CAAA;AAEJ;;;;"}