diff --git a/Makefile b/Makefile
index 5dcbac2..cc085ff 100644
--- a/Makefile
+++ b/Makefile
@@ -8,7 +8,7 @@ endif
fix:
cargo clippy --fix --allow-dirty --allow-staged && cargo +nightly fmt
-update-playground:
+update-ui:
cd clients/tabby-ui && yarn build
rm -rf crates/tabby/ui && cp -R clients/tabby-ui/out crates/tabby/ui
diff --git a/clients/tabby-ui/components/header.tsx b/clients/tabby-ui/components/header.tsx
index 800e8a8..1ca3e9c 100644
--- a/clients/tabby-ui/components/header.tsx
+++ b/clients/tabby-ui/components/header.tsx
@@ -8,7 +8,7 @@ import { IconGitHub, IconExternalLink, IconNotice } from '@/components/ui/icons'
import dynamic from 'next/dynamic'
import Link from 'next/link'
import { useHealth } from '@/lib/hooks/use-health'
-import { useLatestRelease } from '@/lib/hooks/use-latest-release'
+import { ReleaseInfo, useLatestRelease } from '@/lib/hooks/use-latest-release'
import { compare } from 'compare-versions'
const ThemeToggle = dynamic(
@@ -21,7 +21,7 @@ export function Header() {
const isChatEnabled = !!data?.chat_model;
const version = data?.version?.git_describe;
const { data: latestRelease } = useLatestRelease();
- const newVersionAvailable = version && latestRelease && compare(latestRelease.name, version, '>');
+ const newVersionAvailable = isNewVersionAvailable(version, latestRelease);
return (
@@ -42,7 +42,7 @@ export function Header() {
className={buttonVariants({ variant: 'ghost' })}
>
- New version ({latestRelease.name}) available
+ New version ({latestRelease?.name}) available
}
)
-}
\ No newline at end of file
+}
+
+function isNewVersionAvailable(version?: string, latestRelease?: ReleaseInfo) {
+ try {
+ return version && latestRelease && compare(latestRelease.name, version, '>');
+ } catch (err) {
+ // Handle invalid semver
+ console.warn(err);
+ return true;
+ }
+}
diff --git a/clients/tabby-ui/lib/hooks/use-latest-release.tsx b/clients/tabby-ui/lib/hooks/use-latest-release.tsx
index 3fbbe18..609739c 100644
--- a/clients/tabby-ui/lib/hooks/use-latest-release.tsx
+++ b/clients/tabby-ui/lib/hooks/use-latest-release.tsx
@@ -4,7 +4,7 @@
import useSWRImmutable from 'swr/immutable';
import { SWRResponse } from 'swr'
-interface ReleaseInfo {
+export interface ReleaseInfo {
name: string
}
diff --git a/crates/tabby/ui/404.html b/crates/tabby/ui/404.html
index 0f0393b..9053d77 100644
--- a/crates/tabby/ui/404.html
+++ b/crates/tabby/ui/404.html
@@ -1 +1 @@
-
404: This page could not be found. Tabby - Home
404
This page could not be found.
\ No newline at end of file
+404: This page could not be found. Tabby - Home
404
This page could not be found.
\ No newline at end of file
diff --git a/crates/tabby/ui/_next/static/Ij3G3VZs37tE5vfE2Vg4Q/_buildManifest.js b/crates/tabby/ui/_next/static/1co1mAayVp6OnfmeWVIoW/_buildManifest.js
similarity index 100%
rename from crates/tabby/ui/_next/static/Ij3G3VZs37tE5vfE2Vg4Q/_buildManifest.js
rename to crates/tabby/ui/_next/static/1co1mAayVp6OnfmeWVIoW/_buildManifest.js
diff --git a/crates/tabby/ui/_next/static/Ij3G3VZs37tE5vfE2Vg4Q/_ssgManifest.js b/crates/tabby/ui/_next/static/1co1mAayVp6OnfmeWVIoW/_ssgManifest.js
similarity index 100%
rename from crates/tabby/ui/_next/static/Ij3G3VZs37tE5vfE2Vg4Q/_ssgManifest.js
rename to crates/tabby/ui/_next/static/1co1mAayVp6OnfmeWVIoW/_ssgManifest.js
diff --git a/crates/tabby/ui/_next/static/chunks/app/layout-3e48d1573c0ecb11.js b/crates/tabby/ui/_next/static/chunks/app/layout-3e48d1573c0ecb11.js
deleted file mode 100644
index b871811..0000000
--- a/crates/tabby/ui/_next/static/chunks/app/layout-3e48d1573c0ecb11.js
+++ /dev/null
@@ -1 +0,0 @@
-(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[185],{21050:function(e,n,r){Promise.resolve().then(r.t.bind(r,58877,23)),Promise.resolve().then(r.bind(r,79446)),Promise.resolve().then(r.bind(r,78495)),Promise.resolve().then(r.t.bind(r,6928,23)),Promise.resolve().then(r.t.bind(r,33195,23)),Promise.resolve().then(r.bind(r,5925))},79446:function(e,n,r){"use strict";r.r(n),r.d(n,{Header:function(){return b}});var t=r(57437);r(2265);var s=r(39311),a=r(93023),i=r(84168),l=r(30415),o=r.n(l),d=r(61396),c=r.n(d),u=r(13287),f=r(45362),h=r(73737);let m=o()(()=>r.e(376).then(r.bind(r,15376)).then(e=>e.ThemeToggle),{loadableGenerated:{webpack:()=>[15376]},ssr:!1});function b(){var e;let{data:n}=(0,u.Q)(),r=!!(null==n?void 0:n.chat_model),l=null==n?void 0:null===(e=n.version)||void 0===e?void 0:e.git_describe,{data:o}=(0,f.Z)("https://api.github.com/repos/TabbyML/tabby/releases/latest",e=>fetch(e).then(e=>e.json())),d=l&&o&&(0,h.q)(o.name,l,">");return(0,t.jsxs)("header",{className:"sticky top-0 z-50 flex items-center justify-between w-full h-16 px-4 border-b shrink-0 bg-gradient-to-b from-background/10 via-background/50 to-background/80 backdrop-blur-xl",children:[(0,t.jsxs)("div",{className:"flex items-center",children:[(0,t.jsx)(m,{}),(0,t.jsx)(c(),{href:"/",className:(0,s.cn)((0,a.d)({variant:"link"})),children:"Home"}),r&&(0,t.jsx)(c(),{href:"/playground",className:(0,s.cn)((0,a.d)({variant:"link"})),children:"Playground"})]}),(0,t.jsxs)("div",{className:"flex items-center justify-end space-x-2",children:[d&&(0,t.jsxs)("a",{target:"_blank",href:"https://github.com/TabbyML/tabby/releases/latest",rel:"noopener noreferrer",className:(0,a.d)({variant:"ghost"}),children:[(0,t.jsx)(i.Qs,{className:"text-yellow-600 dark:text-yellow-400"}),(0,t.jsxs)("span",{className:"hidden ml-2 md:flex",children:["New version (",o.name,") available"]})]}),(0,t.jsxs)("a",{target:"_blank",href:"https://github.com/TabbyML/tabby",rel:"noopener noreferrer",className:(0,s.cn)((0,a.d)({variant:"outline"})),children:[(0,t.jsx)(i.Mr,{}),(0,t.jsx)("span",{className:"hidden ml-2 md:flex",children:"GitHub"})]}),(0,t.jsxs)("a",{target:"_blank",href:"/swagger-ui",rel:"noopener noreferrer",className:(0,s.cn)((0,a.d)({variant:"outline"})),children:[(0,t.jsx)(i.Tq,{}),(0,t.jsx)("span",{className:"hidden ml-2 md:flex",children:"OpenAPI"})]})]})]})}},78495:function(e,n,r){"use strict";r.r(n),r.d(n,{Providers:function(){return i}});var t=r(57437);r(2265);var s=r(6435),a=r(95482);function i(e){let{children:n,...r}=e;return(0,t.jsx)(s.f,{...r,children:(0,t.jsx)(a.pn,{children:n})})}},95482:function(e,n,r){"use strict";r.d(n,{_v:function(){return c},aJ:function(){return d},pn:function(){return l},u:function(){return o}});var t=r(57437),s=r(2265),a=r(43212),i=r(39311);let l=a.zt,o=a.fC,d=a.xz,c=s.forwardRef((e,n)=>{let{className:r,sideOffset:s=4,...l}=e;return(0,t.jsx)(a.VY,{ref:n,sideOffset:s,className:(0,i.cn)("z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-xs font-medium text-popover-foreground shadow-md animate-in fade-in-50 data-[side=bottom]:slide-in-from-top-1 data-[side=left]:slide-in-from-right-1 data-[side=right]:slide-in-from-left-1 data-[side=top]:slide-in-from-bottom-1",r),...l})});c.displayName=a.VY.displayName},13287:function(e,n,r){"use strict";r.d(n,{Q:function(){return s}});var t=r(45362);function s(){return(0,t.Z)("/v1/health",e=>fetch(e).then(e=>e.json()),{fallbackData:void 0})}},58877:function(){}},function(e){e.O(0,[400,406,362,563,894,971,864,744],function(){return e(e.s=21050)}),_N_E=e.O()}]);
\ No newline at end of file
diff --git a/crates/tabby/ui/_next/static/chunks/app/layout-818228cc9264ccbc.js b/crates/tabby/ui/_next/static/chunks/app/layout-818228cc9264ccbc.js
new file mode 100644
index 0000000..d322d86
--- /dev/null
+++ b/crates/tabby/ui/_next/static/chunks/app/layout-818228cc9264ccbc.js
@@ -0,0 +1 @@
+(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[185],{21050:function(e,n,r){Promise.resolve().then(r.t.bind(r,58877,23)),Promise.resolve().then(r.bind(r,79446)),Promise.resolve().then(r.bind(r,78495)),Promise.resolve().then(r.t.bind(r,6928,23)),Promise.resolve().then(r.t.bind(r,33195,23)),Promise.resolve().then(r.bind(r,5925))},79446:function(e,n,r){"use strict";r.r(n),r.d(n,{Header:function(){return b}});var t=r(57437);r(2265);var s=r(39311),a=r(93023),i=r(84168),o=r(30415),l=r.n(o),d=r(61396),c=r.n(d),u=r(13287),f=r(45362),h=r(73737);let m=l()(()=>r.e(376).then(r.bind(r,15376)).then(e=>e.ThemeToggle),{loadableGenerated:{webpack:()=>[15376]},ssr:!1});function b(){var e;let{data:n}=(0,u.Q)(),r=!!(null==n?void 0:n.chat_model),o=null==n?void 0:null===(e=n.version)||void 0===e?void 0:e.git_describe,{data:l}=(0,f.Z)("https://api.github.com/repos/TabbyML/tabby/releases/latest",e=>fetch(e).then(e=>e.json())),d=function(e,n){try{return e&&n&&(0,h.q)(n.name,e,">")}catch(e){return console.warn(e),!0}}(o,l);return(0,t.jsxs)("header",{className:"sticky top-0 z-50 flex items-center justify-between w-full h-16 px-4 border-b shrink-0 bg-gradient-to-b from-background/10 via-background/50 to-background/80 backdrop-blur-xl",children:[(0,t.jsxs)("div",{className:"flex items-center",children:[(0,t.jsx)(m,{}),(0,t.jsx)(c(),{href:"/",className:(0,s.cn)((0,a.d)({variant:"link"})),children:"Home"}),r&&(0,t.jsx)(c(),{href:"/playground",className:(0,s.cn)((0,a.d)({variant:"link"})),children:"Playground"})]}),(0,t.jsxs)("div",{className:"flex items-center justify-end space-x-2",children:[d&&(0,t.jsxs)("a",{target:"_blank",href:"https://github.com/TabbyML/tabby/releases/latest",rel:"noopener noreferrer",className:(0,a.d)({variant:"ghost"}),children:[(0,t.jsx)(i.Qs,{className:"text-yellow-600 dark:text-yellow-400"}),(0,t.jsxs)("span",{className:"hidden ml-2 md:flex",children:["New version (",null==l?void 0:l.name,") available"]})]}),(0,t.jsxs)("a",{target:"_blank",href:"https://github.com/TabbyML/tabby",rel:"noopener noreferrer",className:(0,s.cn)((0,a.d)({variant:"outline"})),children:[(0,t.jsx)(i.Mr,{}),(0,t.jsx)("span",{className:"hidden ml-2 md:flex",children:"GitHub"})]}),(0,t.jsxs)("a",{target:"_blank",href:"/swagger-ui",rel:"noopener noreferrer",className:(0,s.cn)((0,a.d)({variant:"outline"})),children:[(0,t.jsx)(i.Tq,{}),(0,t.jsx)("span",{className:"hidden ml-2 md:flex",children:"OpenAPI"})]})]})]})}},78495:function(e,n,r){"use strict";r.r(n),r.d(n,{Providers:function(){return i}});var t=r(57437);r(2265);var s=r(6435),a=r(95482);function i(e){let{children:n,...r}=e;return(0,t.jsx)(s.f,{...r,children:(0,t.jsx)(a.pn,{children:n})})}},95482:function(e,n,r){"use strict";r.d(n,{_v:function(){return c},aJ:function(){return d},pn:function(){return o},u:function(){return l}});var t=r(57437),s=r(2265),a=r(43212),i=r(39311);let o=a.zt,l=a.fC,d=a.xz,c=s.forwardRef((e,n)=>{let{className:r,sideOffset:s=4,...o}=e;return(0,t.jsx)(a.VY,{ref:n,sideOffset:s,className:(0,i.cn)("z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-xs font-medium text-popover-foreground shadow-md animate-in fade-in-50 data-[side=bottom]:slide-in-from-top-1 data-[side=left]:slide-in-from-right-1 data-[side=right]:slide-in-from-left-1 data-[side=top]:slide-in-from-bottom-1",r),...o})});c.displayName=a.VY.displayName},13287:function(e,n,r){"use strict";r.d(n,{Q:function(){return s}});var t=r(45362);function s(){return(0,t.Z)("/v1/health",e=>fetch(e).then(e=>e.json()))}},58877:function(){}},function(e){e.O(0,[400,406,362,563,894,971,864,744],function(){return e(e.s=21050)}),_N_E=e.O()}]);
\ No newline at end of file
diff --git a/crates/tabby/ui/_next/static/chunks/app/page-e7141b56a55588af.js b/crates/tabby/ui/_next/static/chunks/app/page-d253e24b5c256244.js
similarity index 96%
rename from crates/tabby/ui/_next/static/chunks/app/page-e7141b56a55588af.js
rename to crates/tabby/ui/_next/static/chunks/app/page-d253e24b5c256244.js
index 6cc5b34..a216291 100644
--- a/crates/tabby/ui/_next/static/chunks/app/page-e7141b56a55588af.js
+++ b/crates/tabby/ui/_next/static/chunks/app/page-d253e24b5c256244.js
@@ -1 +1 @@
-(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[931],{48458:function(e,t,s){Promise.resolve().then(s.bind(s,25454))},25454:function(e,t,s){"use strict";s.r(t),s.d(t,{default:function(){return y}});var a=s(57437),n=s(93023),r=s(2265),i=s(27775),l=s(39311),o=s(84168);let c=i.fC;i.xz;let d=e=>{let{className:t,children:s,...n}=e;return(0,a.jsx)(i.h_,{className:(0,l.cn)(t),...n,children:(0,a.jsx)("div",{className:"fixed inset-0 z-50 flex items-start justify-center sm:items-center",children:s})})};d.displayName=i.h_.displayName;let m=r.forwardRef((e,t)=>{let{className:s,...n}=e;return(0,a.jsx)(i.aV,{ref:t,className:(0,l.cn)("fixed inset-0 z-50 bg-background/80 backdrop-blur-sm transition-all duration-100 data-[state=closed]:animate-out data-[state=closed]:fade-out data-[state=open]:fade-in",s),...n})});m.displayName=i.aV.displayName;let u=r.forwardRef((e,t)=>{let{className:s,children:n,...r}=e;return(0,a.jsxs)(d,{children:[(0,a.jsx)(m,{}),(0,a.jsxs)(i.VY,{ref:t,className:(0,l.cn)("fixed z-50 grid w-full gap-4 rounded-b-lg border bg-background p-6 shadow-sm animate-in data-[state=open]:fade-in-90 data-[state=open]:slide-in-from-bottom-10 sm:max-w-lg sm:rounded-lg sm:zoom-in-90 data-[state=open]:sm:slide-in-from-bottom-0",s),...r,children:[n,(0,a.jsxs)(i.x8,{className:"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground",children:[(0,a.jsx)(o.bM,{}),(0,a.jsx)("span",{className:"sr-only",children:"Close"})]})]})]})});u.displayName=i.VY.displayName;let f=e=>{let{className:t,...s}=e;return(0,a.jsx)("div",{className:(0,l.cn)("flex flex-col space-y-1.5 text-center sm:text-left",t),...s})};f.displayName="DialogHeader";let h=e=>{let{className:t,...s}=e;return(0,a.jsx)("div",{className:(0,l.cn)("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",t),...s})};h.displayName="DialogFooter";let x=r.forwardRef((e,t)=>{let{className:s,...n}=e;return(0,a.jsx)(i.Dx,{ref:t,className:(0,l.cn)("text-lg font-semibold leading-none tracking-tight",s),...n})});x.displayName=i.Dx.displayName;let g=r.forwardRef((e,t)=>{let{className:s,...n}=e;return(0,a.jsx)(i.dk,{ref:t,className:(0,l.cn)("text-sm text-muted-foreground",s),...n})});g.displayName=i.dk.displayName;var b=s(16775),p=s(13287);let j="community-dialog-shown";function y(){let[e,t]=(0,r.useState)(!1);return(0,r.useEffect)(()=>{localStorage.getItem(j)||(t(!0),localStorage.setItem(j,"true"))},[]),(0,a.jsxs)("div",{className:"grow flex justify-center items-center",children:[(0,a.jsx)(w,{}),(0,a.jsx)(c,{open:e,onOpenChange:t,children:(0,a.jsxs)(u,{children:[(0,a.jsxs)(f,{className:"gap-3",children:[(0,a.jsx)(x,{children:"Join the Tabby community"}),(0,a.jsx)(g,{children:"Connect with other contributors building Tabby. Share knowledge, get help, and contribute to the open-source project."})]}),(0,a.jsx)(h,{className:"sm:justify-start",children:(0,a.jsxs)("a",{target:"_blank",href:"https://join.slack.com/t/tabbycommunity/shared_invite/zt-1xeiddizp-bciR2RtFTaJ37RBxr8VxpA",className:(0,n.d)(),children:[(0,a.jsx)(o.gx,{className:"-ml-2 h-8 w-8"}),"Join us on Slack"]})})]})})]})}function N(e){let{href:t,children:s}=e;return(0,a.jsx)("a",{target:"_blank",href:t,className:"underline",children:s})}function v(e){return encodeURIComponent(e.replaceAll("-","--"))}function w(){let{data:e}=(0,p.Q)();if(e)return(0,a.jsxs)("div",{className:"w-2/3 lg:w-1/3 flex flex-col gap-3",children:[(0,a.jsxs)("h1",{children:[(0,a.jsx)("span",{className:"font-bold",children:"Congratulations"}),", your tabby instance is running!"]}),(0,a.jsxs)("span",{className:"flex gap-1",children:[(0,a.jsx)("a",{target:"_blank",href:"https://github.com/TabbyML/tabby/releases/tag/".concat(e.version.git_describe),children:(0,a.jsx)("img",{src:"https://img.shields.io/badge/version-".concat(v(e.version.git_describe),"-green")})}),(0,a.jsx)("img",{src:"https://img.shields.io/badge/device-".concat(e.device,"-blue")}),(0,a.jsx)("img",{src:"https://img.shields.io/badge/model-".concat(v(e.model),"-red")})]}),(0,a.jsx)(b.Z,{}),(0,a.jsxs)("span",{children:["You can find our documentation ",(0,a.jsx)(N,{href:"https://tabby.tabbyml.com/docs/getting-started",children:"here"}),".",(0,a.jsxs)("ul",{className:"mt-2",children:[(0,a.jsxs)("li",{children:["\uD83D\uDCBB ",(0,a.jsx)(N,{href:"https://tabby.tabbyml.com/docs/extensions/",children:"IDE/Editor Extensions"})]}),(0,a.jsxs)("li",{children:["⚙️ ",(0,a.jsx)(N,{href:"https://tabby.tabbyml.com/docs/configuration",children:"Configuration"})]})]})]})]})}},16775:function(e,t,s){"use strict";s.d(t,{Z:function(){return l}});var a=s(57437),n=s(2265),r=s(26823),i=s(39311);let l=n.forwardRef((e,t)=>{let{className:s,orientation:n="horizontal",decorative:l=!0,...o}=e;return(0,a.jsx)(r.f,{ref:t,decorative:l,orientation:n,className:(0,i.cn)("shrink-0 bg-border","horizontal"===n?"h-[1px] w-full":"h-full w-[1px]",s),...o})});l.displayName=r.f.displayName},13287:function(e,t,s){"use strict";s.d(t,{Q:function(){return n}});var a=s(45362);function n(){return(0,a.Z)("/v1/health",e=>fetch(e).then(e=>e.json()),{fallbackData:void 0})}}},function(e){e.O(0,[400,362,703,894,971,864,744],function(){return e(e.s=48458)}),_N_E=e.O()}]);
\ No newline at end of file
+(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[931],{48458:function(e,t,s){Promise.resolve().then(s.bind(s,25454))},25454:function(e,t,s){"use strict";s.r(t),s.d(t,{default:function(){return y}});var a=s(57437),n=s(93023),r=s(2265),i=s(27775),l=s(39311),o=s(84168);let c=i.fC;i.xz;let d=e=>{let{className:t,children:s,...n}=e;return(0,a.jsx)(i.h_,{className:(0,l.cn)(t),...n,children:(0,a.jsx)("div",{className:"fixed inset-0 z-50 flex items-start justify-center sm:items-center",children:s})})};d.displayName=i.h_.displayName;let m=r.forwardRef((e,t)=>{let{className:s,...n}=e;return(0,a.jsx)(i.aV,{ref:t,className:(0,l.cn)("fixed inset-0 z-50 bg-background/80 backdrop-blur-sm transition-all duration-100 data-[state=closed]:animate-out data-[state=closed]:fade-out data-[state=open]:fade-in",s),...n})});m.displayName=i.aV.displayName;let u=r.forwardRef((e,t)=>{let{className:s,children:n,...r}=e;return(0,a.jsxs)(d,{children:[(0,a.jsx)(m,{}),(0,a.jsxs)(i.VY,{ref:t,className:(0,l.cn)("fixed z-50 grid w-full gap-4 rounded-b-lg border bg-background p-6 shadow-sm animate-in data-[state=open]:fade-in-90 data-[state=open]:slide-in-from-bottom-10 sm:max-w-lg sm:rounded-lg sm:zoom-in-90 data-[state=open]:sm:slide-in-from-bottom-0",s),...r,children:[n,(0,a.jsxs)(i.x8,{className:"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground",children:[(0,a.jsx)(o.bM,{}),(0,a.jsx)("span",{className:"sr-only",children:"Close"})]})]})]})});u.displayName=i.VY.displayName;let f=e=>{let{className:t,...s}=e;return(0,a.jsx)("div",{className:(0,l.cn)("flex flex-col space-y-1.5 text-center sm:text-left",t),...s})};f.displayName="DialogHeader";let h=e=>{let{className:t,...s}=e;return(0,a.jsx)("div",{className:(0,l.cn)("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",t),...s})};h.displayName="DialogFooter";let x=r.forwardRef((e,t)=>{let{className:s,...n}=e;return(0,a.jsx)(i.Dx,{ref:t,className:(0,l.cn)("text-lg font-semibold leading-none tracking-tight",s),...n})});x.displayName=i.Dx.displayName;let g=r.forwardRef((e,t)=>{let{className:s,...n}=e;return(0,a.jsx)(i.dk,{ref:t,className:(0,l.cn)("text-sm text-muted-foreground",s),...n})});g.displayName=i.dk.displayName;var b=s(16775),p=s(13287);let j="community-dialog-shown";function y(){let[e,t]=(0,r.useState)(!1);return(0,r.useEffect)(()=>{localStorage.getItem(j)||(t(!0),localStorage.setItem(j,"true"))},[]),(0,a.jsxs)("div",{className:"grow flex justify-center items-center",children:[(0,a.jsx)(w,{}),(0,a.jsx)(c,{open:e,onOpenChange:t,children:(0,a.jsxs)(u,{children:[(0,a.jsxs)(f,{className:"gap-3",children:[(0,a.jsx)(x,{children:"Join the Tabby community"}),(0,a.jsx)(g,{children:"Connect with other contributors building Tabby. Share knowledge, get help, and contribute to the open-source project."})]}),(0,a.jsx)(h,{className:"sm:justify-start",children:(0,a.jsxs)("a",{target:"_blank",href:"https://join.slack.com/t/tabbycommunity/shared_invite/zt-1xeiddizp-bciR2RtFTaJ37RBxr8VxpA",className:(0,n.d)(),children:[(0,a.jsx)(o.gx,{className:"-ml-2 h-8 w-8"}),"Join us on Slack"]})})]})})]})}function N(e){let{href:t,children:s}=e;return(0,a.jsx)("a",{target:"_blank",href:t,className:"underline",children:s})}function v(e){return encodeURIComponent(e.replaceAll("-","--"))}function w(){let{data:e}=(0,p.Q)();if(e)return(0,a.jsxs)("div",{className:"w-2/3 lg:w-1/3 flex flex-col gap-3",children:[(0,a.jsxs)("h1",{children:[(0,a.jsx)("span",{className:"font-bold",children:"Congratulations"}),", your tabby instance is running!"]}),(0,a.jsxs)("span",{className:"flex gap-1",children:[(0,a.jsx)("a",{target:"_blank",href:"https://github.com/TabbyML/tabby/releases/tag/".concat(e.version.git_describe),children:(0,a.jsx)("img",{src:"https://img.shields.io/badge/version-".concat(v(e.version.git_describe),"-green")})}),(0,a.jsx)("img",{src:"https://img.shields.io/badge/device-".concat(e.device,"-blue")}),(0,a.jsx)("img",{src:"https://img.shields.io/badge/model-".concat(v(e.model),"-red")})]}),(0,a.jsx)(b.Z,{}),(0,a.jsxs)("span",{children:["You can find our documentation ",(0,a.jsx)(N,{href:"https://tabby.tabbyml.com/docs/getting-started",children:"here"}),".",(0,a.jsxs)("ul",{className:"mt-2",children:[(0,a.jsxs)("li",{children:["\uD83D\uDCBB ",(0,a.jsx)(N,{href:"https://tabby.tabbyml.com/docs/extensions/",children:"IDE/Editor Extensions"})]}),(0,a.jsxs)("li",{children:["⚙️ ",(0,a.jsx)(N,{href:"https://tabby.tabbyml.com/docs/configuration",children:"Configuration"})]})]})]})]})}},16775:function(e,t,s){"use strict";s.d(t,{Z:function(){return l}});var a=s(57437),n=s(2265),r=s(26823),i=s(39311);let l=n.forwardRef((e,t)=>{let{className:s,orientation:n="horizontal",decorative:l=!0,...o}=e;return(0,a.jsx)(r.f,{ref:t,decorative:l,orientation:n,className:(0,i.cn)("shrink-0 bg-border","horizontal"===n?"h-[1px] w-full":"h-full w-[1px]",s),...o})});l.displayName=r.f.displayName},13287:function(e,t,s){"use strict";s.d(t,{Q:function(){return n}});var a=s(45362);function n(){return(0,a.Z)("/v1/health",e=>fetch(e).then(e=>e.json()))}}},function(e){e.O(0,[400,362,703,894,971,864,744],function(){return e(e.s=48458)}),_N_E=e.O()}]);
\ No newline at end of file
diff --git a/crates/tabby/ui/index.html b/crates/tabby/ui/index.html
index a32497f..d694792 100644
--- a/crates/tabby/ui/index.html
+++ b/crates/tabby/ui/index.html
@@ -1 +1 @@
-Tabby - Home
\ No newline at end of file
+Tabby - Home
\ No newline at end of file
diff --git a/crates/tabby/ui/index.txt b/crates/tabby/ui/index.txt
index e494651..ef459d5 100644
--- a/crates/tabby/ui/index.txt
+++ b/crates/tabby/ui/index.txt
@@ -1,14 +1,14 @@
1:HL["/_next/static/media/86fdec36ddd9097e-s.p.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
2:HL["/_next/static/media/c9a5bc6a7c948fb0-s.p.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
3:HL["/_next/static/css/ea73550058928240.css","style"]
-0:["Ij3G3VZs37tE5vfE2Vg4Q",[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],"$L4",[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/ea73550058928240.css","precedence":"next"}]],"$L5"]]]]
-6:I{"id":5925,"chunks":["400:static/chunks/400-bab9e88e0219f9f5.js","406:static/chunks/406-35481e1b86c5b377.js","362:static/chunks/362-ae0994d279f3f3bb.js","563:static/chunks/563-52218f82bb9eb225.js","894:static/chunks/894-06b613a845aedd59.js","185:static/chunks/app/layout-3e48d1573c0ecb11.js"],"name":"Toaster","async":false}
-7:I{"id":78495,"chunks":["400:static/chunks/400-bab9e88e0219f9f5.js","406:static/chunks/406-35481e1b86c5b377.js","362:static/chunks/362-ae0994d279f3f3bb.js","563:static/chunks/563-52218f82bb9eb225.js","894:static/chunks/894-06b613a845aedd59.js","185:static/chunks/app/layout-3e48d1573c0ecb11.js"],"name":"Providers","async":false}
-8:I{"id":79446,"chunks":["400:static/chunks/400-bab9e88e0219f9f5.js","406:static/chunks/406-35481e1b86c5b377.js","362:static/chunks/362-ae0994d279f3f3bb.js","563:static/chunks/563-52218f82bb9eb225.js","894:static/chunks/894-06b613a845aedd59.js","185:static/chunks/app/layout-3e48d1573c0ecb11.js"],"name":"Header","async":false}
+0:["1co1mAayVp6OnfmeWVIoW",[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],"$L4",[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/ea73550058928240.css","precedence":"next"}]],"$L5"]]]]
+6:I{"id":5925,"chunks":["400:static/chunks/400-bab9e88e0219f9f5.js","406:static/chunks/406-35481e1b86c5b377.js","362:static/chunks/362-ae0994d279f3f3bb.js","563:static/chunks/563-52218f82bb9eb225.js","894:static/chunks/894-06b613a845aedd59.js","185:static/chunks/app/layout-818228cc9264ccbc.js"],"name":"Toaster","async":false}
+7:I{"id":78495,"chunks":["400:static/chunks/400-bab9e88e0219f9f5.js","406:static/chunks/406-35481e1b86c5b377.js","362:static/chunks/362-ae0994d279f3f3bb.js","563:static/chunks/563-52218f82bb9eb225.js","894:static/chunks/894-06b613a845aedd59.js","185:static/chunks/app/layout-818228cc9264ccbc.js"],"name":"Providers","async":false}
+8:I{"id":79446,"chunks":["400:static/chunks/400-bab9e88e0219f9f5.js","406:static/chunks/406-35481e1b86c5b377.js","362:static/chunks/362-ae0994d279f3f3bb.js","563:static/chunks/563-52218f82bb9eb225.js","894:static/chunks/894-06b613a845aedd59.js","185:static/chunks/app/layout-818228cc9264ccbc.js"],"name":"Header","async":false}
9:I{"id":81443,"chunks":["272:static/chunks/webpack-8526d963d32b72d9.js","971:static/chunks/fd9d1056-5dfc77aa37d8c76f.js","864:static/chunks/864-bf315a5307aba1d7.js"],"name":"","async":false}
a:I{"id":18639,"chunks":["272:static/chunks/webpack-8526d963d32b72d9.js","971:static/chunks/fd9d1056-5dfc77aa37d8c76f.js","864:static/chunks/864-bf315a5307aba1d7.js"],"name":"","async":false}
c:I{"id":65146,"chunks":["272:static/chunks/webpack-8526d963d32b72d9.js","971:static/chunks/fd9d1056-5dfc77aa37d8c76f.js","864:static/chunks/864-bf315a5307aba1d7.js"],"name":"","async":false}
-d:I{"id":25454,"chunks":["400:static/chunks/400-bab9e88e0219f9f5.js","362:static/chunks/362-ae0994d279f3f3bb.js","703:static/chunks/703-35aa8c1eaf8df6ef.js","894:static/chunks/894-06b613a845aedd59.js","931:static/chunks/app/page-e7141b56a55588af.js"],"name":"","async":false}
+d:I{"id":25454,"chunks":["400:static/chunks/400-bab9e88e0219f9f5.js","362:static/chunks/362-ae0994d279f3f3bb.js","703:static/chunks/703-35aa8c1eaf8df6ef.js","894:static/chunks/894-06b613a845aedd59.js","931:static/chunks/app/page-d253e24b5c256244.js"],"name":"","async":false}
4:[null,["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":[["$","head",null,{}],["$","body",null,{"className":"font-sans antialiased __variable_e66fe9 __variable_bd9c35","children":[["$","$L6",null,{}],["$","$L7",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"children":[["$","div",null,{"className":"flex flex-col min-h-screen","children":[["$","$L8",null,{}],["$","main",null,{"className":"flex flex-col flex-1 bg-muted/50","children":["$","$L9",null,{"parallelRouterKey":"children","segmentPath":["children"],"loading":"$undefined","loadingStyles":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","template":["$","$La",null,{}],"templateStyles":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[],"childProp":{"current":["$Lb",["$","$Lc",null,{"propsForComponent":{"params":{}},"Component":"$d"}],null],"segment":"__PAGE__"},"styles":[]}]}]]}],null]}]]}]]}],null]
5:[["$","meta","0",{"charSet":"utf-8"}],["$","title","1",{"children":"Tabby - Home"}],["$","meta","2",{"name":"description","content":"Tabby, an opensource, self-hosted AI coding assistant."}],["$","meta","3",{"name":"theme-color","media":"(prefers-color-scheme: light)","content":"white"}],["$","meta","4",{"name":"theme-color","media":"(prefers-color-scheme: dark)","content":"black"}],["$","meta","5",{"name":"viewport","content":"width=device-width, initial-scale=1"}],["$","meta","6",{"name":"next-size-adjust"}]]
b:null
diff --git a/crates/tabby/ui/playground.html b/crates/tabby/ui/playground.html
index c2d0e21..0b812b8 100644
--- a/crates/tabby/ui/playground.html
+++ b/crates/tabby/ui/playground.html
@@ -1 +1 @@
-Tabby - Playground
Welcome to Playground! You can start a conversation here or try the following examples:
Convert list of string to numbers How to parse email addressScroll to bottom
Tabby , an opensource, self-hosted AI coding assistant .
\ No newline at end of file
+Tabby - Playground
Welcome to Playground! You can start a conversation here or try the following examples:
Convert list of string to numbers How to parse email addressScroll to bottom
Tabby , an opensource, self-hosted AI coding assistant .
\ No newline at end of file
diff --git a/crates/tabby/ui/playground.txt b/crates/tabby/ui/playground.txt
index e483da3..e6dceb4 100644
--- a/crates/tabby/ui/playground.txt
+++ b/crates/tabby/ui/playground.txt
@@ -1,13 +1,13 @@
1:HL["/_next/static/media/86fdec36ddd9097e-s.p.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
2:HL["/_next/static/media/c9a5bc6a7c948fb0-s.p.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
3:HL["/_next/static/css/ea73550058928240.css","style"]
-0:["Ij3G3VZs37tE5vfE2Vg4Q",[[["",{"children":["playground",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],"$L4",[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/ea73550058928240.css","precedence":"next"}]],"$L5"]]]]
-6:I{"id":5925,"chunks":["400:static/chunks/400-bab9e88e0219f9f5.js","406:static/chunks/406-35481e1b86c5b377.js","362:static/chunks/362-ae0994d279f3f3bb.js","563:static/chunks/563-52218f82bb9eb225.js","894:static/chunks/894-06b613a845aedd59.js","185:static/chunks/app/layout-3e48d1573c0ecb11.js"],"name":"Toaster","async":false}
-7:I{"id":78495,"chunks":["400:static/chunks/400-bab9e88e0219f9f5.js","406:static/chunks/406-35481e1b86c5b377.js","362:static/chunks/362-ae0994d279f3f3bb.js","563:static/chunks/563-52218f82bb9eb225.js","894:static/chunks/894-06b613a845aedd59.js","185:static/chunks/app/layout-3e48d1573c0ecb11.js"],"name":"Providers","async":false}
-8:I{"id":79446,"chunks":["400:static/chunks/400-bab9e88e0219f9f5.js","406:static/chunks/406-35481e1b86c5b377.js","362:static/chunks/362-ae0994d279f3f3bb.js","563:static/chunks/563-52218f82bb9eb225.js","894:static/chunks/894-06b613a845aedd59.js","185:static/chunks/app/layout-3e48d1573c0ecb11.js"],"name":"Header","async":false}
+0:["1co1mAayVp6OnfmeWVIoW",[[["",{"children":["playground",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],"$L4",[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/ea73550058928240.css","precedence":"next"}]],"$L5"]]]]
+6:I{"id":5925,"chunks":["400:static/chunks/400-bab9e88e0219f9f5.js","406:static/chunks/406-35481e1b86c5b377.js","362:static/chunks/362-ae0994d279f3f3bb.js","563:static/chunks/563-52218f82bb9eb225.js","894:static/chunks/894-06b613a845aedd59.js","185:static/chunks/app/layout-818228cc9264ccbc.js"],"name":"Toaster","async":false}
+7:I{"id":78495,"chunks":["400:static/chunks/400-bab9e88e0219f9f5.js","406:static/chunks/406-35481e1b86c5b377.js","362:static/chunks/362-ae0994d279f3f3bb.js","563:static/chunks/563-52218f82bb9eb225.js","894:static/chunks/894-06b613a845aedd59.js","185:static/chunks/app/layout-818228cc9264ccbc.js"],"name":"Providers","async":false}
+8:I{"id":79446,"chunks":["400:static/chunks/400-bab9e88e0219f9f5.js","406:static/chunks/406-35481e1b86c5b377.js","362:static/chunks/362-ae0994d279f3f3bb.js","563:static/chunks/563-52218f82bb9eb225.js","894:static/chunks/894-06b613a845aedd59.js","185:static/chunks/app/layout-818228cc9264ccbc.js"],"name":"Header","async":false}
9:I{"id":81443,"chunks":["272:static/chunks/webpack-8526d963d32b72d9.js","971:static/chunks/fd9d1056-5dfc77aa37d8c76f.js","864:static/chunks/864-bf315a5307aba1d7.js"],"name":"","async":false}
a:I{"id":18639,"chunks":["272:static/chunks/webpack-8526d963d32b72d9.js","971:static/chunks/fd9d1056-5dfc77aa37d8c76f.js","864:static/chunks/864-bf315a5307aba1d7.js"],"name":"","async":false}
c:I{"id":12202,"chunks":["400:static/chunks/400-bab9e88e0219f9f5.js","406:static/chunks/406-35481e1b86c5b377.js","28:static/chunks/28-27d0fe8a88c4cbfb.js","894:static/chunks/894-06b613a845aedd59.js","383:static/chunks/app/playground/page-e2c85638af29803a.js"],"name":"Chat","async":false}
5:[["$","meta","0",{"charSet":"utf-8"}],["$","title","1",{"children":"Tabby - Playground"}],["$","meta","2",{"name":"description","content":"Tabby, an opensource, self-hosted AI coding assistant."}],["$","meta","3",{"name":"theme-color","media":"(prefers-color-scheme: light)","content":"white"}],["$","meta","4",{"name":"theme-color","media":"(prefers-color-scheme: dark)","content":"black"}],["$","meta","5",{"name":"viewport","content":"width=device-width, initial-scale=1"}],["$","meta","6",{"name":"next-size-adjust"}]]
-4:[null,["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":[["$","head",null,{}],["$","body",null,{"className":"font-sans antialiased __variable_e66fe9 __variable_bd9c35","children":[["$","$L6",null,{}],["$","$L7",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"children":[["$","div",null,{"className":"flex flex-col min-h-screen","children":[["$","$L8",null,{}],["$","main",null,{"className":"flex flex-col flex-1 bg-muted/50","children":["$","$L9",null,{"parallelRouterKey":"children","segmentPath":["children"],"loading":"$undefined","loadingStyles":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","template":["$","$La",null,{}],"templateStyles":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[],"childProp":{"current":["$","$L9",null,{"parallelRouterKey":"children","segmentPath":["children","playground","children"],"loading":"$undefined","loadingStyles":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","template":["$","$La",null,{}],"templateStyles":"$undefined","notFound":"$undefined","notFoundStyles":"$undefined","childProp":{"current":["$Lb",["$","$Lc",null,{"id":"hiHurcM"}],null],"segment":"__PAGE__"},"styles":[]}],"segment":"playground"},"styles":[]}]}]]}],null]}]]}]]}],null]
+4:[null,["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":[["$","head",null,{}],["$","body",null,{"className":"font-sans antialiased __variable_e66fe9 __variable_bd9c35","children":[["$","$L6",null,{}],["$","$L7",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"children":[["$","div",null,{"className":"flex flex-col min-h-screen","children":[["$","$L8",null,{}],["$","main",null,{"className":"flex flex-col flex-1 bg-muted/50","children":["$","$L9",null,{"parallelRouterKey":"children","segmentPath":["children"],"loading":"$undefined","loadingStyles":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","template":["$","$La",null,{}],"templateStyles":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[],"childProp":{"current":["$","$L9",null,{"parallelRouterKey":"children","segmentPath":["children","playground","children"],"loading":"$undefined","loadingStyles":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","template":["$","$La",null,{}],"templateStyles":"$undefined","notFound":"$undefined","notFoundStyles":"$undefined","childProp":{"current":["$Lb",["$","$Lc",null,{"id":"BfLH7Lw"}],null],"segment":"__PAGE__"},"styles":[]}],"segment":"playground"},"styles":[]}]}]]}],null]}]]}]]}],null]
b:null