@marimo-team/frontend 0.23.17-dev46 → 0.23.17-dev47
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/dist/assets/chat-panel-Dzq-QTrj.js +4 -0
- package/dist/assets/{edit-page-GtsW1Yeh.js → edit-page-HdLqqfXC.js} +2 -2
- package/dist/assets/{index-C_pCjmat.js → index-BxVymcMs.js} +2 -2
- package/dist/index.html +1 -1
- package/package.json +1 -1
- package/src/components/chat/__tests__/use-chat-controller-id.test.tsx +39 -0
- package/src/components/chat/chat-panel.tsx +5 -1
- package/src/components/chat/use-chat-controller-id.ts +24 -0
- package/dist/assets/chat-panel-VAvLxFDw.js +0 -4
package/dist/index.html
CHANGED
|
@@ -66,7 +66,7 @@
|
|
|
66
66
|
<marimo-server-token data-token="{{ server_token }}" hidden></marimo-server-token>
|
|
67
67
|
<!-- /TODO -->
|
|
68
68
|
<title>{{ title }}</title>
|
|
69
|
-
<script type="module" crossorigin src="./assets/index-
|
|
69
|
+
<script type="module" crossorigin src="./assets/index-BxVymcMs.js"></script>
|
|
70
70
|
<link rel="modulepreload" crossorigin href="./assets/preload-helper-TXkS1QI3.js">
|
|
71
71
|
<link rel="modulepreload" crossorigin href="./assets/objects-BlG0ZrO0.js">
|
|
72
72
|
<link rel="modulepreload" crossorigin href="./assets/chunk-LvLJmgfZ.js">
|
package/package.json
CHANGED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
+
|
|
3
|
+
import { act, renderHook } from "@testing-library/react";
|
|
4
|
+
import { describe, expect, it } from "vitest";
|
|
5
|
+
import type { ChatId } from "@/core/ai/state";
|
|
6
|
+
import { useChatControllerId } from "../use-chat-controller-id";
|
|
7
|
+
|
|
8
|
+
describe("useChatControllerId", () => {
|
|
9
|
+
it("creates a new ID when starting another unsaved chat", () => {
|
|
10
|
+
const activeChatId = "existing-chat" as ChatId;
|
|
11
|
+
const initialProps: { activeId: ChatId | undefined } = {
|
|
12
|
+
activeId: undefined,
|
|
13
|
+
};
|
|
14
|
+
const { result, rerender } = renderHook(
|
|
15
|
+
({ activeId }: { activeId: ChatId | undefined }) =>
|
|
16
|
+
useChatControllerId(activeId),
|
|
17
|
+
{ initialProps },
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
const initialDraftId = result.current.chatControllerId;
|
|
21
|
+
rerender({ activeId: activeChatId });
|
|
22
|
+
|
|
23
|
+
expect(result.current.chatControllerId).toBe(activeChatId);
|
|
24
|
+
|
|
25
|
+
act(() => result.current.renewDraftChatId());
|
|
26
|
+
rerender({ activeId: undefined });
|
|
27
|
+
|
|
28
|
+
expect(result.current.chatControllerId).not.toBe(initialDraftId);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it("renews the ID when the current chat is already unsaved", () => {
|
|
32
|
+
const { result } = renderHook(() => useChatControllerId(undefined));
|
|
33
|
+
const initialDraftId = result.current.chatControllerId;
|
|
34
|
+
|
|
35
|
+
act(() => result.current.renewDraftChatId());
|
|
36
|
+
|
|
37
|
+
expect(result.current.chatControllerId).not.toBe(initialDraftId);
|
|
38
|
+
});
|
|
39
|
+
});
|
|
@@ -110,6 +110,7 @@ import {
|
|
|
110
110
|
import { getCodes } from "@/core/codemirror/copilot/getCodes";
|
|
111
111
|
import { focusInputAndMoveToEnd } from "@/core/codemirror/utils";
|
|
112
112
|
import ScrollToBottomButton from "./acp/scroll-to-bottom-button";
|
|
113
|
+
import { useChatControllerId } from "./use-chat-controller-id";
|
|
113
114
|
|
|
114
115
|
// Default mode for the AI
|
|
115
116
|
const DEFAULT_MODE = "manual";
|
|
@@ -554,6 +555,8 @@ const ChatPanelBody = () => {
|
|
|
554
555
|
const { openModal, closeModal } = useImperativeModal();
|
|
555
556
|
|
|
556
557
|
const activeChatId = activeChat?.id;
|
|
558
|
+
const { chatControllerId, renewDraftChatId } =
|
|
559
|
+
useChatControllerId(activeChatId);
|
|
557
560
|
const store = useStore();
|
|
558
561
|
|
|
559
562
|
const { addStagedCell } = useStagedAICellsActions();
|
|
@@ -577,7 +580,7 @@ const ChatPanelBody = () => {
|
|
|
577
580
|
addToolApprovalResponse,
|
|
578
581
|
id: chatId,
|
|
579
582
|
} = useChat({
|
|
580
|
-
id:
|
|
583
|
+
id: chatControllerId,
|
|
581
584
|
throttle: AI_SDK_UI_THROTTLE_MS,
|
|
582
585
|
sendAutomaticallyWhen: ({ messages }) => hasPendingToolCalls(messages),
|
|
583
586
|
messages: activeChat?.messages || [], // initial messages
|
|
@@ -816,6 +819,7 @@ const ChatPanelBody = () => {
|
|
|
816
819
|
);
|
|
817
820
|
|
|
818
821
|
const handleNewChat = useEvent(() => {
|
|
822
|
+
renewDraftChatId();
|
|
819
823
|
setActiveChat(null);
|
|
820
824
|
setInput("");
|
|
821
825
|
setNewThreadInput("");
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
+
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import useEvent from "react-use-event-hook";
|
|
5
|
+
import type { ChatId } from "@/core/ai/state";
|
|
6
|
+
import { generateUUID } from "@/utils/uuid";
|
|
7
|
+
|
|
8
|
+
function generateChatId(): ChatId {
|
|
9
|
+
return generateUUID() as ChatId;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Keep an ID for an unsaved chat so `useChat` can distinguish it from the
|
|
14
|
+
* previously active chat. Empty chats are not added to chat history.
|
|
15
|
+
*/
|
|
16
|
+
export function useChatControllerId(activeChatId?: ChatId) {
|
|
17
|
+
const [draftChatId, setDraftChatId] = useState(generateChatId);
|
|
18
|
+
const renewDraftChatId = useEvent(() => setDraftChatId(generateChatId()));
|
|
19
|
+
|
|
20
|
+
return {
|
|
21
|
+
chatControllerId: activeChatId ?? draftChatId,
|
|
22
|
+
renewDraftChatId,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import{s as ze}from"./chunk-LvLJmgfZ.js";import{d as Ht,f as Wt,l as ve,n as P,u as ge}from"./useEvent-D91BmmQi.js";import{t as Ot}from"./react-Bj1aDYRI.js";import{Br as Ut,E as Yt,Wt as Xt,mn as Fe}from"./cells-DxL32Atg.js";import"./react-dom-CSu739Rf.js";import{t as be}from"./compiler-runtime-B3qBwwSJ.js";import{T as qt,o as Vt,r as He,t as Bt}from"./ai-model-dropdown-CIqhiHxf.js";import{g as ae,o as ee}from"./useEventListener-B_wSLgFR.js";import{a as Kt,n as We}from"./utils-C5VWChv9.js";import{N as $t,o as Gt}from"./config-Bm5B9wGP.js";import{t as Qt}from"./switch-8FxRs-OU.js";import{t as $}from"./cn-DYvqRARy.js";import{t as Jt}from"./jsx-runtime-Blw4afVn.js";import{C as Zt,b as er,g as G,v as le,w as oe,x as Q}from"./fullscreen-B51geQ_6.js";import{u as tr}from"./menu-items-Db-bgz92.js";import{t as rr}from"./config-BVfo0E1-.js";import{i as Oe,r as Ue,t as Ye}from"./popover-DHbixh3D.js";import{a as ar,i as or,n as sr,p as lr,r as nr,s as ir,t as cr}from"./select-Clmc8Hw2.js";import{i as Xe,t as we}from"./tooltip-BcgbFR7q.js";import{t as K}from"./button-BB1AV4Rb.js";import"./dist-gUHullA_.js";import"./cjs-D5tzp-Y6.js";import"./main-BNL5rxQw.js";import"./useNonce-CbdaHKzX.js";import{r as dr}from"./requests-9-v2bhoi.js";import{t as qe}from"./createLucideIcon-w-Qo9n0R.js";import{t as ur}from"./scroll-to-bottom-button-CRMPUjYZ.js";import{t as mr}from"./arrow-right-C1pQZGqv.js";import{t as Ve}from"./bot-message-square-DTHo_4sQ.js";import"./markdown-renderer-DpskAUxO.js";import{i as hr,n as pr,r as fr,t as xr}from"./chat-display-CBpsXLHT.js";import{A as vr,C as gr,D as br,F as Be,I as wr,M as yr,N as ne,S as jr,T as Sr,V as Cr,_ as Nr,b as Ar,d as Ke,f as Rr,g as $e,h as Tr,l as Er,n as Ge,p as _r,r as kr,u as Ir,v as Lr,w as Mr,x as Pr,y as Qe}from"./add-cell-with-ai-CuLILhtV.js";import{t as Dr}from"./code-B2aKtXoe.js";import{t as zr}from"./hat-glasses-BttHlyvs.js";import{n as Je}from"./spinner-D-V4psAa.js";import{t as Fr}from"./message-circle-dL5J5ZsZ.js";import{t as Hr}from"./plus-AgXtozBz.js";import{dt as Wr,r as Or}from"./input-_AaMXWgD.js";import{t as Ur}from"./settings-D_PiwXwo.js";import{t as Yr}from"./sparkles-DUCpRFlS.js";import"./dist-Jbd9zUbK.js";import"./dist-BWXIz8tq.js";import"./dist-DX04AOlt.js";import"./dist-D5nYeU7Q.js";import"./dist-6qzebh8f.js";import"./session-BtBr2zr3.js";import"./purify.es-CWmnYhGI.js";import{s as Xr}from"./dates-BzOh4kS_.js";import{t as qr}from"./copy-icon-DWG8Y-xW.js";import{t as Vr}from"./context-BFPaAUK_.js";import{n as Br}from"./ImperativeModal-Ci0icDPt.js";import{t as Kr}from"./links-wcQA1Np1.js";import{i as Ze,o as $r,r as et,t as Gr}from"./state-DDimGh2o.js";import{n as Qr}from"./error-banner-BkIr-0dH.js";import"./chunk-5FQGJX7Z-CYQpNADu.js";import"./html-to-image-ChNWEUlR.js";import"./esm-Bmzgrl_5.js";import{t as ye}from"./empty-state-JOk_hLQe.js";import{t as Jr}from"./pair-with-agent-modal-1b5Eh8Xo.js";var h=ze(Ot(),1),a=ze(Jt(),1);function Zr(t,e){return h.useReducer((r,l)=>e[r][l]??r,t)}var je="ScrollArea",[tt,Bo]=Zt(je),[ea,z]=tt(je),rt=h.forwardRef((t,e)=>{let{__scopeScrollArea:r,type:l="hover",dir:o,scrollHideDelay:s=600,...n}=t,[i,u]=h.useState(null),[c,d]=h.useState(null),[m,f]=h.useState(null),[x,g]=h.useState(null),[b,A]=h.useState(null),[w,S]=h.useState(0),[T,C]=h.useState(0),[j,N]=h.useState(!1),[L,I]=h.useState(!1),y=ee(e,M=>u(M)),E=tr(o);return(0,a.jsx)(ea,{scope:r,type:l,dir:E,scrollHideDelay:s,scrollArea:i,viewport:c,onViewportChange:d,content:m,onContentChange:f,scrollbarX:x,onScrollbarXChange:g,scrollbarXEnabled:j,onScrollbarXEnabledChange:N,scrollbarY:b,onScrollbarYChange:A,scrollbarYEnabled:L,onScrollbarYEnabledChange:I,onCornerWidthChange:S,onCornerHeightChange:C,children:(0,a.jsx)(oe.div,{dir:E,...n,ref:y,style:{position:"relative","--radix-scroll-area-corner-width":w+"px","--radix-scroll-area-corner-height":T+"px",...t.style}})})});rt.displayName=je;var at="ScrollAreaViewport",ot=h.forwardRef((t,e)=>{let{__scopeScrollArea:r,children:l,nonce:o,...s}=t,n=z(at,r),i=ee(e,h.useRef(null),n.onViewportChange);return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("style",{dangerouslySetInnerHTML:{__html:"[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}"},nonce:o}),(0,a.jsx)(oe.div,{"data-radix-scroll-area-viewport":"",...s,ref:i,style:{overflowX:n.scrollbarXEnabled?"scroll":"hidden",overflowY:n.scrollbarYEnabled?"scroll":"hidden",...t.style},children:(0,a.jsx)("div",{ref:n.onContentChange,style:{minWidth:"100%",display:"table"},children:l})})]})});ot.displayName=at;var W="ScrollAreaScrollbar",Se=h.forwardRef((t,e)=>{let{forceMount:r,...l}=t,o=z(W,t.__scopeScrollArea),{onScrollbarXEnabledChange:s,onScrollbarYEnabledChange:n}=o,i=t.orientation==="horizontal";return h.useEffect(()=>(i?s(!0):n(!0),()=>{i?s(!1):n(!1)}),[i,s,n]),o.type==="hover"?(0,a.jsx)(ta,{...l,ref:e,forceMount:r}):o.type==="scroll"?(0,a.jsx)(ra,{...l,ref:e,forceMount:r}):o.type==="auto"?(0,a.jsx)(st,{...l,ref:e,forceMount:r}):o.type==="always"?(0,a.jsx)(Ce,{...l,ref:e}):null});Se.displayName=W;var ta=h.forwardRef((t,e)=>{let{forceMount:r,...l}=t,o=z(W,t.__scopeScrollArea),[s,n]=h.useState(!1);return h.useEffect(()=>{let i=o.scrollArea,u=0;if(i){let c=()=>{window.clearTimeout(u),n(!0)},d=()=>{u=window.setTimeout(()=>n(!1),o.scrollHideDelay)};return i.addEventListener("pointerenter",c),i.addEventListener("pointerleave",d),()=>{window.clearTimeout(u),i.removeEventListener("pointerenter",c),i.removeEventListener("pointerleave",d)}}},[o.scrollArea,o.scrollHideDelay]),(0,a.jsx)(le,{present:r||s,children:(0,a.jsx)(st,{"data-state":s?"visible":"hidden",...l,ref:e})})}),ra=h.forwardRef((t,e)=>{let{forceMount:r,...l}=t,o=z(W,t.__scopeScrollArea),s=t.orientation==="horizontal",n=ue(()=>u("SCROLL_END"),100),[i,u]=Zr("hidden",{hidden:{SCROLL:"scrolling"},scrolling:{SCROLL_END:"idle",POINTER_ENTER:"interacting"},interacting:{SCROLL:"interacting",POINTER_LEAVE:"idle"},idle:{HIDE:"hidden",SCROLL:"scrolling",POINTER_ENTER:"interacting"}});return h.useEffect(()=>{if(i==="idle"){let c=window.setTimeout(()=>u("HIDE"),o.scrollHideDelay);return()=>window.clearTimeout(c)}},[i,o.scrollHideDelay,u]),h.useEffect(()=>{let c=o.viewport,d=s?"scrollLeft":"scrollTop";if(c){let m=c[d],f=()=>{let x=c[d];m!==x&&(u("SCROLL"),n()),m=x};return c.addEventListener("scroll",f),()=>c.removeEventListener("scroll",f)}},[o.viewport,s,u,n]),(0,a.jsx)(le,{present:r||i!=="hidden",children:(0,a.jsx)(Ce,{"data-state":i==="hidden"?"hidden":"visible",...l,ref:e,onPointerEnter:Q(t.onPointerEnter,()=>u("POINTER_ENTER")),onPointerLeave:Q(t.onPointerLeave,()=>u("POINTER_LEAVE"))})})}),st=h.forwardRef((t,e)=>{let r=z(W,t.__scopeScrollArea),{forceMount:l,...o}=t,[s,n]=h.useState(!1),i=t.orientation==="horizontal",u=ue(()=>{if(r.viewport){let c=r.viewport.offsetWidth<r.viewport.scrollWidth,d=r.viewport.offsetHeight<r.viewport.scrollHeight;n(i?c:d)}},10);return te(r.viewport,u),te(r.content,u),(0,a.jsx)(le,{present:l||s,children:(0,a.jsx)(Ce,{"data-state":s?"visible":"hidden",...o,ref:e})})}),Ce=h.forwardRef((t,e)=>{let{orientation:r="vertical",...l}=t,o=z(W,t.__scopeScrollArea),s=h.useRef(null),n=h.useRef(0),[i,u]=h.useState({content:0,viewport:0,scrollbar:{size:0,paddingStart:0,paddingEnd:0}}),c=dt(i.viewport,i.content),d={...l,sizes:i,onSizesChange:u,hasThumb:c>0&&c<1,onThumbChange:f=>s.current=f,onThumbPointerUp:()=>n.current=0,onThumbPointerDown:f=>n.current=f};function m(f,x){return ia(f,n.current,i,x)}return r==="horizontal"?(0,a.jsx)(aa,{...d,ref:e,onThumbPositionChange:()=>{if(o.viewport&&s.current){let f=o.viewport.scrollLeft,x=ut(f,i,o.dir);s.current.style.transform=`translate3d(${x}px, 0, 0)`}},onWheelScroll:f=>{o.viewport&&(o.viewport.scrollLeft=f)},onDragScroll:f=>{o.viewport&&(o.viewport.scrollLeft=m(f,o.dir))}}):r==="vertical"?(0,a.jsx)(oa,{...d,ref:e,onThumbPositionChange:()=>{if(o.viewport&&s.current){let f=o.viewport.scrollTop,x=ut(f,i);s.current.style.transform=`translate3d(0, ${x}px, 0)`}},onWheelScroll:f=>{o.viewport&&(o.viewport.scrollTop=f)},onDragScroll:f=>{o.viewport&&(o.viewport.scrollTop=m(f))}}):null}),aa=h.forwardRef((t,e)=>{let{sizes:r,onSizesChange:l,...o}=t,s=z(W,t.__scopeScrollArea),[n,i]=h.useState(),u=h.useRef(null),c=ee(e,u,s.onScrollbarXChange);return h.useEffect(()=>{u.current&&i(getComputedStyle(u.current))},[u]),(0,a.jsx)(nt,{"data-orientation":"horizontal",...o,ref:c,sizes:r,style:{bottom:0,left:s.dir==="rtl"?"var(--radix-scroll-area-corner-width)":0,right:s.dir==="ltr"?"var(--radix-scroll-area-corner-width)":0,"--radix-scroll-area-thumb-width":de(r)+"px",...t.style},onThumbPointerDown:d=>t.onThumbPointerDown(d.x),onDragScroll:d=>t.onDragScroll(d.x),onWheelScroll:(d,m)=>{if(s.viewport){let f=s.viewport.scrollLeft+d.deltaX;t.onWheelScroll(f),ht(f,m)&&d.preventDefault()}},onResize:()=>{u.current&&s.viewport&&n&&l({content:s.viewport.scrollWidth,viewport:s.viewport.offsetWidth,scrollbar:{size:u.current.clientWidth,paddingStart:ce(n.paddingLeft),paddingEnd:ce(n.paddingRight)}})}})}),oa=h.forwardRef((t,e)=>{let{sizes:r,onSizesChange:l,...o}=t,s=z(W,t.__scopeScrollArea),[n,i]=h.useState(),u=h.useRef(null),c=ee(e,u,s.onScrollbarYChange);return h.useEffect(()=>{u.current&&i(getComputedStyle(u.current))},[u]),(0,a.jsx)(nt,{"data-orientation":"vertical",...o,ref:c,sizes:r,style:{top:0,right:s.dir==="ltr"?0:void 0,left:s.dir==="rtl"?0:void 0,bottom:"var(--radix-scroll-area-corner-height)","--radix-scroll-area-thumb-height":de(r)+"px",...t.style},onThumbPointerDown:d=>t.onThumbPointerDown(d.y),onDragScroll:d=>t.onDragScroll(d.y),onWheelScroll:(d,m)=>{if(s.viewport){let f=s.viewport.scrollTop+d.deltaY;t.onWheelScroll(f),ht(f,m)&&d.preventDefault()}},onResize:()=>{u.current&&s.viewport&&n&&l({content:s.viewport.scrollHeight,viewport:s.viewport.offsetHeight,scrollbar:{size:u.current.clientHeight,paddingStart:ce(n.paddingTop),paddingEnd:ce(n.paddingBottom)}})}})}),[sa,lt]=tt(W),nt=h.forwardRef((t,e)=>{let{__scopeScrollArea:r,sizes:l,hasThumb:o,onThumbChange:s,onThumbPointerUp:n,onThumbPointerDown:i,onThumbPositionChange:u,onDragScroll:c,onWheelScroll:d,onResize:m,...f}=t,x=z(W,r),[g,b]=h.useState(null),A=ee(e,y=>b(y)),w=h.useRef(null),S=h.useRef(""),T=x.viewport,C=l.content-l.viewport,j=G(d),N=G(u),L=ue(m,10);function I(y){w.current&&c({x:y.clientX-w.current.left,y:y.clientY-w.current.top})}return h.useEffect(()=>{let y=E=>{let M=E.target;g!=null&&g.contains(M)&&j(E,C)};return document.addEventListener("wheel",y,{passive:!1}),()=>document.removeEventListener("wheel",y,{passive:!1})},[T,g,C,j]),h.useEffect(N,[l,N]),te(g,L),te(x.content,L),(0,a.jsx)(sa,{scope:r,scrollbar:g,hasThumb:o,onThumbChange:G(s),onThumbPointerUp:G(n),onThumbPositionChange:N,onThumbPointerDown:G(i),children:(0,a.jsx)(oe.div,{...f,ref:A,style:{position:"absolute",...f.style},onPointerDown:Q(t.onPointerDown,y=>{y.button===0&&(y.target.setPointerCapture(y.pointerId),w.current=g.getBoundingClientRect(),S.current=document.body.style.webkitUserSelect,document.body.style.webkitUserSelect="none",x.viewport&&(x.viewport.style.scrollBehavior="auto"),I(y))}),onPointerMove:Q(t.onPointerMove,I),onPointerUp:Q(t.onPointerUp,y=>{let E=y.target;E.hasPointerCapture(y.pointerId)&&E.releasePointerCapture(y.pointerId),document.body.style.webkitUserSelect=S.current,x.viewport&&(x.viewport.style.scrollBehavior=""),w.current=null})})})}),ie="ScrollAreaThumb",it=h.forwardRef((t,e)=>{let{forceMount:r,...l}=t,o=lt(ie,t.__scopeScrollArea);return(0,a.jsx)(le,{present:r||o.hasThumb,children:(0,a.jsx)(la,{ref:e,...l})})}),la=h.forwardRef((t,e)=>{let{__scopeScrollArea:r,style:l,...o}=t,s=z(ie,r),n=lt(ie,r),{onThumbPositionChange:i}=n,u=ee(e,m=>n.onThumbChange(m)),c=h.useRef(void 0),d=ue(()=>{c.current&&(c.current=(c.current(),void 0))},100);return h.useEffect(()=>{let m=s.viewport;if(m){let f=()=>{d(),c.current||(c.current=ca(m,i),i())};return i(),m.addEventListener("scroll",f),()=>m.removeEventListener("scroll",f)}},[s.viewport,d,i]),(0,a.jsx)(oe.div,{"data-state":n.hasThumb?"visible":"hidden",...o,ref:u,style:{width:"var(--radix-scroll-area-thumb-width)",height:"var(--radix-scroll-area-thumb-height)",...l},onPointerDownCapture:Q(t.onPointerDownCapture,m=>{let f=m.target.getBoundingClientRect(),x=m.clientX-f.left,g=m.clientY-f.top;n.onThumbPointerDown({x,y:g})}),onPointerUp:Q(t.onPointerUp,n.onThumbPointerUp)})});it.displayName=ie;var Ne="ScrollAreaCorner",ct=h.forwardRef((t,e)=>{let r=z(Ne,t.__scopeScrollArea),l=!!(r.scrollbarX&&r.scrollbarY);return r.type!=="scroll"&&l?(0,a.jsx)(na,{...t,ref:e}):null});ct.displayName=Ne;var na=h.forwardRef((t,e)=>{let{__scopeScrollArea:r,...l}=t,o=z(Ne,r),[s,n]=h.useState(0),[i,u]=h.useState(0),c=!!(s&&i);return te(o.scrollbarX,()=>{var m;let d=((m=o.scrollbarX)==null?void 0:m.offsetHeight)||0;o.onCornerHeightChange(d),u(d)}),te(o.scrollbarY,()=>{var m;let d=((m=o.scrollbarY)==null?void 0:m.offsetWidth)||0;o.onCornerWidthChange(d),n(d)}),c?(0,a.jsx)(oe.div,{...l,ref:e,style:{width:s,height:i,position:"absolute",right:o.dir==="ltr"?0:void 0,left:o.dir==="rtl"?0:void 0,bottom:0,...t.style}}):null});function ce(t){return t?parseInt(t,10):0}function dt(t,e){let r=t/e;return isNaN(r)?0:r}function de(t){let e=dt(t.viewport,t.content),r=t.scrollbar.paddingStart+t.scrollbar.paddingEnd,l=(t.scrollbar.size-r)*e;return Math.max(l,18)}function ia(t,e,r,l="ltr"){let o=de(r),s=o/2,n=e||s,i=o-n,u=r.scrollbar.paddingStart+n,c=r.scrollbar.size-r.scrollbar.paddingEnd-i,d=r.content-r.viewport,m=l==="ltr"?[0,d]:[d*-1,0];return mt([u,c],m)(t)}function ut(t,e,r="ltr"){let l=de(e),o=e.scrollbar.paddingStart+e.scrollbar.paddingEnd,s=e.scrollbar.size-o,n=e.content-e.viewport,i=s-l,u=lr(t,r==="ltr"?[0,n]:[n*-1,0]);return mt([0,n],[0,i])(u)}function mt(t,e){return r=>{if(t[0]===t[1]||e[0]===e[1])return e[0];let l=(e[1]-e[0])/(t[1]-t[0]);return e[0]+l*(r-t[0])}}function ht(t,e){return t>0&&t<e}var ca=(t,e=()=>{})=>{let r={left:t.scrollLeft,top:t.scrollTop},l=0;return(function o(){let s={left:t.scrollLeft,top:t.scrollTop},n=r.left!==s.left,i=r.top!==s.top;(n||i)&&e(),r=s,l=window.requestAnimationFrame(o)})(),()=>window.cancelAnimationFrame(l)};function ue(t,e){let r=G(t),l=h.useRef(0);return h.useEffect(()=>()=>window.clearTimeout(l.current),[]),h.useCallback(()=>{window.clearTimeout(l.current),l.current=window.setTimeout(r,e)},[r,e])}function te(t,e){let r=G(e);er(()=>{let l=0;if(t){let o=new ResizeObserver(()=>{cancelAnimationFrame(l),l=window.requestAnimationFrame(r)});return o.observe(t),()=>{window.cancelAnimationFrame(l),o.unobserve(t)}}},[t,r])}var pt=rt,da=ot,ua=ct,ma=qe("notebook-text",[["path",{d:"M2 6h4",key:"aawbzj"}],["path",{d:"M2 10h4",key:"l0bgd4"}],["path",{d:"M2 14h4",key:"1gsvsf"}],["path",{d:"M2 18h4",key:"1bu2t1"}],["rect",{width:"16",height:"20",x:"4",y:"2",rx:"2",key:"1nb95v"}],["path",{d:"M9.5 8h5",key:"11mslq"}],["path",{d:"M9.5 12H16",key:"ktog6x"}],["path",{d:"M9.5 16H14",key:"p1seyn"}]]),ha=qe("sliders-horizontal",[["path",{d:"M10 5H3",key:"1qgfaw"}],["path",{d:"M12 19H3",key:"yhmn1j"}],["path",{d:"M14 3v4",key:"1sua03"}],["path",{d:"M16 17v4",key:"1q0r14"}],["path",{d:"M21 12h-9",key:"1o4lsq"}],["path",{d:"M21 19h-5",key:"1rlt1p"}],["path",{d:"M21 5h-7",key:"1oszz2"}],["path",{d:"M8 10v4",key:"tgpxqk"}],["path",{d:"M8 12H3",key:"a7s4jb"}]]),ft=be();const pa=({chatState:t,chatId:e,messages:r})=>{if(!e)return ae.warn("No active chat"),t;let l=t.chats.get(e);if(!l)return ae.warn("No active chat"),t;let o=new Map(t.chats),s=Date.now();return o.set(l.id,{...l,messages:r,updatedAt:s}),{...t,chats:o}};var xt=h.forwardRef((t,e)=>{let r=(0,ft.c)(15),l,o,s;r[0]===t?(l=r[1],o=r[2],s=r[3]):({className:o,children:l,...s}=t,r[0]=t,r[1]=l,r[2]=o,r[3]=s);let n;r[4]===o?n=r[5]:(n=$("relative overflow-hidden",o),r[4]=o,r[5]=n);let i;r[6]===l?i=r[7]:(i=(0,a.jsx)(da,{className:"h-full w-full rounded-[inherit]",children:l}),r[6]=l,r[7]=i);let u,c;r[8]===Symbol.for("react.memo_cache_sentinel")?(u=(0,a.jsx)(vt,{}),c=(0,a.jsx)(ua,{}),r[8]=u,r[9]=c):(u=r[8],c=r[9]);let d;return r[10]!==s||r[11]!==e||r[12]!==n||r[13]!==i?(d=(0,a.jsxs)(pt,{ref:e,className:n,...s,children:[i,u,c]}),r[10]=s,r[11]=e,r[12]=n,r[13]=i,r[14]=d):d=r[14],d});xt.displayName=pt.displayName;var vt=h.forwardRef((t,e)=>{let r=(0,ft.c)(14),l,o,s;r[0]===t?(l=r[1],o=r[2],s=r[3]):({className:l,orientation:s,...o}=t,r[0]=t,r[1]=l,r[2]=o,r[3]=s);let n=s===void 0?"vertical":s,i=n==="vertical"&&"h-full w-2.5 border-l border-l-transparent p-px",u=n==="horizontal"&&"h-2.5 flex-col border-t border-t-transparent p-px",c;r[4]!==l||r[5]!==i||r[6]!==u?(c=$("flex touch-none select-none transition-colors",i,u,l),r[4]=l,r[5]=i,r[6]=u,r[7]=c):c=r[7];let d;r[8]===Symbol.for("react.memo_cache_sentinel")?(d=(0,a.jsx)(it,{className:"relative flex-1 rounded-full bg-border"}),r[8]=d):d=r[8];let m;return r[9]!==n||r[10]!==o||r[11]!==e||r[12]!==c?(m=(0,a.jsx)(Se,{ref:e,orientation:n,className:c,...o,children:d}),r[9]=n,r[10]=o,r[11]=e,r[12]=c,r[13]=m):m=r[13],m});vt.displayName=Se.displayName;var fa=[{label:"Today",days:0},{label:"Yesterday",days:1},{label:"2d ago",days:2},{label:"3d ago",days:3},{label:"This week",days:7},{label:"This month",days:30}];const xa=t=>{let e=Date.now(),r=fa.map(s=>({...s,chats:[]})),l={label:"Older",days:1/0,chats:[]},o=s=>{switch(s){case 0:return r[0];case 1:return r[1];case 2:return r[2];case 3:return r[3];default:return s>=4&&s<=7?r[4]:s>=8&&s<=30?r[5]:l}};for(let s of t)o(Math.floor((e-s.updatedAt)/864e5)).chats.push(s);return[...r,l].filter(s=>s.chats.length>0)},va=({activeChatId:t,setActiveChat:e})=>{let r=ge(Ze),{locale:l}=Vr(),[o,s]=(0,h.useState)(""),n=(0,h.useMemo)(()=>[...r.chats.values()].toSorted((c,d)=>d.updatedAt-c.updatedAt),[r.chats]),i=(0,h.useMemo)(()=>o.trim()?n.filter(c=>c.title.toLowerCase().includes(o.toLowerCase())):n,[n,o]),u=(0,h.useMemo)(()=>xa(i),[i]);return(0,a.jsxs)(Ye,{children:[(0,a.jsx)(we,{content:"Previous chats",children:(0,a.jsx)(Oe,{asChild:!0,children:(0,a.jsx)(K,{variant:"text",size:"icon",children:(0,a.jsx)(Ut,{className:"h-4 w-4"})})})}),(0,a.jsxs)(Ue,{className:"w-[480px] p-0",align:"start",side:"right",children:[(0,a.jsx)("div",{className:"pt-3 px-3 w-full",children:(0,a.jsx)(Or,{placeholder:"Search chat history...",value:o,onChange:c=>s(c.target.value),className:"text-xs"})}),(0,a.jsx)(xt,{className:"h-[450px] p-2",children:(0,a.jsxs)("div",{className:"space-y-3",children:[n.length===0&&(0,a.jsx)(ye,{title:"No chats yet",description:"Start a new chat to get started",icon:(0,a.jsx)(Ve,{})}),i.length===0&&o&&n.length>0&&(0,a.jsx)(ye,{title:"No chats found",description:`No chats match "${o}"`,icon:(0,a.jsx)(Wr,{})}),u.map((c,d)=>(0,a.jsxs)("div",{className:"space-y-2",children:[(0,a.jsx)("div",{className:"text-xs px-1 text-muted-foreground/60",children:c.label}),(0,a.jsx)("div",{children:c.chats.map(m=>(0,a.jsxs)("button",{className:$("w-full p-1 rounded-md cursor-pointer text-left flex items-center justify-between",m.id===t&&"bg-accent",m.id!==t&&"hover:bg-muted/20"),onClick:()=>{e(m.id)},type:"button",children:[(0,a.jsx)("div",{className:"flex-1 min-w-0",children:(0,a.jsx)("div",{className:"text-sm truncate",children:m.title})}),(0,a.jsx)("div",{className:"text-xs text-muted-foreground/60 ml-2 shrink-0",children:Xr(m.updatedAt,l)})]},m.id))}),d!==u.length-1&&(0,a.jsx)("hr",{})]},c.label))]})})]})]})};var ga=be();const ba=()=>{let t=(0,ga.c)(17),[e,r]=ve(et),l=e.webSearch,o=l?"Capabilities (web search enabled)":"Capabilities",s=l||void 0,n=l&&"bg-primary/15 text-primary ring-1 ring-primary/30 opacity-100 hover:bg-primary/20",i;t[0]===n?i=t[1]:(i=$("h-6 w-6 shrink-0 bg-muted hover:bg-muted/30",n),t[0]=n,t[1]=i);let u;t[2]===Symbol.for("react.memo_cache_sentinel")?(u=(0,a.jsx)(ha,{className:"h-3.5 w-3.5"}),t[2]=u):u=t[2];let c;t[3]!==o||t[4]!==s||t[5]!==i?(c=(0,a.jsx)(Oe,{asChild:!0,children:(0,a.jsx)(K,{"aria-label":"Capabilities",title:o,"data-active":s,variant:"text",size:"icon",className:i,children:u})}),t[3]=o,t[4]=s,t[5]=i,t[6]=c):c=t[6];let d;t[7]===Symbol.for("react.memo_cache_sentinel")?(d=(0,a.jsx)("span",{className:"text-sm font-semibold",children:"Web search"}),t[7]=d):d=t[7];let m;t[8]===Symbol.for("react.memo_cache_sentinel")?(m=(0,a.jsxs)("div",{className:"flex flex-col gap-0.5",children:[d,(0,a.jsxs)("span",{className:"text-xs text-muted-foreground",children:["Search the web when the model supports it."," ",(0,a.jsx)(Kr,{href:"https://docs.marimo.io/guides/editor_features/tools#web-search-and-fetch",children:"Learn more"})]})]}),t[8]=m):m=t[8];let f;t[9]===r?f=t[10]:(f=b=>r(A=>({...A,webSearch:b})),t[9]=r,t[10]=f);let x;t[11]!==f||t[12]!==l?(x=(0,a.jsx)(Ue,{className:"w-76 p-3",align:"start",side:"top",children:(0,a.jsxs)("label",{htmlFor:"web-search-toggle",className:"flex items-start justify-between gap-3 cursor-pointer",children:[m,(0,a.jsx)(Qt,{id:"web-search-toggle","aria-label":"Web search",size:"sm",checked:l,onCheckedChange:f})]})}),t[11]=f,t[12]=l,t[13]=x):x=t[13];let g;return t[14]!==c||t[15]!==x?(g=(0,a.jsxs)(Ye,{children:[c,x]}),t[14]=c,t[15]=x,t[16]=g):g=t[16],g};var J=be(),gt="manual",bt=(0,h.memo)(t=>{let e=(0,J.c)(18),{message:r}=t,l;e[0]===r.parts?l=e[1]:(l=r.parts.filter(Na).map(Aa).join(`
|
|
2
|
-
`),e[0]=r.parts,e[1]=l);let o=l,s,n,i;if(e[2]!==r.parts){let x=r.parts.filter(Ra);i="flex justify-end",s="w-[95%] bg-background border border-dashed p-2 rounded-sm opacity-70",n=x.map(Ta),e[2]=r.parts,e[3]=s,e[4]=n,e[5]=i}else s=e[3],n=e[4],i=e[5];let u;e[6]===o?u=e[7]:(u=(0,a.jsx)("span",{className:"wrap-break-word",children:o}),e[6]=o,e[7]=u);let c;e[8]===Symbol.for("react.memo_cache_sentinel")?(c=(0,a.jsx)(Je,{className:"h-3.5 w-3.5 shrink-0 animate-spin"}),e[8]=c):c=e[8];let d;e[9]===u?d=e[10]:(d=(0,a.jsxs)("div",{className:"flex items-center justify-end gap-2 text-sm text-muted-foreground",children:[u,c]}),e[9]=u,e[10]=d);let m;e[11]!==s||e[12]!==n||e[13]!==d?(m=(0,a.jsxs)("div",{className:s,children:[n,d]}),e[11]=s,e[12]=n,e[13]=d,e[14]=m):m=e[14];let f;return e[15]!==i||e[16]!==m?(f=(0,a.jsx)("div",{className:i,children:m}),e[15]=i,e[16]=m,e[17]=f):f=e[17],f});bt.displayName="QueuedMessageDisplay";var wa=t=>{let e=(0,J.c)(18),{onNewChat:r,activeChatId:l,setActiveChat:o}=t,{handleClick:s}=He(),n;e[0]===Symbol.for("react.memo_cache_sentinel")?(n=(0,a.jsx)(Hr,{className:"h-4 w-4"}),e[0]=n):n=e[0];let i;e[1]===r?i=e[2]:(i=(0,a.jsx)(we,{content:"New chat",children:(0,a.jsx)(K,{variant:"text",size:"icon",onClick:r,children:n})}),e[1]=r,e[2]=i);let u;e[3]===Symbol.for("react.memo_cache_sentinel")?(u=(0,a.jsx)(Vt,{}),e[3]=u):u=e[3];let c;e[4]===s?c=e[5]:(c=()=>s("ai"),e[4]=s,e[5]=c);let d;e[6]===Symbol.for("react.memo_cache_sentinel")?(d=(0,a.jsx)(Ur,{className:"h-4 w-4"}),e[6]=d):d=e[6];let m;e[7]===c?m=e[8]:(m=(0,a.jsx)(we,{content:"AI Settings",children:(0,a.jsx)(K,{variant:"text",size:"xs",className:"hover:bg-foreground/10 py-2",onClick:c,children:d})}),e[7]=c,e[8]=m);let f;e[9]!==l||e[10]!==o?(f=(0,a.jsx)(va,{activeChatId:l,setActiveChat:o}),e[9]=l,e[10]=o,e[11]=f):f=e[11];let x;e[12]!==m||e[13]!==f?(x=(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[u,m,f]}),e[12]=m,e[13]=f,e[14]=x):x=e[14];let g;return e[15]!==i||e[16]!==x?(g=(0,a.jsxs)("div",{className:"flex border-b px-2 py-1 justify-between shrink-0 items-center",children:[i,x]}),e[15]=i,e[16]=x,e[17]=g):g=e[17],g},wt=(0,h.memo)(t=>{let e=(0,J.c)(17),{message:r,index:l,onEdit:o,isStreamingReasoning:s,isLast:n,isActive:i,addToolApprovalResponse:u}=t,c;e[0]!==l||e[1]!==o?(c=w=>{var C,j,N;let S=(j=(C=w.parts)==null?void 0:C.filter(Ea))==null?void 0:j.map(_a).join(`
|
|
3
|
-
`),T=(N=w.parts)==null?void 0:N.filter(ka);return(0,a.jsxs)("div",{className:"w-[95%] bg-background border p-1 rounded-sm",children:[T==null?void 0:T.map(Ia),(0,a.jsx)(Ge,{value:S,placeholder:"Type your message...",onChange:La,onSubmit:(L,I)=>{I.trim()&&o(l,I)},onClose:Ma},w.id)]})},e[0]=l,e[1]=o,e[2]=c):c=e[2];let d=c,m;e[3]!==u||e[4]!==i||e[5]!==n||e[6]!==s?(m=w=>(0,a.jsxs)("div",{className:"w-[95%] wrap-break-word",children:[(0,a.jsx)("div",{className:"absolute right-1 top-1 opacity-0 group-hover:opacity-100 transition-opacity",children:(0,a.jsx)(qr,{className:"h-3 w-3",value:w.parts.filter(Pa).map(Da).join(`
|
|
4
|
-
`)||""})}),xr({message:w,isStreamingReasoning:s,isLast:n,isActive:i,addToolApprovalResponse:u})]}),e[3]=u,e[4]=i,e[5]=n,e[6]=s,e[7]=m):m=e[7];let f=m,x=r.role==="user"?"justify-end":"justify-start",g;e[8]===x?g=e[9]:(g=$("flex group relative",x),e[8]=x,e[9]=g);let b;e[10]!==r||e[11]!==f||e[12]!==d?(b=r.role==="user"?d(r):f(r),e[10]=r,e[11]=f,e[12]=d,e[13]=b):b=e[13];let A;return e[14]!==g||e[15]!==b?(A=(0,a.jsx)("div",{className:g,children:b}),e[14]=g,e[15]=b,e[16]=A):A=e[16],A});wt.displayName="ChatMessage";var yt=(0,h.memo)(t=>{var se;let e=(0,J.c)(43),{isEmpty:r,onSendClick:l,isLoading:o,onStop:s,fileInputRef:n,onAddFiles:i,onAddContext:u}=t,c=ge(We),d=(c==null?void 0:c.mode)||gt,m=((se=c==null?void 0:c.models)==null?void 0:se.chat_model)||"openai/gpt-4o",f=qt.parse(m).providerId,{saveModeChange:x}=rr(),g;e[0]===Symbol.for("react.memo_cache_sentinel")?(g=[{value:"manual",label:"Manual",subtitle:"Pure chat, no tool usage",Icon:Fr},{value:"ask",label:"Ask",subtitle:"AI with access to read-only tools like documentation search",Icon:ma},{value:"agent",label:"Agent",subtitle:"AI with access to read and write tools",Icon:zr},{value:"code_mode",label:"Code Mode",subtitle:"AI with access to the notebook's kernel. Can overwrite changes.",Icon:Dr}],e[0]=g):g=e[0];let b=g,A=Tr.has(f),w;e[1]!==d||e[2]!==b?(w=b.find(me=>me.value===d),e[1]=d,e[2]=b,e[3]=w):w=e[3];let S=w,T=S==null?void 0:S.Icon,C=S==null?void 0:S.label,j;e[4]===T?j=e[5]:(j=T&&(0,a.jsx)(T,{className:"h-3 w-3"}),e[4]=T,e[5]=j);let N;e[6]===C?N=e[7]:(N=(0,a.jsx)("span",{className:"text-nowrap",children:C}),e[6]=C,e[7]=N);let L;e[8]!==j||e[9]!==N?(L=(0,a.jsxs)(ir,{className:"h-6 text-xs border-border shadow-none! ring-0! bg-muted hover:bg-muted/30 py-0 px-2 gap-1.5 shrink-0",children:[j,N]}),e[8]=j,e[9]=N,e[10]=L):L=e[10];let I;e[11]===Symbol.for("react.memo_cache_sentinel")?(I=(0,a.jsx)(ar,{className:"text-xs uppercase tracking-wider text-muted-foreground/70 font-medium",children:"AI Mode"}),e[11]=I):I=e[11];let y;e[12]===b?y=e[13]:(y=(0,a.jsx)(sr,{children:(0,a.jsxs)(nr,{children:[I,b.map(za)]})}),e[12]=b,e[13]=y);let E;e[14]!==d||e[15]!==x||e[16]!==L||e[17]!==y?(E=(0,a.jsxs)(cr,{value:d,onValueChange:x,children:[L,y]}),e[14]=d,e[15]=x,e[16]=L,e[17]=y,e[18]=E):E=e[18];let M,U;e[19]===Symbol.for("react.memo_cache_sentinel")?(U=(0,a.jsx)(Bt,{placeholder:"Model",triggerClassName:"h-6 text-xs shadow-none! ring-0! bg-muted hover:bg-muted/30 rounded-sm max-w-[200px]",iconSize:"small",showAddCustomModelDocs:!0,forRole:"chat"}),M=(0,a.jsx)(ba,{}),e[19]=M,e[20]=U):(M=e[19],U=e[20]);let Y;e[21]===E?Y=e[22]:(Y=(0,a.jsxs)("div",{className:"flex flex-wrap items-center gap-1",children:[E,U,M]}),e[21]=E,e[22]=Y);let X;e[23]!==o||e[24]!==u?(X=(0,a.jsx)(Er,{handleAddContext:u,isLoading:o}),e[23]=o,e[24]=u,e[25]=X):X=e[25];let q;e[26]!==n||e[27]!==A||e[28]!==o||e[29]!==i?(q=A&&(0,a.jsx)(Ir,{fileInputRef:n,isLoading:o,onAddFiles:i}),e[26]=n,e[27]=A,e[28]=o,e[29]=i,e[30]=q):q=e[30];let V;e[31]!==r||e[32]!==o||e[33]!==l||e[34]!==s?(V=(0,a.jsx)(_r,{isLoading:o,onStop:s,onSendClick:l,isEmpty:r}),e[31]=r,e[32]=o,e[33]=l,e[34]=s,e[35]=V):V=e[35];let F;e[36]!==X||e[37]!==q||e[38]!==V?(F=(0,a.jsxs)("div",{className:"flex flex-row ml-auto",children:[X,q,V]}),e[36]=X,e[37]=q,e[38]=V,e[39]=F):F=e[39];let B;return e[40]!==Y||e[41]!==F?(B=(0,a.jsx)(Xe,{children:(0,a.jsxs)("div",{className:"px-3 py-2 border-t border-border/20 flex flex-wrap items-center gap-1",children:[Y,F]})}),e[40]=Y,e[41]=F,e[42]=B):B=e[42],B});yt.displayName="ChatInputFooter";var Ae=(0,h.memo)(t=>{let e=(0,J.c)(29),{placeholder:r,input:l,inputClassName:o,setInput:s,onSubmit:n,inputRef:i,isLoading:u,onStop:c,fileInputRef:d,onAddFiles:m,onClose:f}=t,x;e[0]!==l||e[1]!==n?(x=()=>{l.trim()&&n(void 0,l)},e[0]=l,e[1]=n,e[2]=x):x=e[2];let g=P(x),b;e[3]===o?b=e[4]:(b=$("px-2 py-1.5",o),e[3]=o,e[4]=b);let A=r||"Type your message...",w;e[5]!==l||e[6]!==i||e[7]!==m||e[8]!==f||e[9]!==n||e[10]!==s||e[11]!==A?(w=(0,a.jsx)(Ge,{className:"max-h-[400px]",inputRef:i,value:l,onChange:s,onSubmit:n,onClose:f,onAddFiles:m,placeholder:A}),e[5]=l,e[6]=i,e[7]=m,e[8]=f,e[9]=n,e[10]=s,e[11]=A,e[12]=w):w=e[12];let S;e[13]!==b||e[14]!==w?(S=(0,a.jsx)("div",{className:b,children:w}),e[13]=b,e[14]=w,e[15]=S):S=e[15];let T=!l.trim(),C;e[16]===i?C=e[17]:(C=()=>vr(i),e[16]=i,e[17]=C);let j;e[18]!==d||e[19]!==g||e[20]!==u||e[21]!==m||e[22]!==c||e[23]!==T||e[24]!==C?(j=(0,a.jsx)(yt,{isEmpty:T,onAddContext:C,onSendClick:g,isLoading:u,onStop:c,fileInputRef:d,onAddFiles:m}),e[18]=d,e[19]=g,e[20]=u,e[21]=m,e[22]=c,e[23]=T,e[24]=C,e[25]=j):j=e[25];let N;return e[26]!==S||e[27]!==j?(N=(0,a.jsxs)("div",{className:"relative shrink-0 flex flex-col border-t",children:[S,j]}),e[26]=S,e[27]=j,e[28]=N):N=e[28],N});Ae.displayName="ChatInput";var ya=t=>{let e=(0,J.c)(5),{onPairWithAgent:r}=t;if($t())return null;let l,o,s;e[0]===Symbol.for("react.memo_cache_sentinel")?(l=(0,a.jsx)(Yr,{className:"h-3.5 w-3.5 shrink-0"}),o=(0,a.jsx)("span",{children:"Work on this notebook with your own agent"}),s=(0,a.jsx)(mr,{className:"h-3 w-3 shrink-0"}),e[0]=l,e[1]=o,e[2]=s):(l=e[0],o=e[1],s=e[2]);let n;return e[3]===r?n=e[4]:(n=(0,a.jsxs)(K,{variant:"text",className:"gap-1.5 text-sm text-link hover:underline",onClick:r,children:[l,o,s]}),e[3]=r,e[4]=n),n},ja=()=>{let t=(0,J.c)(6),e=ge(Kt),{handleClick:r}=He();if(!e){let o;t[0]===r?o=t[1]:(o=(0,a.jsx)(K,{variant:"outline",size:"sm",onClick:()=>r("ai","ai-providers"),children:"Edit AI settings"}),t[0]=r,t[1]=o);let s;t[2]===Symbol.for("react.memo_cache_sentinel")?(s=(0,a.jsx)(Ve,{}),t[2]=s):s=t[2];let n;return t[3]===o?n=t[4]:(n=(0,a.jsx)(ye,{title:"Chat with AI",description:"No AI provider configured or Chat model not selected",action:o,icon:s}),t[3]=o,t[4]=n),n}let l;return t[5]===Symbol.for("react.memo_cache_sentinel")?(l=(0,a.jsx)(Sa,{}),t[5]=l):l=t[5],l},Sa=()=>{let t=Ht(Ze),[e,r]=ve(Gr),[l,o]=ve($r),[s,n]=(0,h.useState)(""),[i,u]=(0,h.useState)(""),[c,d]=(0,h.useState)(!0),{files:m,addFiles:f,clearFiles:x,removeFile:g}=gr(),{messages:b,enqueue:A,flushNext:w,clear:S,hasQueuedRef:T}=Mr(),C=(0,h.useRef)(null),j=(0,h.useRef)(null),N=(0,h.useRef)(null),L=(0,h.useRef)(null),I=(0,h.useRef)(null),[y,E]=(0,h.useState)(null),M=P(()=>{I.current=null,E(null)}),U=Gt(),{invokeAiTool:Y,sendRun:X}=dr(),{openModal:q,closeModal:V}=Br(),F=e==null?void 0:e.id,B=Wt(),{addStagedCell:se}=br(),{createNewCell:me,prepareForRun:jt}=Yt(),St={addStagedCell:se,createNewCell:me,prepareForRun:jt,sendRun:X,store:B},{messages:H,sendMessage:he,error:re,status:Re,regenerate:Ct,stop:pe,addToolOutput:Nt,addToolApprovalResponse:At,id:Rt}=wr({id:F,throttle:100,sendAutomaticallyWhen:({messages:p})=>Qe(p),messages:(e==null?void 0:e.messages)||[],transport:new kr({api:U.getAiURL("chat").toString(),headers:()=>U.headers(),prepareSendMessagesRequest:async p=>{var O;let v=await Cr({messages:p.messages});v.success||ae.debug("Outgoing chat messages failed AI SDK schema validation",v.error);let R={uiMessages:p.messages,includeOtherCode:Xt(""),options:B.get(et)},k=((O=B.get(We))==null?void 0:O.mode)||gt,_=Sr.getToolSchemas(k);return{api:U.getAiURL("chat").toString(),body:{tools:_,...p,...R}}}},p=>{let v=fr(p);v!==void 0&&(I.current=v)}),onFinish:({messages:p,isError:v,isAbort:R,finishReason:k})=>{if(t(_=>pa({chatState:_,chatId:_.activeChatId,messages:p})),R){let _=hr({isAbort:!0,streamReason:I.current});if(M(),_!=null){let O=pr(_);ae.debug("Chat stream aborted",{reason:_,finishReason:k}),E(O)}}else M();fe(p,{isError:v,isAbort:R})},onToolCall:async({toolCall:p})=>{await Lr({invokeAiTool:Y,addToolOutput:Nt,toolCall:{toolName:p.toolName,toolCallId:p.toolCallId,input:p.input},toolContext:St})},onError:p=>{ae.error("An error occurred:",p)}}),Te=P(p=>{M(),he({role:"user",parts:p})}),fe=P((p,v)=>{T.current&&jr({isError:v.isError,isAbort:v.isAbort,hasPendingToolCalls:Qe(p),hasUnresolvedToolCalls:Ar(p)})&&w(Te)}),D=Re==="submitted"||Re==="streaming",Ee=(0,h.useRef)(D);Ee.current=D;let _e=P(p=>{Ee.current||T.current?A(p):Te(p)}),Tt=P(()=>{let p=N.current;if(!p)return;let{scrollTop:v,scrollHeight:R,clientHeight:k}=p;d(R>k?Math.abs(R-k-v)<5:!0)}),xe=P((p=!1)=>{let v=N.current;v&&v.scrollTo({top:v.scrollHeight,behavior:p?"smooth":"auto"})}),Et=D&&H.length>0&&Pr(H);(0,h.useEffect)(()=>{d(!0),S(),M()},[F,S,M]),(0,h.useEffect)(()=>{if(!c)return;let p=requestAnimationFrame(()=>{xe()});return()=>cancelAnimationFrame(p)},[H,b,D,c,xe]),(0,h.useEffect)(()=>{D||fe(H,{isError:re!=null,isAbort:!1})},[H,D,re,fe]);let ke=P(p=>{let v=Date.now(),R={id:Rt,title:Nr(p),messages:[],createdAt:v,updatedAt:v};t(k=>{let _=new Map(k.chats);return _.set(R.id,R),{...k,chats:_,activeChatId:R.id}})}),_t=P(async(p,v)=>{ke(p);let R=v&&v.length>0?await $e(v):void 0,{contextPart:k,attachments:_}=await ne(p);he({role:"user",parts:[{type:"text",text:p},...k?[k]:[],...R??[],..._]}),x(),n("")}),kt=P(()=>{r(null),n(""),u(""),S(),x()}),It=P(()=>{q((0,a.jsx)(Jr,{onClose:V}))}),Lt=P(async(p,v)=>{var Pe;let R=H[p],k=((Pe=R.parts)==null?void 0:Pe.filter(De=>De.type==="file"&&!yr(De)))??[],{contextPart:_,attachments:O}=await ne(v),Ft=R.id;he({messageId:Ft,role:"user",parts:[{type:"text",text:v},..._?[_]:[],...k,...O]})}),Mt=P(async(p,v)=>{var O;if(!v.trim())return;(O=j.current)!=null&&O.view&&Be(j.current.view);let R=m?await $e(m):void 0,{contextPart:k,attachments:_}=await ne(v);p==null||p.preventDefault(),_e([{type:"text",text:v},...k?[k]:[],...R??[],..._]),n(""),x()}),Pt=()=>{M(),Ct()},Dt=P(()=>{var p;i.trim()&&((p=C.current)!=null&&p.view&&Be(C.current.view),_t(i.trim(),m))}),zt=()=>{var p,v;return(v=(p=C.current)==null?void 0:p.editor)==null?void 0:v.blur()},Ie=P(async p=>{F??(ke(p),n(i));let{contextPart:v,attachments:R}=await ne(p);_e([{type:"text",text:p},...v?[v]:[],...R])}),Z=H.length===0;(0,h.useEffect)(()=>{if(!l)return;o(null);let{prompt:p,submit:v}=l;v?Ie(p):Z?(u(p),Fe(C)):(n(p),Fe(j))},[l,o,Z,Ie]);let Le=Z?(0,a.jsx)(Ae,{placeholder:"Ask anything, @ to include context about tables or dataframes",input:i,inputRef:C,inputClassName:"px-1 py-0",setInput:u,onSubmit:Dt,isLoading:D,onStop:pe,fileInputRef:L,onAddFiles:f,onClose:zt},"new-thread-input"):(0,a.jsx)(Ae,{input:s,setInput:n,onSubmit:Mt,inputRef:j,isLoading:D,onStop:pe,onClose:()=>{var p,v;return(v=(p=j.current)==null?void 0:p.editor)==null?void 0:v.blur()},fileInputRef:L,onAddFiles:f}),Me=m&&m.length>0&&(0,a.jsx)("div",{className:$("flex flex-row gap-1 flex-wrap p-1",Z&&"py-2 px-1"),children:m==null?void 0:m.map(p=>(0,a.jsx)(Rr,{file:p,onRemove:()=>g(p)},p.name))});return(0,a.jsxs)("div",{className:"flex flex-col h-[calc(100%-53px)]",children:[(0,a.jsx)(Xe,{children:(0,a.jsx)(wa,{onNewChat:kt,activeChatId:e==null?void 0:e.id,setActiveChat:r})}),(0,a.jsxs)("div",{className:"flex-1 flex flex-col overflow-hidden relative min-h-0",children:[(0,a.jsxs)("div",{className:"flex-1 px-3 bg-(--slate-1) gap-4 py-3 flex flex-col overflow-y-auto",ref:N,onScroll:Tt,children:[Z&&(0,a.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,a.jsxs)("div",{className:"rounded-md border bg-background",children:[Me,Le]}),(0,a.jsx)(ya,{onPairWithAgent:It})]}),H.map((p,v)=>(0,a.jsx)(wt,{message:p,index:v,onEdit:Lt,isStreamingReasoning:Et,isLast:v===H.length-1,isActive:D,addToolApprovalResponse:At},p.id)),b.map(p=>(0,a.jsx)(bt,{message:p},p.id)),D&&(0,a.jsx)("div",{className:"flex justify-center py-4",children:(0,a.jsx)(Je,{className:"h-4 w-4 animate-spin"})}),re&&(0,a.jsxs)("div",{className:"flex items-center justify-center space-x-2 mb-4",children:[(0,a.jsx)(Qr,{error:re||Error("Unknown error")}),(0,a.jsx)(K,{variant:"outline",size:"sm",onClick:Pt,children:"Retry"})]}),y&&!D&&!re&&(0,a.jsx)("div",{className:"flex justify-center py-2",children:(0,a.jsx)("span",{className:"text-xs text-muted-foreground",children:y})})]}),(0,a.jsx)(ur,{isVisible:!c&&(H.length>0||b.length>0),onScrollToBottom:()=>xe(!0)})]}),D&&(0,a.jsx)("div",{className:"w-full flex justify-center items-center z-20 border-t",children:(0,a.jsx)(K,{variant:"linkDestructive",size:"sm",onClick:pe,children:"Stop"})}),!Z&&(0,a.jsxs)(a.Fragment,{children:[Me,Le]})]})},Ca=ja;function Na(t){return t.type==="text"}function Aa(t){return t.text}function Ra(t){return t.type==="file"}function Ta(t,e){return(0,a.jsx)(Ke,{attachment:t},e)}function Ea(t){return t.type==="text"}function _a(t){return t.text}function ka(t){return t.type==="file"}function Ia(t,e){return(0,a.jsx)(Ke,{attachment:t},e)}function La(){}function Ma(){}function Pa(t){return t.type==="text"}function Da(t){return t.text}function za(t){return(0,a.jsx)(or,{value:t.value,className:"text-xs py-1",children:(0,a.jsxs)("div",{className:"flex items-start gap-2.5",children:[(0,a.jsx)("span",{className:"mt-1 text-muted-foreground",children:(0,a.jsx)(t.Icon,{className:"h-3 w-3"})}),(0,a.jsxs)("div",{className:"flex flex-col gap-0.5",children:[(0,a.jsx)("span",{className:"font-semibold",children:t.label}),(0,a.jsx)("span",{className:"text-muted-foreground",children:t.subtitle})]})]})},t.value)}export{Ca as default};
|