db-studio 1.7.5 → 1.7.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/dist/core-dist/assets/_pathlessLayout-Dj-vL1ro.js +2 -0
  2. package/dist/core-dist/assets/{_pathlessLayout-BgaXE7MD.js → _pathlessLayout-lti_XhXr.js} +1 -1
  3. package/dist/core-dist/assets/_queryId-BlmTSMat.js +1 -0
  4. package/dist/core-dist/assets/_table-B6EDRVAF.js +10 -0
  5. package/dist/core-dist/assets/_table-Bexe-PRD.js +1 -0
  6. package/dist/core-dist/assets/{cdoe-editor--A2X22TE.js → cdoe-editor-C6c3JNwJ.js} +2 -2
  7. package/dist/core-dist/assets/{chat-sidebar-Dq5zKCoF.js → chat-sidebar-A3iurUmg.js} +2 -2
  8. package/dist/core-dist/assets/{chunk-BO2N2NFS-CtrFqJix.js → chunk-BO2N2NFS-BWASkQ7r.js} +4 -4
  9. package/dist/core-dist/assets/{dist-C-W9v39G.js → dist-BY1hG1Ya.js} +1 -1
  10. package/dist/core-dist/assets/{dist-CWf64aZV.js → dist-CX0IXul5.js} +1 -1
  11. package/dist/core-dist/assets/{highlighted-body-OFNGDK62-Dqw8vrq4.js → highlighted-body-OFNGDK62-BEkQLPsL.js} +1 -1
  12. package/dist/core-dist/assets/{icons-CAZJbhBz.js → icons-BywMJ5og.js} +1 -1
  13. package/dist/core-dist/assets/index-B7KYpPyV.js +57 -0
  14. package/dist/core-dist/assets/index-Dv6o03bL.css +2 -0
  15. package/dist/core-dist/assets/{indexes-B2pdcOTa.js → indexes-WJgC6xdV.js} +1 -1
  16. package/dist/core-dist/assets/{logs-DItnmo1m.js → logs-BD6ggRmF.js} +1 -1
  17. package/dist/core-dist/assets/mermaid-GHXKKRXX-Cey0AJ6z.js +1 -0
  18. package/dist/core-dist/assets/queries.store-CwP6d13j.js +1 -0
  19. package/dist/core-dist/assets/{radix-ui-B93Y7STU.js → radix-ui-C0u6gLux.js} +1 -1
  20. package/dist/core-dist/assets/{react-dom-KMIgB9GW.js → react-dom-JJlWtX5O.js} +1 -1
  21. package/dist/core-dist/assets/runner-DT89R_pW.js +1 -0
  22. package/dist/core-dist/assets/{runner-tab-JuHyhE5I.js → runner-tab-CJfQuLY7.js} +3 -3
  23. package/dist/core-dist/assets/{schema-B1a8u8dT.js → schema-fNXfq0jj.js} +1 -1
  24. package/dist/core-dist/assets/{scroll-area-DIT4iXSA.js → scroll-area-A-6bIiHh.js} +1 -1
  25. package/dist/core-dist/assets/{table-Bq-YbPAX.js → table-NRrQaCx4.js} +1 -1
  26. package/dist/core-dist/assets/{tanstack-COAHM0pn.js → tanstack-DyfKDo5s.js} +1 -1
  27. package/dist/core-dist/assets/{tooltip-BPnX8rwL.js → tooltip-BSKLiphS.js} +1 -1
  28. package/dist/core-dist/assets/use-delete-column-JnaJwJqm.js +1 -0
  29. package/dist/core-dist/assets/{use-rate-limit-JM72I-Qe.js → use-rate-limit-Bdyk6haf.js} +1 -1
  30. package/dist/core-dist/assets/{visualizer-CQk0bfHO.js → visualizer-DBsb8pcK.js} +1 -1
  31. package/dist/core-dist/index.html +6 -6
  32. package/dist/index.js +1 -1
  33. package/dist/index.js.map +1 -1
  34. package/package.json +1 -1
  35. package/dist/core-dist/assets/_pathlessLayout-7XOLasgU.js +0 -2
  36. package/dist/core-dist/assets/_queryId-DHd3r8hS.js +0 -1
  37. package/dist/core-dist/assets/_table-BrQjEEkt.js +0 -8
  38. package/dist/core-dist/assets/_table-C6uuIAjA.js +0 -1
  39. package/dist/core-dist/assets/index-Cw94sGcz.js +0 -57
  40. package/dist/core-dist/assets/index-hsgkD-V0.css +0 -2
  41. package/dist/core-dist/assets/mermaid-GHXKKRXX--wNt23Qo.js +0 -1
  42. package/dist/core-dist/assets/queries.store-B8yJ67Tq.js +0 -1
  43. package/dist/core-dist/assets/runner-DGQg7j15.js +0 -1
  44. package/dist/core-dist/assets/use-delete-column-DfaGMfjR.js +0 -1
