feat(ui): add dashboard (#674)

* feat(ui): add dashboard

* handle path
release-notes-05
Meng Zhang 2023-10-30 00:29:50 -07:00 committed by GitHub
parent 89a63dbf33
commit b4772fbcd0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
46 changed files with 567 additions and 198 deletions

View File

@ -144,10 +144,6 @@ pub async fn main(config: &Config, args: &ServeArgs) {
let app = Router::new()
.route("/", routing::get(ui::handler))
.route("/index.txt", routing::get(ui::handler))
.route("/api", routing::get(ui::handler))
.route("/api.txt", routing::get(ui::handler))
.route("/_next/*path", routing::get(ui::handler))
.merge(api_router(args, config))
.merge(SwaggerUi::new("/swagger-ui").url("/api-docs/openapi.json", doc))
.fallback(ui::handler);

View File

@ -41,6 +41,10 @@ pub async fn handler(uri: Uri) -> impl IntoResponse {
path = "index.html".to_owned()
} else if path == "playground" {
path = "playground.html".to_owned();
} else if path == "dashboard/home" {
path = "dashboard/home.html".to_owned();
} else if path == "dashboard/runners" {
path = "dashboard/runners.html".to_owned();
}
WebStaticFile(path)
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[663],{7404:function(e,n,t){"use strict";t.d(n,{j:function(){return s}});let r=e=>"boolean"==typeof e?"".concat(e):0===e?"0":e,l=function(){for(var e=arguments.length,n=Array(e),t=0;t<e;t++)n[t]=arguments[t];return n.flat(1/0).filter(Boolean).join(" ")},s=(e,n)=>t=>{var s;if((null==n?void 0:n.variants)==null)return l(e,null==t?void 0:t.class,null==t?void 0:t.className);let{variants:i,defaultVariants:a}=n,o=Object.keys(i).map(e=>{let n=null==t?void 0:t[e],l=null==a?void 0:a[e];if(null===n)return null;let s=r(n)||r(l);return i[e][s]}),c=t&&Object.entries(t).reduce((e,n)=>{let[t,r]=n;return void 0===r||(e[t]=r),e},{}),d=null==n?void 0:null===(s=n.compoundVariants)||void 0===s?void 0:s.reduce((e,n)=>{let{class:t,className:r,...l}=n;return Object.entries(l).every(e=>{let[n,t]=e;return Array.isArray(t)?t.includes({...a,...c}[n]):({...a,...c})[n]===t})?[...e,t,r]:e},[]);return l(e,o,d,null==t?void 0:t.class,null==t?void 0:t.className)}},96360:function(e,n,t){Promise.resolve().then(t.bind(t,79744))},79744:function(e,n,t){"use strict";t.r(n),t.d(n,{default:function(){return c}});var r=t(57437),l=t(39311),s=t(7404),i=t(61396),a=t.n(i),o=t(24033);function c(e){let{children:n,className:t}=e;return(0,r.jsxs)("div",{className:(0,l.cn)("grid overflow-hidden lg:grid-cols-[280px_1fr]",t),children:[(0,r.jsx)("div",{className:"hidden border-r bg-zinc-100/40 dark:bg-zinc-800/40 lg:block",children:(0,r.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,r.jsx)("div",{className:"h-[12px]"}),(0,r.jsx)("div",{className:"flex-1",children:(0,r.jsxs)("nav",{className:"grid items-start gap-4 px-4 text-sm font-medium",children:[(0,r.jsxs)(u,{href:"/dashboard/home",children:[(0,r.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg",className:" h-4 w-4",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,r.jsx)("path",{d:"m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"}),(0,r.jsx)("polyline",{points:"9 22 9 12 15 12 15 22"})]}),"Home"]}),(0,r.jsxs)(u,{href:"/dashboard/runners",children:[(0,r.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg",className:" h-4 w-4",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,r.jsx)("path",{d:"m12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83Z"}),(0,r.jsx)("path",{d:"m6.08 9.5-3.5 1.6a1 1 0 0 0 0 1.81l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9a1 1 0 0 0 0-1.83l-3.5-1.59"}),(0,r.jsx)("path",{d:"m6.08 14.5-3.5 1.6a1 1 0 0 0 0 1.81l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9a1 1 0 0 0 0-1.83l-3.5-1.59"})]}),"Runners"]})]})})]})}),(0,r.jsx)("div",{className:"flex flex-1 flex-col overflow-auto p-4 lg:p-16",children:n})]})}let d=(0,s.j)("flex items-center gap-3 rounded-lg px-3 py-2 text-zinc-900 transition-all hover:text-zinc-900 dark:text-zinc-50 dark:hover:text-zinc-50",{variants:{state:{selected:"bg-zinc-200 dark:bg-zinc-800","not-selected":""}},defaultVariants:{state:"not-selected"}});function u(e){let{href:n,children:t}=e,l=(0,o.usePathname)();return(0,r.jsx)(a(),{className:d({state:l==n?"selected":"not-selected"}),href:n,children:t})}},39311:function(e,n,t){"use strict";t.d(n,{cn:function(){return i}});var r=t(50348),l=t(28481),s=t(23986);function i(){for(var e=arguments.length,n=Array(e),t=0;t<e;t++)n[t]=arguments[t];return(0,s.m)((0,r.W)(n))}(0,l.kP)("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",7)},67650:function(e,n,t){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),Object.defineProperty(n,"RouterContext",{enumerable:!0,get:function(){return s}});let r=t(21024),l=r._(t(2265)),s=l.default.createContext(null)},24033:function(e,n,t){e.exports=t(20290)}},function(e){e.O(0,[195,396,971,864,744],function(){return e(e.s=96360)}),_N_E=e.O()}]);

View File