@@ -0,0 +1 @@
1
+ import{r as Ce}from"./rolldown-runtime-Bnw7wDfq.js";import{v as L,x as U}from"./tanstack-DyfKDo5s.js";import{A as Ne,_ as ve,i as je,m as ge,n as Se,nt as Te,p as De,x as Ae}from"./icons-BywMJ5og.js";import{Ot as qe}from"./radix-ui-C0u6gLux.js";import{$ as W,A as ze,At as we,Ct as X,D as Ee,E as ee,L as Re,M as O,Mt as ae,N as Pe,Nt as Ke,O as Fe,Ot as k,Pt as Oe,Q as se,R as ne,T as le,X as V,Z as re,_ as s,_t as S,b as Ie,c as Ve,ct as M,d as A,et as te,f as C,g as P,gt as x,h as n,it as q,j as _e,jt as ie,k as Le,kt as oe,l as Ue,m as E,n as ke,nt as me,p as c,rt as Me,st as $,tt as ce,u as N,v as de,vt as $e,w as Be,wt as v,x as ue,y as Qe,z as R}from"./index-B7KYpPyV.js";import{i as he,n as pe,t as xe}from"./tooltip-BSKLiphS.js";import{n as Ye,t as He}from"./use-delete-column-JnaJwJqm.js";function _(a){return Ie(Ue,a)}var j=Ce(Te(),1),y=n({db:s("Database name is required")}),Ge=["pg","mysql","mssql","mongodb"],B=N(Ge,{message:"Invalid database type"}),Ea=y.extend({dbType:B}),Ra=n({dbType:B}),Je=n({tableName:s("Table name is required")}),f=n({columnName:s("Column name is required"),columnType:s("Column type is required"),defaultValue:s().optional(),isPrimaryKey:c().default(!1),isNullable:c().default(!1),isUnique:c().default(!1),isIdentity:c().default(!1),isArray:c().default(!1)}),Pa=n({db:y.shape.db,tableName:Je.shape.tableName,columnName:f.shape.columnName,columnType:f.shape.columnType,defaultValue:f.shape.defaultValue,isPrimaryKey:f.shape.isPrimaryKey,isNullable:f.shape.isNullable,isUnique:f.shape.isUnique,isIdentity:f.shape.isIdentity,isArray:f.shape.isArray}),Ka=n({tableName:s("Table name is required"),data:P(s("Column name is required"),A())}),Fa=y.extend({cascade:s().optional().transform(a=>a==="true")}),g=n({tableName:s("Table name is required"),columnName:s("Column name is required")}),Oa=n({db:y.shape.db,tableName:g.shape.tableName,columnName:g.shape.columnName,cascade:c().optional()}),Ia=n({message:s("Message is required"),tableName:s("Table name is required"),columnName:s("Column name is required"),deletedCount:E("Deleted count is required").default(0)}),D=n({columnType:s("Column type is required"),isNullable:c(),defaultValue:s().nullable().optional()}),Va=n({db:y.shape.db,tableName:g.shape.tableName,columnName:g.shape.columnName,columnType:D.shape.columnType,isNullable:D.shape.isNullable,defaultValue:D.shape.defaultValue}),_a=n({tableName:s().min(1,"Table name is required"),records:C(P(s(),A())).min(1,"At least one record is required")}),La=n({messages:C(n({role:N(["user","assistant","system","tool"]),content:s().nullable()})),data:n({conversationId:s().optional(),db:y.shape.db})}),Ze=["text","boolean","number","enum","json","date","array"],We=N(Ze),Xe=["int","bigint","smallint","numeric","float","double","money","tinyint","mediumint","bit","boolean","text","varchar","char","tinytext","mediumtext","longtext","json","jsonb","xml","uuid","date","time","timestamp","timestamptz","interval","datetime","year","bytea","inet","cidr","macaddr","macaddr8","point","line","polygon","binary","varbinary","blob","tinyblob","mediumblob","longblob","array","enum","set"],ea=N(Xe),Ua=n({columnName:s(),dataType:We,dataTypeLabel:ea,isNullable:c(),columnDefault:s().nullable(),isPrimaryKey:c(),isForeignKey:c(),referencedTable:s().nullable(),referencedColumn:s().nullable(),enumValues:C(s()).nullable()}),aa=["CASCADE","SET NULL","SET DEFAULT","RESTRICT","NO ACTION"],Z=N(aa),sa=n({columnName:s("Column name is required"),columnType:s("Column type is required"),defaultValue:s().optional(),isPrimaryKey:c().default(!1),isNullable:c().default(!1),isUnique:c().default(!1),isIdentity:c().default(!1),isArray:c().default(!1)}),na=n({columnName:s("Column name is required"),referencedTable:s("Referenced table is required"),referencedColumn:s("Referenced column is required"),onUpdate:Z.default("NO ACTION"),onDelete:Z.default("NO ACTION")}),ka=n({tableName:s("Table name is required"),fields:C(sa).min(1,"At least one field is required"),foreignKeys:C(na).optional()}),la=n({name:s("Name is required"),size:s("Size is required"),owner:s("Owner is required"),encoding:s("Encoding is required")}),Ma=n({databases:C(la),dbType:B}),$a=n({version:s("Version is required"),database:s("Database is required"),user:s("User is required"),host:s("Host is required").nullable(),port:E("Port is required").nullable(),active_connections:_("Active connections is required"),max_connections:_("Max connections is required")}),Ba=n({tableName:s("Table name is required"),primaryKeys:C(n({columnName:s("Column name is required"),value:A()})).min(1,"At least one primary key is required")}),Qa=y.extend({cascade:s().optional().transform(a=>a==="true")}),Ya=n({query:s("Query is required")}),ra=["csv","xlsx","json"],Ha=y.extend({format:N(ra,{message:"Invalid format. Supported formats: csv, xlsx, json"})}),ta=n({newColumnName:s("New column name is required")}),Ga=n({db:y.shape.db,tableName:g.shape.tableName,columnName:g.shape.columnName,newColumnName:ta.shape.newColumnName}),Ja=n({columnName:s(),operator:s(),value:s()}),w=["asc","desc"],Za=n({columnName:s(),direction:N(w)}),ia=n({limit:E(),total:E(),hasNextPage:c(),hasPreviousPage:c(),nextCursor:s().nullable(),prevCursor:s().nullable()}),Wa=n({data:C(P(s(),Qe())),meta:ia}),Xa=n({db:y.shape.db,cursor:s().optional(),limit:s().optional().default("50").transform(Number),direction:N(w).optional().default(w[0]),sort:s().optional().transform(a=>{if(!a)return"";try{const r=JSON.parse(a);return Array.isArray(r)?r:a}catch{return a}}),order:N(w).optional(),filters:s().optional().transform(a=>{if(!a)return[];try{return JSON.parse(a)}catch{return[]}})}),es=n({tableName:s("Table name is required"),schemaName:s().optional(),rowCount:_("Row count is required")}),as=n({schema:s()}),ss=n({tableName:s("Table name is required"),primaryKey:s("Primary key is required").default("id"),updates:C(n({rowData:P(s("Column name is required"),A()),columnName:s("Column name is required"),value:A()},{message:"Each update must have a row data, column name, and value."})).min(1,"At least one update is required")}),oa=a=>({...a,defaultValue:a.defaultValue?.trim()?a.defaultValue.trim():void 0}),ma=({tableName:a})=>{const r=U(),{closeSheet:d}=S(),{selectedDatabase:i}=$(),{mutateAsync:h,isPending:o}=L({mutationFn:async l=>{const m=new URLSearchParams({db:i??""});return(await M.post(`/tables/${encodeURIComponent(a)}/columns`,oa(l),{params:m})).data.data},onSuccess:async()=>{await Promise.all([r.invalidateQueries({queryKey:[q.CACHE_KEYS.TABLE_COLUMNS,a],exact:!1}),r.invalidateQueries({queryKey:[q.CACHE_KEYS.TABLE_DATA,a],exact:!1})]),d("add-column")},onError:l=>{console.error("Error adding column:",l)}});return{addColumn:async(l,m)=>k.promise(h(l,m),{loading:"Adding column...",success:t=>t||"Column added successfully",error:t=>typeof t.details=="string"&&t.details||t.message||"Failed to add column"}),isAddingColumn:o}},e=qe(),ca=n({fields:de([n({columnName:f.shape.columnName,columnType:f.shape.columnType,defaultValue:s(),isPrimaryKey:c(),isNullable:c(),isUnique:c(),isIdentity:c(),isArray:c()})])}),I={fields:[{columnName:"",columnType:"",defaultValue:"",isPrimaryKey:!1,isNullable:!0,isUnique:!1,isIdentity:!1,isArray:!1}]},da=()=>{const a=Oe({control:Ke().control,name:"fields.0.isPrimaryKey"});return(0,e.jsxs)("div",{className:"space-y-4",children:[(0,e.jsxs)("div",{className:"grid grid-cols-4 px-2",children:[(0,e.jsx)(x,{className:"text-xs",children:"Column Name"}),(0,e.jsx)(x,{className:"text-xs",children:"Column Type"}),(0,e.jsx)(x,{className:"text-xs",children:"Default Value"}),(0,e.jsx)(x,{className:"text-xs",children:"Primary"})]}),(0,e.jsx)("div",{className:"px-2 py-3",children:(0,e.jsxs)("div",{className:"grid grid-cols-4 gap-4",children:[(0,e.jsx)(Ee,{index:0,showForeignKeyButton:!1}),(0,e.jsx)(ee,{index:0}),(0,e.jsx)(le,{index:0,isRequired:!1}),(0,e.jsxs)("div",{className:"flex gap-2",children:[(0,e.jsx)(Be,{index:0}),(0,e.jsx)(Fe,{index:0,isDisabled:!!a})]})]})})]})},ua=({tableName:a})=>{const{closeSheet:r,isSheetOpen:d}=S(),{addColumn:i,isAddingColumn:h}=ma({tableName:a}),o=ae({mode:"onSubmit",defaultValues:I,resolver:oe(ca)}),u=()=>{o.reset(I),r("add-column")},l=async m=>{await i(m.fields[0]),o.reset(I)};return(0,e.jsx)(ue,{title:"Add column",description:`Add a new column to "${a}".`,open:d("add-column"),onOpenChange:m=>{m||u()},children:(0,e.jsx)(ie,{...o,children:(0,e.jsxs)("form",{onSubmit:o.handleSubmit(l),className:"space-y-6",children:[(0,e.jsx)(da,{}),(0,e.jsx)(X,{onCancel:u,isLoading:h})]})})})},Q=$e()(a=>({editingColumn:null,setEditingColumn:r=>a({editingColumn:r})})),ha=a=>({...a,defaultValue:a.defaultValue?.trim()?a.defaultValue.trim():null}),pa=({tableName:a,columnName:r})=>{const d=U(),{closeSheet:i}=S(),{setEditingColumn:h}=Q(),{selectedDatabase:o}=$(),{mutateAsync:u,isPending:l}=L({mutationFn:async t=>{const p=new URLSearchParams({db:o??""});return(await M.patch(`/tables/${encodeURIComponent(a)}/columns/${encodeURIComponent(r)}`,ha(t),{params:p})).data.data},onSuccess:async()=>{await d.invalidateQueries({queryKey:[q.CACHE_KEYS.TABLE_COLUMNS,a],exact:!1}),h(null),i("edit-column")},onError:t=>{console.error("Error altering column:",t)}});return{alterColumn:async(t,p)=>k.promise(u(t,p),{loading:"Updating column...",success:b=>b||"Column updated successfully",error:b=>typeof b.details=="string"&&b.details||b.message||"Failed to update column"}),isAlteringColumn:l}},xa=n({fields:de([n({columnName:s(),columnType:D.shape.columnType,defaultValue:s(),isPrimaryKey:c(),isNullable:D.shape.isNullable,isUnique:c(),isIdentity:c(),isArray:c()})])}),z=a=>({fields:[{columnName:a?.columnName??"",columnType:a?.dataTypeLabel??"",defaultValue:a?.columnDefault??"",isPrimaryKey:!1,isNullable:a?.isNullable??!0,isUnique:!1,isIdentity:!1,isArray:a?.dataType==="array"}]}),fa=({tableName:a})=>{const{closeSheet:r,isSheetOpen:d}=S(),{editingColumn:i,setEditingColumn:h}=Q(),o=ae({mode:"onSubmit",defaultValues:z(null),resolver:oe(xa)}),{alterColumn:u,isAlteringColumn:l}=pa({tableName:a,columnName:i?.columnName??""});(0,j.useEffect)(()=>{o.reset(z(i))},[i,o]);const m=()=>{h(null),o.reset(z(null)),r("edit-column")},t=async p=>{await u({columnType:p.fields[0].columnType,isNullable:p.fields[0].isNullable,defaultValue:p.fields[0].defaultValue}),o.reset(z(null))};return(0,e.jsx)(ue,{title:i?`Edit ${i.columnName}`:"Edit column",description:i?`Update the type, nullability, and default value for "${i.columnName}".`:"Update the selected column.",open:d("edit-column"),onOpenChange:p=>{p||m()},children:(0,e.jsx)(ie,{...o,children:(0,e.jsxs)("form",{onSubmit:o.handleSubmit(t),className:"space-y-6",children:[(0,e.jsxs)("div",{className:"space-y-4",children:[(0,e.jsxs)("div",{className:"space-y-2",children:[(0,e.jsx)(x,{htmlFor:"edit-column-name",children:"Column name"}),(0,e.jsx)(V,{id:"edit-column-name",value:i?.columnName??"",readOnly:!0,disabled:!0})]}),(0,e.jsxs)("div",{className:"space-y-2",children:[(0,e.jsx)(x,{children:"Column type"}),(0,e.jsx)(ee,{index:0})]}),(0,e.jsxs)("div",{className:"space-y-2",children:[(0,e.jsx)(x,{children:"Default value"}),(0,e.jsx)(le,{index:0,isRequired:!1})]}),(0,e.jsx)(we,{control:o.control,name:"fields.0.isNullable",render:({field:p})=>(0,e.jsxs)("div",{className:"flex items-center gap-3 rounded-lg border border-zinc-800 px-3 py-3",children:[(0,e.jsx)(ne,{id:"edit-column-nullable",checked:!!p.value,onCheckedChange:b=>p.onChange(b===!0)}),(0,e.jsxs)("div",{className:"space-y-1",children:[(0,e.jsx)(x,{htmlFor:"edit-column-nullable",className:"cursor-pointer",children:"Nullable"}),(0,e.jsx)("p",{className:"text-xs text-muted-foreground",children:"Allow this column to store NULL values."})]})]})})]}),(0,e.jsx)(X,{onCancel:m,isLoading:l})]})})})},ya=({tableName:a,columnName:r})=>{const d=U(),{selectedDatabase:i}=$(),{mutateAsync:h,isPending:o}=L({mutationFn:async l=>{const m=new URLSearchParams({db:i??""});return(await M.patch(`/tables/${encodeURIComponent(a)}/columns/${encodeURIComponent(r)}/rename`,l,{params:m})).data.data},onSuccess:async()=>{await Promise.all([d.invalidateQueries({queryKey:[q.CACHE_KEYS.TABLE_COLUMNS,a],exact:!1}),d.invalidateQueries({queryKey:[q.CACHE_KEYS.TABLE_DATA,a],exact:!1})])},onError:l=>{console.error("Error renaming column:",l)}});return{renameColumn:async(l,m)=>k.promise(h(l,m),{loading:"Renaming column...",success:t=>t||"Column renamed successfully",error:t=>typeof t.details=="string"&&t.details||t.message||"Failed to rename column"}),isRenamingColumn:o}},ba=({col:a,tableName:r})=>{const{openSheet:d}=S(),{setEditingColumn:i}=Q(),{renameColumn:h,isRenamingColumn:o}=ya({tableName:r,columnName:a.columnName}),{deleteColumn:u,isDeletingColumn:l}=He(),[m,t]=(0,j.useState)(!1),[p,b]=(0,j.useState)(!1),[Y,H]=(0,j.useState)(a.columnName),[G,J]=(0,j.useState)(!1),fe=()=>{i(a),d("edit-column")},K=T=>{t(T),T||H(a.columnName)},F=T=>{b(T),T||J(!1)},ye=async()=>{await h({newColumnName:Y.trim()}),K(!1)},be=async()=>{await u({db:"",tableName:r,columnName:a.columnName,cascade:G}),F(!1)};return(0,e.jsxs)(e.Fragment,{children:[(0,e.jsxs)(Le,{children:[(0,e.jsx)(Re,{asChild:!0,children:(0,e.jsx)(v,{variant:"ghost",size:"icon-sm",children:(0,e.jsx)(Ne,{className:"size-4"})})}),(0,e.jsx)(ze,{align:"end",className:"w-48",children:(0,e.jsxs)(_e,{children:[(0,e.jsxs)(O,{onClick:fe,children:[(0,e.jsx)(ve,{className:"size-4"}),"Edit Column"]}),(0,e.jsxs)(O,{onClick:()=>K(!0),children:[(0,e.jsx)(Se,{className:"size-4"}),"Rename Column"]}),(0,e.jsx)(Pe,{}),(0,e.jsxs)(O,{variant:"destructive",onClick:()=>F(!0),children:[(0,e.jsx)(je,{className:"size-4"}),"Drop Column"]})]})})]}),(0,e.jsx)(Ca,{columnName:a.columnName,newColumnName:Y,setNewColumnName:H,isOpen:m,onOpenChange:K,onRename:ye,isRenaming:o}),(0,e.jsx)(Na,{columnName:a.columnName,isOpen:p,onOpenChange:F,cascadeDelete:G,setCascadeDelete:J,onDrop:be,isDropping:l})]})},Ca=({columnName:a,newColumnName:r,setNewColumnName:d,isOpen:i,onOpenChange:h,onRename:o,isRenaming:u})=>{const l=!r.trim()||r.trim()===a;return(0,e.jsx)(re,{open:i,onOpenChange:h,children:(0,e.jsxs)(se,{className:"max-w-md",children:[(0,e.jsxs)(ce,{children:[(0,e.jsx)(me,{children:"Rename Column"}),(0,e.jsx)(W,{children:"Update the column name while keeping the rest of the schema unchanged."})]}),(0,e.jsxs)("div",{className:"space-y-4",children:[(0,e.jsxs)("div",{className:"space-y-2",children:[(0,e.jsx)(x,{htmlFor:"current-column-name",children:"Current name"}),(0,e.jsx)(V,{id:"current-column-name",value:a,readOnly:!0,disabled:!0})]}),(0,e.jsxs)("div",{className:"space-y-2",children:[(0,e.jsx)(x,{htmlFor:"new-column-name",children:"New name"}),(0,e.jsx)(V,{id:"new-column-name",value:r,onChange:m=>d(m.target.value),placeholder:"column_name",autoFocus:!0})]})]}),(0,e.jsxs)(te,{className:"gap-2",children:[(0,e.jsx)(v,{variant:"outline",onClick:()=>h(!1),disabled:u,children:"Cancel"}),(0,e.jsx)(v,{onClick:o,disabled:l||u,children:u?"Renaming...":"Rename Column"})]})]})})},Na=({columnName:a,isOpen:r,onOpenChange:d,cascadeDelete:i,setCascadeDelete:h,onDrop:o,isDropping:u})=>(0,e.jsx)(re,{open:r,onOpenChange:d,children:(0,e.jsxs)(se,{className:"max-w-md",children:[(0,e.jsxs)(ce,{children:[(0,e.jsx)(me,{children:"Drop Column"}),(0,e.jsxs)(W,{children:["Are you sure you want to drop the column"," ",(0,e.jsxs)("span",{className:"font-semibold text-foreground",children:['"',a,'"']}),"? This action cannot be undone and permanently removes the data stored in it."]})]}),(0,e.jsxs)("div",{className:"flex gap-3 rounded-lg border border-zinc-800 px-3 py-3",children:[(0,e.jsx)(ne,{id:`drop-column-cascade-${a}`,checked:i,onCheckedChange:l=>h(l===!0)}),(0,e.jsxs)("div",{className:"space-y-1",children:[(0,e.jsx)(x,{htmlFor:`drop-column-cascade-${a}`,className:"cursor-pointer",children:"Drop with CASCADE"}),(0,e.jsx)("p",{className:"text-xs text-muted-foreground",children:"Also remove dependent indexes, constraints, and foreign key references."})]})]}),(0,e.jsxs)(te,{className:"gap-2",children:[(0,e.jsx)(v,{variant:"outline",onClick:()=>d(!1),disabled:u,children:"Cancel"}),(0,e.jsx)(v,{variant:"destructive",onClick:o,disabled:u,children:u?"Dropping...":"Drop Column"})]})]})}),va=({tableName:a,refetch:r,isRefetching:d=!1})=>{const{openSheet:i}=S();return(0,e.jsxs)("header",{className:"max-h-8 overflow-hidden border-b border-zinc-800 w-full flex items-center bg-black sticky top-0 left-0 right-0 z-0",children:[(0,e.jsx)(v,{type:"button",variant:"ghost",className:"size-8! aspect-square border-x-0 border-y-0 border-zinc-800 rounded-none",onClick:()=>{r()},"aria-label":`Refetch schema for ${a}`,disabled:d,children:(0,e.jsx)(De,{className:"size-4"})}),(0,e.jsxs)(v,{type:"button",variant:"default",className:"h-8! border-l border-y-0 border-r-0 border-zinc-800 rounded-none flex items-center gap-2",onClick:()=>i("add-column"),children:[(0,e.jsx)(ge,{className:"size-4"}),"Add Column"]})]})},ja=({col:a})=>a.dataTypeLabel==="enum"&&a.enumValues&&a.enumValues.length>0?(0,e.jsxs)(xe,{children:[(0,e.jsx)(he,{asChild:!0,children:(0,e.jsx)(R,{variant:"outline",className:"font-mono cursor-default truncate",children:a.dataTypeLabel})}),(0,e.jsx)(pe,{side:"right",children:(0,e.jsxs)("div",{className:"text-xs space-y-0.5",children:[(0,e.jsx)("p",{className:"text-zinc-400 mb-1",children:"Enum values:"}),a.enumValues.map(r=>(0,e.jsx)("p",{className:"font-mono",children:r},r))]})})]}):(0,e.jsx)(R,{variant:"outline",className:"font-mono",children:a.dataTypeLabel}),ga=({tableName:a})=>{const{tableCols:r,isLoadingTableCols:d,isRefetchingTableCols:i,errorTableCols:h,refetchTableCols:o}=Me({tableName:a}),u=(0,j.useMemo)(()=>[{id:"index",header:"",cell:({row:l})=>(0,e.jsx)("span",{className:"text-xs text-zinc-600",children:l.index+1}),size:47,minSize:47,enableResizing:!1},{id:"columnName",header:"Name",accessorKey:"columnName",cell:({getValue:l})=>(0,e.jsx)("span",{className:"font-mono text-zinc-100 truncate",children:l()}),minSize:100,size:200},{id:"dataTypeLabel",header:"Type",cell:({row:l})=>(0,e.jsx)(ja,{col:l.original}),size:100,minSize:100},{id:"columnDefault",header:"Default",accessorKey:"columnDefault",cell:({getValue:l})=>{const m=l();return m?(0,e.jsx)("span",{className:"font-mono text-xs text-zinc-400 truncate",children:m}):(0,e.jsx)("span",{className:"text-zinc-600",children:"—"})},minSize:100,size:180},{id:"isNullable",header:"Nullable",accessorKey:"isNullable",cell:({getValue:l})=>l()?(0,e.jsx)("span",{className:"text-xs text-zinc-400",children:"yes"}):(0,e.jsx)("span",{className:"text-xs text-zinc-600",children:"no"}),minSize:100},{id:"key",header:"Key",cell:({row:l})=>{const{isPrimaryKey:m,isForeignKey:t}=l.original;return(0,e.jsxs)("div",{className:"flex items-center gap-1",children:[m&&(0,e.jsx)(R,{variant:"default",className:"text-[0.6rem] px-1.5",children:"PK"}),t&&(0,e.jsx)(R,{variant:"secondary",className:"text-[0.6rem] px-1.5",children:"FK"})]})},minSize:100,size:90},{id:"references",header:"References",cell:({row:l})=>{const{isForeignKey:m,referencedTable:t,referencedColumn:p}=l.original;return!m||!t||!p?(0,e.jsx)("span",{className:"text-zinc-600",children:"—"}):(0,e.jsxs)(xe,{children:[(0,e.jsx)(he,{asChild:!0,children:(0,e.jsxs)("span",{className:"inline-flex items-center gap-1 text-xs text-zinc-400 cursor-default",children:[(0,e.jsx)(Ae,{className:"size-3 text-zinc-600"}),(0,e.jsxs)("span",{className:"font-mono",children:[t,".",p]})]})}),(0,e.jsx)(pe,{side:"left",children:(0,e.jsxs)("p",{children:["References"," ",(0,e.jsxs)("span",{className:"font-mono font-medium",children:[t,".",p]})]})})]})},size:220,minSize:100},{id:"actions",header:"",cell:({row:l})=>(0,e.jsx)("div",{className:"flex justify-center items-center",children:(0,e.jsx)(ba,{col:l.original,tableName:a})}),size:50,enableResizing:!1}],[a]);return d?(0,e.jsx)("div",{className:"size-full flex items-center justify-center",children:(0,e.jsx)(Ve,{size:"size-7"})}):h?(0,e.jsxs)("div",{className:"size-full flex flex-col items-center justify-center gap-2",children:[(0,e.jsx)("div",{className:"text-sm font-medium",children:"Failed to load schema"}),(0,e.jsx)("div",{className:"text-sm text-muted-foreground",children:h.message})]}):(0,e.jsxs)("div",{className:"flex-1 flex flex-col overflow-hidden",children:[(0,e.jsx)(va,{tableName:a,refetch:o,isRefetching:i}),(0,e.jsx)(Ye,{columns:u,data:r??[]}),(0,e.jsx)(ua,{tableName:a}),(0,e.jsx)(fa,{tableName:a})]})};function ns(){const{table:a}=ke.useParams();return(0,e.jsx)("main",{className:"flex-1 flex flex-col overflow-hidden",children:(0,e.jsx)(ga,{tableName:a})})}export{ns as component};
@@ -1,9 +1,9 @@
1
- import{r as L}from"./rolldown-runtime-Bnw7wDfq.js";import{tt as f}from"./icons-CAZJbhBz.js";import{Ot as G}from"./radix-ui-B93Y7STU.js";import{_t as e,gt as g,ht as T,mt as A}from"./monaco-editor-B6TxHuqP.js";import{Dt as p}from"./index-Cw94sGcz.js";var d=L(f(),1),U=["SELECT","FROM","WHERE","INSERT","UPDATE","DELETE","CREATE","DROP","ALTER","TABLE","INDEX","VIEW","DATABASE","SCHEMA","FUNCTION","PROCEDURE","TRIGGER","AND","OR","NOT","IN","BETWEEN","LIKE","IS","NULL","JOIN","LEFT","RIGHT","INNER","OUTER","CROSS","ON","USING","GROUP","BY","HAVING","ORDER","ASC","DESC","LIMIT","OFFSET","UNION","INTERSECT","EXCEPT","AS","DISTINCT","ALL","EXISTS","CASE","WHEN","THEN","ELSE","END","WITH","RECURSIVE","PRIMARY","KEY","FOREIGN","REFERENCES","UNIQUE","CHECK","DEFAULT","CASCADE","RESTRICT","NO","ACTION","SET","CONSTRAINT","BEGIN","COMMIT","ROLLBACK","SAVEPOINT","TRANSACTION","GRANT","REVOKE","PRIVILEGES","TO","RETURNING"],D=["=",">","<","!","~","?",":","==","<=",">=","!=","&&","||","++","--","+","-","*","/","&","|","^","%",">>","<<","+=","-=","*=","/=","&=","|=","^=","%="],b=["COUNT","SUM","AVG","MIN","MAX","COALESCE","NULLIF","CAST","CONCAT","SUBSTRING","LOWER","UPPER","TRIM","LENGTH","NOW","CURRENT_DATE","CURRENT_TIME","CURRENT_TIMESTAMP","EXTRACT","DATE_TRUNC","AGE","ARRAY_AGG","JSON_BUILD_OBJECT","JSON_AGG","ROW_NUMBER","RANK","DENSE_RANK","LAG","LEAD","FIRST_VALUE","LAST_VALUE","STRING_AGG","GENERATE_SERIES"],M=["INTEGER","INT","SMALLINT","BIGINT","DECIMAL","NUMERIC","REAL","DOUBLE","PRECISION","SERIAL","BIGSERIAL","VARCHAR","CHAR","TEXT","BOOLEAN","BOOL","DATE","TIME","TIMESTAMP","TIMESTAMPTZ","INTERVAL","UUID","JSON","JSONB","ARRAY","BYTEA","INET","CIDR"],_=["SELECT","FROM","WHERE","INSERT INTO","UPDATE","DELETE FROM","CREATE TABLE","DROP TABLE","ALTER TABLE","JOIN","LEFT JOIN","RIGHT JOIN","INNER JOIN","GROUP BY","ORDER BY","HAVING","LIMIT"],B=["COUNT(*)","SUM()","AVG()","MIN()","MAX()","COALESCE()","CONCAT()","NOW()","CURRENT_DATE","CURRENT_TIMESTAMP","STRING_AGG()","ARRAY_AGG()","JSON_AGG()"],P=["INTEGER","VARCHAR","TEXT","BOOLEAN","TIMESTAMP","DATE","JSON","JSONB","UUID","SERIAL","BIGSERIAL"],x=G(),W=({initialQuery:u,queryId:l,savedQuery:R,language:I,onQueryChange:a,onUnsavedChanges:o,onExecuteQuery:S,onSaveQuery:C})=>{const m=(0,d.useRef)(null),O=(0,d.useRef)(null);return(0,d.useEffect)(()=>{if(!m.current)return;const N=[];I==="pgsql"&&(e.register({id:"pgsql"}),N.push(e.registerDocumentFormattingEditProvider("pgsql",{provideDocumentFormattingEdits:t=>{const E=t.getValue().replace(/\s+/g," ").replace(/\s*,\s*/g,`,
1
+ import{r as L}from"./rolldown-runtime-Bnw7wDfq.js";import{nt as f}from"./icons-BywMJ5og.js";import{Ot as G}from"./radix-ui-C0u6gLux.js";import{_t as e,gt as g,ht as T,mt as A}from"./monaco-editor-B6TxHuqP.js";import{Ot as p}from"./index-B7KYpPyV.js";var d=L(f(),1),U=["SELECT","FROM","WHERE","INSERT","UPDATE","DELETE","CREATE","DROP","ALTER","TABLE","INDEX","VIEW","DATABASE","SCHEMA","FUNCTION","PROCEDURE","TRIGGER","AND","OR","NOT","IN","BETWEEN","LIKE","IS","NULL","JOIN","LEFT","RIGHT","INNER","OUTER","CROSS","ON","USING","GROUP","BY","HAVING","ORDER","ASC","DESC","LIMIT","OFFSET","UNION","INTERSECT","EXCEPT","AS","DISTINCT","ALL","EXISTS","CASE","WHEN","THEN","ELSE","END","WITH","RECURSIVE","PRIMARY","KEY","FOREIGN","REFERENCES","UNIQUE","CHECK","DEFAULT","CASCADE","RESTRICT","NO","ACTION","SET","CONSTRAINT","BEGIN","COMMIT","ROLLBACK","SAVEPOINT","TRANSACTION","GRANT","REVOKE","PRIVILEGES","TO","RETURNING"],b=["=",">","<","!","~","?",":","==","<=",">=","!=","&&","||","++","--","+","-","*","/","&","|","^","%",">>","<<","+=","-=","*=","/=","&=","|=","^=","%="],D=["COUNT","SUM","AVG","MIN","MAX","COALESCE","NULLIF","CAST","CONCAT","SUBSTRING","LOWER","UPPER","TRIM","LENGTH","NOW","CURRENT_DATE","CURRENT_TIME","CURRENT_TIMESTAMP","EXTRACT","DATE_TRUNC","AGE","ARRAY_AGG","JSON_BUILD_OBJECT","JSON_AGG","ROW_NUMBER","RANK","DENSE_RANK","LAG","LEAD","FIRST_VALUE","LAST_VALUE","STRING_AGG","GENERATE_SERIES"],M=["INTEGER","INT","SMALLINT","BIGINT","DECIMAL","NUMERIC","REAL","DOUBLE","PRECISION","SERIAL","BIGSERIAL","VARCHAR","CHAR","TEXT","BOOLEAN","BOOL","DATE","TIME","TIMESTAMP","TIMESTAMPTZ","INTERVAL","UUID","JSON","JSONB","ARRAY","BYTEA","INET","CIDR"],_=["SELECT","FROM","WHERE","INSERT INTO","UPDATE","DELETE FROM","CREATE TABLE","DROP TABLE","ALTER TABLE","JOIN","LEFT JOIN","RIGHT JOIN","INNER JOIN","GROUP BY","ORDER BY","HAVING","LIMIT"],B=["COUNT(*)","SUM()","AVG()","MIN()","MAX()","COALESCE()","CONCAT()","NOW()","CURRENT_DATE","CURRENT_TIMESTAMP","STRING_AGG()","ARRAY_AGG()","JSON_AGG()"],P=["INTEGER","VARCHAR","TEXT","BOOLEAN","TIMESTAMP","DATE","JSON","JSONB","UUID","SERIAL","BIGSERIAL"],x=G(),W=({initialQuery:u,queryId:l,savedQuery:R,language:I,onQueryChange:a,onUnsavedChanges:o,onExecuteQuery:S,onSaveQuery:C})=>{const m=(0,d.useRef)(null),O=(0,d.useRef)(null);return(0,d.useEffect)(()=>{if(!m.current)return;const N=[];I==="pgsql"&&(e.register({id:"pgsql"}),N.push(e.registerDocumentFormattingEditProvider("pgsql",{provideDocumentFormattingEdits:t=>{const E=t.getValue().replace(/\s+/g," ").replace(/\s*,\s*/g,`,
2
2
  `).replace(/\b(SELECT|FROM|WHERE|JOIN|LEFT JOIN|RIGHT JOIN|INNER JOIN|GROUP BY|ORDER BY|HAVING|LIMIT|OFFSET)\b/gi,`
3
3
  $1`).replace(/\b(AND|OR)\b/gi,`
4
4
  $1`).trim().split(`
5
5
  `).map(s=>{const r=s.trim();return r.startsWith("AND")||r.startsWith("OR")||/^[^A-Z]/.test(r)?` ${r}`:r}).join(`
6
- `);return[{range:t.getFullModelRange(),text:E}]}})),e.setMonarchTokensProvider("pgsql",{defaultToken:"",tokenPostfix:".sql",ignoreCase:!0,keywords:U,operators:D,builtinFunctions:b,builtinTypes:M,tokenizer:{root:[{include:"@comments"},{include:"@whitespace"},{include:"@numbers"},{include:"@strings"},{include:"@complexIdentifiers"},[/[;,.]/,"delimiter"],[/[()]/,"@brackets"],[/[\w@#$]+/,{cases:{"@keywords":"keyword","@operators":"operator","@builtinFunctions":"predefined","@builtinTypes":"type","@default":"identifier"}}],[/[<>=!%&+\-*/|~^]/,"operator"]],whitespace:[[/\s+/,"white"]],comments:[[/--+.*/,"comment"],[/\/\*/,{token:"comment.quote",next:"@comment"}]],comment:[[/[^*/]+/,"comment"],[/\*\//,{token:"comment.quote",next:"@pop"}],[/./,"comment"]],numbers:[[/0[xX][0-9a-fA-F]*/,"number"],[/[$][+-]*\d*(\.\d*)?/,"number"],[/((\d+(\.\d*)?)|(\.\d+))([eE][-+]?\d+)?/,"number"]],strings:[[/'/,{token:"string",next:"@string"}],[/"/,{token:"string.double",next:"@stringDouble"}]],string:[[/[^']+/,"string"],[/''/,"string"],[/'/,{token:"string",next:"@pop"}]],stringDouble:[[/[^"]+/,"string.double"],[/""/,"string.double"],[/"/,{token:"string.double",next:"@pop"}]],complexIdentifiers:[[/"/,{token:"identifier.quote",next:"@quotedIdentifier"}]],quotedIdentifier:[[/[^"]+/,"identifier"],[/""/,"identifier"],[/"/,{token:"identifier.quote",next:"@pop"}]]}}),N.push(e.registerCompletionItemProvider("pgsql",{provideCompletionItems:(t,E)=>{const s=t.getWordUntilPosition(E),r={startLineNumber:E.lineNumber,endLineNumber:E.lineNumber,startColumn:s.startColumn,endColumn:s.endColumn};return{suggestions:[..._.map(i=>({label:i,kind:e.CompletionItemKind.Keyword,insertText:i,range:r})),...B.map(i=>({label:i,kind:e.CompletionItemKind.Function,insertText:i.includes("(*)")?i:i.replace("()","($0)"),insertTextRules:e.CompletionItemInsertTextRule.InsertAsSnippet,range:r})),...P.map(i=>({label:i,kind:e.CompletionItemKind.TypeParameter,insertText:i,range:r})),{label:"select-template",kind:e.CompletionItemKind.Snippet,insertText:["SELECT ${1:columns}","FROM ${2:table}","WHERE ${3:condition};"].join(`
6
+ `);return[{range:t.getFullModelRange(),text:E}]}})),e.setMonarchTokensProvider("pgsql",{defaultToken:"",tokenPostfix:".sql",ignoreCase:!0,keywords:U,operators:b,builtinFunctions:D,builtinTypes:M,tokenizer:{root:[{include:"@comments"},{include:"@whitespace"},{include:"@numbers"},{include:"@strings"},{include:"@complexIdentifiers"},[/[;,.]/,"delimiter"],[/[()]/,"@brackets"],[/[\w@#$]+/,{cases:{"@keywords":"keyword","@operators":"operator","@builtinFunctions":"predefined","@builtinTypes":"type","@default":"identifier"}}],[/[<>=!%&+\-*/|~^]/,"operator"]],whitespace:[[/\s+/,"white"]],comments:[[/--+.*/,"comment"],[/\/\*/,{token:"comment.quote",next:"@comment"}]],comment:[[/[^*/]+/,"comment"],[/\*\//,{token:"comment.quote",next:"@pop"}],[/./,"comment"]],numbers:[[/0[xX][0-9a-fA-F]*/,"number"],[/[$][+-]*\d*(\.\d*)?/,"number"],[/((\d+(\.\d*)?)|(\.\d+))([eE][-+]?\d+)?/,"number"]],strings:[[/'/,{token:"string",next:"@string"}],[/"/,{token:"string.double",next:"@stringDouble"}]],string:[[/[^']+/,"string"],[/''/,"string"],[/'/,{token:"string",next:"@pop"}]],stringDouble:[[/[^"]+/,"string.double"],[/""/,"string.double"],[/"/,{token:"string.double",next:"@pop"}]],complexIdentifiers:[[/"/,{token:"identifier.quote",next:"@quotedIdentifier"}]],quotedIdentifier:[[/[^"]+/,"identifier"],[/""/,"identifier"],[/"/,{token:"identifier.quote",next:"@pop"}]]}}),N.push(e.registerCompletionItemProvider("pgsql",{provideCompletionItems:(t,E)=>{const s=t.getWordUntilPosition(E),r={startLineNumber:E.lineNumber,endLineNumber:E.lineNumber,startColumn:s.startColumn,endColumn:s.endColumn};return{suggestions:[..._.map(i=>({label:i,kind:e.CompletionItemKind.Keyword,insertText:i,range:r})),...B.map(i=>({label:i,kind:e.CompletionItemKind.Function,insertText:i.includes("(*)")?i:i.replace("()","($0)"),insertTextRules:e.CompletionItemInsertTextRule.InsertAsSnippet,range:r})),...P.map(i=>({label:i,kind:e.CompletionItemKind.TypeParameter,insertText:i,range:r})),{label:"select-template",kind:e.CompletionItemKind.Snippet,insertText:["SELECT ${1:columns}","FROM ${2:table}","WHERE ${3:condition};"].join(`
7
7
  `),insertTextRules:e.CompletionItemInsertTextRule.InsertAsSnippet,documentation:"SELECT statement template",range:r},{label:"create-table-template",kind:e.CompletionItemKind.Snippet,insertText:["CREATE TABLE ${1:table_name} ("," ${2:id} SERIAL PRIMARY KEY,"," ${3:column_name} ${4:VARCHAR(255)} ${5:NOT NULL},"," created_at TIMESTAMP DEFAULT NOW()",");"].join(`
8
8
  `),insertTextRules:e.CompletionItemInsertTextRule.InsertAsSnippet,documentation:"CREATE TABLE template",range:r},{label:"insert-template",kind:e.CompletionItemKind.Snippet,insertText:["INSERT INTO ${1:table} (${2:columns})","VALUES (${3:values})","RETURNING *;"].join(`
9
9
  `),insertTextRules:e.CompletionItemInsertTextRule.InsertAsSnippet,documentation:"INSERT statement template",range:r}]}}})));const n=g.create(m.current,{value:u,language:I,theme:"vs-dark",fontSize:14,minimap:{enabled:!1},lineNumbers:"on",roundedSelection:!0,scrollBeyondLastLine:!0,scrollbar:{horizontal:"hidden",vertical:"hidden",useShadows:!1,verticalHasArrows:!1,horizontalHasArrows:!1,arrowSize:0},automaticLayout:!0,tabSize:4,insertSpaces:!0,wordWrap:"on",folding:!0,bracketPairColorization:{enabled:!0},suggest:{showKeywords:!0,showSnippets:!0},quickSuggestions:{other:!0,comments:!1,strings:!1}});O.current=n,n.addCommand(T.CtrlCmd|A.Enter,()=>{const t=n.getValue();if(!t.trim()){p.error("Query is empty!");return}S(t)}),n.addCommand(T.CtrlCmd|T.Shift|A.KeyF,()=>{n.trigger("keyboard","editor.action.formatDocument",{}),p.success("Query formatted")}),n.addCommand(T.CtrlCmd|A.KeyS,()=>{C()}),a(n.getValue()),o(l?n.getValue()!==R:!1);const c=n.onDidChangeModelContent(()=>{const t=n.getValue();if(a(t),!l){o(!1);return}o(t!==R)});return()=>{for(const t of N)t.dispose();c.dispose(),n.dispose()}},[u,l,R,I,a,o,S]),(0,x.jsx)("div",{ref:m,className:"flex-1 min-h-0 overflow-y-scroll"})};export{W as CodeEditor};
@@ -1,2 +1,2 @@
1
- import{r as ge}from"./rolldown-runtime-Bnw7wDfq.js";import{o as xe,s as ve}from"./tanstack-COAHM0pn.js";import{J as Te,M as be,W as je,b as Se,c as Ce,et as ye,m as we,t as Ne,tt as ke}from"./icons-CAZJbhBz.js";import{Ct as J,F as Re,I as Ee,Ot as Ae,P as Le,Tt as Be}from"./radix-ui-B93Y7STU.js";import{Ct as W,G as De,K as Ie,Tt as w,W as Pe,b as _e,ct as ze,gt as Me,ot as Fe,q as Ue}from"./index-Cw94sGcz.js";import{r as ee}from"./chunk-BO2N2NFS-CtrFqJix.js";import{n as Oe,t as qe}from"./scroll-area-DIT4iXSA.js";import{i as Ge,n as We,t as He}from"./tooltip-BPnX8rwL.js";import{t as te}from"./use-rate-limit-JM72I-Qe.js";var Ke=["Show me all tables in my database","What columns are in the users table?","Write a query to find all active users","How many orders were placed last month?","Find top 5 customers by total spend","Write a JOIN between users and orders","Users who haven't made any purchase yet","Generate monthly revenue summary query","Suggest useful indexes for better performance","Show schema of the products / inventory table","Latest 20 orders with customer names","Help me write a safe UPDATE query"],s=ge(ke(),1),Je={damping:.7,stiffness:.05,mass:1.25},Ve=70,Xe=1e3/60,Ye=350,F=!1;globalThis.document?.addEventListener("mousedown",()=>{F=!0});globalThis.document?.addEventListener("mouseup",()=>{F=!1});globalThis.document?.addEventListener("click",()=>{F=!1});var $e=(r={})=>{const[n,o]=(0,s.useState)(!1),[i,a]=(0,s.useState)(r.initial!==!1),[d,m]=(0,s.useState)(!1),x=(0,s.useRef)(null);x.current=r;const v=(0,s.useCallback)(()=>{if(!F)return!1;const l=window.getSelection();if(!l||!l.rangeCount)return!1;const c=l.getRangeAt(0);return c.commonAncestorContainer.contains(h.current)||h.current?.contains(c.commonAncestorContainer)},[]),T=(0,s.useCallback)(l=>{e.isAtBottom=l,a(l)},[]),C=(0,s.useCallback)(l=>{e.escapedFromLock=l,o(l)},[]),e=(0,s.useMemo)(()=>{let l;return{escapedFromLock:n,isAtBottom:i,resizeDifference:0,accumulated:0,velocity:0,listeners:new Set,get scrollTop(){return h.current?.scrollTop??0},set scrollTop(c){h.current&&(h.current.scrollTop=c,e.ignoreScrollToTop=h.current.scrollTop)},get targetScrollTop(){return!h.current||!S.current?0:h.current.scrollHeight-1-h.current.clientHeight},get calculatedTargetScrollTop(){if(!h.current||!S.current)return 0;const{targetScrollTop:c}=this;if(!r.targetScrollTop)return c;if(l?.targetScrollTop===c)return l.calculatedScrollTop;const g=Math.max(Math.min(r.targetScrollTop(c,{scrollElement:h.current,contentElement:S.current}),c),0);return l={targetScrollTop:c,calculatedScrollTop:g},requestAnimationFrame(()=>{l=void 0}),g},get scrollDifference(){return this.calculatedTargetScrollTop-this.scrollTop},get isNearBottom(){return this.scrollDifference<=Ve}}},[]),u=(0,s.useCallback)((l={})=>{typeof l=="string"&&(l={animation:l}),l.preserveScrollPosition||T(!0);const c=Date.now()+(Number(l.wait)||0),g=G(x.current,l.animation),{ignoreEscapes:R=!1}=l;let L,B=e.calculatedTargetScrollTop;l.duration instanceof Promise?l.duration.finally(()=>{L=Date.now()}):L=c+(l.duration??0);const E=async()=>{const _=new Promise(requestAnimationFrame).then(()=>{if(!e.isAtBottom)return e.animation=void 0,!1;const{scrollTop:D}=e,P=performance.now(),U=(P-(e.lastTick??P))/Xe;if(e.animation||(e.animation={behavior:g,promise:_,ignoreEscapes:R}),e.animation.behavior===g&&(e.lastTick=P),v()||c>Date.now())return E();if(D<Math.min(B,e.calculatedTargetScrollTop)){if(e.animation?.behavior===g){if(g==="instant")return e.scrollTop=e.calculatedTargetScrollTop,E();e.velocity=(g.damping*e.velocity+g.stiffness*e.scrollDifference)/g.mass,e.accumulated+=e.velocity*U,e.scrollTop+=e.accumulated,e.scrollTop!==D&&(e.accumulated=0)}return E()}return L>Date.now()?(B=e.calculatedTargetScrollTop,E()):(e.animation=void 0,e.scrollTop<e.calculatedTargetScrollTop?u({animation:G(x.current,x.current.resize),ignoreEscapes:R,duration:Math.max(0,L-Date.now())||void 0}):e.isAtBottom)});return _.then(D=>(requestAnimationFrame(()=>{e.animation||(e.lastTick=void 0,e.velocity=0)}),D))};return l.wait!==!0&&(e.animation=void 0),e.animation?.behavior===g?e.animation.promise:E()},[T,v,e]),N=(0,s.useCallback)(()=>{C(!0),T(!1)},[C,T]),k=(0,s.useCallback)(({target:l})=>{if(l!==h.current)return;const{scrollTop:c,ignoreScrollToTop:g}=e;let{lastScrollTop:R=c}=e;e.lastScrollTop=c,e.ignoreScrollToTop=void 0,g&&g>c&&(R=g),m(e.isNearBottom),setTimeout(()=>{if(e.resizeDifference||c===g)return;if(v()){C(!0),T(!1);return}const L=c>R,B=c<R;if(e.animation?.ignoreEscapes){e.scrollTop=R;return}B&&(C(!0),T(!1)),L&&C(!1),!e.escapedFromLock&&e.isNearBottom&&T(!0)},1)},[C,T,v,e]),f=(0,s.useCallback)(({target:l,deltaY:c})=>{let g=l;for(;!["scroll","auto"].includes(getComputedStyle(g).overflow);){if(!g.parentElement)return;g=g.parentElement}g===h.current&&c<0&&h.current.scrollHeight>h.current.clientHeight&&!e.animation?.ignoreEscapes&&(C(!0),T(!1))},[C,T,e]),h=V(l=>{h.current?.removeEventListener("scroll",k),h.current?.removeEventListener("wheel",f),l?.addEventListener("scroll",k,{passive:!0}),l?.addEventListener("wheel",f,{passive:!0})},[]),S=V(l=>{if(e.resizeObserver?.disconnect(),!l)return;let c;e.resizeObserver=new ResizeObserver(([g])=>{const{height:R}=g.contentRect,L=R-(c??R);if(e.resizeDifference=L,e.scrollTop>e.targetScrollTop&&(e.scrollTop=e.targetScrollTop),m(e.isNearBottom),L>=0){const B=G(x.current,c?x.current.resize:x.current.initial);u({animation:B,wait:!0,preserveScrollPosition:!0,duration:B==="instant"?void 0:Ye})}else e.isNearBottom&&(C(!1),T(!0));c=R,requestAnimationFrame(()=>{setTimeout(()=>{e.resizeDifference===L&&(e.resizeDifference=0)},1)})}),e.resizeObserver?.observe(l)},[]);return{contentRef:S,scrollRef:h,scrollToBottom:u,stopScroll:N,isAtBottom:i||d,isNearBottom:d,escapedFromLock:n,state:e}};function V(r,n){const o=(0,s.useCallback)(i=>(o.current=i,r(i)),n);return o}var q=new Map;function G(...r){const n={...Je};let o=!1;for(const a of r){if(a==="instant"){o=!0;continue}typeof a=="object"&&(o=!1,n.damping=a.damping??n.damping,n.stiffness=a.stiffness??n.stiffness,n.mass=a.mass??n.mass)}const i=JSON.stringify(n);return q.has(i)||q.set(i,Object.freeze(n)),o?"instant":q.get(i)}var t=Ae(),re=(0,s.createContext)(null),Qe=typeof window<"u"?s.useLayoutEffect:s.useEffect;function M({instance:r,children:n,resize:o,initial:i,mass:a,damping:d,stiffness:m,targetScrollTop:x,contextRef:v,...T}){const C=(0,s.useRef)(null),e=$e({mass:a,damping:d,stiffness:m,resize:o,initial:i,targetScrollTop:s.useCallback((g,R)=>(c?.targetScrollTop??x)?.(g,R)??g,[x])}),{scrollRef:u,contentRef:N,scrollToBottom:k,stopScroll:f,isAtBottom:h,escapedFromLock:S,state:l}=r??e,c=(0,s.useMemo)(()=>({scrollToBottom:k,stopScroll:f,scrollRef:u,isAtBottom:h,escapedFromLock:S,contentRef:N,state:l,get targetScrollTop(){return C.current},set targetScrollTop(g){C.current=g}}),[k,h,N,u,f,S,l]);return(0,s.useImperativeHandle)(v,()=>c,[c]),Qe(()=>{u.current&&getComputedStyle(u.current).overflow==="visible"&&(u.current.style.overflow="auto")},[]),(0,t.jsx)(re.Provider,{value:c,children:(0,t.jsx)("div",{...T,children:typeof n=="function"?n(c):n})})}(function(r){function n({children:o,...i}){const a=ne();return(0,t.jsx)("div",{ref:a.scrollRef,style:{height:"100%",width:"100%"},children:(0,t.jsx)("div",{...i,ref:a.contentRef,children:typeof o=="function"?o(a):o})})}r.Content=n})(M||(M={}));function ne(){const r=(0,s.useContext)(re);if(!r)throw new Error("use-stick-to-bottom component context must be used within a StickToBottom component");return r}var Ze=({className:r,...n})=>(0,t.jsx)(M,{className:w("relative flex-1 overflow-y-hidden",r),initial:"smooth",resize:"smooth",role:"log",...n}),et=({className:r,...n})=>(0,t.jsx)(M.Content,{className:w("flex flex-col gap-8 p-4",r),...n}),tt=({className:r,...n})=>{const{isAtBottom:o,scrollToBottom:i}=ne(),a=(0,s.useCallback)(()=>{i()},[i]);return!o&&(0,t.jsx)(W,{className:w("absolute bottom-4 left-[50%] translate-x-[-50%] rounded-full",r),onClick:a,size:"icon",type:"button",variant:"outline",...n,children:(0,t.jsx)(ye,{className:"size-4"})})},X=[{variant:"shine",component:({children:r,className:n,...o})=>(0,t.jsx)("span",{...o,className:w("bg-[linear-gradient(110deg,#bfbfbf,35%,#000,50%,#bfbfbf,75%,#bfbfbf)] dark:bg-[linear-gradient(110deg,#404040,35%,#fff,50%,#404040,75%,#404040)]","bg-size-[200%_100%] bg-clip-text text-transparent","animate-shine",n),children:r})}];function rt({variant:r="shine",className:n,...o}){const i=X.find(a=>a.variant===r)?.component||X[0].component;return(0,t.jsx)(Be,{className:w("font-medium text-sm"),children:(0,t.jsx)(i,{...o,className:n})})}var Y=({className:r,from:n,...o})=>(0,t.jsx)("div",{className:w("group flex w-full max-w-[95%] flex-col gap-2",n==="user"?"is-user ml-auto justify-end":"is-assistant",r),...o}),$=({children:r,className:n,...o})=>(0,t.jsx)("div",{className:w("is-user:dark flex w-fit max-w-full min-w-0 flex-col gap-2 overflow-hidden text-sm","group-[.is-user]:ml-auto group-[.is-user]:rounded-lg group-[.is-user]:bg-secondary group-[.is-user]:px-4 group-[.is-user]:py-3 group-[.is-user]:text-foreground","group-[.is-assistant]:text-foreground",n),...o,children:r}),se=(0,s.createContext)(null),nt=()=>{const r=(0,s.useContext)(se);if(!r)throw new Error("MessageBranch components must be used within MessageBranch");return r},Q=({defaultBranch:r=0,onBranchChange:n,className:o,...i})=>{const[a,d]=(0,s.useState)(r),[m,x]=(0,s.useState)([]),v=u=>{d(u),n?.(u)},T=()=>{v(a>0?a-1:m.length-1)},C=()=>{v(a<m.length-1?a+1:0)},e={currentBranch:a,totalBranches:m.length,goToPrevious:T,goToNext:C,branches:m,setBranches:x};return(0,t.jsx)(se.Provider,{value:e,children:(0,t.jsx)("div",{className:w("grid w-full gap-2 [&>div]:pb-0",o),...i})})},Z=({children:r,...n})=>{const{currentBranch:o,setBranches:i,branches:a}=nt(),d=Array.isArray(r)?r:[r];return(0,s.useEffect)(()=>{a.length!==d.length&&i(d)},[d,a,i]),d.map((m,x)=>(0,t.jsx)("div",{className:w("grid gap-2 overflow-hidden [&>div]:pb-0",x===o?"block":"hidden"),...n,children:m},m.key))},oe=(0,s.memo)(({className:r,...n})=>(0,t.jsx)(ee,{className:w("size-full [&>*:first-child]:mt-0 [&>*:last-child]:mb-0",r),...n}),(r,n)=>r.children===n.children);oe.displayName="MessageResponse";var st="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict",ot=(r=21)=>{let n="",o=crypto.getRandomValues(new Uint8Array(r|=0));for(;r--;)n+=st[o[r]&63];return n},at=(0,s.createContext)(null),it=(0,s.createContext)(null),ae=()=>(0,s.useContext)(at),lt=()=>(0,s.useContext)(it),ie=(0,s.createContext)(null),ct=()=>{const r=lt(),n=(0,s.useContext)(ie),o=r??n;if(!o)throw new Error("usePromptInputAttachments must be used within a PromptInput or PromptInputProvider");return o},ut=({className:r,accept:n,multiple:o,globalDrop:i,syncHiddenInput:a,maxFiles:d,maxFileSize:m,onError:x,onSubmit:v,children:T,...C})=>{const e=ae(),u=!!e,N=(0,s.useRef)(null),k=(0,s.useRef)(null),[f,h]=(0,s.useState)([]),S=u?e.attachments.files:f,l=(0,s.useRef)(S);l.current=S;const c=(0,s.useCallback)(()=>{N.current?.click()},[]),g=(0,s.useCallback)(p=>!n||n.trim()===""?!0:n.split(",").map(b=>b.trim()).filter(Boolean).some(b=>{if(b.endsWith("/*")){const j=b.slice(0,-1);return p.type.startsWith(j)}return p.type===b}),[n]),R=(0,s.useCallback)(p=>{const b=Array.from(p),j=b.filter(I=>g(I));if(b.length&&j.length===0){x?.({code:"accept",message:"No files match the accepted types."});return}const y=I=>m?I.size<=m:!0,A=j.filter(y);if(j.length>0&&A.length===0){x?.({code:"max_file_size",message:"All files exceed the maximum size."});return}h(I=>{const z=typeof d=="number"?Math.max(0,d-I.length):void 0,he=typeof z=="number"?A.slice(0,z):A;typeof z=="number"&&A.length>z&&x?.({code:"max_files",message:"Too many files. Some were not added."});const K=[];for(const O of he)K.push({id:ot(),type:"file",url:URL.createObjectURL(O),mediaType:O.type,filename:O.name});return I.concat(K)})},[g,d,m,x]),L=(0,s.useCallback)(p=>h(b=>{const j=b.find(y=>y.id===p);return j?.url&&URL.revokeObjectURL(j.url),b.filter(y=>y.id!==p)}),[]),B=(0,s.useCallback)(()=>h(p=>{for(const b of p)b.url&&URL.revokeObjectURL(b.url);return[]}),[]),E=u?e.attachments.add:R,_=u?e.attachments.remove:L,D=u?e.attachments.clear:B,P=u?e.attachments.openFileDialog:c;(0,s.useEffect)(()=>{u&&e.__registerFileInput(N,()=>N.current?.click())},[u,e]),(0,s.useEffect)(()=>{a&&N.current&&S.length===0&&(N.current.value="")},[S,a]),(0,s.useEffect)(()=>{const p=k.current;if(!p||i)return;const b=y=>{y.dataTransfer?.types?.includes("Files")&&y.preventDefault()},j=y=>{y.dataTransfer?.types?.includes("Files")&&y.preventDefault(),y.dataTransfer?.files&&y.dataTransfer.files.length>0&&E(y.dataTransfer.files)};return p.addEventListener("dragover",b),p.addEventListener("drop",j),()=>{p.removeEventListener("dragover",b),p.removeEventListener("drop",j)}},[E,i]),(0,s.useEffect)(()=>{if(!i)return;const p=j=>{j.dataTransfer?.types?.includes("Files")&&j.preventDefault()},b=j=>{j.dataTransfer?.types?.includes("Files")&&j.preventDefault(),j.dataTransfer?.files&&j.dataTransfer.files.length>0&&E(j.dataTransfer.files)};return document.addEventListener("dragover",p),document.addEventListener("drop",b),()=>{document.removeEventListener("dragover",p),document.removeEventListener("drop",b)}},[E,i]),(0,s.useEffect)(()=>()=>{if(!u)for(const p of l.current)p.url&&URL.revokeObjectURL(p.url)},[u]);const U=p=>{p.currentTarget.files&&E(p.currentTarget.files),p.currentTarget.value=""},de=async p=>{try{const b=await(await fetch(p)).blob();return new Promise(j=>{const y=new FileReader;y.onloadend=()=>j(y.result),y.onerror=()=>j(null),y.readAsDataURL(b)})}catch{return null}},me=(0,s.useMemo)(()=>({files:S.map(p=>({...p,id:p.id})),add:E,remove:_,clear:D,openFileDialog:P,fileInputRef:N}),[S,E,_,D,P]),pe=p=>{p.preventDefault();const b=p.currentTarget,j=u?e.textInput.value:new FormData(b).get("message")||"";u||b.reset(),Promise.all(S.map(async({id:y,...A})=>{if(A.url?.startsWith("blob:")){const I=await de(A.url);return{...A,url:I??A.url}}return A})).then(y=>{try{const A=v({text:j,files:y},p);A instanceof Promise?A.then(()=>{D(),u&&e.textInput.clear()}).catch(()=>{}):(D(),u&&e.textInput.clear())}catch{}}).catch(()=>{})},H=(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("input",{accept:n,"aria-label":"Upload files",className:"hidden",multiple:o,onChange:U,ref:N,title:"Upload files",type:"file"}),(0,t.jsx)("form",{className:w("w-full",r),onSubmit:pe,ref:k,...C,children:(0,t.jsx)(Pe,{className:"overflow-hidden",children:T})})]});return u?H:(0,t.jsx)(ie.Provider,{value:me,children:H})},ft=({className:r,...n})=>(0,t.jsx)("div",{className:w("contents",r),...n}),dt=({onChange:r,className:n,placeholder:o="What would you like to know?",...i})=>{const a=ae(),d=ct(),[m,x]=(0,s.useState)(!1),v=e=>{if(e.key==="Enter"){if(m||e.nativeEvent.isComposing||e.shiftKey)return;e.preventDefault();const u=e.currentTarget.form;if(u?.querySelector('button[type="submit"]')?.disabled)return;u?.requestSubmit()}if(e.key==="Backspace"&&e.currentTarget.value===""&&d.files.length>0){e.preventDefault();const u=d.files.at(-1);u&&d.remove(u.id)}},T=e=>{const u=e.clipboardData?.items;if(!u)return;const N=[];for(const k of u)if(k.kind==="file"){const f=k.getAsFile();f&&N.push(f)}N.length>0&&(e.preventDefault(),d.add(N))},C=a?{value:a.textInput.value,onChange:e=>{a.textInput.setInput(e.currentTarget.value),r?.(e)}}:{onChange:r};return(0,t.jsx)(Ue,{className:w("field-sizing-content max-h-48 min-h-16",n),name:"message",onCompositionEnd:()=>x(!1),onCompositionStart:()=>x(!0),onKeyDown:v,onPaste:T,placeholder:o,...i,...C})},mt=({className:r,...n})=>(0,t.jsx)(De,{align:"block-end",className:w("justify-between justify-end gap-1",r),...n}),pt=({className:r,variant:n="default",size:o="icon-sm",status:i,children:a,...d})=>{let m=(0,t.jsx)(be,{className:"size-4"});return i==="submitted"?m=(0,t.jsx)(Se,{className:"size-4 animate-spin"}):i==="streaming"?m=(0,t.jsx)(Ce,{className:"size-4"}):i==="error"&&(m=(0,t.jsx)(Ne,{className:"size-4"})),(0,t.jsx)(Ie,{"aria-label":"Submit",className:w(r),size:o,type:"submit",variant:n,...d,children:a??m})};function ht({...r}){return(0,t.jsx)(Re,{"data-slot":"collapsible",...r})}function gt({...r}){return(0,t.jsx)(Ee,{"data-slot":"collapsible-trigger",...r})}function xt({...r}){return(0,t.jsx)(Le,{"data-slot":"collapsible-content",...r})}var vt=({children:r,as:n="p",className:o,duration:i=2,spread:a=2})=>{const d=(0,s.useMemo)(()=>(r?.length??0)*a,[r,a]);return(0,t.jsx)(n,{className:w("relative inline-block bg-size-[250%_100%,auto] bg-clip-text text-transparent","[--bg:linear-gradient(90deg,#0000_calc(50%-var(--spread)),var(--color-background),#0000_calc(50%+var(--spread)))] [background-repeat:no-repeat,padding-box]","animate-shimmer",o),style:{"--spread":`${d}px`,"--duration":`${i}s`,backgroundImage:"var(--bg), linear-gradient(var(--color-muted-foreground), var(--color-muted-foreground))"},children:r})},Tt=(0,s.memo)(vt),le=(0,s.createContext)(null),bt=()=>{const r=(0,s.useContext)(le);if(!r)throw new Error("Reasoning components must be used within Reasoning");return r},jt=1e3,St=1e3,ce=(0,s.memo)(({className:r,isStreaming:n=!1,open:o,defaultOpen:i=!0,onOpenChange:a,duration:d,children:m,...x})=>{const[v,T]=J({prop:o,defaultProp:i,onChange:a}),[C,e]=J({prop:d,defaultProp:void 0}),[u,N]=(0,s.useState)(!1),[k,f]=(0,s.useState)(null);(0,s.useEffect)(()=>{n?k===null&&f(Date.now()):k!==null&&(e(Math.ceil((Date.now()-k)/St)),f(null))},[n,k,e]),(0,s.useEffect)(()=>{if(i&&!n&&v&&!u){const S=setTimeout(()=>{T(!1),N(!0)},jt);return()=>clearTimeout(S)}},[n,v,i,T,u]);const h=S=>{T(S)};return(0,t.jsx)(le.Provider,{value:{isStreaming:n,isOpen:v,setIsOpen:T,duration:C},children:(0,t.jsx)(ht,{className:w("not-prose mb-4",r),onOpenChange:h,open:v,...x,children:m})})}),Ct=(r,n)=>r||n===0?(0,t.jsx)(Tt,{duration:1,children:"Thinking..."}):n===void 0?(0,t.jsx)("p",{children:"Thought for a few seconds"}):(0,t.jsxs)("p",{children:["Thought for ",n," seconds"]}),ue=(0,s.memo)(({className:r,children:n,getThinkingMessage:o=Ct,...i})=>{const{isStreaming:a,isOpen:d,duration:m}=bt();return(0,t.jsx)(gt,{className:w("flex w-full items-center gap-2 text-muted-foreground text-sm transition-colors hover:text-foreground",r),...i,children:n??(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(Te,{className:"size-4"}),o(a,m),(0,t.jsx)(je,{className:w("size-4 transition-transform",d?"rotate-180":"rotate-0")})]})})}),fe=(0,s.memo)(({className:r,children:n,...o})=>(0,t.jsx)(xt,{className:w("mt-4 text-sm","data-[state=closed]:fade-out-0 data-[state=closed]:slide-out-to-top-2 data-[state=open]:slide-in-from-top-2 text-muted-foreground outline-none data-[state=closed]:animate-out data-[state=open]:animate-in",r),...o,children:(0,t.jsx)(ee,{children:n})}));ce.displayName="Reasoning";ue.displayName="ReasoningTrigger";fe.displayName="ReasoningContent";var yt=({className:r,children:n,...o})=>(0,t.jsxs)(qe,{className:"w-full overflow-x-auto whitespace-nowrap",...o,children:[(0,t.jsx)("div",{className:w("flex w-max flex-nowrap items-center gap-2",r),children:n}),(0,t.jsx)(Oe,{className:"hidden",orientation:"horizontal"})]}),wt=({suggestion:r,onClick:n,className:o,variant:i="outline",size:a="sm",children:d,...m})=>{const x=()=>{n?.(r)};return(0,t.jsx)(W,{className:w("cursor-pointer rounded-full px-4",o),onClick:x,size:a,type:"button",variant:i,...m,children:d||r})},Nt=({db:r,onRateLimitRefetch:n,onControllerReady:o})=>{const[i,a]=(0,s.useState)(""),{rateLimit:d}=te(),{messages:m,sendMessage:x,isLoading:v,clear:T,stop:C}=xe({connection:ve(`${ze.BASE_URL}/chat`),body:{db:r},onError:f=>console.error("Error:",f.message),onResponse:f=>console.log("Response:",f),onFinish:f=>{console.log("Finish:",f),n()}});(0,s.useEffect)(()=>{o({clear:()=>{T(),a("")},isLoading:v})},[T,v,o]);const e=f=>{const h=!!f.text,S=!!f.files?.length;!(h||S)||v||(x(f.text),a(""))},u=f=>{x(f),a("")},N=()=>{C(),a("")},k=v?"streaming":"ready";return(0,t.jsxs)("div",{className:"relative flex size-full flex-col divide-y overflow-hidden",children:[(0,t.jsxs)(Ze,{children:[(0,t.jsx)(et,{children:m.length===0?(0,t.jsx)("div",{className:"flex items-center justify-center h-full text-muted-foreground",children:(0,t.jsxs)("div",{className:"text-center space-y-2",children:[(0,t.jsx)("p",{className:"text-lg font-medium",children:"Start a new conversation"}),(0,t.jsx)("p",{className:"text-sm",children:"Ask me anything to get started"})]})}):(0,t.jsxs)(t.Fragment,{children:[m.map(f=>{const h=f.parts.filter(c=>c.type==="thinking"),S=f.parts.filter(c=>c.type==="text").map(c=>c.content).join(""),l=h.length>0;return(0,t.jsx)(Q,{defaultBranch:0,children:(0,t.jsx)(Z,{children:(0,t.jsx)(Y,{from:f.role==="user"?"user":"assistant",children:(0,t.jsxs)("div",{children:[l&&f.role==="assistant"&&(0,t.jsxs)(ce,{duration:0,children:[(0,t.jsx)(ue,{}),(0,t.jsx)(fe,{children:h.map(c=>c.content).join(`
2
- `)})]}),(0,t.jsx)($,{children:(0,t.jsx)(oe,{children:S})})]})})})},f.id)}),v&&(0,t.jsx)(Q,{defaultBranch:0,children:(0,t.jsx)(Z,{children:(0,t.jsx)(Y,{from:"assistant",children:(0,t.jsx)($,{children:(0,t.jsx)(rt,{children:"Thinking..."})})})})})]})}),(0,t.jsx)(tt,{})]}),(0,t.jsxs)("div",{className:"grid shrink-0 gap-4 pt-3",children:[m.length===0&&(0,t.jsx)(yt,{className:"px-4",children:Ke.map(f=>(0,t.jsx)(wt,{onClick:()=>u(f),suggestion:f,size:"lg",children:f},f))}),(0,t.jsx)("div",{className:"w-full px-4 pb-4",children:(0,t.jsxs)(ut,{globalDrop:!0,multiple:!0,onSubmit:e,children:[(0,t.jsx)(ft,{children:(0,t.jsx)(dt,{onChange:f=>a(f.target.value),value:i,placeholder:"Type a message..."})}),(0,t.jsx)(mt,{children:(0,t.jsx)(pt,{className:"h-8!",status:k,onClick:v?N:void 0,disabled:d&&d.remaining===0})})]})})]})]})},_t=()=>{const{rateLimit:r,refetchRateLimit:n}=te(),{isSheetOpen:o,closeSheet:i}=Me(),{selectedDatabase:a}=Fe(),[d,m]=(0,s.useState)(null),x=(0,s.useRef)(v=>m(v));return(0,t.jsx)(_e,{title:"AI Assistant",cta:(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[r&&(0,t.jsxs)(He,{children:[(0,t.jsx)(Ge,{asChild:!0,children:(0,t.jsxs)("span",{className:"text-xs px-2 py-1 cursor-default text-muted-foreground",children:[r.remaining,"/",r.limit]})}),(0,t.jsx)(We,{side:"bottom",children:(0,t.jsxs)("p",{children:[r.remaining," messages remaining"]})})]}),a&&d&&(0,t.jsxs)(W,{type:"button",variant:"outline",size:"lg",onClick:d.clear,disabled:d.isLoading,children:[(0,t.jsx)(we,{className:"h-4 w-4 mr-1"}),"New Chat"]})]}),closeButton:!1,open:o("ai-assistant"),size:"max-w-2xl!",contentClassName:"p-0 flex flex-col h-[calc(100vh-4rem)] flex-1",onOpenChange:v=>{v||i("ai-assistant")},children:a?(0,t.jsx)(Nt,{db:a,onRateLimitRefetch:n,onControllerReady:x.current},a):(0,t.jsx)("div",{className:"flex items-center justify-center h-full text-muted-foreground p-8",children:(0,t.jsxs)("div",{className:"text-center space-y-2",children:[(0,t.jsx)("p",{className:"text-lg font-medium",children:"No database selected"}),(0,t.jsx)("p",{className:"text-sm",children:"Select a database from the sidebar to start chatting."})]})})})};export{_t as ChatSidebar};
1
+ import{r as ge}from"./rolldown-runtime-Bnw7wDfq.js";import{o as xe,s as ve}from"./tanstack-DyfKDo5s.js";import{G as Te,N as be,Y as je,b as Se,c as Ce,m as ye,nt as we,t as Ne,tt as ke}from"./icons-BywMJ5og.js";import{Ct as J,F as Ee,I as Re,Ot as Ae,P as Le,Tt as Be}from"./radix-ui-C0u6gLux.js";import{Et as w,G as De,J as Ie,K as Pe,_t as _e,lt as ze,q as Me,st as Fe,wt as H,x as Ue}from"./index-B7KYpPyV.js";import{r as ee}from"./chunk-BO2N2NFS-BWASkQ7r.js";import{n as Oe,t as qe}from"./scroll-area-A-6bIiHh.js";import{i as Ge,n as He,t as We}from"./tooltip-BSKLiphS.js";import{t as te}from"./use-rate-limit-Bdyk6haf.js";var Ke=["Show me all tables in my database","What columns are in the users table?","Write a query to find all active users","How many orders were placed last month?","Find top 5 customers by total spend","Write a JOIN between users and orders","Users who haven't made any purchase yet","Generate monthly revenue summary query","Suggest useful indexes for better performance","Show schema of the products / inventory table","Latest 20 orders with customer names","Help me write a safe UPDATE query"],s=ge(we(),1),Je={damping:.7,stiffness:.05,mass:1.25},Ve=70,Xe=1e3/60,Ye=350,F=!1;globalThis.document?.addEventListener("mousedown",()=>{F=!0});globalThis.document?.addEventListener("mouseup",()=>{F=!1});globalThis.document?.addEventListener("click",()=>{F=!1});var $e=(r={})=>{const[n,o]=(0,s.useState)(!1),[i,a]=(0,s.useState)(r.initial!==!1),[d,m]=(0,s.useState)(!1),x=(0,s.useRef)(null);x.current=r;const v=(0,s.useCallback)(()=>{if(!F)return!1;const l=window.getSelection();if(!l||!l.rangeCount)return!1;const c=l.getRangeAt(0);return c.commonAncestorContainer.contains(h.current)||h.current?.contains(c.commonAncestorContainer)},[]),T=(0,s.useCallback)(l=>{e.isAtBottom=l,a(l)},[]),C=(0,s.useCallback)(l=>{e.escapedFromLock=l,o(l)},[]),e=(0,s.useMemo)(()=>{let l;return{escapedFromLock:n,isAtBottom:i,resizeDifference:0,accumulated:0,velocity:0,listeners:new Set,get scrollTop(){return h.current?.scrollTop??0},set scrollTop(c){h.current&&(h.current.scrollTop=c,e.ignoreScrollToTop=h.current.scrollTop)},get targetScrollTop(){return!h.current||!S.current?0:h.current.scrollHeight-1-h.current.clientHeight},get calculatedTargetScrollTop(){if(!h.current||!S.current)return 0;const{targetScrollTop:c}=this;if(!r.targetScrollTop)return c;if(l?.targetScrollTop===c)return l.calculatedScrollTop;const g=Math.max(Math.min(r.targetScrollTop(c,{scrollElement:h.current,contentElement:S.current}),c),0);return l={targetScrollTop:c,calculatedScrollTop:g},requestAnimationFrame(()=>{l=void 0}),g},get scrollDifference(){return this.calculatedTargetScrollTop-this.scrollTop},get isNearBottom(){return this.scrollDifference<=Ve}}},[]),u=(0,s.useCallback)((l={})=>{typeof l=="string"&&(l={animation:l}),l.preserveScrollPosition||T(!0);const c=Date.now()+(Number(l.wait)||0),g=G(x.current,l.animation),{ignoreEscapes:E=!1}=l;let L,B=e.calculatedTargetScrollTop;l.duration instanceof Promise?l.duration.finally(()=>{L=Date.now()}):L=c+(l.duration??0);const R=async()=>{const _=new Promise(requestAnimationFrame).then(()=>{if(!e.isAtBottom)return e.animation=void 0,!1;const{scrollTop:D}=e,P=performance.now(),U=(P-(e.lastTick??P))/Xe;if(e.animation||(e.animation={behavior:g,promise:_,ignoreEscapes:E}),e.animation.behavior===g&&(e.lastTick=P),v()||c>Date.now())return R();if(D<Math.min(B,e.calculatedTargetScrollTop)){if(e.animation?.behavior===g){if(g==="instant")return e.scrollTop=e.calculatedTargetScrollTop,R();e.velocity=(g.damping*e.velocity+g.stiffness*e.scrollDifference)/g.mass,e.accumulated+=e.velocity*U,e.scrollTop+=e.accumulated,e.scrollTop!==D&&(e.accumulated=0)}return R()}return L>Date.now()?(B=e.calculatedTargetScrollTop,R()):(e.animation=void 0,e.scrollTop<e.calculatedTargetScrollTop?u({animation:G(x.current,x.current.resize),ignoreEscapes:E,duration:Math.max(0,L-Date.now())||void 0}):e.isAtBottom)});return _.then(D=>(requestAnimationFrame(()=>{e.animation||(e.lastTick=void 0,e.velocity=0)}),D))};return l.wait!==!0&&(e.animation=void 0),e.animation?.behavior===g?e.animation.promise:R()},[T,v,e]),N=(0,s.useCallback)(()=>{C(!0),T(!1)},[C,T]),k=(0,s.useCallback)(({target:l})=>{if(l!==h.current)return;const{scrollTop:c,ignoreScrollToTop:g}=e;let{lastScrollTop:E=c}=e;e.lastScrollTop=c,e.ignoreScrollToTop=void 0,g&&g>c&&(E=g),m(e.isNearBottom),setTimeout(()=>{if(e.resizeDifference||c===g)return;if(v()){C(!0),T(!1);return}const L=c>E,B=c<E;if(e.animation?.ignoreEscapes){e.scrollTop=E;return}B&&(C(!0),T(!1)),L&&C(!1),!e.escapedFromLock&&e.isNearBottom&&T(!0)},1)},[C,T,v,e]),f=(0,s.useCallback)(({target:l,deltaY:c})=>{let g=l;for(;!["scroll","auto"].includes(getComputedStyle(g).overflow);){if(!g.parentElement)return;g=g.parentElement}g===h.current&&c<0&&h.current.scrollHeight>h.current.clientHeight&&!e.animation?.ignoreEscapes&&(C(!0),T(!1))},[C,T,e]),h=V(l=>{h.current?.removeEventListener("scroll",k),h.current?.removeEventListener("wheel",f),l?.addEventListener("scroll",k,{passive:!0}),l?.addEventListener("wheel",f,{passive:!0})},[]),S=V(l=>{if(e.resizeObserver?.disconnect(),!l)return;let c;e.resizeObserver=new ResizeObserver(([g])=>{const{height:E}=g.contentRect,L=E-(c??E);if(e.resizeDifference=L,e.scrollTop>e.targetScrollTop&&(e.scrollTop=e.targetScrollTop),m(e.isNearBottom),L>=0){const B=G(x.current,c?x.current.resize:x.current.initial);u({animation:B,wait:!0,preserveScrollPosition:!0,duration:B==="instant"?void 0:Ye})}else e.isNearBottom&&(C(!1),T(!0));c=E,requestAnimationFrame(()=>{setTimeout(()=>{e.resizeDifference===L&&(e.resizeDifference=0)},1)})}),e.resizeObserver?.observe(l)},[]);return{contentRef:S,scrollRef:h,scrollToBottom:u,stopScroll:N,isAtBottom:i||d,isNearBottom:d,escapedFromLock:n,state:e}};function V(r,n){const o=(0,s.useCallback)(i=>(o.current=i,r(i)),n);return o}var q=new Map;function G(...r){const n={...Je};let o=!1;for(const a of r){if(a==="instant"){o=!0;continue}typeof a=="object"&&(o=!1,n.damping=a.damping??n.damping,n.stiffness=a.stiffness??n.stiffness,n.mass=a.mass??n.mass)}const i=JSON.stringify(n);return q.has(i)||q.set(i,Object.freeze(n)),o?"instant":q.get(i)}var t=Ae(),re=(0,s.createContext)(null),Qe=typeof window<"u"?s.useLayoutEffect:s.useEffect;function M({instance:r,children:n,resize:o,initial:i,mass:a,damping:d,stiffness:m,targetScrollTop:x,contextRef:v,...T}){const C=(0,s.useRef)(null),e=$e({mass:a,damping:d,stiffness:m,resize:o,initial:i,targetScrollTop:s.useCallback((g,E)=>(c?.targetScrollTop??x)?.(g,E)??g,[x])}),{scrollRef:u,contentRef:N,scrollToBottom:k,stopScroll:f,isAtBottom:h,escapedFromLock:S,state:l}=r??e,c=(0,s.useMemo)(()=>({scrollToBottom:k,stopScroll:f,scrollRef:u,isAtBottom:h,escapedFromLock:S,contentRef:N,state:l,get targetScrollTop(){return C.current},set targetScrollTop(g){C.current=g}}),[k,h,N,u,f,S,l]);return(0,s.useImperativeHandle)(v,()=>c,[c]),Qe(()=>{u.current&&getComputedStyle(u.current).overflow==="visible"&&(u.current.style.overflow="auto")},[]),(0,t.jsx)(re.Provider,{value:c,children:(0,t.jsx)("div",{...T,children:typeof n=="function"?n(c):n})})}(function(r){function n({children:o,...i}){const a=ne();return(0,t.jsx)("div",{ref:a.scrollRef,style:{height:"100%",width:"100%"},children:(0,t.jsx)("div",{...i,ref:a.contentRef,children:typeof o=="function"?o(a):o})})}r.Content=n})(M||(M={}));function ne(){const r=(0,s.useContext)(re);if(!r)throw new Error("use-stick-to-bottom component context must be used within a StickToBottom component");return r}var Ze=({className:r,...n})=>(0,t.jsx)(M,{className:w("relative flex-1 overflow-y-hidden",r),initial:"smooth",resize:"smooth",role:"log",...n}),et=({className:r,...n})=>(0,t.jsx)(M.Content,{className:w("flex flex-col gap-8 p-4",r),...n}),tt=({className:r,...n})=>{const{isAtBottom:o,scrollToBottom:i}=ne(),a=(0,s.useCallback)(()=>{i()},[i]);return!o&&(0,t.jsx)(H,{className:w("absolute bottom-4 left-[50%] translate-x-[-50%] rounded-full",r),onClick:a,size:"icon",type:"button",variant:"outline",...n,children:(0,t.jsx)(ke,{className:"size-4"})})},X=[{variant:"shine",component:({children:r,className:n,...o})=>(0,t.jsx)("span",{...o,className:w("bg-[linear-gradient(110deg,#bfbfbf,35%,#000,50%,#bfbfbf,75%,#bfbfbf)] dark:bg-[linear-gradient(110deg,#404040,35%,#fff,50%,#404040,75%,#404040)]","bg-size-[200%_100%] bg-clip-text text-transparent","animate-shine",n),children:r})}];function rt({variant:r="shine",className:n,...o}){const i=X.find(a=>a.variant===r)?.component||X[0].component;return(0,t.jsx)(Be,{className:w("font-medium text-sm"),children:(0,t.jsx)(i,{...o,className:n})})}var Y=({className:r,from:n,...o})=>(0,t.jsx)("div",{className:w("group flex w-full max-w-[95%] flex-col gap-2",n==="user"?"is-user ml-auto justify-end":"is-assistant",r),...o}),$=({children:r,className:n,...o})=>(0,t.jsx)("div",{className:w("is-user:dark flex w-fit max-w-full min-w-0 flex-col gap-2 overflow-hidden text-sm","group-[.is-user]:ml-auto group-[.is-user]:rounded-lg group-[.is-user]:bg-secondary group-[.is-user]:px-4 group-[.is-user]:py-3 group-[.is-user]:text-foreground","group-[.is-assistant]:text-foreground",n),...o,children:r}),se=(0,s.createContext)(null),nt=()=>{const r=(0,s.useContext)(se);if(!r)throw new Error("MessageBranch components must be used within MessageBranch");return r},Q=({defaultBranch:r=0,onBranchChange:n,className:o,...i})=>{const[a,d]=(0,s.useState)(r),[m,x]=(0,s.useState)([]),v=u=>{d(u),n?.(u)},T=()=>{v(a>0?a-1:m.length-1)},C=()=>{v(a<m.length-1?a+1:0)},e={currentBranch:a,totalBranches:m.length,goToPrevious:T,goToNext:C,branches:m,setBranches:x};return(0,t.jsx)(se.Provider,{value:e,children:(0,t.jsx)("div",{className:w("grid w-full gap-2 [&>div]:pb-0",o),...i})})},Z=({children:r,...n})=>{const{currentBranch:o,setBranches:i,branches:a}=nt(),d=Array.isArray(r)?r:[r];return(0,s.useEffect)(()=>{a.length!==d.length&&i(d)},[d,a,i]),d.map((m,x)=>(0,t.jsx)("div",{className:w("grid gap-2 overflow-hidden [&>div]:pb-0",x===o?"block":"hidden"),...n,children:m},m.key))},oe=(0,s.memo)(({className:r,...n})=>(0,t.jsx)(ee,{className:w("size-full [&>*:first-child]:mt-0 [&>*:last-child]:mb-0",r),...n}),(r,n)=>r.children===n.children);oe.displayName="MessageResponse";var st="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict",ot=(r=21)=>{let n="",o=crypto.getRandomValues(new Uint8Array(r|=0));for(;r--;)n+=st[o[r]&63];return n},at=(0,s.createContext)(null),it=(0,s.createContext)(null),ae=()=>(0,s.useContext)(at),lt=()=>(0,s.useContext)(it),ie=(0,s.createContext)(null),ct=()=>{const r=lt(),n=(0,s.useContext)(ie),o=r??n;if(!o)throw new Error("usePromptInputAttachments must be used within a PromptInput or PromptInputProvider");return o},ut=({className:r,accept:n,multiple:o,globalDrop:i,syncHiddenInput:a,maxFiles:d,maxFileSize:m,onError:x,onSubmit:v,children:T,...C})=>{const e=ae(),u=!!e,N=(0,s.useRef)(null),k=(0,s.useRef)(null),[f,h]=(0,s.useState)([]),S=u?e.attachments.files:f,l=(0,s.useRef)(S);l.current=S;const c=(0,s.useCallback)(()=>{N.current?.click()},[]),g=(0,s.useCallback)(p=>!n||n.trim()===""?!0:n.split(",").map(b=>b.trim()).filter(Boolean).some(b=>{if(b.endsWith("/*")){const j=b.slice(0,-1);return p.type.startsWith(j)}return p.type===b}),[n]),E=(0,s.useCallback)(p=>{const b=Array.from(p),j=b.filter(I=>g(I));if(b.length&&j.length===0){x?.({code:"accept",message:"No files match the accepted types."});return}const y=I=>m?I.size<=m:!0,A=j.filter(y);if(j.length>0&&A.length===0){x?.({code:"max_file_size",message:"All files exceed the maximum size."});return}h(I=>{const z=typeof d=="number"?Math.max(0,d-I.length):void 0,he=typeof z=="number"?A.slice(0,z):A;typeof z=="number"&&A.length>z&&x?.({code:"max_files",message:"Too many files. Some were not added."});const K=[];for(const O of he)K.push({id:ot(),type:"file",url:URL.createObjectURL(O),mediaType:O.type,filename:O.name});return I.concat(K)})},[g,d,m,x]),L=(0,s.useCallback)(p=>h(b=>{const j=b.find(y=>y.id===p);return j?.url&&URL.revokeObjectURL(j.url),b.filter(y=>y.id!==p)}),[]),B=(0,s.useCallback)(()=>h(p=>{for(const b of p)b.url&&URL.revokeObjectURL(b.url);return[]}),[]),R=u?e.attachments.add:E,_=u?e.attachments.remove:L,D=u?e.attachments.clear:B,P=u?e.attachments.openFileDialog:c;(0,s.useEffect)(()=>{u&&e.__registerFileInput(N,()=>N.current?.click())},[u,e]),(0,s.useEffect)(()=>{a&&N.current&&S.length===0&&(N.current.value="")},[S,a]),(0,s.useEffect)(()=>{const p=k.current;if(!p||i)return;const b=y=>{y.dataTransfer?.types?.includes("Files")&&y.preventDefault()},j=y=>{y.dataTransfer?.types?.includes("Files")&&y.preventDefault(),y.dataTransfer?.files&&y.dataTransfer.files.length>0&&R(y.dataTransfer.files)};return p.addEventListener("dragover",b),p.addEventListener("drop",j),()=>{p.removeEventListener("dragover",b),p.removeEventListener("drop",j)}},[R,i]),(0,s.useEffect)(()=>{if(!i)return;const p=j=>{j.dataTransfer?.types?.includes("Files")&&j.preventDefault()},b=j=>{j.dataTransfer?.types?.includes("Files")&&j.preventDefault(),j.dataTransfer?.files&&j.dataTransfer.files.length>0&&R(j.dataTransfer.files)};return document.addEventListener("dragover",p),document.addEventListener("drop",b),()=>{document.removeEventListener("dragover",p),document.removeEventListener("drop",b)}},[R,i]),(0,s.useEffect)(()=>()=>{if(!u)for(const p of l.current)p.url&&URL.revokeObjectURL(p.url)},[u]);const U=p=>{p.currentTarget.files&&R(p.currentTarget.files),p.currentTarget.value=""},de=async p=>{try{const b=await(await fetch(p)).blob();return new Promise(j=>{const y=new FileReader;y.onloadend=()=>j(y.result),y.onerror=()=>j(null),y.readAsDataURL(b)})}catch{return null}},me=(0,s.useMemo)(()=>({files:S.map(p=>({...p,id:p.id})),add:R,remove:_,clear:D,openFileDialog:P,fileInputRef:N}),[S,R,_,D,P]),pe=p=>{p.preventDefault();const b=p.currentTarget,j=u?e.textInput.value:new FormData(b).get("message")||"";u||b.reset(),Promise.all(S.map(async({id:y,...A})=>{if(A.url?.startsWith("blob:")){const I=await de(A.url);return{...A,url:I??A.url}}return A})).then(y=>{try{const A=v({text:j,files:y},p);A instanceof Promise?A.then(()=>{D(),u&&e.textInput.clear()}).catch(()=>{}):(D(),u&&e.textInput.clear())}catch{}}).catch(()=>{})},W=(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("input",{accept:n,"aria-label":"Upload files",className:"hidden",multiple:o,onChange:U,ref:N,title:"Upload files",type:"file"}),(0,t.jsx)("form",{className:w("w-full",r),onSubmit:pe,ref:k,...C,children:(0,t.jsx)(De,{className:"overflow-hidden",children:T})})]});return u?W:(0,t.jsx)(ie.Provider,{value:me,children:W})},ft=({className:r,...n})=>(0,t.jsx)("div",{className:w("contents",r),...n}),dt=({onChange:r,className:n,placeholder:o="What would you like to know?",...i})=>{const a=ae(),d=ct(),[m,x]=(0,s.useState)(!1),v=e=>{if(e.key==="Enter"){if(m||e.nativeEvent.isComposing||e.shiftKey)return;e.preventDefault();const u=e.currentTarget.form;if(u?.querySelector('button[type="submit"]')?.disabled)return;u?.requestSubmit()}if(e.key==="Backspace"&&e.currentTarget.value===""&&d.files.length>0){e.preventDefault();const u=d.files.at(-1);u&&d.remove(u.id)}},T=e=>{const u=e.clipboardData?.items;if(!u)return;const N=[];for(const k of u)if(k.kind==="file"){const f=k.getAsFile();f&&N.push(f)}N.length>0&&(e.preventDefault(),d.add(N))},C=a?{value:a.textInput.value,onChange:e=>{a.textInput.setInput(e.currentTarget.value),r?.(e)}}:{onChange:r};return(0,t.jsx)(Ie,{className:w("field-sizing-content max-h-48 min-h-16",n),name:"message",onCompositionEnd:()=>x(!1),onCompositionStart:()=>x(!0),onKeyDown:v,onPaste:T,placeholder:o,...i,...C})},mt=({className:r,...n})=>(0,t.jsx)(Pe,{align:"block-end",className:w("justify-between justify-end gap-1",r),...n}),pt=({className:r,variant:n="default",size:o="icon-sm",status:i,children:a,...d})=>{let m=(0,t.jsx)(be,{className:"size-4"});return i==="submitted"?m=(0,t.jsx)(Se,{className:"size-4 animate-spin"}):i==="streaming"?m=(0,t.jsx)(Ce,{className:"size-4"}):i==="error"&&(m=(0,t.jsx)(Ne,{className:"size-4"})),(0,t.jsx)(Me,{"aria-label":"Submit",className:w(r),size:o,type:"submit",variant:n,...d,children:a??m})};function ht({...r}){return(0,t.jsx)(Ee,{"data-slot":"collapsible",...r})}function gt({...r}){return(0,t.jsx)(Re,{"data-slot":"collapsible-trigger",...r})}function xt({...r}){return(0,t.jsx)(Le,{"data-slot":"collapsible-content",...r})}var vt=({children:r,as:n="p",className:o,duration:i=2,spread:a=2})=>{const d=(0,s.useMemo)(()=>(r?.length??0)*a,[r,a]);return(0,t.jsx)(n,{className:w("relative inline-block bg-size-[250%_100%,auto] bg-clip-text text-transparent","[--bg:linear-gradient(90deg,#0000_calc(50%-var(--spread)),var(--color-background),#0000_calc(50%+var(--spread)))] [background-repeat:no-repeat,padding-box]","animate-shimmer",o),style:{"--spread":`${d}px`,"--duration":`${i}s`,backgroundImage:"var(--bg), linear-gradient(var(--color-muted-foreground), var(--color-muted-foreground))"},children:r})},Tt=(0,s.memo)(vt),le=(0,s.createContext)(null),bt=()=>{const r=(0,s.useContext)(le);if(!r)throw new Error("Reasoning components must be used within Reasoning");return r},jt=1e3,St=1e3,ce=(0,s.memo)(({className:r,isStreaming:n=!1,open:o,defaultOpen:i=!0,onOpenChange:a,duration:d,children:m,...x})=>{const[v,T]=J({prop:o,defaultProp:i,onChange:a}),[C,e]=J({prop:d,defaultProp:void 0}),[u,N]=(0,s.useState)(!1),[k,f]=(0,s.useState)(null);(0,s.useEffect)(()=>{n?k===null&&f(Date.now()):k!==null&&(e(Math.ceil((Date.now()-k)/St)),f(null))},[n,k,e]),(0,s.useEffect)(()=>{if(i&&!n&&v&&!u){const S=setTimeout(()=>{T(!1),N(!0)},jt);return()=>clearTimeout(S)}},[n,v,i,T,u]);const h=S=>{T(S)};return(0,t.jsx)(le.Provider,{value:{isStreaming:n,isOpen:v,setIsOpen:T,duration:C},children:(0,t.jsx)(ht,{className:w("not-prose mb-4",r),onOpenChange:h,open:v,...x,children:m})})}),Ct=(r,n)=>r||n===0?(0,t.jsx)(Tt,{duration:1,children:"Thinking..."}):n===void 0?(0,t.jsx)("p",{children:"Thought for a few seconds"}):(0,t.jsxs)("p",{children:["Thought for ",n," seconds"]}),ue=(0,s.memo)(({className:r,children:n,getThinkingMessage:o=Ct,...i})=>{const{isStreaming:a,isOpen:d,duration:m}=bt();return(0,t.jsx)(gt,{className:w("flex w-full items-center gap-2 text-muted-foreground text-sm transition-colors hover:text-foreground",r),...i,children:n??(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(je,{className:"size-4"}),o(a,m),(0,t.jsx)(Te,{className:w("size-4 transition-transform",d?"rotate-180":"rotate-0")})]})})}),fe=(0,s.memo)(({className:r,children:n,...o})=>(0,t.jsx)(xt,{className:w("mt-4 text-sm","data-[state=closed]:fade-out-0 data-[state=closed]:slide-out-to-top-2 data-[state=open]:slide-in-from-top-2 text-muted-foreground outline-none data-[state=closed]:animate-out data-[state=open]:animate-in",r),...o,children:(0,t.jsx)(ee,{children:n})}));ce.displayName="Reasoning";ue.displayName="ReasoningTrigger";fe.displayName="ReasoningContent";var yt=({className:r,children:n,...o})=>(0,t.jsxs)(qe,{className:"w-full overflow-x-auto whitespace-nowrap",...o,children:[(0,t.jsx)("div",{className:w("flex w-max flex-nowrap items-center gap-2",r),children:n}),(0,t.jsx)(Oe,{className:"hidden",orientation:"horizontal"})]}),wt=({suggestion:r,onClick:n,className:o,variant:i="outline",size:a="sm",children:d,...m})=>{const x=()=>{n?.(r)};return(0,t.jsx)(H,{className:w("cursor-pointer rounded-full px-4",o),onClick:x,size:a,type:"button",variant:i,...m,children:d||r})},Nt=({db:r,onRateLimitRefetch:n,onControllerReady:o})=>{const[i,a]=(0,s.useState)(""),{rateLimit:d}=te(),{messages:m,sendMessage:x,isLoading:v,clear:T,stop:C}=xe({connection:ve(`${ze.BASE_URL}/chat`),body:{db:r},onError:f=>console.error("Error:",f.message),onResponse:f=>console.log("Response:",f),onFinish:f=>{console.log("Finish:",f),n()}});(0,s.useEffect)(()=>{o({clear:()=>{T(),a("")},isLoading:v})},[T,v,o]);const e=f=>{const h=!!f.text,S=!!f.files?.length;!(h||S)||v||(x(f.text),a(""))},u=f=>{x(f),a("")},N=()=>{C(),a("")},k=v?"streaming":"ready";return(0,t.jsxs)("div",{className:"relative flex size-full flex-col divide-y overflow-hidden",children:[(0,t.jsxs)(Ze,{children:[(0,t.jsx)(et,{children:m.length===0?(0,t.jsx)("div",{className:"flex items-center justify-center h-full text-muted-foreground",children:(0,t.jsxs)("div",{className:"text-center space-y-2",children:[(0,t.jsx)("p",{className:"text-lg font-medium",children:"Start a new conversation"}),(0,t.jsx)("p",{className:"text-sm",children:"Ask me anything to get started"})]})}):(0,t.jsxs)(t.Fragment,{children:[m.map(f=>{const h=f.parts.filter(c=>c.type==="thinking"),S=f.parts.filter(c=>c.type==="text").map(c=>c.content).join(""),l=h.length>0;return(0,t.jsx)(Q,{defaultBranch:0,children:(0,t.jsx)(Z,{children:(0,t.jsx)(Y,{from:f.role==="user"?"user":"assistant",children:(0,t.jsxs)("div",{children:[l&&f.role==="assistant"&&(0,t.jsxs)(ce,{duration:0,children:[(0,t.jsx)(ue,{}),(0,t.jsx)(fe,{children:h.map(c=>c.content).join(`
2
+ `)})]}),(0,t.jsx)($,{children:(0,t.jsx)(oe,{children:S})})]})})})},f.id)}),v&&(0,t.jsx)(Q,{defaultBranch:0,children:(0,t.jsx)(Z,{children:(0,t.jsx)(Y,{from:"assistant",children:(0,t.jsx)($,{children:(0,t.jsx)(rt,{children:"Thinking..."})})})})})]})}),(0,t.jsx)(tt,{})]}),(0,t.jsxs)("div",{className:"grid shrink-0 gap-4 pt-3",children:[m.length===0&&(0,t.jsx)(yt,{className:"px-4",children:Ke.map(f=>(0,t.jsx)(wt,{onClick:()=>u(f),suggestion:f,size:"lg",children:f},f))}),(0,t.jsx)("div",{className:"w-full px-4 pb-4",children:(0,t.jsxs)(ut,{globalDrop:!0,multiple:!0,onSubmit:e,children:[(0,t.jsx)(ft,{children:(0,t.jsx)(dt,{onChange:f=>a(f.target.value),value:i,placeholder:"Type a message..."})}),(0,t.jsx)(mt,{children:(0,t.jsx)(pt,{className:"h-8!",status:k,onClick:v?N:void 0,disabled:d&&d.remaining===0})})]})})]})]})},_t=()=>{const{rateLimit:r,refetchRateLimit:n}=te(),{isSheetOpen:o,closeSheet:i}=_e(),{selectedDatabase:a}=Fe(),[d,m]=(0,s.useState)(null),x=(0,s.useRef)(v=>m(v));return(0,t.jsx)(Ue,{title:"AI Assistant",cta:(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[r&&(0,t.jsxs)(We,{children:[(0,t.jsx)(Ge,{asChild:!0,children:(0,t.jsxs)("span",{className:"text-xs px-2 py-1 cursor-default text-muted-foreground",children:[r.remaining,"/",r.limit]})}),(0,t.jsx)(He,{side:"bottom",children:(0,t.jsxs)("p",{children:[r.remaining," messages remaining"]})})]}),a&&d&&(0,t.jsxs)(H,{type:"button",variant:"outline",size:"lg",onClick:d.clear,disabled:d.isLoading,children:[(0,t.jsx)(ye,{className:"h-4 w-4 mr-1"}),"New Chat"]})]}),closeButton:!1,open:o("ai-assistant"),size:"max-w-2xl!",contentClassName:"p-0 flex flex-col h-[calc(100vh-4rem)] flex-1",onOpenChange:v=>{v||i("ai-assistant")},children:a?(0,t.jsx)(Nt,{db:a,onRateLimitRefetch:n,onControllerReady:x.current},a):(0,t.jsx)("div",{className:"flex items-center justify-center h-full text-muted-foreground p-8",children:(0,t.jsxs)("div",{className:"text-center space-y-2",children:[(0,t.jsx)("p",{className:"text-lg font-medium",children:"No database selected"}),(0,t.jsx)("p",{className:"text-sm",children:"Select a database from the sidebar to start chatting."})]})})})};export{_t as ChatSidebar};