@ -0,0 +1 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[454],{93924:function(e,t,s){Promise.resolve().then(s.bind(s,93203))},93203:function(e,t,s){"use strict";s.r(t),s.d(t,{default:function(){return f}});var r=s(57437),a=s(94190),n=s(2265),l=s(39311);let d=n.forwardRef((e,t)=>{let{className:s,...a}=e;return(0,r.jsx)("div",{ref:t,className:(0,l.cn)("rounded-lg border bg-card text-card-foreground shadow-sm",s),...a})});d.displayName="Card";let i=n.forwardRef((e,t)=>{let{className:s,...a}=e;return(0,r.jsx)("div",{ref:t,className:(0,l.cn)("flex flex-col space-y-1.5 p-6",s),...a})});i.displayName="CardHeader";let o=n.forwardRef((e,t)=>{let{className:s,...a}=e;return(0,r.jsx)("h3",{ref:t,className:(0,l.cn)("text-2xl font-semibold leading-none tracking-tight",s),...a})});o.displayName="CardTitle";let h=n.forwardRef((e,t)=>{let{className:s,...a}=e;return(0,r.jsx)("p",{ref:t,className:(0,l.cn)("text-sm text-muted-foreground",s),...a})});h.displayName="CardDescription";let c=n.forwardRef((e,t)=>{let{className:s,...a}=e;return(0,r.jsx)("div",{ref:t,className:(0,l.cn)("p-6 pt-0",s),...a})});c.displayName="CardContent";let x=n.forwardRef((e,t)=>{let{className:s,...a}=e;return(0,r.jsx)("div",{ref:t,className:(0,l.cn)("flex items-center p-6 pt-0",s),...a})});function p(e){let{title:t,health:s}=e;return(0,r.jsxs)(d,{className:"rounded-xl shadow-md",children:[(0,r.jsx)(i,{className:"p-0 px-4 pb-2 pt-4",children:(0,r.jsx)(o,{className:"text-md font-semibold",children:t})}),(0,r.jsxs)(c,{className:"flex flex-col gap-2 p-0 px-4 pb-4 pt-2",children:[(0,r.jsxs)(u,{children:[(0,r.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg",className:" h-5 w-5 text-gray-400",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,r.jsx)("path",{d:"M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z"}),(0,r.jsx)("polyline",{points:"14 2 14 8 20 8"}),(0,r.jsx)("path",{d:"m10 13-2 2 2 2"}),(0,r.jsx)("path",{d:"m14 17 2-2-2-2"})]}),(0,r.jsx)("p",{className:"ml-2",children:s.model})]}),s.chat_model&&(0,r.jsxs)(u,{children:[(0,r.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg",className:" h-5 w-5 text-gray-400",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,r.jsx)("path",{d:"M14 9a2 2 0 0 1-2 2H6l-4 4V4c0-1.1.9-2 2-2h8a2 2 0 0 1 2 2v5Z"}),(0,r.jsx)("path",{d:"M18 9h2a2 2 0 0 1 2 2v11l-4-4h-6a2 2 0 0 1-2-2v-1"})]}),(0,r.jsx)("p",{className:"ml-2",children:s.chat_model})]}),(0,r.jsxs)(u,{children:[(0,r.jsxs)("svg",{className:" h-5 w-5 text-gray-400",fill:"none",height:"24",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:"2",viewBox:"0 0 24 24",width:"24",xmlns:"http://www.w3.org/2000/svg",children:[(0,r.jsx)("rect",{height:"16",rx:"2",width:"16",x:"4",y:"4"}),(0,r.jsx)("rect",{height:"6",width:"6",x:"9",y:"9"}),(0,r.jsx)("path",{d:"M15 2v2"}),(0,r.jsx)("path",{d:"M15 20v2"}),(0,r.jsx)("path",{d:"M2 15h2"}),(0,r.jsx)("path",{d:"M2 9h2"}),(0,r.jsx)("path",{d:"M20 15h2"}),(0,r.jsx)("path",{d:"M20 9h2"}),(0,r.jsx)("path",{d:"M9 2v2"}),(0,r.jsx)("path",{d:"M9 20v2"})]}),(0,r.jsxs)("p",{className:"ml-2",children:[s.cpu_info," (",s.cpu_count," cores)"]})]}),s.cuda_devices.map((e,t)=>(0,r.jsxs)(u,{children:[(0,r.jsxs)("svg",{className:" h-5 w-5 text-gray-400",fill:"none",height:"24",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:"2",viewBox:"0 0 24 24",width:"24",xmlns:"http://www.w3.org/2000/svg",children:[(0,r.jsx)("path",{d:"M6 19v-3"}),(0,r.jsx)("path",{d:"M10 19v-3"}),(0,r.jsx)("path",{d:"M14 19v-3"}),(0,r.jsx)("path",{d:"M18 19v-3"}),(0,r.jsx)("path",{d:"M8 11V9"}),(0,r.jsx)("path",{d:"M16 11V9"}),(0,r.jsx)("path",{d:"M12 11V9"}),(0,r.jsx)("path",{d:"M2 15h20"}),(0,r.jsx)("path",{d:"M2 7a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v1.1a2 2 0 0 0 0 3.837V17a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2v-5.1a2 2 0 0 0 0-3.837Z"})]}),(0,r.jsx)("p",{className:"ml-2",children:e})]},t))]})]})}function u(e){let{children:t}=e;return(0,r.jsx)("div",{className:"mt-2 flex items-center text-sm text-gray-500",children:t})}function f(){let{data:e}=(0,a.Q)();if(e)return(0,r.jsx)("div",{className:"flex h-full w-full items-start justify-start",children:(0,r.jsx)(p,{title:"Local Runner",health:e})})}x.displayName="CardFooter"},94190:function(e,t,s){"use strict";s.d(t,{Q:function(){return n}});var r=s(45362);function a(e){return fetch(e).then(e=>e.json())}function n(){return(0,r.Z)("/v1/health",a)}},39311:function(e,t,s){"use strict";s.d(t,{cn:function(){return l}});var r=s(50348),a=s(28481),n=s(23986);function l(){for(var e=arguments.length,t=Array(e),s=0;s<e;s++)t[s]=arguments[s];return(0,n.m)((0,r.W)(t))}(0,a.kP)("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",7)}},function(e){e.O(0,[195,362,971,864,744],function(){return e(e.s=93924)}),_N_E=e.O()}]);

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[185],{25330: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),i=r(93023),a=r(84168),o=r(30415),l=r.n(o),d=r(61396),c=r.n(d),u=r(94190),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 h-16 w-full shrink-0 items-center justify-between border-b bg-gradient-to-b from-background/10 via-background/50 to-background/80 px-4 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,i.d)({variant:"link"})),children:"Home"}),(0,t.jsx)(c(),{href:"/api",className:(0,s.cn)((0,i.d)({variant:"link"})),children:"API"}),r&&(0,t.jsx)(c(),{href:"/playground",className:(0,s.cn)((0,i.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,i.d)({variant:"ghost"}),children:[(0,t.jsx)(a.Qs,{className:"text-yellow-600 dark:text-yellow-400"}),(0,t.jsxs)("span",{className:"ml-2 hidden 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,i.d)({variant:"outline"})),children:[(0,t.jsx)(a.Mr,{}),(0,t.jsx)("span",{className:"ml-2 hidden md:flex",children:"GitHub"})]})]})]})}},78495:function(e,n,r){"use strict";r.r(n),r.d(n,{Providers:function(){return a}});var t=r(57437);r(2265);var s=r(6435),i=r(95482);function a(e){let{children:n,...r}=e;return(0,t.jsx)(s.f,{...r,children:(0,t.jsx)(i.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),i=r(43212),a=r(39311);let o=i.zt,l=i.fC,d=i.xz,c=s.forwardRef((e,n)=>{let{className:r,sideOffset:s=4,...o}=e;return(0,t.jsx)(i.VY,{ref:n,sideOffset:s,className:(0,a.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=i.VY.displayName},94190:function(e,n,r){"use strict";r.d(n,{Q:function(){return i}});var t=r(45362);function s(e){return fetch(e).then(e=>e.json())}function i(){return(0,t.Z)("/v1/health",s)}},58877:function(){}},function(e){e.O(0,[400,406,362,563,894,971,864,744],function(){return e(e.s=25330)}),_N_E=e.O()}]);

View File

@ -0,0 +1 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[931],{69563:function(e,n,t){Promise.resolve().then(t.t.bind(t,63388,23))},63388:function(e,n,t){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),function(e,n){for(var t in n)Object.defineProperty(e,t,{enumerable:!0,get:n[t]})}(n,{suspense:function(){return u},NoSSR:function(){return o}}),t(21024),t(2265);let r=t(54922);function u(){let e=Error(r.NEXT_DYNAMIC_NO_SSR_CODE);throw e.digest=r.NEXT_DYNAMIC_NO_SSR_CODE,e}function o(e){let{children:n}=e;return n}}},function(e){e.O(0,[971,864,744],function(){return e(e.s=69563)}),_N_E=e.O()}]);

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
!function(){"use strict";var t,e,n,r,o,u,i,c,f,a={},l={};function s(t){var e=l[t];if(void 0!==e)return e.exports;var n=l[t]={exports:{}},r=!0;try{a[t](n,n.exports,s),r=!1}finally{r&&delete l[t]}return n.exports}s.m=a,t=[],s.O=function(e,n,r,o){if(n){o=o||0;for(var u=t.length;u>0&&t[u-1][2]>o;u--)t[u]=t[u-1];t[u]=[n,r,o];return}for(var i=1/0,u=0;u<t.length;u++){for(var n=t[u][0],r=t[u][1],o=t[u][2],c=!0,f=0;f<n.length;f++)i>=o&&Object.keys(s.O).every(function(t){return s.O[t](n[f])})?n.splice(f--,1):(c=!1,o<i&&(i=o));if(c){t.splice(u--,1);var a=r()}}return a},s.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return s.d(e,{a:e}),e},n=Object.getPrototypeOf?function(t){return Object.getPrototypeOf(t)}:function(t){return t.__proto__},s.t=function(t,r){if(1&r&&(t=this(t)),8&r||"object"==typeof t&&t&&(4&r&&t.__esModule||16&r&&"function"==typeof t.then))return t;var o=Object.create(null);s.r(o);var u={};e=e||[null,n({}),n([]),n(n)];for(var i=2&r&&t;"object"==typeof i&&!~e.indexOf(i);i=n(i))Object.getOwnPropertyNames(i).forEach(function(e){u[e]=function(){return t[e]}});return u.default=function(){return t},s.d(o,u),o},s.d=function(t,e){for(var n in e)s.o(e,n)&&!s.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},s.f={},s.e=function(t){return Promise.all(Object.keys(s.f).reduce(function(e,n){return s.f[n](t,e),e},[]))},s.u=function(t){return"static/chunks/"+t+".2b6536d53b303d15.js"},s.miniCssF=function(t){return"static/css/2b051a9b83c80bf9.css"},s.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||Function("return this")()}catch(t){if("object"==typeof window)return window}}(),s.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r={},o="_N_E:",s.l=function(t,e,n,u){if(r[t]){r[t].push(e);return}if(void 0!==n)for(var i,c,f=document.getElementsByTagName("script"),a=0;a<f.length;a++){var l=f[a];if(l.getAttribute("src")==t||l.getAttribute("data-webpack")==o+n){i=l;break}}i||(c=!0,(i=document.createElement("script")).charset="utf-8",i.timeout=120,s.nc&&i.setAttribute("nonce",s.nc),i.setAttribute("data-webpack",o+n),i.src=s.tu(t)),r[t]=[e];var d=function(e,n){i.onerror=i.onload=null,clearTimeout(p);var o=r[t];if(delete r[t],i.parentNode&&i.parentNode.removeChild(i),o&&o.forEach(function(t){return t(n)}),e)return e(n)},p=setTimeout(d.bind(null,void 0,{type:"timeout",target:i}),12e4);i.onerror=d.bind(null,i.onerror),i.onload=d.bind(null,i.onload),c&&document.head.appendChild(i)},s.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},s.tt=function(){return void 0===u&&(u={createScriptURL:function(t){return t}},"undefined"!=typeof trustedTypes&&trustedTypes.createPolicy&&(u=trustedTypes.createPolicy("nextjs#bundler",u))),u},s.tu=function(t){return s.tt().createScriptURL(t)},s.p="/_next/",i={272:0},s.f.j=function(t,e){var n=s.o(i,t)?i[t]:void 0;if(0!==n){if(n)e.push(n[2]);else if(272!=t){var r=new Promise(function(e,r){n=i[t]=[e,r]});e.push(n[2]=r);var o=s.p+s.u(t),u=Error();s.l(o,function(e){if(s.o(i,t)&&(0!==(n=i[t])&&(i[t]=void 0),n)){var r=e&&("load"===e.type?"missing":e.type),o=e&&e.target&&e.target.src;u.message="Loading chunk "+t+" failed.\n("+r+": "+o+")",u.name="ChunkLoadError",u.type=r,u.request=o,n[1](u)}},"chunk-"+t,t)}else i[t]=0}},s.O.j=function(t){return 0===i[t]},c=function(t,e){var n,r,o=e[0],u=e[1],c=e[2],f=0;if(o.some(function(t){return 0!==i[t]})){for(n in u)s.o(u,n)&&(s.m[n]=u[n]);if(c)var a=c(s)}for(t&&t(e);f<o.length;f++)r=o[f],s.o(i,r)&&i[r]&&i[r][0](),i[r]=0;return s.O(a)},(f=self.webpackChunk_N_E=self.webpackChunk_N_E||[]).forEach(c.bind(null,0)),f.push=c.bind(null,f.push.bind(f)),s.nc=void 0}();

View File

@ -0,0 +1 @@
!function(){"use strict";var e,t,n,r,o,u,i,c,f,a={},l={};function s(e){var t=l[e];if(void 0!==t)return t.exports;var n=l[e]={exports:{}},r=!0;try{a[e](n,n.exports,s),r=!1}finally{r&&delete l[e]}return n.exports}s.m=a,e=[],s.O=function(t,n,r,o){if(n){o=o||0;for(var u=e.length;u>0&&e[u-1][2]>o;u--)e[u]=e[u-1];e[u]=[n,r,o];return}for(var i=1/0,u=0;u<e.length;u++){for(var n=e[u][0],r=e[u][1],o=e[u][2],c=!0,f=0;f<n.length;f++)i>=o&&Object.keys(s.O).every(function(e){return s.O[e](n[f])})?n.splice(f--,1):(c=!1,o<i&&(i=o));if(c){e.splice(u--,1);var a=r()}}return a},s.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return s.d(t,{a:t}),t},n=Object.getPrototypeOf?function(e){return Object.getPrototypeOf(e)}:function(e){return e.__proto__},s.t=function(e,r){if(1&r&&(e=this(e)),8&r||"object"==typeof e&&e&&(4&r&&e.__esModule||16&r&&"function"==typeof e.then))return e;var o=Object.create(null);s.r(o);var u={};t=t||[null,n({}),n([]),n(n)];for(var i=2&r&&e;"object"==typeof i&&!~t.indexOf(i);i=n(i))Object.getOwnPropertyNames(i).forEach(function(t){u[t]=function(){return e[t]}});return u.default=function(){return e},s.d(o,u),o},s.d=function(e,t){for(var n in t)s.o(t,n)&&!s.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},s.f={},s.e=function(e){return Promise.all(Object.keys(s.f).reduce(function(t,n){return s.f[n](e,t),t},[]))},s.u=function(e){return"static/chunks/"+e+".2b6536d53b303d15.js"},s.miniCssF=function(e){return"static/css/ec1d302aa85c53c3.css"},s.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||Function("return this")()}catch(e){if("object"==typeof window)return window}}(),s.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r={},o="_N_E:",s.l=function(e,t,n,u){if(r[e]){r[e].push(t);return}if(void 0!==n)for(var i,c,f=document.getElementsByTagName("script"),a=0;a<f.length;a++){var l=f[a];if(l.getAttribute("src")==e||l.getAttribute("data-webpack")==o+n){i=l;break}}i||(c=!0,(i=document.createElement("script")).charset="utf-8",i.timeout=120,s.nc&&i.setAttribute("nonce",s.nc),i.setAttribute("data-webpack",o+n),i.src=s.tu(e)),r[e]=[t];var d=function(t,n){i.onerror=i.onload=null,clearTimeout(p);var o=r[e];if(delete r[e],i.parentNode&&i.parentNode.removeChild(i),o&&o.forEach(function(e){return e(n)}),t)return t(n)},p=setTimeout(d.bind(null,void 0,{type:"timeout",target:i}),12e4);i.onerror=d.bind(null,i.onerror),i.onload=d.bind(null,i.onload),c&&document.head.appendChild(i)},s.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},s.tt=function(){return void 0===u&&(u={createScriptURL:function(e){return e}},"undefined"!=typeof trustedTypes&&trustedTypes.createPolicy&&(u=trustedTypes.createPolicy("nextjs#bundler",u))),u},s.tu=function(e){return s.tt().createScriptURL(e)},s.p="/_next/",i={272:0},s.f.j=function(e,t){var n=s.o(i,e)?i[e]:void 0;if(0!==n){if(n)t.push(n[2]);else if(272!=e){var r=new Promise(function(t,r){n=i[e]=[t,r]});t.push(n[2]=r);var o=s.p+s.u(e),u=Error();s.l(o,function(t){if(s.o(i,e)&&(0!==(n=i[e])&&(i[e]=void 0),n)){var r=t&&("load"===t.type?"missing":t.type),o=t&&t.target&&t.target.src;u.message="Loading chunk "+e+" failed.\n("+r+": "+o+")",u.name="ChunkLoadError",u.type=r,u.request=o,n[1](u)}},"chunk-"+e,e)}else i[e]=0}},s.O.j=function(e){return 0===i[e]},c=function(e,t){var n,r,o=t[0],u=t[1],c=t[2],f=0;if(o.some(function(e){return 0!==i[e]})){for(n in u)s.o(u,n)&&(s.m[n]=u[n]);if(c)var a=c(s)}for(e&&e(t);f<o.length;f++)r=o[f],s.o(i,r)&&i[r]&&i[r][0](),i[r]=0;return s.O(a)},(f=self.webpackChunk_N_E=self.webpackChunk_N_E||[]).forEach(c.bind(null,0)),f.push=c.bind(null,f.push.bind(f)),s.nc=void 0}();

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,12 +1,12 @@
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/2b051a9b83c80bf9.css","style"]
0:["QrHYrv6IM9fXxh7mpanWB",[[["",{"children":["api",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],"$L4",[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/2b051a9b83c80bf9.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-f0d1adefd8c6331e.js","185:static/chunks/app/layout-f087fba7a4279e51.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-f0d1adefd8c6331e.js","185:static/chunks/app/layout-f087fba7a4279e51.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-f0d1adefd8c6331e.js","185:static/chunks/app/layout-f087fba7a4279e51.js"],"name":"Header","async":false}
9:I{"id":81443,"chunks":["272:static/chunks/webpack-04ed420267a761a9.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-04ed420267a761a9.js","971:static/chunks/fd9d1056-5dfc77aa37d8c76f.js","864:static/chunks/864-bf315a5307aba1d7.js"],"name":"","async":false}
3:HL["/_next/static/css/ec1d302aa85c53c3.css","style"]
0:["ie_20wEIgQnZFxy1-N2Oh",[[["",{"children":["api",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],"$L4",[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/ec1d302aa85c53c3.css","precedence":"next"}]],"$L5"]]]]
6:I{"id":5925,"chunks":["195:static/chunks/195-42fffaf30b0aaee4.js","362:static/chunks/362-87396568076e34f1.js","536:static/chunks/536-ac1918586623b8f8.js","406:static/chunks/406-35481e1b86c5b377.js","396:static/chunks/396-28aae48ee9582229.js","894:static/chunks/894-f0d1adefd8c6331e.js","185:static/chunks/app/layout-6289fba2f8cf7457.js"],"name":"Toaster","async":false}
7:I{"id":78495,"chunks":["195:static/chunks/195-42fffaf30b0aaee4.js","362:static/chunks/362-87396568076e34f1.js","536:static/chunks/536-ac1918586623b8f8.js","406:static/chunks/406-35481e1b86c5b377.js","396:static/chunks/396-28aae48ee9582229.js","894:static/chunks/894-f0d1adefd8c6331e.js","185:static/chunks/app/layout-6289fba2f8cf7457.js"],"name":"Providers","async":false}
8:I{"id":11486,"chunks":["195:static/chunks/195-42fffaf30b0aaee4.js","362:static/chunks/362-87396568076e34f1.js","536:static/chunks/536-ac1918586623b8f8.js","406:static/chunks/406-35481e1b86c5b377.js","396:static/chunks/396-28aae48ee9582229.js","894:static/chunks/894-f0d1adefd8c6331e.js","185:static/chunks/app/layout-6289fba2f8cf7457.js"],"name":"Header","async":false}
9:I{"id":81443,"chunks":["272:static/chunks/webpack-ea3be9ec3294ba31.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-ea3be9ec3294ba31.js","971:static/chunks/fd9d1056-5dfc77aa37d8c76f.js","864:static/chunks/864-bf315a5307aba1d7.js"],"name":"","async":false}
5:[["$","meta","0",{"charSet":"utf-8"}],["$","title","1",{"children":"Tabby - API"}],["$","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 min-h-screen flex-col","children":[["$","$L8",null,{}],["$","main",null,{"className":"flex flex-1 flex-col 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","api","children"],"loading":"$undefined","loadingStyles":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","template":["$","$La",null,{}],"templateStyles":"$undefined","notFound":"$undefined","notFoundStyles":"$undefined","childProp":{"current":["$Lb",["$","iframe",null,{"className":"grow","src":"/swagger-ui"}],null],"segment":"__PAGE__"},"styles":[]}],"segment":"api"},"styles":[]}]}]]}],null]}]]}]]}],null]
b:null

1
crates/tabby/ui/dashboard/home.html vendored Normal file

File diff suppressed because one or more lines are too long

15
crates/tabby/ui/dashboard/home.txt vendored Normal file
View File

@ -0,0 +1,15 @@
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/ec1d302aa85c53c3.css","style"]
0:["ie_20wEIgQnZFxy1-N2Oh",[[["",{"children":["dashboard",{"children":["home",{"children":["__PAGE__",{}]}]}]},"$undefined","$undefined",true],"$L4",[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/ec1d302aa85c53c3.css","precedence":"next"}]],"$L5"]]]]
6:I{"id":5925,"chunks":["195:static/chunks/195-42fffaf30b0aaee4.js","362:static/chunks/362-87396568076e34f1.js","536:static/chunks/536-ac1918586623b8f8.js","406:static/chunks/406-35481e1b86c5b377.js","396:static/chunks/396-28aae48ee9582229.js","894:static/chunks/894-f0d1adefd8c6331e.js","185:static/chunks/app/layout-6289fba2f8cf7457.js"],"name":"Toaster","async":false}
7:I{"id":78495,"chunks":["195:static/chunks/195-42fffaf30b0aaee4.js","362:static/chunks/362-87396568076e34f1.js","536:static/chunks/536-ac1918586623b8f8.js","406:static/chunks/406-35481e1b86c5b377.js","396:static/chunks/396-28aae48ee9582229.js","894:static/chunks/894-f0d1adefd8c6331e.js","185:static/chunks/app/layout-6289fba2f8cf7457.js"],"name":"Providers","async":false}
8:I{"id":11486,"chunks":["195:static/chunks/195-42fffaf30b0aaee4.js","362:static/chunks/362-87396568076e34f1.js","536:static/chunks/536-ac1918586623b8f8.js","406:static/chunks/406-35481e1b86c5b377.js","396:static/chunks/396-28aae48ee9582229.js","894:static/chunks/894-f0d1adefd8c6331e.js","185:static/chunks/app/layout-6289fba2f8cf7457.js"],"name":"Header","async":false}
9:I{"id":81443,"chunks":["272:static/chunks/webpack-ea3be9ec3294ba31.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-ea3be9ec3294ba31.js","971:static/chunks/fd9d1056-5dfc77aa37d8c76f.js","864:static/chunks/864-bf315a5307aba1d7.js"],"name":"","async":false}
b:I{"id":79744,"chunks":["195:static/chunks/195-42fffaf30b0aaee4.js","396:static/chunks/396-28aae48ee9582229.js","663:static/chunks/app/dashboard/layout-9b2ef3995d47740e.js"],"name":"","async":false}
d:I{"id":65146,"chunks":["272:static/chunks/webpack-ea3be9ec3294ba31.js","971:static/chunks/fd9d1056-5dfc77aa37d8c76f.js","864:static/chunks/864-bf315a5307aba1d7.js"],"name":"","async":false}
e:I{"id":70406,"chunks":["195:static/chunks/195-42fffaf30b0aaee4.js","362:static/chunks/362-87396568076e34f1.js","536:static/chunks/536-ac1918586623b8f8.js","703:static/chunks/703-35aa8c1eaf8df6ef.js","894:static/chunks/894-f0d1adefd8c6331e.js","883:static/chunks/app/dashboard/home/page-4eb22256bfa93a96.js"],"name":"","async":false}
5:[["$","meta","0",{"charSet":"utf-8"}],["$","title","1",{"children":"Tabby - Dashboard"}],["$","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 min-h-screen flex-col","children":[["$","$L8",null,{}],["$","main",null,{"className":"flex flex-1 flex-col 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":[null,["$","$Lb",null,{"className":"flex-1","children":["$","$L9",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children"],"loading":"$undefined","loadingStyles":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","template":["$","$La",null,{}],"templateStyles":"$undefined","notFound":"$undefined","notFoundStyles":"$undefined","childProp":{"current":["$","$L9",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","home","children"],"loading":"$undefined","loadingStyles":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","template":["$","$La",null,{}],"templateStyles":"$undefined","notFound":"$undefined","notFoundStyles":"$undefined","childProp":{"current":["$Lc",["$","$Ld",null,{"propsForComponent":{"params":{}},"Component":"$e"}],null],"segment":"__PAGE__"},"styles":[]}],"segment":"home"},"styles":[]}]}],null],"segment":"dashboard"},"styles":[]}]}]]}],null]}]]}]]}],null]
c:null

File diff suppressed because one or more lines are too long

15
crates/tabby/ui/dashboard/runners.txt vendored Normal file
View File

@ -0,0 +1,15 @@
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/ec1d302aa85c53c3.css","style"]
0:["ie_20wEIgQnZFxy1-N2Oh",[[["",{"children":["dashboard",{"children":["runners",{"children":["__PAGE__",{}]}]}]},"$undefined","$undefined",true],"$L4",[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/ec1d302aa85c53c3.css","precedence":"next"}]],"$L5"]]]]
6:I{"id":5925,"chunks":["195:static/chunks/195-42fffaf30b0aaee4.js","362:static/chunks/362-87396568076e34f1.js","536:static/chunks/536-ac1918586623b8f8.js","406:static/chunks/406-35481e1b86c5b377.js","396:static/chunks/396-28aae48ee9582229.js","894:static/chunks/894-f0d1adefd8c6331e.js","185:static/chunks/app/layout-6289fba2f8cf7457.js"],"name":"Toaster","async":false}
7:I{"id":78495,"chunks":["195:static/chunks/195-42fffaf30b0aaee4.js","362:static/chunks/362-87396568076e34f1.js","536:static/chunks/536-ac1918586623b8f8.js","406:static/chunks/406-35481e1b86c5b377.js","396:static/chunks/396-28aae48ee9582229.js","894:static/chunks/894-f0d1adefd8c6331e.js","185:static/chunks/app/layout-6289fba2f8cf7457.js"],"name":"Providers","async":false}
8:I{"id":11486,"chunks":["195:static/chunks/195-42fffaf30b0aaee4.js","362:static/chunks/362-87396568076e34f1.js","536:static/chunks/536-ac1918586623b8f8.js","406:static/chunks/406-35481e1b86c5b377.js","396:static/chunks/396-28aae48ee9582229.js","894:static/chunks/894-f0d1adefd8c6331e.js","185:static/chunks/app/layout-6289fba2f8cf7457.js"],"name":"Header","async":false}
9:I{"id":81443,"chunks":["272:static/chunks/webpack-ea3be9ec3294ba31.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-ea3be9ec3294ba31.js","971:static/chunks/fd9d1056-5dfc77aa37d8c76f.js","864:static/chunks/864-bf315a5307aba1d7.js"],"name":"","async":false}
b:I{"id":79744,"chunks":["195:static/chunks/195-42fffaf30b0aaee4.js","396:static/chunks/396-28aae48ee9582229.js","663:static/chunks/app/dashboard/layout-9b2ef3995d47740e.js"],"name":"","async":false}
d:I{"id":65146,"chunks":["272:static/chunks/webpack-ea3be9ec3294ba31.js","971:static/chunks/fd9d1056-5dfc77aa37d8c76f.js","864:static/chunks/864-bf315a5307aba1d7.js"],"name":"","async":false}
e:I{"id":93203,"chunks":["195:static/chunks/195-42fffaf30b0aaee4.js","362:static/chunks/362-87396568076e34f1.js","454:static/chunks/app/dashboard/runners/page-5a19d3435b2e9dae.js"],"name":"","async":false}
5:[["$","meta","0",{"charSet":"utf-8"}],["$","title","1",{"children":"Tabby - Dashboard"}],["$","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 min-h-screen flex-col","children":[["$","$L8",null,{}],["$","main",null,{"className":"flex flex-1 flex-col 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":[null,["$","$Lb",null,{"className":"flex-1","children":["$","$L9",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children"],"loading":"$undefined","loadingStyles":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","template":["$","$La",null,{}],"templateStyles":"$undefined","notFound":"$undefined","notFoundStyles":"$undefined","childProp":{"current":["$","$L9",null,{"parallelRouterKey":"children","segmentPath":["children","dashboard","children","runners","children"],"loading":"$undefined","loadingStyles":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","template":["$","$La",null,{}],"templateStyles":"$undefined","notFound":"$undefined","notFoundStyles":"$undefined","childProp":{"current":["$Lc",["$","$Ld",null,{"propsForComponent":{"params":{}},"Component":"$e"}],null],"segment":"__PAGE__"},"styles":[]}],"segment":"runners"},"styles":[]}]}],null],"segment":"dashboard"},"styles":[]}]}]]}],null]}]]}]]}],null]
c:null

File diff suppressed because one or more lines are too long

View File

@ -1,14 +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/2b051a9b83c80bf9.css","style"]
0:["QrHYrv6IM9fXxh7mpanWB",[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],"$L4",[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/2b051a9b83c80bf9.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-f0d1adefd8c6331e.js","185:static/chunks/app/layout-f087fba7a4279e51.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-f0d1adefd8c6331e.js","185:static/chunks/app/layout-f087fba7a4279e51.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-f0d1adefd8c6331e.js","185:static/chunks/app/layout-f087fba7a4279e51.js"],"name":"Header","async":false}
9:I{"id":81443,"chunks":["272:static/chunks/webpack-04ed420267a761a9.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-04ed420267a761a9.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-04ed420267a761a9.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-f0d1adefd8c6331e.js","931:static/chunks/app/page-478c8032840b58db.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 min-h-screen flex-col","children":[["$","$L8",null,{}],["$","main",null,{"className":"flex flex-1 flex-col 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"}]]
3:HL["/_next/static/css/ec1d302aa85c53c3.css","style"]
0:["ie_20wEIgQnZFxy1-N2Oh",[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],"$L4",[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/ec1d302aa85c53c3.css","precedence":"next"}]],"$L5"]]]]
6:I{"id":5925,"chunks":["195:static/chunks/195-42fffaf30b0aaee4.js","362:static/chunks/362-87396568076e34f1.js","536:static/chunks/536-ac1918586623b8f8.js","406:static/chunks/406-35481e1b86c5b377.js","396:static/chunks/396-28aae48ee9582229.js","894:static/chunks/894-f0d1adefd8c6331e.js","185:static/chunks/app/layout-6289fba2f8cf7457.js"],"name":"Toaster","async":false}
7:I{"id":78495,"chunks":["195:static/chunks/195-42fffaf30b0aaee4.js","362:static/chunks/362-87396568076e34f1.js","536:static/chunks/536-ac1918586623b8f8.js","406:static/chunks/406-35481e1b86c5b377.js","396:static/chunks/396-28aae48ee9582229.js","894:static/chunks/894-f0d1adefd8c6331e.js","185:static/chunks/app/layout-6289fba2f8cf7457.js"],"name":"Providers","async":false}
8:I{"id":11486,"chunks":["195:static/chunks/195-42fffaf30b0aaee4.js","362:static/chunks/362-87396568076e34f1.js","536:static/chunks/536-ac1918586623b8f8.js","406:static/chunks/406-35481e1b86c5b377.js","396:static/chunks/396-28aae48ee9582229.js","894:static/chunks/894-f0d1adefd8c6331e.js","185:static/chunks/app/layout-6289fba2f8cf7457.js"],"name":"Header","async":false}
9:I{"id":81443,"chunks":["272:static/chunks/webpack-ea3be9ec3294ba31.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-ea3be9ec3294ba31.js","971:static/chunks/fd9d1056-5dfc77aa37d8c76f.js","864:static/chunks/864-bf315a5307aba1d7.js"],"name":"","async":false}
5:[["$","meta","0",{"charSet":"utf-8"}],["$","title","1",{"children":"Tabby"}],["$","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 min-h-screen flex-col","children":[["$","$L8",null,{}],["$","main",null,{"className":"flex flex-1 flex-col 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],"segment":"__PAGE__"},"styles":[]}]}]]}],null]}]]}]]}],null]
c:E{"digest":"NEXT_REDIRECT;replace;/dashboard/home;false"}
b:null

File diff suppressed because one or more lines are too long

View File

@ -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/2b051a9b83c80bf9.css","style"]
0:["QrHYrv6IM9fXxh7mpanWB",[[["",{"children":["playground",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],"$L4",[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/2b051a9b83c80bf9.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-f0d1adefd8c6331e.js","185:static/chunks/app/layout-f087fba7a4279e51.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-f0d1adefd8c6331e.js","185:static/chunks/app/layout-f087fba7a4279e51.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-f0d1adefd8c6331e.js","185:static/chunks/app/layout-f087fba7a4279e51.js"],"name":"Header","async":false}
9:I{"id":81443,"chunks":["272:static/chunks/webpack-04ed420267a761a9.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-04ed420267a761a9.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-f0d1adefd8c6331e.js","383:static/chunks/app/playground/page-b742820613e86585.js"],"name":"Chat","async":false}
3:HL["/_next/static/css/ec1d302aa85c53c3.css","style"]
0:["ie_20wEIgQnZFxy1-N2Oh",[[["",{"children":["playground",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],"$L4",[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/ec1d302aa85c53c3.css","precedence":"next"}]],"$L5"]]]]
6:I{"id":5925,"chunks":["195:static/chunks/195-42fffaf30b0aaee4.js","362:static/chunks/362-87396568076e34f1.js","536:static/chunks/536-ac1918586623b8f8.js","406:static/chunks/406-35481e1b86c5b377.js","396:static/chunks/396-28aae48ee9582229.js","894:static/chunks/894-f0d1adefd8c6331e.js","185:static/chunks/app/layout-6289fba2f8cf7457.js"],"name":"Toaster","async":false}
7:I{"id":78495,"chunks":["195:static/chunks/195-42fffaf30b0aaee4.js","362:static/chunks/362-87396568076e34f1.js","536:static/chunks/536-ac1918586623b8f8.js","406:static/chunks/406-35481e1b86c5b377.js","396:static/chunks/396-28aae48ee9582229.js","894:static/chunks/894-f0d1adefd8c6331e.js","185:static/chunks/app/layout-6289fba2f8cf7457.js"],"name":"Providers","async":false}
8:I{"id":11486,"chunks":["195:static/chunks/195-42fffaf30b0aaee4.js","362:static/chunks/362-87396568076e34f1.js","536:static/chunks/536-ac1918586623b8f8.js","406:static/chunks/406-35481e1b86c5b377.js","396:static/chunks/396-28aae48ee9582229.js","894:static/chunks/894-f0d1adefd8c6331e.js","185:static/chunks/app/layout-6289fba2f8cf7457.js"],"name":"Header","async":false}
9:I{"id":81443,"chunks":["272:static/chunks/webpack-ea3be9ec3294ba31.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-ea3be9ec3294ba31.js","971:static/chunks/fd9d1056-5dfc77aa37d8c76f.js","864:static/chunks/864-bf315a5307aba1d7.js"],"name":"","async":false}
c:I{"id":12202,"chunks":["195:static/chunks/195-42fffaf30b0aaee4.js","536:static/chunks/536-ac1918586623b8f8.js","406:static/chunks/406-35481e1b86c5b377.js","28:static/chunks/28-f3f58cacc7da57b1.js","894:static/chunks/894-f0d1adefd8c6331e.js","383:static/chunks/app/playground/page-6f64c606c3737aeb.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 min-h-screen flex-col","children":[["$","$L8",null,{}],["$","main",null,{"className":"flex flex-1 flex-col 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":"GG5oy2I"}],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 min-h-screen flex-col","children":[["$","$L8",null,{}],["$","main",null,{"className":"flex flex-1 flex-col 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":"5kvurMY"}],null],"segment":"__PAGE__"},"styles":[]}],"segment":"playground"},"styles":[]}]}]]}],null]}]]}]]}],null]
b:null

View File

@ -0,0 +1,99 @@
'use client'
import { cn } from '@/lib/utils'
import { VariantProps, cva } from 'class-variance-authority'
import Link from 'next/link'
import { usePathname } from 'next/navigation'
export interface SidebarProps {
children: React.ReactNode
className?: string
}
export default function Sidebar({ children, className }: SidebarProps) {
return (
<div
className={cn('grid overflow-hidden lg:grid-cols-[280px_1fr]', className)}
>
<div className="hidden border-r bg-zinc-100/40 dark:bg-zinc-800/40 lg:block">
<div className="flex flex-col gap-2">
<div className="h-[12px]"></div>
<div className="flex-1">
<nav className="grid items-start gap-4 px-4 text-sm font-medium">
<SidebarButton href="/dashboard/home">
<svg
xmlns="http://www.w3.org/2000/svg"
className=" h-4 w-4"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeWidth="2"
strokeLinecap="round"
strokeLinejoin="round"
>
<path d="m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z" />
<polyline points="9 22 9 12 15 12 15 22" />
</svg>
Home
</SidebarButton>
<SidebarButton href="/dashboard/runners">
<svg
xmlns="http://www.w3.org/2000/svg"
className=" h-4 w-4"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeWidth="2"
strokeLinecap="round"
strokeLinejoin="round"
>
<path d="m12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83Z" />
<path d="m6.08 9.5-3.5 1.6a1 1 0 0 0 0 1.81l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9a1 1 0 0 0 0-1.83l-3.5-1.59" />
<path d="m6.08 14.5-3.5 1.6a1 1 0 0 0 0 1.81l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9a1 1 0 0 0 0-1.83l-3.5-1.59" />
</svg>
Runners
</SidebarButton>
</nav>
</div>
</div>
</div>
<div className="flex flex-1 flex-col overflow-auto p-4 lg:p-16">
{children}
</div>
</div>
)
}
interface SidebarButtonProps {
href: string
children: React.ReactNode
}
const linkVariants = cva(
'flex items-center gap-3 rounded-lg px-3 py-2 text-zinc-900 transition-all hover:text-zinc-900 dark:text-zinc-50 dark:hover:text-zinc-50',
{
variants: {
state: {
selected: 'bg-zinc-200 dark:bg-zinc-800',
'not-selected': ''
}
},
defaultVariants: {
state: 'not-selected'
}
}
)
function SidebarButton({ href, children }: SidebarButtonProps) {
const pathname = usePathname()
const state = pathname == href ? 'selected' : 'not-selected'
return (
<Link className={linkVariants({ state })} href={href}>
{children}
</Link>
)
}

View File

@ -0,0 +1,118 @@
'use client'
import { buttonVariants } from '@/components/ui/button'
import {
Dialog,
DialogContent,
DialogDescription,
DialogFooter,
DialogHeader,
DialogTitle
} from '@/components/ui/dialog'
import { IconSlack } from '@/components/ui/icons'
import { Separator } from '@/components/ui/separator'
import { useHealth } from '@/lib/hooks/use-health'
import { PropsWithChildren, useEffect, useState } from 'react'
const COMMUNITY_DIALOG_SHOWN_KEY = 'community-dialog-shown'
export default function Home() {
const [open, setOpen] = useState(false)
useEffect(() => {
if (!localStorage.getItem(COMMUNITY_DIALOG_SHOWN_KEY)) {
setOpen(true)
localStorage.setItem(COMMUNITY_DIALOG_SHOWN_KEY, 'true')
}
}, [])
return (
<div>
<MainPanel />
<Dialog open={open} onOpenChange={setOpen}>
<DialogContent>
<DialogHeader className="gap-3">
<DialogTitle>Join the Tabby community</DialogTitle>
<DialogDescription>
Connect with other contributors building Tabby. Share knowledge,
get help, and contribute to the open-source project.
</DialogDescription>
</DialogHeader>
<DialogFooter className="sm:justify-start">
<a
target="_blank"
href="https://join.slack.com/t/tabbycommunity/shared_invite/zt-1xeiddizp-bciR2RtFTaJ37RBxr8VxpA"
className={buttonVariants()}
>
<IconSlack className="-ml-2 h-8 w-8" />
Join us on Slack
</a>
</DialogFooter>
</DialogContent>
</Dialog>
</div>
)
}
interface LinkProps {
href: string
}
function Link({ href, children }: PropsWithChildren<LinkProps>) {
return (
<a target="_blank" href={href} className="underline">
{children}
</a>
)
}
function toBadgeString(str: string) {
return encodeURIComponent(str.replaceAll('-', '--'))
}
function MainPanel() {
const { data: healthInfo } = useHealth()
if (!healthInfo) return
return (
<div className="flex w-full flex-col gap-3">
<h1>
<span className="font-bold">Congratulations</span>, your tabby instance
is running!
</h1>
<span className="flex flex-wrap gap-1">
<a
target="_blank"
href={`https://github.com/TabbyML/tabby/releases/tag/${healthInfo.version.git_describe}`}
>
<img
src={`https://img.shields.io/badge/version-${toBadgeString(
healthInfo.version.git_describe
)}-green`}
/>
</a>
</span>
<Separator />
<span>
You can find our documentation{' '}
<Link href="https://tabby.tabbyml.com/docs/getting-started">here</Link>.
<ul className="mt-2">
<li>
💻{' '}
<Link href="https://tabby.tabbyml.com/docs/extensions/">
IDE/Editor Extensions
</Link>
</li>
<li>
{' '}
<Link href="https://tabby.tabbyml.com/docs/configuration">
Configuration
</Link>
</li>
</ul>
</span>
</div>
)
}

View File

@ -0,0 +1,14 @@
import { Metadata } from 'next'
import Sidebar from './components/sidebar'
export const metadata: Metadata = {
title: 'Dashboard'
}
interface DashboardLayoutProps {
children: React.ReactNode
}
export default function RootLayout({ children }: DashboardLayoutProps) {
return <Sidebar className="flex-1">{children}</Sidebar>
}

View File

@ -0,0 +1,126 @@
import { CardTitle, CardHeader, CardContent, Card } from '@/components/ui/card'
import { HealthInfo } from '@/lib/hooks/use-health'
interface RunnerCardProps {
title: string
health: HealthInfo
}
export default function RunnerCard({ title, health }: RunnerCardProps) {
return (
<Card className="rounded-xl shadow-md">
<CardHeader className="p-0 px-4 pb-2 pt-4">
<CardTitle className="text-md font-semibold">{title}</CardTitle>
</CardHeader>
<CardContent className="flex flex-col gap-2 p-0 px-4 pb-4 pt-2">
<Info>
<svg
xmlns="http://www.w3.org/2000/svg"
className=" h-5 w-5 text-gray-400"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeWidth="2"
strokeLinecap="round"
strokeLinejoin="round"
>
<path d="M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z" />
<polyline points="14 2 14 8 20 8" />
<path d="m10 13-2 2 2 2" />
<path d="m14 17 2-2-2-2" />
</svg>
<p className="ml-2">{health.model}</p>
</Info>
{health.chat_model && (
<Info>
<svg
xmlns="http://www.w3.org/2000/svg"
className=" h-5 w-5 text-gray-400"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeWidth="2"
strokeLinecap="round"
strokeLinejoin="round"
>
<path d="M14 9a2 2 0 0 1-2 2H6l-4 4V4c0-1.1.9-2 2-2h8a2 2 0 0 1 2 2v5Z" />
<path d="M18 9h2a2 2 0 0 1 2 2v11l-4-4h-6a2 2 0 0 1-2-2v-1" />
</svg>
<p className="ml-2">{health.chat_model}</p>
</Info>
)}
<Info>
<svg
className=" h-5 w-5 text-gray-400"
fill="none"
height="24"
stroke="currentColor"
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth="2"
viewBox="0 0 24 24"
width="24"
xmlns="http://www.w3.org/2000/svg"
>
<rect height="16" rx="2" width="16" x="4" y="4" />
<rect height="6" width="6" x="9" y="9" />
<path d="M15 2v2" />
<path d="M15 20v2" />
<path d="M2 15h2" />
<path d="M2 9h2" />
<path d="M20 15h2" />
<path d="M20 9h2" />
<path d="M9 2v2" />
<path d="M9 20v2" />
</svg>
<p className="ml-2">
{health.cpu_info} ({health.cpu_count} cores)
</p>
</Info>
{health.cuda_devices.map((x, i) => (
<Info key={i}>
<svg
className=" h-5 w-5 text-gray-400"
fill="none"
height="24"
stroke="currentColor"
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth="2"
viewBox="0 0 24 24"
width="24"
xmlns="http://www.w3.org/2000/svg"
>
<path d="M6 19v-3" />
<path d="M10 19v-3" />
<path d="M14 19v-3" />
<path d="M18 19v-3" />
<path d="M8 11V9" />
<path d="M16 11V9" />
<path d="M12 11V9" />
<path d="M2 15h20" />
<path d="M2 7a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v1.1a2 2 0 0 0 0 3.837V17a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2v-5.1a2 2 0 0 0 0-3.837Z" />
</svg>
<p className="ml-2">{x}</p>
</Info>
))}
</CardContent>
</Card>
)
}
interface InfoProps {
children: React.ReactNode
}
function Info({ children }: InfoProps) {
return (
<div className="mt-2 flex items-center text-sm text-gray-500">
{children}
</div>
)
}

View File

@ -0,0 +1,16 @@
'use client'
import { useHealth } from '@/lib/hooks/use-health'
import RunnerCard from './components/runner-card'
export default function Runners() {
const { data: health } = useHealth()
if (!health) return
return (
<div className="flex h-full w-full items-start justify-start">
<RunnerCard title="Local Runner" health={health} />
</div>
)
}

View File

@ -11,7 +11,7 @@ import { Header } from '@/components/header'
export const metadata: Metadata = {
title: {
default: 'Tabby - Home',
default: 'Tabby',
template: `Tabby - %s`
},
description: 'Tabby, an opensource, self-hosted AI coding assistant.',

View File

@ -1,134 +1,5 @@
'use client'
import { redirect } from 'next/navigation'
import { buttonVariants } from '@/components/ui/button'
import {
Dialog,
DialogContent,
DialogDescription,
DialogFooter,
DialogHeader,
DialogTitle,
DialogTrigger
} from '@/components/ui/dialog'
import { IconSlack } from '@/components/ui/icons'
import { Separator } from '@/components/ui/separator'
import { useHealth } from '@/lib/hooks/use-health'
import { PropsWithChildren, useEffect, useState } from 'react'
const COMMUNITY_DIALOG_SHOWN_KEY = 'community-dialog-shown'
export default function IndexPage() {
const [open, setOpen] = useState(false)
useEffect(() => {
if (!localStorage.getItem(COMMUNITY_DIALOG_SHOWN_KEY)) {
setOpen(true)
localStorage.setItem(COMMUNITY_DIALOG_SHOWN_KEY, 'true')
}
}, [])
return (
<div className="flex grow items-center justify-center">
<MainPanel />
<Dialog open={open} onOpenChange={setOpen}>
<DialogContent>
<DialogHeader className="gap-3">
<DialogTitle>Join the Tabby community</DialogTitle>
<DialogDescription>
Connect with other contributors building Tabby. Share knowledge,
get help, and contribute to the open-source project.
</DialogDescription>
</DialogHeader>
<DialogFooter className="sm:justify-start">
<a
target="_blank"
href="https://join.slack.com/t/tabbycommunity/shared_invite/zt-1xeiddizp-bciR2RtFTaJ37RBxr8VxpA"
className={buttonVariants()}
>
<IconSlack className="-ml-2 h-8 w-8" />
Join us on Slack
</a>
</DialogFooter>
</DialogContent>
</Dialog>
</div>
)
}
interface LinkProps {
href: string
}
function Link({ href, children }: PropsWithChildren<LinkProps>) {
return (
<a target="_blank" href={href} className="underline">
{children}
</a>
)
}
function toBadgeString(str: string) {
return encodeURIComponent(str.replaceAll('-', '--'))
}
function MainPanel() {
const { data: healthInfo } = useHealth()
if (!healthInfo) return
return (
<div className="flex w-2/3 flex-col gap-3 lg:w-1/3">
<h1>
<span className="font-bold">Congratulations</span>, your tabby instance
is running!
</h1>
<span className="flex flex-wrap gap-1">
<a
target="_blank"
href={`https://github.com/TabbyML/tabby/releases/tag/${healthInfo.version.git_describe}`}
>
<img
src={`https://img.shields.io/badge/version-${toBadgeString(
healthInfo.version.git_describe
)}-green`}
/>
</a>
<img
src={`https://img.shields.io/badge/device-${healthInfo.device}-blue`}
/>
<img
src={`https://img.shields.io/badge/model-${toBadgeString(
healthInfo.model
)}-red`}
/>
{healthInfo.chat_model && (
<img
src={`https://img.shields.io/badge/chat%20model-${toBadgeString(
healthInfo.chat_model
)}-orange`}
/>
)}
</span>
<Separator />
<span>
You can find our documentation{' '}
<Link href="https://tabby.tabbyml.com/docs/getting-started">here</Link>.
<ul className="mt-2">
<li>
💻{' '}
<Link href="https://tabby.tabbyml.com/docs/extensions/">
IDE/Editor Extensions
</Link>
</li>
<li>
{' '}
<Link href="https://tabby.tabbyml.com/docs/configuration">
Configuration
</Link>
</li>
</ul>
</span>
</div>
)
export default function () {
redirect('/dashboard/home')
}

View File

@ -4,7 +4,7 @@ import * as React from 'react'
import { cn } from '@/lib/utils'
import { buttonVariants } from '@/components/ui/button'
import { IconGitHub, IconExternalLink, IconNotice } from '@/components/ui/icons'
import { IconGitHub, IconNotice } from '@/components/ui/icons'
import dynamic from 'next/dynamic'
import Link from 'next/link'
import { useHealth } from '@/lib/hooks/use-health'
@ -28,7 +28,7 @@ export function Header() {
<div className="flex items-center">
<ThemeToggle />
<Link href="/" className={cn(buttonVariants({ variant: 'link' }))}>
Home
Dashboard
</Link>
<Link href="/api" className={cn(buttonVariants({ variant: 'link' }))}>
API

View File

@ -0,0 +1,79 @@
import * as React from 'react'
import { cn } from '@/lib/utils'
const Card = React.forwardRef<
HTMLDivElement,
React.HTMLAttributes<HTMLDivElement>
>(({ className, ...props }, ref) => (
<div
ref={ref}
className={cn(
'rounded-lg border bg-card text-card-foreground shadow-sm',
className
)}
{...props}
/>
))
Card.displayName = 'Card'
const CardHeader = React.forwardRef<
HTMLDivElement,
React.HTMLAttributes<HTMLDivElement>
>(({ className, ...props }, ref) => (
<div
ref={ref}
className={cn('flex flex-col space-y-1.5 p-6', className)}
{...props}
/>
))
CardHeader.displayName = 'CardHeader'
const CardTitle = React.forwardRef<
HTMLParagraphElement,
React.HTMLAttributes<HTMLHeadingElement>
>(({ className, ...props }, ref) => (
<h3
ref={ref}
className={cn(
'text-2xl font-semibold leading-none tracking-tight',
className
)}
{...props}
/>
))
CardTitle.displayName = 'CardTitle'
const CardDescription = React.forwardRef<
HTMLParagraphElement,
React.HTMLAttributes<HTMLParagraphElement>
>(({ className, ...props }, ref) => (
<p
ref={ref}
className={cn('text-sm text-muted-foreground', className)}
{...props}
/>
))
CardDescription.displayName = 'CardDescription'
const CardContent = React.forwardRef<
HTMLDivElement,
React.HTMLAttributes<HTMLDivElement>
>(({ className, ...props }, ref) => (
<div ref={ref} className={cn('p-6 pt-0', className)} {...props} />
))
CardContent.displayName = 'CardContent'
const CardFooter = React.forwardRef<
HTMLDivElement,
React.HTMLAttributes<HTMLDivElement>
>(({ className, ...props }, ref) => (
<div
ref={ref}
className={cn('flex items-center p-6 pt-0', className)}
{...props}
/>
))
CardFooter.displayName = 'CardFooter'
export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }

View File

@ -8,6 +8,9 @@ export interface HealthInfo {
device: string
model: string
chat_model?: string
cpu_info: string
cpu_count: number
cuda_devices: string[]
version: {
build_date: string
git_describe: string