@madh-io/alfred-ai 0.17.5 → 0.17.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bundle/index.js CHANGED
@@ -1428,7 +1428,7 @@ Alfred: ${t}
1428
1428
  `),this.prompt(),r}async editMessage(e,t,s,r){Fc.clearLine(process.stdout,0),Fc.cursorTo(process.stdout,0),process.stdout.write(`Alfred: ${s}`)}async deleteMessage(e,t){}prompt(){this.rl?.prompt()}}});import Yg from"node:http";import Jg from"node:https";import _e from"node:fs";import dt from"node:path";import ci from"node:crypto";var Zg,Up,li,Fp=T(()=>{"use strict";lt();Zg={".html":"text/html; charset=utf-8",".css":"text/css; charset=utf-8",".js":"application/javascript; charset=utf-8",".json":"application/json; charset=utf-8",".png":"image/png",".jpg":"image/jpeg",".svg":"image/svg+xml",".ico":"image/x-icon",".woff":"font/woff",".woff2":"font/woff2",".txt":"text/plain; charset=utf-8"},Up=1048576,li=class extends ye{static{p(this,"HttpAdapter")}platform="api";server=null;streams=new Map;messageCounter=0;port;host;apiToken;corsOrigin;healthCheckFn;metricsFn;dashboardFn;webUiPath;tls;webhooks=new Map;constructor(e,t,s){if(super(),this.port=e,this.host=t,this.apiToken=s?.apiToken,this.corsOrigin=s?.corsOrigin??"http://localhost:3420",this.healthCheckFn=s?.healthCheck,this.metricsFn=s?.metricsCallback,this.dashboardFn=s?.dashboardCallback,this.webUiPath=s?.webUiPath,this.tls=s?.tls,s?.webhooks)for(let r of s.webhooks)this.webhooks.set(r.name,r)}addWebhook(e){this.webhooks.set(e.name,e)}async connect(){this.status="connecting";let e=p((s,r)=>{this.handleRequest(s,r)},"handler"),t=await this.resolveTls();t?this.server=Jg.createServer(t,e):this.server=Yg.createServer(e),await new Promise((s,r)=>{this.server.listen(this.port,this.host,()=>{s()}),this.server.once("error",r)}),this.status="connected",this.emit("connected")}async disconnect(){for(let[e,t]of this.streams)this.writeSseEvent(t,"done",{type:"done"}),t.end(),this.streams.delete(e);this.server&&(await new Promise(e=>{this.server.close(()=>e())}),this.server=null),this.status="disconnected",this.emit("disconnected")}async sendMessage(e,t,s){let r=`api-resp-${++this.messageCounter}`,n=this.streams.get(e);return n&&this.writeSseEvent(n,"response",{type:"response",text:t}),r}async editMessage(e,t,s,r){let n=this.streams.get(e);n&&this.writeSseEvent(n,"status",{type:"status",text:s})}async deleteMessage(e,t){}async sendPhoto(e,t,s){let r=this.streams.get(e);return r&&this.writeSseEvent(r,"attachment",{type:"attachment",attachmentType:"image",data:t.toString("base64"),caption:s}),`api-photo-${++this.messageCounter}`}async sendFile(e,t,s,r){let n=this.streams.get(e);return n&&this.writeSseEvent(n,"attachment",{type:"attachment",attachmentType:"file",data:t.toString("base64"),fileName:s,caption:r}),`api-file-${++this.messageCounter}`}async sendVoice(e,t,s){let r=this.streams.get(e);return r&&this.writeSseEvent(r,"attachment",{type:"attachment",attachmentType:"voice",data:t.toString("base64"),caption:s}),`api-voice-${++this.messageCounter}`}endStream(e){let t=this.streams.get(e);t&&(this.writeSseEvent(t,"done",{type:"done"}),t.end(),this.streams.delete(e))}async resolveTls(){if(!this.tls?.enabled)return null;if(this.tls.cert&&this.tls.key)try{return{cert:_e.readFileSync(this.tls.cert),key:_e.readFileSync(this.tls.key)}}catch(r){throw new Error(`TLS cert/key read failed: ${r instanceof Error?r.message:String(r)}`)}let e=dt.join(process.env.HOME??process.env.USERPROFILE??".",".alfred","tls"),t=dt.join(e,"cert.pem"),s=dt.join(e,"key.pem");if(_e.existsSync(t)&&_e.existsSync(s))return{cert:_e.readFileSync(t),key:_e.readFileSync(s)};try{let{execFileSync:r}=await import("node:child_process"),{generateKeyPairSync:n}=await import("node:crypto"),{privateKey:o}=n("rsa",{modulusLength:2048,publicKeyEncoding:{type:"spki",format:"pem"},privateKeyEncoding:{type:"pkcs8",format:"pem"}});return _e.mkdirSync(e,{recursive:!0}),_e.writeFileSync(s,o,{mode:384}),r("openssl",["req","-new","-x509","-key",s,"-out",t,"-days","365","-subj","/CN=Alfred AI/O=Alfred","-addext","subjectAltName=IP:127.0.0.1,IP:0.0.0.0,DNS:localhost"],{stdio:"pipe"}),{cert:_e.readFileSync(t),key:_e.readFileSync(s)}}catch(r){return console.warn(`[HttpAdapter] Self-signed TLS cert generation failed: ${r instanceof Error?r.message:String(r)}. Running without TLS.`),null}}handleRequest(e,t){if(t.setHeader("X-Content-Type-Options","nosniff"),t.setHeader("X-Frame-Options","DENY"),t.setHeader("Access-Control-Allow-Origin",this.corsOrigin),t.setHeader("Access-Control-Allow-Methods","GET, POST, OPTIONS"),t.setHeader("Access-Control-Allow-Headers","Content-Type, Authorization"),e.method==="OPTIONS"){t.writeHead(204),t.end();return}let s=new URL(e.url??"/",`http://${e.headers.host??"localhost"}`);if(s.pathname==="/api/health"&&e.method==="GET")this.handleHealth(t);else if(s.pathname==="/api/metrics"&&e.method==="GET")this.handleMetrics(t);else if(s.pathname==="/api/message"&&e.method==="POST")this.handleMessage(e,t);else if(s.pathname==="/api/dashboard"&&e.method==="GET")this.handleDashboard(e,t);else if(s.pathname.startsWith("/api/webhook/")&&e.method==="POST"){let r=s.pathname.slice(13);this.handleWebhook(e,t,r)}else this.webUiPath&&s.pathname.startsWith("/alfred/")&&e.method==="GET"?this.serveStaticFile(s.pathname,t):this.webUiPath&&s.pathname==="/alfred"&&e.method==="GET"?(t.writeHead(302,{Location:"/alfred/"}),t.end()):(t.writeHead(404,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"Not found"})))}checkAuth(e,t){if(!this.apiToken)return!0;let s=e.headers.authorization,r=`Bearer ${this.apiToken}`;return!s||s.length!==r.length||!ci.timingSafeEqual(Buffer.from(s),Buffer.from(r))?(t.writeHead(401,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"Unauthorized"})),!1):!0}handleDashboard(e,t){if(this.checkAuth(e,t)){if(!this.dashboardFn){t.writeHead(404,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"Dashboard not configured"}));return}try{let s=this.dashboardFn();t.writeHead(200,{"Content-Type":"application/json"}),t.end(JSON.stringify(s))}catch{t.writeHead(500,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"Dashboard data fetch failed"}))}}}serveStaticFile(e,t){if(!this.webUiPath){t.writeHead(404),t.end();return}let s=e.replace(/^\/alfred/,"");(!s||s==="/")&&(s="/index.html");let r=dt.resolve(this.webUiPath,"."+s);if(!r.startsWith(dt.resolve(this.webUiPath))){t.writeHead(403),t.end();return}let n=r;if(!_e.existsSync(n))if(_e.existsSync(n+".html"))n=n+".html";else if(_e.existsSync(dt.join(n,"index.html")))n=dt.join(n,"index.html");else{t.writeHead(404,{"Content-Type":"text/html"}),t.end("Not found");return}try{if(_e.statSync(n).isDirectory()){let u=dt.join(n,"index.html");if(_e.existsSync(u))n=u;else{t.writeHead(404),t.end();return}}}catch{t.writeHead(404),t.end();return}let o=_e.statSync(n),i=dt.extname(n).toLowerCase(),a=Zg[i]??"application/octet-stream",c=i===".html"?"no-cache":"public, max-age=31536000, immutable";t.writeHead(200,{"Content-Type":a,"Content-Length":o.size,"Cache-Control":c}),_e.createReadStream(n).pipe(t)}handleHealth(e){let t=this.healthCheckFn?.()??{},s=t.db!==!1?"ok":"degraded",r=s==="ok"?200:503;e.writeHead(r,{"Content-Type":"application/json"}),e.end(JSON.stringify({status:s,...t,timestamp:new Date().toISOString()}))}handleMetrics(e){this.metricsFn?(e.writeHead(200,{"Content-Type":"text/plain; version=0.0.4; charset=utf-8"}),e.end(this.metricsFn())):this.handleHealth(e)}handleMessage(e,t){if(!this.checkAuth(e,t))return;let s="",r=0,n=!1;e.on("data",o=>{if(!n){if(r+=o.length,r>Up){n=!0,t.writeHead(413,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"Payload too large"})),e.destroy();return}s+=o.toString()}}),e.on("end",()=>{if(!n)try{let o=JSON.parse(s),i=o.text;if(!i||typeof i!="string"){t.writeHead(400,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:'Missing or invalid "text" field'}));return}let a=o.chatId??`api-chat-${ci.randomUUID()}`,c=o.userId??"api-user",d=this.streams.get(a);d&&(this.writeSseEvent(d,"done",{type:"done"}),d.end()),t.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","Access-Control-Allow-Origin":this.corsOrigin,"Access-Control-Allow-Methods":"GET, POST, OPTIONS","Access-Control-Allow-Headers":"Content-Type, Authorization","X-Content-Type-Options":"nosniff"}),t.flushHeaders(),this.streams.set(a,t),t.on("close",()=>{this.streams.delete(a)}),this.messageCounter++;let u={id:`api-${this.messageCounter}`,platform:"api",chatId:a,chatType:"dm",userId:c,userName:c,displayName:"API User",text:i,timestamp:new Date};this.emit("message",u)}catch{t.writeHead(400,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"Invalid JSON body"}))}})}handleWebhook(e,t,s){let r=this.webhooks.get(s);if(!r){t.writeHead(404,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:`Webhook "${s}" not found`}));return}let n="",o=0,i=!1;e.on("data",a=>{if(!i){if(o+=a.length,o>Up){i=!0,t.writeHead(413,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"Payload too large"})),e.destroy();return}n+=a.toString()}}),e.on("end",async()=>{if(i)return;let a=e.headers["x-webhook-signature"];if(!a){t.writeHead(401,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"Missing X-Webhook-Signature header"}));return}let c=ci.createHmac("sha256",r.secret).update(n).digest(),d=Buffer.from(a,"hex");if(d.length!==c.length||!ci.timingSafeEqual(d,c)){t.writeHead(403,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"Invalid signature"}));return}try{let u=JSON.parse(n);await r.callback(u),t.writeHead(200,{"Content-Type":"application/json"}),t.end(JSON.stringify({ok:!0}))}catch(u){t.writeHead(500,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:u instanceof Error?u.message:"Internal error"}))}})}writeSseEvent(e,t,s){e.writableEnded||e.write(`event: ${t}
1429
1429
  data: ${JSON.stringify(s)}
1430
1430
 
1431
- `)}}});var bt={};me(bt,{CLIAdapter:()=>ai,DiscordAdapter:()=>ri,HttpAdapter:()=>li,MatrixAdapter:()=>ni,MessagingAdapter:()=>ye,SignalAdapter:()=>ii,TelegramAdapter:()=>ti,WhatsAppAdapter:()=>oi});var Et=T(()=>{"use strict";lt();Np();Lp();Dp();Mp();Op();Pp();Fp()});import nr from"node:fs";import Pe from"node:path";import Qg from"js-yaml";var Jt,jp=T(()=>{"use strict";ta();ho();ot();ga();yo();re();nc();ic();ac();cc();lc();dc();uc();pc();mc();hc();fc();gc();yc();vp();Tc();Sc();$c();vc();Ac();Ic();Rc();xc();Cc();Dc();Mc();Jt=class{static{p(this,"Alfred")}config;logger;database;pipeline;llmProvider;reminderScheduler;backgroundTaskRunner;proactiveScheduler;watchEngine;confirmationQueue;adapters=new Map;formatter=new kn;userRepo;skillRegistry;mcpManager;calendarSkill;calendarWatcher;todoWatcher;reasoningEngine;usageRepo;auditRepo;summaryRepo;activityRepo;memoryRepo;watchRepo;scheduledActionRepo;skillHealthRepo;reminderRepo;skillHealthTracker;healthCheckTimer;startedAt=new Date().toISOString();constructor(e){this.config=e,this.logger=Ir("alfred",e.logger.level)}async initialize(){this.logger.info("Initializing Alfred..."),this.database=new ht(this.config.storage.path);let e=this.database.getDb(),t=new ss(e),s=new rs(e);this.userRepo=s;let r=new ft(e);this.auditRepo=r;let n=new ns(e);this.memoryRepo=n;let o=new os(e);this.reminderRepo=o;let i=new is(e),a=new as(e),c=new cs(e),d=new ls(e),u=new us(e);this.scheduledActionRepo=u;let m=new yt(e);this.activityRepo=m;let h=new On(m,this.logger.child({component:"activity"})),f=new ws(e);this.skillHealthRepo=f;let g=new Pn(f,this.logger.child({component:"skill-health"}),h);this.skillHealthTracker=g,this.logger.info("Storage initialized");let y=new Fr,_=this.loadSecurityRules();y.loadRules(_);let S=new jr(y,r,this.logger.child({component:"security"}));this.logger.info({ruleCount:_.length},"Security engine initialized");let E=ha(this.config.llm,this.logger.child({component:"llm"}));await E.initialize(),this.llmProvider=E;let $=new ys(e);this.usageRepo=$,E.setPersist((C,j,Z,te,$e,ir)=>{$.record(C,j,Z,te,$e,ir)});let R=new bn(E,a,this.logger.child({component:"embeddings"})),M=this.config.activeLearning?.enabled!==!1,G,K;M&&(G=new Cn({llm:E,memoryRepo:n,logger:this.logger.child({component:"active-learning"}),embeddingService:R,minMessageLength:this.config.activeLearning?.minMessageLength,minConfidence:this.config.activeLearning?.minConfidence,maxExtractionsPerMinute:this.config.activeLearning?.maxExtractionsPerMinute}),K=new Nn(n,this.logger.child({component:"memory-retriever"}),R),this.logger.info("Active learning & memory retriever initialized"));let F=new gs(e);this.summaryRepo=F;let ee=new Ln(E,F,this.logger.child({component:"summarizer"}));this.logger.info("Conversation summarizer initialized");let ue=new Es(this.logger.child({component:"sandbox"})),D=this.skillRegistry=new bs;D.register(new Ss),D.register(new $s),D.register(new vs(this.config.search?{provider:this.config.search.provider,apiKey:this.config.search.apiKey,baseUrl:this.config.search.baseUrl}:void 0)),D.register(new As(o)),D.register(new Is(i));let ne=new ms(e);if(D.register(new Gs(ne)),D.register(new Rs),D.register(new xs),D.register(new Cs(n,R)),D.register(new Ns(E,D,ue,S)),this.config.email?.accounts?.length){let C=new Map;for(let Z of this.config.email.accounts)try{Z.provider==="microsoft"&&!Z.microsoft?.clientId&&this.config.calendar?.microsoft&&(Z.microsoft={...this.config.calendar.microsoft});let te=await Br(Z);C.set(Z.name,te),this.logger.info({account:Z.name,provider:Z.provider??"imap-smtp"},"Email account initialized")}catch(te){this.logger.warn({err:te,account:Z.name},"Email account initialization failed, skipping")}let j=C.size>0?new wt(C):new wt;j.setLLM(E),D.register(j)}else{let C=new wt;C.setLLM(E),D.register(C)}D.register(new Ls),D.register(new Ds);let ae=new Ys;ae.setReloadCallback(C=>this.reloadService(C)),D.register(ae),D.register(new Os),D.register(new Ps),D.register(new Us),D.register(new Fs(s)),D.register(new js(s,c,this.adapters,(C,j)=>t.findByPlatformAndUser(C,j)));let Q=new Bs(d);D.register(Q),D.register(new Hs(u));let W=new ps(e),he=new En(W,R,this.logger.child({component:"documents"}));D.register(new Ws(W,he,R));let Ve,le;if(this.config.calendar)try{le=await zr(this.config.calendar),Ve=new Ht(le),D.register(Ve),this.logger.info({provider:this.config.calendar.provider},"Calendar initialized")}catch(C){this.logger.warn({err:C},"Calendar initialization failed, continuing without calendar")}if(this.calendarSkill=Ve,le&&this.config.calendar?.vorlauf?.enabled){let C=new gt(e),j=this.config.security?.ownerUserId;j&&(this.calendarWatcher=new Dn(le,C,this.adapters,j,"telegram",this.config.calendar.vorlauf,this.logger.child({component:"calendar-watcher"}),h))}{let C=this.config.security?.ownerUserId;if(C){let j=new gt(e);this.todoWatcher=new Mn(ne,j,this.adapters,C,"telegram",{minutesBefore:30},this.logger.child({component:"todo-watcher"}),h)}}if(this.config.mcp?.servers?.length){let{MCPManager:C}=await Promise.resolve().then(()=>(re(),ie));this.mcpManager=new C(this.logger.child({component:"mcp"})),await this.mcpManager.initialize(this.config.mcp);for(let j of this.mcpManager.getSkills())D.register(j);this.logger.info({mcpSkills:this.mcpManager.getSkills().length},"MCP skills registered")}if(this.config.codeSandbox?.enabled){let{CodeExecutionSkill:C}=await Promise.resolve().then(()=>(re(),ie));D.register(new C({allowedLanguages:this.config.codeSandbox.allowedLanguages,maxTimeoutMs:this.config.codeSandbox.maxTimeoutMs})),this.logger.info("Code sandbox enabled")}if(this.config.codeAgents?.enabled){let{CodeAgentSkill:C}=await Promise.resolve().then(()=>(re(),ie));D.register(new C({agents:this.config.codeAgents.agents,forge:this.config.codeAgents.forge},E)),this.logger.info({agents:this.config.codeAgents.agents.map(j=>j.name)},"Code agent skill enabled")}if(this.config.projectAgents?.enabled&&this.config.codeAgents?.agents){let{ProjectAgentSkill:C}=await Promise.resolve().then(()=>(re(),ie)),{ProjectAgentSessionRepository:j}=await Promise.resolve().then(()=>(ho(),fd)),Z=new j(e),te=new C({...this.config.projectAgents,agents:this.config.codeAgents.agents},E,Z),{ProjectAgentRunner:$e}=await Promise.resolve().then(()=>(Oc(),xp)),ir=new $e(new Map(this.config.codeAgents.agents.map(ar=>[ar.name,ar])),E,Z,this.adapters,this.logger.child({component:"project-agent"}));te.setRunner(ir),D.register(te),this.logger.info("Project agent skill enabled")}if(this.config.proxmox){let{ProxmoxSkill:C}=await Promise.resolve().then(()=>(re(),ie));D.register(new C(this.config.proxmox)),this.logger.info({baseUrl:this.config.proxmox.baseUrl},"Proxmox skill enabled")}if(this.config.unifi){let{UniFiSkill:C}=await Promise.resolve().then(()=>(re(),ie));D.register(new C(this.config.unifi)),this.logger.info({baseUrl:this.config.unifi.baseUrl},"UniFi skill enabled")}if(this.config.homeassistant){let{HomeAssistantSkill:C}=await Promise.resolve().then(()=>(re(),ie));D.register(new C(this.config.homeassistant)),this.logger.info({baseUrl:this.config.homeassistant.baseUrl},"Home Assistant skill enabled")}if(this.config.contacts)try{let{ContactsSkill:C,createContactsProvider:j}=await Promise.resolve().then(()=>(re(),ie)),Z=await j(this.config.contacts);D.register(new C(Z)),this.logger.info({provider:this.config.contacts.provider},"Contacts skill enabled")}catch(C){this.logger.warn({err:C},"Contacts initialization failed, continuing without contacts")}if(this.config.docker){let{DockerSkill:C}=await Promise.resolve().then(()=>(re(),ie));D.register(new C(this.config.docker)),this.logger.info("Docker skill enabled")}if(this.config.bmw){let{BMWSkill:C}=await Promise.resolve().then(()=>(re(),ie));D.register(new C(this.config.bmw)),this.logger.info("BMW CarData skill enabled")}if(this.config.routing){let{RoutingSkill:C}=await Promise.resolve().then(()=>(re(),ie));D.register(new C(this.config.routing)),this.logger.info("Routing skill enabled")}if(this.config.todo){let{MicrosoftTodoSkill:C}=await Promise.resolve().then(()=>(re(),ie));D.register(new C(this.config.todo)),this.logger.info("Microsoft To Do skill enabled")}if(this.config.proxmox||this.config.unifi||this.config.homeassistant||this.config.proxmoxBackup){let{MonitorSkill:C}=await Promise.resolve().then(()=>(re(),ie));D.register(new C({proxmox:this.config.proxmox,unifi:this.config.unifi,homeassistant:this.config.homeassistant,proxmoxBackup:this.config.proxmoxBackup})),this.logger.info("Infrastructure monitor skill enabled")}{let{EnergyPriceSkill:C}=await Promise.resolve().then(()=>(re(),ie));D.register(new C(this.config.energy)),this.logger.info({grid:this.config.energy?.gridName},"Energy price skill registered")}{let{MarketplaceSkill:C}=await Promise.resolve().then(()=>(re(),ie));D.register(new C(this.config.marketplace)),this.logger.info("Marketplace skill registered")}{let{BriefingSkill:C}=await Promise.resolve().then(()=>(re(),ie));D.register(new C(D,this.config,n)),this.logger.info("Briefing skill registered")}if(D.register(new Qs(n)),this.logger.info("Feed reader skill registered"),this.config.youtube?.apiKey){let{YouTubeSkill:C}=await Promise.resolve().then(()=>(re(),ie));D.register(new C(this.config.youtube)),this.logger.info("YouTube skill registered")}this.logger.info({skills:D.getAll().map(C=>C.metadata.name)},"Skills registered");let Se;if(this.config.speech?.apiKey&&(Se=new yn(this.config.speech,this.logger.child({component:"speech"})),this.logger.info({provider:this.config.speech.provider},"Speech-to-text initialized")),this.config.speech?.ttsEnabled){let C=new wn(this.config.speech,this.logger.child({component:"tts"}));D.register(new zs(C)),this.logger.info("Text-to-speech skill registered")}let pe=this.detectImageGenProvider();if(pe){let C=new Tn(pe,this.logger.child({component:"image-gen"}));D.register(new qs(C)),this.logger.info({provider:pe.provider},"Image generation skill registered")}try{let C=new _n(this.logger.child({component:"transit"}));D.register(new Xs(C)),this.logger.info("Public transit skill registered")}catch(C){this.logger.warn({err:C},"Failed to register transit skill")}let Ue=new hn(t),Qe=Pe.resolve(Pe.dirname(this.config.storage.path),"inbox");this.pipeline=new fn({llm:E,conversationManager:Ue,users:s,logger:this.logger.child({component:"pipeline"}),skillRegistry:D,skillSandbox:ue,securityManager:S,memoryRepo:n,speechTranscriber:Se,inboxPath:Qe,embeddingService:R,activeLearning:G,memoryRetriever:K,maxHistoryMessages:this.config.conversation?.maxHistoryMessages??100,documentProcessor:he,conversationSummarizer:ee}),this.reminderScheduler=new gn(o,async(C,j,Z)=>{let te=this.adapters.get(C);te?await te.sendMessage(j,Z):this.logger.warn({platform:C,chatId:j},"No adapter for reminder platform")},this.logger.child({component:"reminders"}),15e3,{getMasterUserId:p(C=>s.getMasterUserId(C),"getMasterUserId"),getLinkedUsers:p(C=>s.getLinkedUsers(C),"getLinkedUsers"),findConversation:p((C,j)=>t.findByPlatformAndUser(C,j),"findConversation")}),this.backgroundTaskRunner=new Sn(D,ue,d,this.adapters,s,this.logger.child({component:"background-tasks"}),h,g);let Ye=new $n(D,ue,d,this.adapters,s,this.logger.child({component:"persistent-agents"}),h);this.backgroundTaskRunner.setPersistentRunner(Ye),Q.setPersistentRunner(Ye),this.proactiveScheduler=new vn(u,D,ue,E,this.adapters,s,this.logger.child({component:"proactive-scheduler"}),this.pipeline,this.formatter,Ue,h);let et=new hs(e);this.watchRepo=et,D.register(new Js(et,D));let Me=new fs(e);this.confirmationQueue=new Rn(Me,D,ue,this.adapters,this.logger.child({component:"confirmation-queue"}),h);let $t=new _s(e),vt=new rr($t,n,this.logger.child({component:"feedback"}));this.confirmationQueue.setFeedbackService(vt),G&&G.setFeedbackService(vt),this.watchEngine=new Zo(et,D,ue,this.adapters,s,this.logger.child({component:"watch-engine"}),this.confirmationQueue,h,g,E);let tt=new Ts(e),X=new Zs(tt);D.register(X);let z=new Un(tt,D,ue,this.logger.child({component:"workflow-runner"}),h,g);X.setRunner(z);{let C=this.config.security?.ownerUserId;if(C&&this.config.reasoning?.enabled!==!1){let j=new gt(e);this.reasoningEngine=new jn(le,ne,et,n,m,f,j,D,ue,E,this.adapters,s,C,"telegram",this.config.reasoning,this.logger.child({component:"reasoning-engine"}),h,this.config.briefing?.location,$t,this.confirmationQueue)}}this.pipeline.setConfirmationQueue(this.confirmationQueue),this.pipeline.setActivityLogger(h),this.pipeline.setSkillHealthTracker(g),await this.initializeAdapters(),this.logger.info("Alfred initialized")}async initializeAdapters(){let{config:e}=this;if(e.telegram.enabled&&e.telegram.token){let{TelegramAdapter:t}=await Promise.resolve().then(()=>(Et(),bt));this.adapters.set("telegram",new t(e.telegram.token)),this.logger.info("Telegram adapter registered")}if(e.discord?.enabled&&e.discord.token){let{DiscordAdapter:t}=await Promise.resolve().then(()=>(Et(),bt));this.adapters.set("discord",new t(e.discord.token)),this.logger.info("Discord adapter registered")}if(e.whatsapp?.enabled){let{WhatsAppAdapter:t}=await Promise.resolve().then(()=>(Et(),bt));this.adapters.set("whatsapp",new t(e.whatsapp.dataPath)),this.logger.info("WhatsApp adapter registered")}if(e.matrix?.enabled&&e.matrix.accessToken){let{MatrixAdapter:t}=await Promise.resolve().then(()=>(Et(),bt));this.adapters.set("matrix",new t(e.matrix.homeserverUrl,e.matrix.accessToken,e.matrix.userId)),this.logger.info("Matrix adapter registered")}if(e.signal?.enabled&&e.signal.phoneNumber){let{SignalAdapter:t}=await Promise.resolve().then(()=>(Et(),bt));this.adapters.set("signal",new t(e.signal.apiUrl,e.signal.phoneNumber)),this.logger.info("Signal adapter registered")}if(e.api?.enabled!==!1){let{HttpAdapter:t}=await Promise.resolve().then(()=>(Et(),bt)),s=e.api?.port??3420,r=e.api?.host??"127.0.0.1";e.api?.token?this.logger.info("HTTP API authentication enabled"):this.logger.warn("HTTP API has no authentication token configured (api.token). API is open."),this.adapters.set("api",new t(s,r,{apiToken:e.api?.token,corsOrigin:e.api?.corsOrigin,tls:e.api?.tls,healthCheck:p(()=>{let n;try{let o=this.config.storage.path,i=nr.statSync(o);n={path:o,sizeBytes:i.size}}catch{}return{db:!!this.database,uptime:Math.floor(process.uptime()),startedAt:this.startedAt,adapters:Object.fromEntries([...this.adapters].map(([o,i])=>[o,i.getStatus()])),metrics:this.pipeline.getMetrics(),costs:this.llmProvider.getCostSummary(),todayUsage:this.usageRepo?.getDaily(new Date().toISOString().slice(0,10)),watchesActive:this.watchRepo?.countEnabled()??0,schedulersActive:this.scheduledActionRepo?.countEnabled()??0,llmProviders:this.llmProvider.getProviderStatuses(),diskUsage:n}},"healthCheck"),metricsCallback:p(()=>this.buildPrometheusMetrics(),"metricsCallback"),dashboardCallback:p(()=>{let n=new Date().toISOString().slice(0,10),o=new Date(Date.now()-10080*6e4).toISOString().slice(0,10);return{watches:this.watchRepo?.getEnabled()??[],scheduled:this.scheduledActionRepo?.getAll()??[],skillHealth:this.skillHealthRepo?.getAll()??[],reminders:this.reminderRepo?.getAllPending()??[],usage:{today:this.usageRepo?.getDaily(n)??null,week:this.usageRepo?.getRange(o,n)??[],total:this.usageRepo?.getTotal()??[]},uptime:Math.floor(process.uptime()),startedAt:this.startedAt,adapters:Object.fromEntries([...this.adapters.entries()].map(([i,a])=>[i,a.getStatus()]))}},"dashboardCallback"),webUiPath:e.api?.webUi!==!1?this.resolveWebUiPath():void 0})),this.logger.info({port:s,host:r,webUi:e.api?.webUi!==!1},"HTTP API adapter registered")}}async start(){this.logger.info("Starting Alfred...");for(let[e,t]of this.adapters){this.setupAdapterHandlers(e,t);try{await t.connect(),this.logger.info({platform:e},"Adapter connected")}catch(s){this.logger.error({platform:e,err:s},"Adapter connection failed \u2014 skipping")}}if(this.reminderScheduler?.start(),this.backgroundTaskRunner?.start(),this.proactiveScheduler?.start(),this.watchEngine?.start(),this.confirmationQueue?.start(),this.calendarWatcher?.start(),this.todoWatcher?.start(),this.reasoningEngine?.start(),this.config.webhooks?.length&&this.watchEngine){let e=this.adapters.get("api");if(e&&"addWebhook"in e){let t=e;for(let s of this.config.webhooks)t.addWebhook({name:s.name,secret:s.secret,callback:p(async r=>{if(s.watchId&&this.watchEngine&&await this.watchEngine.triggerWatch(s.watchId),s.chatId&&s.platform){let n=this.adapters.get(s.platform);if(n){let o=`\u{1F514} Webhook "${s.name}" triggered`+(r.action?`: ${r.action}`:"");await n.sendMessage(s.chatId,o)}}},"callback")}),this.logger.info({name:s.name,watchId:s.watchId},"Webhook registered")}}try{let e={audit:this.auditRepo?.cleanup(90)??0,summaries:this.summaryRepo?.cleanup(180)??0,activity:this.activityRepo?.cleanup(90)??0,usage:this.usageRepo?.cleanup(365)??0,expiredMemories:this.memoryRepo?.cleanupExpired()??0};(e.audit||e.summaries||e.activity||e.usage)&&this.logger.info(e,"Startup DB cleanup completed")}catch(e){this.logger.warn({err:e},"Startup DB cleanup failed")}this.skillHealthTracker&&(this.healthCheckTimer=setInterval(()=>this.skillHealthTracker.checkReEnables(),5*6e4)),this.adapters.size===0&&this.logger.warn("No messaging adapters enabled. Configure at least one platform."),this.logger.info(`Alfred is running with ${this.adapters.size} adapter(s)`)}async startWithCLI(){this.adapters.clear();let{CLIAdapter:e}=await Promise.resolve().then(()=>(Et(),bt)),t=new e;this.adapters.set("cli",t),t.on("disconnected",()=>{this.stop().then(()=>process.exit(0))}),await this.start()}async stop(){this.logger.info("Stopping Alfred..."),this.reminderScheduler?.stop(),this.backgroundTaskRunner?.stop(),this.proactiveScheduler?.stop(),this.watchEngine?.stop(),this.confirmationQueue?.stop(),this.calendarWatcher?.stop(),this.todoWatcher?.stop(),this.reasoningEngine?.stop(),this.healthCheckTimer&&(clearInterval(this.healthCheckTimer),this.healthCheckTimer=void 0),this.mcpManager&&await this.mcpManager.shutdown();let e=5e3;for(let[t,s]of this.adapters)try{await Promise.race([s.disconnect(),new Promise(r=>setTimeout(r,e))]),this.logger.info({platform:t},"Adapter disconnected")}catch(r){this.logger.error({platform:t,err:r},"Failed to disconnect adapter")}try{this.database&&(this.database.getDb().pragma("wal_checkpoint(TRUNCATE)"),this.database.close())}catch{}this.logger.info("Alfred stopped")}async reloadService(e){try{Qi();let t=new fe().loadConfig();if(this.skillRegistry.has(e)&&this.skillRegistry.unregister(e),e==="proxmox"&&t.proxmox){let{ProxmoxSkill:s}=await Promise.resolve().then(()=>(re(),ie));this.skillRegistry.register(new s(t.proxmox)),this.config.proxmox=t.proxmox,this.logger.info({baseUrl:t.proxmox.baseUrl},"Proxmox skill hot-reloaded")}if(e==="unifi"&&t.unifi){let{UniFiSkill:s}=await Promise.resolve().then(()=>(re(),ie));this.skillRegistry.register(new s(t.unifi)),this.config.unifi=t.unifi,this.logger.info({baseUrl:t.unifi.baseUrl},"UniFi skill hot-reloaded")}if(e==="homeassistant"&&t.homeassistant){let{HomeAssistantSkill:s}=await Promise.resolve().then(()=>(re(),ie));this.skillRegistry.register(new s(t.homeassistant)),this.config.homeassistant=t.homeassistant,this.logger.info({baseUrl:t.homeassistant.baseUrl},"Home Assistant skill hot-reloaded")}if(e==="contacts"&&t.contacts){let{ContactsSkill:s,createContactsProvider:r}=await Promise.resolve().then(()=>(re(),ie)),n=await r(t.contacts);this.skillRegistry.register(new s(n)),this.config.contacts=t.contacts,this.logger.info({provider:t.contacts.provider},"Contacts skill hot-reloaded")}if(e==="docker"&&t.docker){let{DockerSkill:s}=await Promise.resolve().then(()=>(re(),ie));this.skillRegistry.register(new s(t.docker)),this.config.docker=t.docker,this.logger.info("Docker skill hot-reloaded")}if(e==="bmw"&&t.bmw){let{BMWSkill:s}=await Promise.resolve().then(()=>(re(),ie));this.skillRegistry.register(new s(t.bmw)),this.config.bmw=t.bmw,this.logger.info("BMW CarData skill hot-reloaded")}if(e==="routing"&&t.routing){let{RoutingSkill:s}=await Promise.resolve().then(()=>(re(),ie));this.skillRegistry.register(new s(t.routing)),this.config.routing=t.routing,this.logger.info("Routing skill hot-reloaded")}if(e==="todo"&&t.todo){let{MicrosoftTodoSkill:s}=await Promise.resolve().then(()=>(re(),ie));this.skillRegistry.register(new s(t.todo)),this.config.todo=t.todo,this.logger.info("Microsoft To Do skill hot-reloaded")}return{success:!0}}catch(t){let s=t instanceof Error?t.message:String(t);return this.logger.error({err:t,service:e},"Failed to hot-reload service"),{success:!1,error:s}}}resolveWebUiPath(){let e;try{e=Pe.dirname(new URL(import.meta.url).pathname),process.platform==="win32"&&e.startsWith("/")&&(e=e.slice(1))}catch{e=process.cwd()}let t=[Pe.join(process.cwd(),"web-ui"),Pe.join(e,"..","web-ui"),Pe.join(e,"web-ui"),Pe.join(e,"..","..","web-ui"),Pe.join(e,"..","..","apps","web","out")];for(let s of t)try{let r=Pe.resolve(s);if(nr.existsSync(Pe.join(r,"index.html")))return this.logger.info({path:r},"Web UI found"),r}catch{}this.logger.debug("Web UI not found \u2014 serving API only")}buildPrometheusMetrics(){let e=[],t=Math.floor(process.uptime());e.push("# HELP alfred_uptime_seconds Process uptime in seconds"),e.push("# TYPE alfred_uptime_seconds gauge"),e.push(`alfred_uptime_seconds ${t}`);let s=this.pipeline.getMetrics();e.push("# HELP alfred_requests_total Total messages processed"),e.push("# TYPE alfred_requests_total counter"),e.push(`alfred_requests_total ${s.requestsTotal}`),e.push("# HELP alfred_requests_success_total Successful requests"),e.push("# TYPE alfred_requests_success_total counter"),e.push(`alfred_requests_success_total ${s.requestsSuccess}`),e.push("# HELP alfred_requests_failed_total Failed requests"),e.push("# TYPE alfred_requests_failed_total counter"),e.push(`alfred_requests_failed_total ${s.requestsFailed}`),e.push("# HELP alfred_request_duration_avg_ms Average request duration"),e.push("# TYPE alfred_request_duration_avg_ms gauge"),e.push(`alfred_request_duration_avg_ms ${s.avgDurationMs}`);let r=this.llmProvider.getCostSummary();e.push("# HELP alfred_llm_input_tokens_total Total LLM input tokens (session)"),e.push("# TYPE alfred_llm_input_tokens_total counter"),e.push(`alfred_llm_input_tokens_total ${r.totalInputTokens}`),e.push("# HELP alfred_llm_output_tokens_total Total LLM output tokens (session)"),e.push("# TYPE alfred_llm_output_tokens_total counter"),e.push(`alfred_llm_output_tokens_total ${r.totalOutputTokens}`),e.push("# HELP alfred_llm_cost_usd_total Total LLM cost in USD (session)"),e.push("# TYPE alfred_llm_cost_usd_total counter"),e.push(`alfred_llm_cost_usd_total ${r.totalCostUsd}`),e.push("# HELP alfred_llm_calls_total LLM calls by model"),e.push("# TYPE alfred_llm_calls_total counter");for(let[n,o]of Object.entries(r.byModel)){let i=`model="${n}"`;e.push(`alfred_llm_calls_total{${i}} ${o.calls}`)}e.push("# HELP alfred_llm_cost_usd LLM cost by model"),e.push("# TYPE alfred_llm_cost_usd counter");for(let[n,o]of Object.entries(r.byModel))e.push(`alfred_llm_cost_usd{model="${n}"} ${o.costUsd}`);e.push("# HELP alfred_llm_input_tokens LLM input tokens by model"),e.push("# TYPE alfred_llm_input_tokens counter");for(let[n,o]of Object.entries(r.byModel))e.push(`alfred_llm_input_tokens{model="${n}"} ${o.inputTokens}`);e.push("# HELP alfred_llm_output_tokens LLM output tokens by model"),e.push("# TYPE alfred_llm_output_tokens counter");for(let[n,o]of Object.entries(r.byModel))e.push(`alfred_llm_output_tokens{model="${n}"} ${o.outputTokens}`);if(this.watchRepo&&(e.push("# HELP alfred_watches_active Number of enabled watches"),e.push("# TYPE alfred_watches_active gauge"),e.push(`alfred_watches_active ${this.watchRepo.countEnabled()}`)),this.scheduledActionRepo&&(e.push("# HELP alfred_schedulers_active Number of enabled scheduled actions"),e.push("# TYPE alfred_schedulers_active gauge"),e.push(`alfred_schedulers_active ${this.scheduledActionRepo.countEnabled()}`)),this.usageRepo){let n=new Date().toISOString().slice(0,10),o=this.usageRepo.getDaily(n);e.push("# HELP alfred_llm_today_cost_usd Total LLM cost today (persisted)"),e.push("# TYPE alfred_llm_today_cost_usd gauge"),e.push(`alfred_llm_today_cost_usd ${o.totalCostUsd}`),e.push("# HELP alfred_llm_today_calls Total LLM calls today (persisted)"),e.push("# TYPE alfred_llm_today_calls gauge"),e.push(`alfred_llm_today_calls ${o.totalCalls}`)}return e.push(""),e.join(`
1431
+ `)}}});var bt={};me(bt,{CLIAdapter:()=>ai,DiscordAdapter:()=>ri,HttpAdapter:()=>li,MatrixAdapter:()=>ni,MessagingAdapter:()=>ye,SignalAdapter:()=>ii,TelegramAdapter:()=>ti,WhatsAppAdapter:()=>oi});var Et=T(()=>{"use strict";lt();Np();Lp();Dp();Mp();Op();Pp();Fp()});import nr from"node:fs";import Pe from"node:path";import Qg from"js-yaml";var Jt,jp=T(()=>{"use strict";ta();ho();ot();ga();yo();re();nc();ic();ac();cc();lc();dc();uc();pc();mc();hc();fc();gc();yc();vp();Tc();Sc();$c();vc();Ac();Ic();Rc();xc();Cc();Dc();Mc();Jt=class{static{p(this,"Alfred")}config;logger;database;pipeline;llmProvider;reminderScheduler;backgroundTaskRunner;proactiveScheduler;watchEngine;confirmationQueue;adapters=new Map;formatter=new kn;userRepo;skillRegistry;mcpManager;calendarSkill;calendarWatcher;todoWatcher;reasoningEngine;usageRepo;auditRepo;summaryRepo;activityRepo;memoryRepo;watchRepo;scheduledActionRepo;skillHealthRepo;reminderRepo;skillHealthTracker;healthCheckTimer;startedAt=new Date().toISOString();constructor(e){this.config=e,this.logger=Ir("alfred",e.logger.level)}async initialize(){this.logger.info("Initializing Alfred..."),this.database=new ht(this.config.storage.path);let e=this.database.getDb(),t=new ss(e),s=new rs(e);this.userRepo=s;let r=new ft(e);this.auditRepo=r;let n=new ns(e);this.memoryRepo=n;let o=new os(e);this.reminderRepo=o;let i=new is(e),a=new as(e),c=new cs(e),d=new ls(e),u=new us(e);this.scheduledActionRepo=u;let m=new yt(e);this.activityRepo=m;let h=new On(m,this.logger.child({component:"activity"})),f=new ws(e);this.skillHealthRepo=f;let g=new Pn(f,this.logger.child({component:"skill-health"}),h);this.skillHealthTracker=g,this.logger.info("Storage initialized");let y=new Fr,_=this.loadSecurityRules();y.loadRules(_);let S=new jr(y,r,this.logger.child({component:"security"}));this.logger.info({ruleCount:_.length},"Security engine initialized");let E=ha(this.config.llm,this.logger.child({component:"llm"}));await E.initialize(),this.llmProvider=E;let $=new ys(e);this.usageRepo=$,E.setPersist((C,j,Z,te,$e,ir)=>{$.record(C,j,Z,te,$e,ir)});let R=new bn(E,a,this.logger.child({component:"embeddings"})),M=this.config.activeLearning?.enabled!==!1,G,K;M&&(G=new Cn({llm:E,memoryRepo:n,logger:this.logger.child({component:"active-learning"}),embeddingService:R,minMessageLength:this.config.activeLearning?.minMessageLength,minConfidence:this.config.activeLearning?.minConfidence,maxExtractionsPerMinute:this.config.activeLearning?.maxExtractionsPerMinute}),K=new Nn(n,this.logger.child({component:"memory-retriever"}),R),this.logger.info("Active learning & memory retriever initialized"));let F=new gs(e);this.summaryRepo=F;let ee=new Ln(E,F,this.logger.child({component:"summarizer"}));this.logger.info("Conversation summarizer initialized");let ue=new Es(this.logger.child({component:"sandbox"})),D=this.skillRegistry=new bs;D.register(new Ss),D.register(new $s),D.register(new vs(this.config.search?{provider:this.config.search.provider,apiKey:this.config.search.apiKey,baseUrl:this.config.search.baseUrl}:void 0)),D.register(new As(o)),D.register(new Is(i));let ne=new ms(e);if(D.register(new Gs(ne)),D.register(new Rs),D.register(new xs),D.register(new Cs(n,R)),D.register(new Ns(E,D,ue,S)),this.config.email?.accounts?.length){let C=new Map;for(let Z of this.config.email.accounts)try{Z.provider==="microsoft"&&!Z.microsoft?.clientId&&this.config.calendar?.microsoft&&(Z.microsoft={...this.config.calendar.microsoft});let te=await Br(Z);C.set(Z.name,te),this.logger.info({account:Z.name,provider:Z.provider??"imap-smtp"},"Email account initialized")}catch(te){this.logger.warn({err:te,account:Z.name},"Email account initialization failed, skipping")}let j=C.size>0?new wt(C):new wt;j.setLLM(E),D.register(j)}else{let C=new wt;C.setLLM(E),D.register(C)}D.register(new Ls),D.register(new Ds);let ae=new Ys;ae.setReloadCallback(C=>this.reloadService(C)),D.register(ae),D.register(new Os),D.register(new Ps),D.register(new Us),D.register(new Fs(s)),D.register(new js(s,c,this.adapters,(C,j)=>t.findByPlatformAndUser(C,j)));let Q=new Bs(d);D.register(Q),D.register(new Hs(u));let W=new ps(e),he=new En(W,R,this.logger.child({component:"documents"}));D.register(new Ws(W,he,R));let Ve,le;if(this.config.calendar)try{le=await zr(this.config.calendar),Ve=new Ht(le),D.register(Ve),this.logger.info({provider:this.config.calendar.provider},"Calendar initialized")}catch(C){this.logger.warn({err:C},"Calendar initialization failed, continuing without calendar")}if(this.calendarSkill=Ve,le&&this.config.calendar?.vorlauf?.enabled){let C=new gt(e),j=this.config.security?.ownerUserId;j&&(this.calendarWatcher=new Dn(le,C,this.adapters,j,"telegram",this.config.calendar.vorlauf,this.logger.child({component:"calendar-watcher"}),h))}{let C=this.config.security?.ownerUserId;if(C){let j=new gt(e);this.todoWatcher=new Mn(ne,j,this.adapters,C,"telegram",{minutesBefore:30},this.logger.child({component:"todo-watcher"}),h)}}if(this.config.mcp?.servers?.length){let{MCPManager:C}=await Promise.resolve().then(()=>(re(),ie));this.mcpManager=new C(this.logger.child({component:"mcp"})),await this.mcpManager.initialize(this.config.mcp);for(let j of this.mcpManager.getSkills())D.register(j);this.logger.info({mcpSkills:this.mcpManager.getSkills().length},"MCP skills registered")}if(this.config.codeSandbox?.enabled){let{CodeExecutionSkill:C}=await Promise.resolve().then(()=>(re(),ie));D.register(new C({allowedLanguages:this.config.codeSandbox.allowedLanguages,maxTimeoutMs:this.config.codeSandbox.maxTimeoutMs})),this.logger.info("Code sandbox enabled")}if(this.config.codeAgents?.enabled){let{CodeAgentSkill:C}=await Promise.resolve().then(()=>(re(),ie));D.register(new C({agents:this.config.codeAgents.agents,forge:this.config.codeAgents.forge},E)),this.logger.info({agents:this.config.codeAgents.agents.map(j=>j.name)},"Code agent skill enabled")}if(this.config.projectAgents?.enabled&&this.config.codeAgents?.agents){let{ProjectAgentSkill:C}=await Promise.resolve().then(()=>(re(),ie)),{ProjectAgentSessionRepository:j}=await Promise.resolve().then(()=>(ho(),fd)),Z=new j(e),te=new C({...this.config.projectAgents,agents:this.config.codeAgents.agents},E,Z),{ProjectAgentRunner:$e}=await Promise.resolve().then(()=>(Oc(),xp)),ir=new $e(new Map(this.config.codeAgents.agents.map(ar=>[ar.name,ar])),E,Z,this.adapters,this.logger.child({component:"project-agent"}));te.setRunner(ir),D.register(te),this.logger.info("Project agent skill enabled")}if(this.config.proxmox){let{ProxmoxSkill:C}=await Promise.resolve().then(()=>(re(),ie));D.register(new C(this.config.proxmox)),this.logger.info({baseUrl:this.config.proxmox.baseUrl},"Proxmox skill enabled")}if(this.config.unifi){let{UniFiSkill:C}=await Promise.resolve().then(()=>(re(),ie));D.register(new C(this.config.unifi)),this.logger.info({baseUrl:this.config.unifi.baseUrl},"UniFi skill enabled")}if(this.config.homeassistant){let{HomeAssistantSkill:C}=await Promise.resolve().then(()=>(re(),ie));D.register(new C(this.config.homeassistant)),this.logger.info({baseUrl:this.config.homeassistant.baseUrl},"Home Assistant skill enabled")}if(this.config.contacts)try{let{ContactsSkill:C,createContactsProvider:j}=await Promise.resolve().then(()=>(re(),ie)),Z=await j(this.config.contacts);D.register(new C(Z)),this.logger.info({provider:this.config.contacts.provider},"Contacts skill enabled")}catch(C){this.logger.warn({err:C},"Contacts initialization failed, continuing without contacts")}if(this.config.docker){let{DockerSkill:C}=await Promise.resolve().then(()=>(re(),ie));D.register(new C(this.config.docker)),this.logger.info("Docker skill enabled")}if(this.config.bmw){let{BMWSkill:C}=await Promise.resolve().then(()=>(re(),ie));D.register(new C(this.config.bmw)),this.logger.info("BMW CarData skill enabled")}if(this.config.routing){let{RoutingSkill:C}=await Promise.resolve().then(()=>(re(),ie));D.register(new C(this.config.routing)),this.logger.info("Routing skill enabled")}if(this.config.todo){let{MicrosoftTodoSkill:C}=await Promise.resolve().then(()=>(re(),ie));D.register(new C(this.config.todo)),this.logger.info("Microsoft To Do skill enabled")}if(this.config.proxmox||this.config.unifi||this.config.homeassistant||this.config.proxmoxBackup){let{MonitorSkill:C}=await Promise.resolve().then(()=>(re(),ie));D.register(new C({proxmox:this.config.proxmox,unifi:this.config.unifi,homeassistant:this.config.homeassistant,proxmoxBackup:this.config.proxmoxBackup})),this.logger.info("Infrastructure monitor skill enabled")}{let{EnergyPriceSkill:C}=await Promise.resolve().then(()=>(re(),ie));D.register(new C(this.config.energy)),this.logger.info({grid:this.config.energy?.gridName},"Energy price skill registered")}{let{MarketplaceSkill:C}=await Promise.resolve().then(()=>(re(),ie));D.register(new C(this.config.marketplace)),this.logger.info("Marketplace skill registered")}{let{BriefingSkill:C}=await Promise.resolve().then(()=>(re(),ie));D.register(new C(D,this.config,n)),this.logger.info("Briefing skill registered")}if(D.register(new Qs(n)),this.logger.info("Feed reader skill registered"),this.config.youtube?.apiKey){let{YouTubeSkill:C}=await Promise.resolve().then(()=>(re(),ie));D.register(new C(this.config.youtube)),this.logger.info("YouTube skill registered")}this.logger.info({skills:D.getAll().map(C=>C.metadata.name)},"Skills registered");let Se;if(this.config.speech?.apiKey&&(Se=new yn(this.config.speech,this.logger.child({component:"speech"})),this.logger.info({provider:this.config.speech.provider},"Speech-to-text initialized")),this.config.speech?.ttsEnabled){let C=new wn(this.config.speech,this.logger.child({component:"tts"}));D.register(new zs(C)),this.logger.info("Text-to-speech skill registered")}let pe=this.detectImageGenProvider();if(pe){let C=new Tn(pe,this.logger.child({component:"image-gen"}));D.register(new qs(C)),this.logger.info({provider:pe.provider},"Image generation skill registered")}try{let C=new _n(this.logger.child({component:"transit"}));D.register(new Xs(C)),this.logger.info("Public transit skill registered")}catch(C){this.logger.warn({err:C},"Failed to register transit skill")}let Ue=new hn(t),Qe=Pe.resolve(Pe.dirname(this.config.storage.path),"inbox");this.pipeline=new fn({llm:E,conversationManager:Ue,users:s,logger:this.logger.child({component:"pipeline"}),skillRegistry:D,skillSandbox:ue,securityManager:S,memoryRepo:n,speechTranscriber:Se,inboxPath:Qe,embeddingService:R,activeLearning:G,memoryRetriever:K,maxHistoryMessages:this.config.conversation?.maxHistoryMessages??100,documentProcessor:he,conversationSummarizer:ee}),this.reminderScheduler=new gn(o,async(C,j,Z)=>{let te=this.adapters.get(C);te?await te.sendMessage(j,Z):this.logger.warn({platform:C,chatId:j},"No adapter for reminder platform")},this.logger.child({component:"reminders"}),15e3,{getMasterUserId:p(C=>s.getMasterUserId(C),"getMasterUserId"),getLinkedUsers:p(C=>s.getLinkedUsers(C),"getLinkedUsers"),findConversation:p((C,j)=>t.findByPlatformAndUser(C,j),"findConversation")}),this.backgroundTaskRunner=new Sn(D,ue,d,this.adapters,s,this.logger.child({component:"background-tasks"}),h,g);let Ye=new $n(D,ue,d,this.adapters,s,this.logger.child({component:"persistent-agents"}),h);this.backgroundTaskRunner.setPersistentRunner(Ye),Q.setPersistentRunner(Ye),this.proactiveScheduler=new vn(u,D,ue,E,this.adapters,s,this.logger.child({component:"proactive-scheduler"}),this.pipeline,this.formatter,Ue,h);let et=new hs(e);this.watchRepo=et,D.register(new Js(et,D));let Me=new fs(e);this.confirmationQueue=new Rn(Me,D,ue,this.adapters,this.logger.child({component:"confirmation-queue"}),h);let $t=new _s(e),vt=new rr($t,n,this.logger.child({component:"feedback"}));this.confirmationQueue.setFeedbackService(vt),G&&G.setFeedbackService(vt),this.watchEngine=new Zo(et,D,ue,this.adapters,s,this.logger.child({component:"watch-engine"}),this.confirmationQueue,h,g,E);let tt=new Ts(e),X=new Zs(tt);D.register(X);let z=new Un(tt,D,ue,this.logger.child({component:"workflow-runner"}),h,g);X.setRunner(z);{let C=this.config.security?.ownerUserId;if(C&&this.config.reasoning?.enabled!==!1){let j=new gt(e);this.reasoningEngine=new jn(le,ne,et,n,m,f,j,D,ue,E,this.adapters,s,C,"telegram",this.config.reasoning,this.logger.child({component:"reasoning-engine"}),h,this.config.briefing?.location,$t,this.confirmationQueue)}}this.pipeline.setConfirmationQueue(this.confirmationQueue),this.pipeline.setActivityLogger(h),this.pipeline.setSkillHealthTracker(g),await this.initializeAdapters(),this.logger.info("Alfred initialized")}async initializeAdapters(){let{config:e}=this;if(e.telegram.enabled&&e.telegram.token){let{TelegramAdapter:t}=await Promise.resolve().then(()=>(Et(),bt));this.adapters.set("telegram",new t(e.telegram.token)),this.logger.info("Telegram adapter registered")}if(e.discord?.enabled&&e.discord.token){let{DiscordAdapter:t}=await Promise.resolve().then(()=>(Et(),bt));this.adapters.set("discord",new t(e.discord.token)),this.logger.info("Discord adapter registered")}if(e.whatsapp?.enabled){let{WhatsAppAdapter:t}=await Promise.resolve().then(()=>(Et(),bt));this.adapters.set("whatsapp",new t(e.whatsapp.dataPath)),this.logger.info("WhatsApp adapter registered")}if(e.matrix?.enabled&&e.matrix.accessToken){let{MatrixAdapter:t}=await Promise.resolve().then(()=>(Et(),bt));this.adapters.set("matrix",new t(e.matrix.homeserverUrl,e.matrix.accessToken,e.matrix.userId)),this.logger.info("Matrix adapter registered")}if(e.signal?.enabled&&e.signal.phoneNumber){let{SignalAdapter:t}=await Promise.resolve().then(()=>(Et(),bt));this.adapters.set("signal",new t(e.signal.apiUrl,e.signal.phoneNumber)),this.logger.info("Signal adapter registered")}if(e.api?.enabled!==!1){let{HttpAdapter:t}=await Promise.resolve().then(()=>(Et(),bt)),s=e.api?.port??3420,r=e.api?.host??"127.0.0.1";e.api?.token?this.logger.info("HTTP API authentication enabled"):this.logger.warn("HTTP API has no authentication token configured (api.token). API is open."),this.adapters.set("api",new t(s,r,{apiToken:e.api?.token,corsOrigin:e.api?.corsOrigin,tls:e.api?.tls,healthCheck:p(()=>{let n;try{let o=this.config.storage.path,i=nr.statSync(o);n={path:o,sizeBytes:i.size}}catch{}return{db:!!this.database,uptime:Math.floor(process.uptime()),startedAt:this.startedAt,adapters:Object.fromEntries([...this.adapters].map(([o,i])=>[o,i.getStatus()])),metrics:this.pipeline.getMetrics(),costs:this.llmProvider.getCostSummary(),todayUsage:this.usageRepo?.getDaily(new Date().toISOString().slice(0,10)),watchesActive:this.watchRepo?.countEnabled()??0,schedulersActive:this.scheduledActionRepo?.countEnabled()??0,llmProviders:this.llmProvider.getProviderStatuses(),diskUsage:n}},"healthCheck"),metricsCallback:p(()=>this.buildPrometheusMetrics(),"metricsCallback"),dashboardCallback:p(()=>{let n=new Date().toISOString().slice(0,10),o=new Date(Date.now()-10080*6e4).toISOString().slice(0,10);return{watches:this.watchRepo?.getEnabled()??[],scheduled:this.scheduledActionRepo?.getAll()??[],skillHealth:this.skillHealthRepo?.getAll()??[],reminders:this.reminderRepo?.getAllPending()??[],usage:{today:this.usageRepo?.getDaily(n)??null,week:this.usageRepo?.getRange(o,n)??[],total:this.usageRepo?.getTotal()??[]},uptime:Math.floor(process.uptime()),startedAt:this.startedAt,adapters:Object.fromEntries([...this.adapters.entries()].map(([i,a])=>[i,a.getStatus()])),llmProviders:this.llmProvider.getProviderStatuses()}},"dashboardCallback"),webUiPath:e.api?.webUi!==!1?this.resolveWebUiPath():void 0})),this.logger.info({port:s,host:r,webUi:e.api?.webUi!==!1},"HTTP API adapter registered")}}async start(){this.logger.info("Starting Alfred...");for(let[e,t]of this.adapters){this.setupAdapterHandlers(e,t);try{await t.connect(),this.logger.info({platform:e},"Adapter connected")}catch(s){this.logger.error({platform:e,err:s},"Adapter connection failed \u2014 skipping")}}if(this.reminderScheduler?.start(),this.backgroundTaskRunner?.start(),this.proactiveScheduler?.start(),this.watchEngine?.start(),this.confirmationQueue?.start(),this.calendarWatcher?.start(),this.todoWatcher?.start(),this.reasoningEngine?.start(),this.config.webhooks?.length&&this.watchEngine){let e=this.adapters.get("api");if(e&&"addWebhook"in e){let t=e;for(let s of this.config.webhooks)t.addWebhook({name:s.name,secret:s.secret,callback:p(async r=>{if(s.watchId&&this.watchEngine&&await this.watchEngine.triggerWatch(s.watchId),s.chatId&&s.platform){let n=this.adapters.get(s.platform);if(n){let o=`\u{1F514} Webhook "${s.name}" triggered`+(r.action?`: ${r.action}`:"");await n.sendMessage(s.chatId,o)}}},"callback")}),this.logger.info({name:s.name,watchId:s.watchId},"Webhook registered")}}try{let e={audit:this.auditRepo?.cleanup(90)??0,summaries:this.summaryRepo?.cleanup(180)??0,activity:this.activityRepo?.cleanup(90)??0,usage:this.usageRepo?.cleanup(365)??0,expiredMemories:this.memoryRepo?.cleanupExpired()??0};(e.audit||e.summaries||e.activity||e.usage)&&this.logger.info(e,"Startup DB cleanup completed")}catch(e){this.logger.warn({err:e},"Startup DB cleanup failed")}this.skillHealthTracker&&(this.healthCheckTimer=setInterval(()=>this.skillHealthTracker.checkReEnables(),5*6e4)),this.adapters.size===0&&this.logger.warn("No messaging adapters enabled. Configure at least one platform."),this.logger.info(`Alfred is running with ${this.adapters.size} adapter(s)`)}async startWithCLI(){this.adapters.clear();let{CLIAdapter:e}=await Promise.resolve().then(()=>(Et(),bt)),t=new e;this.adapters.set("cli",t),t.on("disconnected",()=>{this.stop().then(()=>process.exit(0))}),await this.start()}async stop(){this.logger.info("Stopping Alfred..."),this.reminderScheduler?.stop(),this.backgroundTaskRunner?.stop(),this.proactiveScheduler?.stop(),this.watchEngine?.stop(),this.confirmationQueue?.stop(),this.calendarWatcher?.stop(),this.todoWatcher?.stop(),this.reasoningEngine?.stop(),this.healthCheckTimer&&(clearInterval(this.healthCheckTimer),this.healthCheckTimer=void 0),this.mcpManager&&await this.mcpManager.shutdown();let e=5e3;for(let[t,s]of this.adapters)try{await Promise.race([s.disconnect(),new Promise(r=>setTimeout(r,e))]),this.logger.info({platform:t},"Adapter disconnected")}catch(r){this.logger.error({platform:t,err:r},"Failed to disconnect adapter")}try{this.database&&(this.database.getDb().pragma("wal_checkpoint(TRUNCATE)"),this.database.close())}catch{}this.logger.info("Alfred stopped")}async reloadService(e){try{Qi();let t=new fe().loadConfig();if(this.skillRegistry.has(e)&&this.skillRegistry.unregister(e),e==="proxmox"&&t.proxmox){let{ProxmoxSkill:s}=await Promise.resolve().then(()=>(re(),ie));this.skillRegistry.register(new s(t.proxmox)),this.config.proxmox=t.proxmox,this.logger.info({baseUrl:t.proxmox.baseUrl},"Proxmox skill hot-reloaded")}if(e==="unifi"&&t.unifi){let{UniFiSkill:s}=await Promise.resolve().then(()=>(re(),ie));this.skillRegistry.register(new s(t.unifi)),this.config.unifi=t.unifi,this.logger.info({baseUrl:t.unifi.baseUrl},"UniFi skill hot-reloaded")}if(e==="homeassistant"&&t.homeassistant){let{HomeAssistantSkill:s}=await Promise.resolve().then(()=>(re(),ie));this.skillRegistry.register(new s(t.homeassistant)),this.config.homeassistant=t.homeassistant,this.logger.info({baseUrl:t.homeassistant.baseUrl},"Home Assistant skill hot-reloaded")}if(e==="contacts"&&t.contacts){let{ContactsSkill:s,createContactsProvider:r}=await Promise.resolve().then(()=>(re(),ie)),n=await r(t.contacts);this.skillRegistry.register(new s(n)),this.config.contacts=t.contacts,this.logger.info({provider:t.contacts.provider},"Contacts skill hot-reloaded")}if(e==="docker"&&t.docker){let{DockerSkill:s}=await Promise.resolve().then(()=>(re(),ie));this.skillRegistry.register(new s(t.docker)),this.config.docker=t.docker,this.logger.info("Docker skill hot-reloaded")}if(e==="bmw"&&t.bmw){let{BMWSkill:s}=await Promise.resolve().then(()=>(re(),ie));this.skillRegistry.register(new s(t.bmw)),this.config.bmw=t.bmw,this.logger.info("BMW CarData skill hot-reloaded")}if(e==="routing"&&t.routing){let{RoutingSkill:s}=await Promise.resolve().then(()=>(re(),ie));this.skillRegistry.register(new s(t.routing)),this.config.routing=t.routing,this.logger.info("Routing skill hot-reloaded")}if(e==="todo"&&t.todo){let{MicrosoftTodoSkill:s}=await Promise.resolve().then(()=>(re(),ie));this.skillRegistry.register(new s(t.todo)),this.config.todo=t.todo,this.logger.info("Microsoft To Do skill hot-reloaded")}return{success:!0}}catch(t){let s=t instanceof Error?t.message:String(t);return this.logger.error({err:t,service:e},"Failed to hot-reload service"),{success:!1,error:s}}}resolveWebUiPath(){let e;try{e=Pe.dirname(new URL(import.meta.url).pathname),process.platform==="win32"&&e.startsWith("/")&&(e=e.slice(1))}catch{e=process.cwd()}let t=[Pe.join(process.cwd(),"web-ui"),Pe.join(e,"..","web-ui"),Pe.join(e,"web-ui"),Pe.join(e,"..","..","web-ui"),Pe.join(e,"..","..","apps","web","out")];for(let s of t)try{let r=Pe.resolve(s);if(nr.existsSync(Pe.join(r,"index.html")))return this.logger.info({path:r},"Web UI found"),r}catch{}this.logger.debug("Web UI not found \u2014 serving API only")}buildPrometheusMetrics(){let e=[],t=Math.floor(process.uptime());e.push("# HELP alfred_uptime_seconds Process uptime in seconds"),e.push("# TYPE alfred_uptime_seconds gauge"),e.push(`alfred_uptime_seconds ${t}`);let s=this.pipeline.getMetrics();e.push("# HELP alfred_requests_total Total messages processed"),e.push("# TYPE alfred_requests_total counter"),e.push(`alfred_requests_total ${s.requestsTotal}`),e.push("# HELP alfred_requests_success_total Successful requests"),e.push("# TYPE alfred_requests_success_total counter"),e.push(`alfred_requests_success_total ${s.requestsSuccess}`),e.push("# HELP alfred_requests_failed_total Failed requests"),e.push("# TYPE alfred_requests_failed_total counter"),e.push(`alfred_requests_failed_total ${s.requestsFailed}`),e.push("# HELP alfred_request_duration_avg_ms Average request duration"),e.push("# TYPE alfred_request_duration_avg_ms gauge"),e.push(`alfred_request_duration_avg_ms ${s.avgDurationMs}`);let r=this.llmProvider.getCostSummary();e.push("# HELP alfred_llm_input_tokens_total Total LLM input tokens (session)"),e.push("# TYPE alfred_llm_input_tokens_total counter"),e.push(`alfred_llm_input_tokens_total ${r.totalInputTokens}`),e.push("# HELP alfred_llm_output_tokens_total Total LLM output tokens (session)"),e.push("# TYPE alfred_llm_output_tokens_total counter"),e.push(`alfred_llm_output_tokens_total ${r.totalOutputTokens}`),e.push("# HELP alfred_llm_cost_usd_total Total LLM cost in USD (session)"),e.push("# TYPE alfred_llm_cost_usd_total counter"),e.push(`alfred_llm_cost_usd_total ${r.totalCostUsd}`),e.push("# HELP alfred_llm_calls_total LLM calls by model"),e.push("# TYPE alfred_llm_calls_total counter");for(let[n,o]of Object.entries(r.byModel)){let i=`model="${n}"`;e.push(`alfred_llm_calls_total{${i}} ${o.calls}`)}e.push("# HELP alfred_llm_cost_usd LLM cost by model"),e.push("# TYPE alfred_llm_cost_usd counter");for(let[n,o]of Object.entries(r.byModel))e.push(`alfred_llm_cost_usd{model="${n}"} ${o.costUsd}`);e.push("# HELP alfred_llm_input_tokens LLM input tokens by model"),e.push("# TYPE alfred_llm_input_tokens counter");for(let[n,o]of Object.entries(r.byModel))e.push(`alfred_llm_input_tokens{model="${n}"} ${o.inputTokens}`);e.push("# HELP alfred_llm_output_tokens LLM output tokens by model"),e.push("# TYPE alfred_llm_output_tokens counter");for(let[n,o]of Object.entries(r.byModel))e.push(`alfred_llm_output_tokens{model="${n}"} ${o.outputTokens}`);if(this.watchRepo&&(e.push("# HELP alfred_watches_active Number of enabled watches"),e.push("# TYPE alfred_watches_active gauge"),e.push(`alfred_watches_active ${this.watchRepo.countEnabled()}`)),this.scheduledActionRepo&&(e.push("# HELP alfred_schedulers_active Number of enabled scheduled actions"),e.push("# TYPE alfred_schedulers_active gauge"),e.push(`alfred_schedulers_active ${this.scheduledActionRepo.countEnabled()}`)),this.usageRepo){let n=new Date().toISOString().slice(0,10),o=this.usageRepo.getDaily(n);e.push("# HELP alfred_llm_today_cost_usd Total LLM cost today (persisted)"),e.push("# TYPE alfred_llm_today_cost_usd gauge"),e.push(`alfred_llm_today_cost_usd ${o.totalCostUsd}`),e.push("# HELP alfred_llm_today_calls Total LLM calls today (persisted)"),e.push("# TYPE alfred_llm_today_calls gauge"),e.push(`alfred_llm_today_calls ${o.totalCalls}`)}return e.push(""),e.join(`
1432
1432
  `)}autoLinkApiUser(e){if(e.platform==="api")try{let t=this.userRepo.findOrCreate("api",e.userId,e.userName);if(this.userRepo.getMasterUserId(t.id)!==t.id)return;let r=this.userRepo.findFirstByPlatformNotIn(["api","cli"]);if(r){let n=this.userRepo.getMasterUserId(r.id);this.userRepo.setMasterUser(t.id,n),this.logger.info({apiUserId:t.id,masterUserId:n},"Auto-linked API user")}}catch(t){this.logger.debug({err:t},"Auto-link API user failed")}}setupAdapterHandlers(e,t){t.on("message",async s=>{try{this.autoLinkApiUser(s);let r,n="",o=p(async a=>{if(a!==n){n=a;try{e==="api"?await t.editMessage(s.chatId,r??"",a):r?await t.editMessage(s.chatId,r,a):r=await t.sendMessage(s.chatId,a)}catch(c){this.logger.debug({err:c,chatId:s.chatId},"Status message edit failed")}}},"onProgress"),i=await this.pipeline.process(s,o);if(i.text){let a=this.formatter.format(i.text,s.platform),c=a.parseMode!=="text"?{parseMode:a.parseMode}:void 0;try{if(r&&e!=="api")try{await t.editMessage(s.chatId,r,a.text,c)}catch(d){this.logger.debug({err:d,chatId:s.chatId},"Final response edit failed, sending as new message"),await t.sendMessage(s.chatId,a.text,c)}else await t.sendMessage(s.chatId,a.text,c)}catch(d){this.logger.warn({err:d,chatId:s.chatId},"Formatted send failed, retrying as plain text");let u=this.formatter.format(i.text,"signal");await t.sendMessage(s.chatId,u.text)}}if(i.attachments)for(let a of i.attachments)try{let c=a.mimeType?.startsWith("image/")??!1,d=a.mimeType==="audio/ogg"||a.mimeType==="audio/opus";c?await t.sendPhoto(s.chatId,a.data,a.fileName):d?await t.sendVoice(s.chatId,a.data):await t.sendFile(s.chatId,a.data,a.fileName)}catch(c){this.logger.warn({err:c,fileName:a.fileName,chatId:s.chatId},"Failed to send attachment")}t.endStream(s.chatId)}catch(r){this.logger.error({platform:e,err:r,chatId:s.chatId},"Failed to handle message");try{await t.sendMessage(s.chatId,"Sorry, I encountered an error processing your message. Please try again.")}catch(n){this.logger.error({err:n},"Failed to send error message")}t.endStream(s.chatId)}}),t.on("error",s=>{this.logger.error({platform:e,err:s},"Adapter error")}),t.on("connected",()=>{this.logger.info({platform:e},"Adapter connected")}),t.on("disconnected",()=>{this.logger.warn({platform:e},"Adapter disconnected")})}detectImageGenProvider(){let e=["default","strong","fast","embeddings","local"];for(let t of["openai","google"])for(let s of e){let r=this.config.llm[s];if(r?.provider===t&&r.apiKey)return{provider:t,apiKey:r.apiKey,baseUrl:r.baseUrl}}}loadSecurityRules(){let e=Pe.resolve(this.config.security.rulesPath),t=[];if(!nr.existsSync(e))return this.logger.warn({rulesPath:e},"Security rules directory not found, using default deny"),t;if(!nr.statSync(e).isDirectory())return this.logger.warn({rulesPath:e},"Security rules path is not a directory"),t;let r=nr.readdirSync(e).filter(n=>n.endsWith(".yml")||n.endsWith(".yaml"));for(let n of r)try{let o=Pe.join(e,n),i=nr.readFileSync(o,"utf-8"),a=Qg.load(i);if(a?.rules&&Array.isArray(a.rules)){let d=new at().loadFromObject({rules:a.rules});t.push(...d),this.logger.info({file:n,count:d.length},"Loaded security rules")}}catch(o){this.logger.error({err:o,file:n},"Failed to load security rules file")}return t}}});var Bp=T(()=>{"use strict"});var jc=T(()=>{"use strict";$c();Ec()});var Bc=T(()=>{"use strict";jp();ic();nc();ac();cc();lc();pc();mc();fc();gc();yc();_t();hc();dc();uc();Sc();vc();bc();Bp();kc();Ac();An();Lc();Tc();jc();Oc();jc();Ic();Rc();xc();Jo();Cc();Dc();Mc()});import di from"node:fs";import Hp from"node:path";import ey from"node:os";function Wp(){try{let l=di.readFileSync(Hc,"utf-8"),e=JSON.parse(l);if(e?.version===1&&e.providers)return e}catch{}return{version:1,providers:{}}}function zp(l){try{let e=Hp.dirname(Hc);di.existsSync(e)||di.mkdirSync(e,{recursive:!0}),di.writeFileSync(Hc,JSON.stringify(l,null,2),"utf-8")}catch{}}async function Zt(l,e){let t=new AbortController,s=setTimeout(()=>t.abort(),sy);try{return await fetch(l,{...e,signal:t.signal})}finally{clearTimeout(s)}}async function qp(l,e,t){switch(l){case"anthropic":{let s=await Zt("https://api.anthropic.com/v1/models",{headers:{"x-api-key":e??"","anthropic-version":"2023-06-01"}});return s.ok?((await s.json()).data??[]).map(n=>({id:n.id,name:n.display_name})):[]}case"openai":{let s=t?`${t.replace(/\/+$/,"")}/models`:"https://api.openai.com/v1/models",r=await Zt(s,{headers:{Authorization:`Bearer ${e??""}`}});return r.ok?((await r.json()).data??[]).map(o=>({id:o.id})):[]}case"google":{let s=`https://generativelanguage.googleapis.com/v1beta/models?key=${encodeURIComponent(e??"")}`,r=await Zt(s);return r.ok?((await r.json()).models??[]).map(o=>({id:o.name.replace(/^models\//,""),name:o.displayName})):[]}case"mistral":{let s=await Zt("https://api.mistral.ai/v1/models",{headers:{Authorization:`Bearer ${e??""}`}});return s.ok?((await s.json()).data??[]).map(n=>({id:n.id,name:n.name})):[]}case"openrouter":{let s=await Zt("https://openrouter.ai/api/v1/models",{headers:{Authorization:`Bearer ${e??""}`}});return s.ok?((await s.json()).data??[]).map(n=>({id:n.id,name:n.name})):[]}case"ollama":{let s=(t??"http://localhost:11434").replace(/\/+$/,""),r=await Zt(`${s}/api/tags`);return r.ok?((await r.json()).models??[]).map(o=>({id:o.name})):[]}case"openwebui":{let s=(t??"http://localhost:3000/api/v1").replace(/\/+$/,""),r=await Zt(`${s}/models`,{headers:{Authorization:`Bearer ${e??""}`}});return r.ok?((await r.json()).data??[]).map(o=>({id:o.id})):[]}default:return[]}}async function Wc(l,e,t){let s=Wp(),r=s.providers[l];if(r&&Date.now()-r.fetchedAt<ty)return r.models;try{let n=await qp(l,e,t);if(n.length>0)return s.providers[l]={fetchedAt:Date.now(),models:n},zp(s),n}catch{}return r?r.models:[]}function ui(l,e,t){qp(l,e,t).then(s=>{if(s.length>0){let r=Wp();r.providers[l]={fetchedAt:Date.now(),models:s},zp(r)}}).catch(()=>{})}function zc(l,e){let t=new Set,s=[];for(let r of l)if(!t.has(r.id)){t.add(r.id);let n=e.find(o=>o.id===r.id);s.push({id:r.id,name:r.name,desc:n?.desc})}for(let r of e)t.has(r.id)||(t.add(r.id),s.push({id:r.id,desc:r.desc}));return s}var ty,sy,Hc,qc=T(()=>{"use strict";ty=1440*60*1e3,sy=5e3,Hc=Hp.join(ey.homedir(),".alfred","model-cache.json");p(Wp,"readCache");p(zp,"writeCache");p(Zt,"fetchWithTimeout");p(qp,"fetchModelsFromAPI");p(Wc,"getModels");p(ui,"refreshCacheInBackground");p(zc,"mergeModels")});var Gp={};me(Gp,{startCommand:()=>ry});async function ry(){let l=new fe,e;try{e=l.loadConfig()}catch(o){console.error("Failed to load configuration:",o.message),process.exit(1)}let t=Ir("cli",e.logger.level);t.info({name:e.name},"Configuration loaded");let s=new Jt(e),r=!1,n=p(async o=>{if(!r){r=!0,t.info({signal:o},"Received shutdown signal");try{await s.stop(),t.info("Graceful shutdown complete"),process.exit(0)}catch(i){t.error({error:i},"Error during shutdown"),process.exit(1)}}},"shutdown");process.on("SIGINT",()=>n("SIGINT")),process.on("SIGTERM",()=>n("SIGTERM")),process.on("uncaughtException",o=>{t.fatal({error:o},"Uncaught exception"),n("uncaughtException")}),process.on("unhandledRejection",o=>{t.fatal({reason:o},"Unhandled rejection"),n("unhandledRejection")});try{await s.initialize(),await s.start(),t.info("Alfred is ready");let o=e.llm;o?.default?.provider?ui(o.default.provider,o.default.apiKey,o.default.baseUrl):o?.provider&&ui(o.provider,void 0,o.baseUrl);for(let i of["strong","fast"]){let a=o?.[i];a?.provider&&ui(a.provider,a.apiKey,a.baseUrl)}}catch(o){let i=o instanceof Error?o:new Error(String(o));t.fatal({err:i},"Failed to start Alfred"),process.exit(1)}}var Kp=T(()=>{"use strict";ot();ta();Bc();qc();p(ry,"startCommand")});var Vp={};me(Vp,{chatCommand:()=>iy});import Xp from"node:http";import Bn from"node:readline";function ny(l,e){return new Promise(t=>{let s=Xp.get(`http://${l}:${e}/api/health`,{timeout:2e3},r=>{let n="";r.on("data",o=>{n+=o.toString()}),r.on("end",()=>{try{let o=JSON.parse(n);t(o.status==="ok")}catch{t(!1)}})});s.on("error",()=>t(!1)),s.on("timeout",()=>{s.destroy(),t(!1)})})}function oy(l,e){let t=Bn.createInterface({input:process.stdin,output:process.stdout,prompt:"You: "});console.log(`
1433
1433
  Alfred Chat (connected to server) \u2014 type your message and press Enter. Use /quit or /exit to leave.
1434
1434
  `),t.prompt(),t.on("line",s=>{let r=s.trim();if(!r){t.prompt();return}(r==="/quit"||r==="/exit")&&(console.log(`
@@ -1 +1 @@
1
- <!DOCTYPE html><!--MVm365HKyeUw6JuHrli2h--><html lang="de"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/alfred/_next/static/css/c6dce7a29a70612c.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/alfred/_next/static/chunks/webpack-dd89effdde862170.js"/><script src="/alfred/_next/static/chunks/8e6518bb-c26e82767f1faf66.js" async=""></script><script src="/alfred/_next/static/chunks/743-05c790de389fcbe8.js" async=""></script><script src="/alfred/_next/static/chunks/main-app-bf91f7268c1fdab4.js" async=""></script><script src="/alfred/_next/static/chunks/app/layout-ab17f30494d646ca.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><title>Alfred AI</title><meta name="description" content="Self-hosted AI Assistant"/><script src="/alfred/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="bg-[#0a0a0a] text-gray-200 h-screen overflow-hidden"><div hidden=""><!--$--><!--/$--></div><div class="flex h-full"><aside class="w-16 md:w-56 bg-[#111111] border-r border-[#1f1f1f] flex flex-col h-full"><div class="p-4 border-b border-[#1f1f1f]"><a href="/alfred/" class="flex items-center gap-2"><span class="text-xl font-bold text-blue-500 font-mono">A</span><span class="hidden md:inline text-sm font-semibold text-gray-200">Alfred</span></a></div><nav class="flex-1 p-2 space-y-1"><a href="/alfred/chat/" class="flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors text-gray-400 hover:bg-[#1a1a1a] hover:text-gray-200"><span>💬</span><span class="hidden md:inline">Chat</span></a><a href="/alfred/dashboard/" class="flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors text-gray-400 hover:bg-[#1a1a1a] hover:text-gray-200"><span>📊</span><span class="hidden md:inline">Dashboard</span></a><a href="/alfred/settings/" class="flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors text-gray-400 hover:bg-[#1a1a1a] hover:text-gray-200"><span>⚙️</span><span class="hidden md:inline">Settings</span></a></nav><div class="p-4 border-t border-[#1f1f1f]"><a href="https://github.com/madh99/alfred-ai" target="_blank" rel="noopener noreferrer" class="text-xs text-gray-500 hover:text-gray-400 hidden md:block">GitHub</a></div></aside><main class="flex-1 overflow-y-auto"><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>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)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--></main></div><script src="/alfred/_next/static/chunks/webpack-dd89effdde862170.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[8719,[\"177\",\"static/chunks/app/layout-ab17f30494d646ca.js\"],\"ConfigProvider\"]\n3:I[4314,[\"177\",\"static/chunks/app/layout-ab17f30494d646ca.js\"],\"Sidebar\"]\n4:I[8954,[],\"\"]\n5:I[5640,[],\"\"]\n6:I[2051,[],\"OutletBoundary\"]\n8:I[6658,[],\"AsyncMetadataOutlet\"]\na:I[2051,[],\"ViewportBoundary\"]\nc:I[2051,[],\"MetadataBoundary\"]\nd:\"$Sreact.suspense\"\nf:I[7698,[],\"\"]\n:HL[\"/alfred/_next/static/css/c6dce7a29a70612c.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"MVm365HKyeUw6JuHrli2h\",\"p\":\"/alfred\",\"c\":[\"\",\"_not-found\",\"\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/alfred/_next/static/css/c6dce7a29a70612c.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"de\",\"children\":[\"$\",\"body\",null,{\"className\":\"bg-[#0a0a0a] text-gray-200 h-screen overflow-hidden\",\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"div\",null,{\"className\":\"flex h-full\",\"children\":[[\"$\",\"$L3\",null,{}],[\"$\",\"main\",null,{\"className\":\"flex-1 overflow-y-auto\",\"children\":[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]]}]}]}]}]]}],{\"children\":[\"/_not-found\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"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.\"}]}]]}]}]],null,[\"$\",\"$L6\",null,{\"children\":[\"$L7\",[\"$\",\"$L8\",null,{\"promise\":\"$@9\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[[\"$\",\"$La\",null,{\"children\":\"$Lb\"}],null],[\"$\",\"$Lc\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$d\",null,{\"fallback\":null,\"children\":\"$Le\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$f\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"b:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n7:null\n"])</script><script>self.__next_f.push([1,"9:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"Alfred AI\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Self-hosted AI Assistant\"}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"e:\"$9:metadata\"\n"])</script></body></html>
1
+ <!DOCTYPE html><!--IjgSY_l4QaNVEU2a3w7qJ--><html lang="de"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/alfred/_next/static/css/250d2ae3e56f3d90.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/alfred/_next/static/chunks/webpack-dd89effdde862170.js"/><script src="/alfred/_next/static/chunks/8e6518bb-c26e82767f1faf66.js" async=""></script><script src="/alfred/_next/static/chunks/743-05c790de389fcbe8.js" async=""></script><script src="/alfred/_next/static/chunks/main-app-bf91f7268c1fdab4.js" async=""></script><script src="/alfred/_next/static/chunks/app/layout-ab17f30494d646ca.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><title>Alfred AI</title><meta name="description" content="Self-hosted AI Assistant"/><script src="/alfred/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="bg-[#0a0a0a] text-gray-200 h-screen overflow-hidden"><div hidden=""><!--$--><!--/$--></div><div class="flex h-full"><aside class="w-16 md:w-56 bg-[#111111] border-r border-[#1f1f1f] flex flex-col h-full"><div class="p-4 border-b border-[#1f1f1f]"><a href="/alfred/" class="flex items-center gap-2"><span class="text-xl font-bold text-blue-500 font-mono">A</span><span class="hidden md:inline text-sm font-semibold text-gray-200">Alfred</span></a></div><nav class="flex-1 p-2 space-y-1"><a href="/alfred/chat/" class="flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors text-gray-400 hover:bg-[#1a1a1a] hover:text-gray-200"><span>💬</span><span class="hidden md:inline">Chat</span></a><a href="/alfred/dashboard/" class="flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors text-gray-400 hover:bg-[#1a1a1a] hover:text-gray-200"><span>📊</span><span class="hidden md:inline">Dashboard</span></a><a href="/alfred/settings/" class="flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors text-gray-400 hover:bg-[#1a1a1a] hover:text-gray-200"><span>⚙️</span><span class="hidden md:inline">Settings</span></a></nav><div class="p-4 border-t border-[#1f1f1f]"><a href="https://github.com/madh99/alfred-ai" target="_blank" rel="noopener noreferrer" class="text-xs text-gray-500 hover:text-gray-400 hidden md:block">GitHub</a></div></aside><main class="flex-1 overflow-y-auto"><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>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)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--></main></div><script src="/alfred/_next/static/chunks/webpack-dd89effdde862170.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[8719,[\"177\",\"static/chunks/app/layout-ab17f30494d646ca.js\"],\"ConfigProvider\"]\n3:I[4314,[\"177\",\"static/chunks/app/layout-ab17f30494d646ca.js\"],\"Sidebar\"]\n4:I[8954,[],\"\"]\n5:I[5640,[],\"\"]\n6:I[2051,[],\"OutletBoundary\"]\n8:I[6658,[],\"AsyncMetadataOutlet\"]\na:I[2051,[],\"ViewportBoundary\"]\nc:I[2051,[],\"MetadataBoundary\"]\nd:\"$Sreact.suspense\"\nf:I[7698,[],\"\"]\n:HL[\"/alfred/_next/static/css/250d2ae3e56f3d90.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"IjgSY_l4QaNVEU2a3w7qJ\",\"p\":\"/alfred\",\"c\":[\"\",\"_not-found\",\"\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/alfred/_next/static/css/250d2ae3e56f3d90.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"de\",\"children\":[\"$\",\"body\",null,{\"className\":\"bg-[#0a0a0a] text-gray-200 h-screen overflow-hidden\",\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"div\",null,{\"className\":\"flex h-full\",\"children\":[[\"$\",\"$L3\",null,{}],[\"$\",\"main\",null,{\"className\":\"flex-1 overflow-y-auto\",\"children\":[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]]}]}]}]}]]}],{\"children\":[\"/_not-found\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"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.\"}]}]]}]}]],null,[\"$\",\"$L6\",null,{\"children\":[\"$L7\",[\"$\",\"$L8\",null,{\"promise\":\"$@9\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[[\"$\",\"$La\",null,{\"children\":\"$Lb\"}],null],[\"$\",\"$Lc\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$d\",null,{\"fallback\":null,\"children\":\"$Le\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$f\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"b:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n7:null\n"])</script><script>self.__next_f.push([1,"9:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"Alfred AI\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Self-hosted AI Assistant\"}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"e:\"$9:metadata\"\n"])</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><!--MVm365HKyeUw6JuHrli2h--><html lang="de"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/alfred/_next/static/css/c6dce7a29a70612c.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/alfred/_next/static/chunks/webpack-dd89effdde862170.js"/><script src="/alfred/_next/static/chunks/8e6518bb-c26e82767f1faf66.js" async=""></script><script src="/alfred/_next/static/chunks/743-05c790de389fcbe8.js" async=""></script><script src="/alfred/_next/static/chunks/main-app-bf91f7268c1fdab4.js" async=""></script><script src="/alfred/_next/static/chunks/app/layout-ab17f30494d646ca.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><title>Alfred AI</title><meta name="description" content="Self-hosted AI Assistant"/><script src="/alfred/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="bg-[#0a0a0a] text-gray-200 h-screen overflow-hidden"><div hidden=""><!--$--><!--/$--></div><div class="flex h-full"><aside class="w-16 md:w-56 bg-[#111111] border-r border-[#1f1f1f] flex flex-col h-full"><div class="p-4 border-b border-[#1f1f1f]"><a href="/alfred/" class="flex items-center gap-2"><span class="text-xl font-bold text-blue-500 font-mono">A</span><span class="hidden md:inline text-sm font-semibold text-gray-200">Alfred</span></a></div><nav class="flex-1 p-2 space-y-1"><a href="/alfred/chat/" class="flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors text-gray-400 hover:bg-[#1a1a1a] hover:text-gray-200"><span>💬</span><span class="hidden md:inline">Chat</span></a><a href="/alfred/dashboard/" class="flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors text-gray-400 hover:bg-[#1a1a1a] hover:text-gray-200"><span>📊</span><span class="hidden md:inline">Dashboard</span></a><a href="/alfred/settings/" class="flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors text-gray-400 hover:bg-[#1a1a1a] hover:text-gray-200"><span>⚙️</span><span class="hidden md:inline">Settings</span></a></nav><div class="p-4 border-t border-[#1f1f1f]"><a href="https://github.com/madh99/alfred-ai" target="_blank" rel="noopener noreferrer" class="text-xs text-gray-500 hover:text-gray-400 hidden md:block">GitHub</a></div></aside><main class="flex-1 overflow-y-auto"><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>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)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--></main></div><script src="/alfred/_next/static/chunks/webpack-dd89effdde862170.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[8719,[\"177\",\"static/chunks/app/layout-ab17f30494d646ca.js\"],\"ConfigProvider\"]\n3:I[4314,[\"177\",\"static/chunks/app/layout-ab17f30494d646ca.js\"],\"Sidebar\"]\n4:I[8954,[],\"\"]\n5:I[5640,[],\"\"]\n6:I[2051,[],\"OutletBoundary\"]\n8:I[6658,[],\"AsyncMetadataOutlet\"]\na:I[2051,[],\"ViewportBoundary\"]\nc:I[2051,[],\"MetadataBoundary\"]\nd:\"$Sreact.suspense\"\nf:I[7698,[],\"\"]\n:HL[\"/alfred/_next/static/css/c6dce7a29a70612c.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"MVm365HKyeUw6JuHrli2h\",\"p\":\"/alfred\",\"c\":[\"\",\"_not-found\",\"\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/alfred/_next/static/css/c6dce7a29a70612c.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"de\",\"children\":[\"$\",\"body\",null,{\"className\":\"bg-[#0a0a0a] text-gray-200 h-screen overflow-hidden\",\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"div\",null,{\"className\":\"flex h-full\",\"children\":[[\"$\",\"$L3\",null,{}],[\"$\",\"main\",null,{\"className\":\"flex-1 overflow-y-auto\",\"children\":[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]]}]}]}]}]]}],{\"children\":[\"/_not-found\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"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.\"}]}]]}]}]],null,[\"$\",\"$L6\",null,{\"children\":[\"$L7\",[\"$\",\"$L8\",null,{\"promise\":\"$@9\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[[\"$\",\"$La\",null,{\"children\":\"$Lb\"}],null],[\"$\",\"$Lc\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$d\",null,{\"fallback\":null,\"children\":\"$Le\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$f\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"b:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n7:null\n"])</script><script>self.__next_f.push([1,"9:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"Alfred AI\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Self-hosted AI Assistant\"}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"e:\"$9:metadata\"\n"])</script></body></html>
1
+ <!DOCTYPE html><!--IjgSY_l4QaNVEU2a3w7qJ--><html lang="de"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/alfred/_next/static/css/250d2ae3e56f3d90.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/alfred/_next/static/chunks/webpack-dd89effdde862170.js"/><script src="/alfred/_next/static/chunks/8e6518bb-c26e82767f1faf66.js" async=""></script><script src="/alfred/_next/static/chunks/743-05c790de389fcbe8.js" async=""></script><script src="/alfred/_next/static/chunks/main-app-bf91f7268c1fdab4.js" async=""></script><script src="/alfred/_next/static/chunks/app/layout-ab17f30494d646ca.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><title>Alfred AI</title><meta name="description" content="Self-hosted AI Assistant"/><script src="/alfred/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="bg-[#0a0a0a] text-gray-200 h-screen overflow-hidden"><div hidden=""><!--$--><!--/$--></div><div class="flex h-full"><aside class="w-16 md:w-56 bg-[#111111] border-r border-[#1f1f1f] flex flex-col h-full"><div class="p-4 border-b border-[#1f1f1f]"><a href="/alfred/" class="flex items-center gap-2"><span class="text-xl font-bold text-blue-500 font-mono">A</span><span class="hidden md:inline text-sm font-semibold text-gray-200">Alfred</span></a></div><nav class="flex-1 p-2 space-y-1"><a href="/alfred/chat/" class="flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors text-gray-400 hover:bg-[#1a1a1a] hover:text-gray-200"><span>💬</span><span class="hidden md:inline">Chat</span></a><a href="/alfred/dashboard/" class="flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors text-gray-400 hover:bg-[#1a1a1a] hover:text-gray-200"><span>📊</span><span class="hidden md:inline">Dashboard</span></a><a href="/alfred/settings/" class="flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors text-gray-400 hover:bg-[#1a1a1a] hover:text-gray-200"><span>⚙️</span><span class="hidden md:inline">Settings</span></a></nav><div class="p-4 border-t border-[#1f1f1f]"><a href="https://github.com/madh99/alfred-ai" target="_blank" rel="noopener noreferrer" class="text-xs text-gray-500 hover:text-gray-400 hidden md:block">GitHub</a></div></aside><main class="flex-1 overflow-y-auto"><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>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)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--></main></div><script src="/alfred/_next/static/chunks/webpack-dd89effdde862170.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[8719,[\"177\",\"static/chunks/app/layout-ab17f30494d646ca.js\"],\"ConfigProvider\"]\n3:I[4314,[\"177\",\"static/chunks/app/layout-ab17f30494d646ca.js\"],\"Sidebar\"]\n4:I[8954,[],\"\"]\n5:I[5640,[],\"\"]\n6:I[2051,[],\"OutletBoundary\"]\n8:I[6658,[],\"AsyncMetadataOutlet\"]\na:I[2051,[],\"ViewportBoundary\"]\nc:I[2051,[],\"MetadataBoundary\"]\nd:\"$Sreact.suspense\"\nf:I[7698,[],\"\"]\n:HL[\"/alfred/_next/static/css/250d2ae3e56f3d90.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"IjgSY_l4QaNVEU2a3w7qJ\",\"p\":\"/alfred\",\"c\":[\"\",\"_not-found\",\"\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/alfred/_next/static/css/250d2ae3e56f3d90.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"de\",\"children\":[\"$\",\"body\",null,{\"className\":\"bg-[#0a0a0a] text-gray-200 h-screen overflow-hidden\",\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"div\",null,{\"className\":\"flex h-full\",\"children\":[[\"$\",\"$L3\",null,{}],[\"$\",\"main\",null,{\"className\":\"flex-1 overflow-y-auto\",\"children\":[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]]}]}]}]}]]}],{\"children\":[\"/_not-found\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"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.\"}]}]]}]}]],null,[\"$\",\"$L6\",null,{\"children\":[\"$L7\",[\"$\",\"$L8\",null,{\"promise\":\"$@9\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[[\"$\",\"$La\",null,{\"children\":\"$Lb\"}],null],[\"$\",\"$Lc\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$d\",null,{\"fallback\":null,\"children\":\"$Le\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$f\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"b:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n7:null\n"])</script><script>self.__next_f.push([1,"9:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"Alfred AI\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Self-hosted AI Assistant\"}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"e:\"$9:metadata\"\n"])</script></body></html>
@@ -0,0 +1 @@
1
+ self.__BUILD_MANIFEST=function(e,r,t){return{__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},__routerFilterStatic:{numItems:5,errorRate:1e-4,numBits:96,numHashes:14,bitArray:[1,0,0,1,e,r,e,r,r,e,r,e,e,r,r,e,r,e,e,e,r,e,e,e,r,r,e,e,e,e,r,e,r,r,r,r,e,e,r,e,e,r,e,r,e,r,e,e,r,e,r,r,r,r,r,e,e,e,e,e,e,e,r,e,e,e,r,r,e,e,r,e,r,r,e,r,r,e,e,r,e,e,e,e,r,r,e,e,e,r,r,r,r,e,e,r]},__routerFilterDynamic:{numItems:r,errorRate:1e-4,numBits:r,numHashes:null,bitArray:[]},"/_error":["static/chunks/pages/_error-01ab52c470df0174.js"],sortedPages:["/_app","/_error"]}}(1,0,1e-4),self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();
@@ -0,0 +1 @@
1
+ self.__SSG_MANIFEST=new Set([]);self.__SSG_MANIFEST_CB&&self.__SSG_MANIFEST_CB()
@@ -0,0 +1 @@
1
+ self.__BUILD_MANIFEST=function(e,r,t){return{__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},__routerFilterStatic:{numItems:5,errorRate:1e-4,numBits:96,numHashes:14,bitArray:[1,0,0,1,e,r,e,r,r,e,r,e,e,r,r,e,r,e,e,e,r,e,e,e,r,r,e,e,e,e,r,e,r,r,r,r,e,e,r,e,e,r,e,r,e,r,e,e,r,e,r,r,r,r,r,e,e,e,e,e,e,e,r,e,e,e,r,r,e,e,r,e,r,r,e,r,r,e,e,r,e,e,e,e,r,r,e,e,e,r,r,r,r,e,e,r]},__routerFilterDynamic:{numItems:r,errorRate:1e-4,numBits:r,numHashes:null,bitArray:[]},"/_error":["static/chunks/pages/_error-01ab52c470df0174.js"],sortedPages:["/_app","/_error"]}}(1,0,1e-4),self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();
@@ -0,0 +1 @@
1
+ self.__SSG_MANIFEST=new Set([]);self.__SSG_MANIFEST_CB&&self.__SSG_MANIFEST_CB()
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[105],{5224:(e,t,s)=>{Promise.resolve().then(s.bind(s,9772))},5242:(e,t,s)=>{"use strict";s.d(t,{A:()=>a});let a=function(){for(var e,t,s=0,a="",l=arguments.length;s<l;s++)(e=arguments[s])&&(t=function e(t){var s,a,l="";if("string"==typeof t||"number"==typeof t)l+=t;else if("object"==typeof t)if(Array.isArray(t)){var r=t.length;for(s=0;s<r;s++)t[s]&&(a=e(t[s]))&&(l&&(l+=" "),l+=a)}else for(a in t)t[a]&&(l&&(l+=" "),l+=a);return l}(e))&&(a&&(a+=" "),a+=t);return a}},8719:(e,t,s)=>{"use strict";s.d(t,{ConfigProvider:()=>o,U:()=>x});var a,l=s(8111),r=s(5271);async function*n(e){var t,s;let a=null==(t=e.body)?void 0:t.getReader();if(!a)return;let l=new TextDecoder,r="",n="",d="";try{for(;;){let{done:e,value:t}=await a.read();if(e)break;let i=(r+=l.decode(t,{stream:!0})).split("\n");for(let e of(r=null!=(s=i.pop())?s:"",i))e.startsWith("event: ")?n=e.slice(7).trim():e.startsWith("data: ")?d+=(d?"\n":"")+e.slice(6):""===e&&(n&&d&&(yield{event:n,data:d}),n="",d="")}n&&d&&(yield{event:n,data:d})}finally{a.releaseLock()}}class d{updateConfig(e,t){this.baseUrl=e,this.token=t}streamMessage(e,t,s,a){let l=new AbortController;return(async()=>{var r,d,i,c,o,x;try{let x=await fetch("".concat(this.baseUrl,"/api/message"),{method:"POST",headers:{"Content-Type":"application/json",...this.token?{Authorization:"Bearer ".concat(this.token)}:{}},body:JSON.stringify({text:e,chatId:t,userId:s}),signal:l.signal});if(!x.ok)return void a.onError("HTTP ".concat(x.status,": ").concat(x.statusText));for await(let{event:e,data:t}of n(x))try{let s=JSON.parse(t);switch(e){case"status":a.onStatus(null!=(d=null!=(r=s.text)?r:s.status)?d:t);break;case"response":a.onResponse(null!=(i=s.text)?i:t);break;case"attachment":a.onAttachment(s);break;case"done":a.onDone();break;case"error":a.onError(null!=(o=null!=(c=s.error)?c:s.message)?o:t)}}catch(s){"response"===e?a.onResponse(t):"error"===e&&a.onError(t)}a.onDone()}catch(e){"AbortError"!==e.name&&a.onError(null!=(x=e.message)?x:"Connection failed")}})(),()=>l.abort()}async fetchDashboard(){let e=await fetch("".concat(this.baseUrl,"/api/dashboard"),{headers:this.token?{Authorization:"Bearer ".concat(this.token)}:{}});if(!e.ok)throw Error("Dashboard: HTTP ".concat(e.status));return e.json()}async fetchHealth(){let e=await fetch("".concat(this.baseUrl,"/api/health"),{headers:this.token?{Authorization:"Bearer ".concat(this.token)}:{}});if(!e.ok)throw Error("Health: HTTP ".concat(e.status));return e.json()}constructor(e,t){this.baseUrl=e,this.token=t}}let i={apiUrl:null!=(a=s(1756).env.NEXT_PUBLIC_ALFRED_API_URL)?a:"",apiToken:""},c=(0,r.createContext)(null);function o(e){let{children:t}=e,[s,a]=(0,r.useState)(i),[n]=(0,r.useState)(()=>new d(i.apiUrl,i.apiToken));return(0,r.useEffect)(()=>{try{let e=localStorage.getItem("alfred-config");if(e){let t=JSON.parse(e);a(t),n.updateConfig(t.apiUrl,t.apiToken)}}catch(e){}},[n]),(0,l.jsx)(c.Provider,{value:{config:s,setConfig:e=>{a(e),n.updateConfig(e.apiUrl,e.apiToken),localStorage.setItem("alfred-config",JSON.stringify(e))},client:n},children:t})}function x(){let e=(0,r.useContext)(c);if(!e)throw Error("useConfig must be used within ConfigProvider");return e}},9772:(e,t,s)=>{"use strict";s.d(t,{DashboardPage:()=>c});var a=s(8111),l=s(5271),r=s(8719),n=s(5242);function d(e){return e<.01?"$".concat((100*e).toFixed(2),"c"):"$".concat(e.toFixed(4))}function i(e){return e>=1e6?"".concat((e/1e6).toFixed(1),"M"):e>=1e3?"".concat((e/1e3).toFixed(1),"K"):String(e)}function c(){var e,t,s,c,o,x,m;let{data:h,loading:u,error:g,refresh:f}=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:3e4,{client:t}=(0,r.U)(),[s,a]=(0,l.useState)(null),[n,d]=(0,l.useState)(!0),[i,c]=(0,l.useState)(null),o=(0,l.useCallback)(async()=>{try{let e=await t.fetchDashboard();a(e),c(null)}catch(e){c(e.message)}finally{d(!1)}},[t]);return(0,l.useEffect)(()=>{o();let t=setInterval(o,e);return()=>clearInterval(t)},[o,e]),{data:s,loading:n,error:i,refresh:o}}();if(u)return(0,a.jsx)("div",{className:"p-8 text-gray-400",children:"Laden..."});if(g)return(0,a.jsxs)("div",{className:"p-8 text-red-400",children:["Fehler: ",g]});if(!h)return null;let p=h.usage,b=null==p?void 0:p.today,j=null!=(t=null==p?void 0:p.week)?t:[],N=null!=(s=null==p?void 0:p.total)?s:[],y=j.reduce((e,t)=>e+t.totalCostUsd,0);return(0,a.jsxs)("div",{className:"p-6 max-w-6xl mx-auto space-y-8",children:[(0,a.jsxs)("div",{className:"flex justify-between items-center",children:[(0,a.jsx)("h1",{className:"text-xl font-semibold text-gray-200",children:"Dashboard"}),(0,a.jsxs)("div",{className:"flex items-center gap-4",children:[null!=h.uptime&&(0,a.jsxs)("span",{className:"text-xs text-gray-500",children:["Uptime: ",function(e){let t=Math.floor(e/3600),s=Math.floor(e%3600/60);return t>24?"".concat(Math.floor(t/24),"d ").concat(t%24,"h"):"".concat(t,"h ").concat(s,"m")}(h.uptime)]}),(0,a.jsx)("button",{onClick:f,className:"text-sm text-blue-400 hover:text-blue-300",children:"Aktualisieren"})]})]}),(0,a.jsxs)("section",{className:"grid gap-3 grid-cols-1 md:grid-cols-2",children:[h.adapters&&(0,a.jsxs)("div",{className:"bg-[#111111] border border-[#1f1f1f] rounded-xl p-4",children:[(0,a.jsx)("h3",{className:"text-sm font-medium text-gray-400 mb-3",children:"Messaging-Adapter"}),(0,a.jsx)("div",{className:"space-y-2",children:Object.entries(h.adapters).map(e=>{let[t,s]=e;return(0,a.jsxs)("div",{className:"flex items-center justify-between",children:[(0,a.jsx)("span",{className:"text-sm text-gray-200 capitalize",children:t}),(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)("span",{className:(0,n.A)("w-2 h-2 rounded-full","connected"===s?"bg-green-500":"bg-red-500")}),(0,a.jsx)("span",{className:(0,n.A)("text-xs","connected"===s?"text-green-400":"text-red-400"),children:s})]})]},t)})})]}),h.llmProviders&&(0,a.jsxs)("div",{className:"bg-[#111111] border border-[#1f1f1f] rounded-xl p-4",children:[(0,a.jsx)("h3",{className:"text-sm font-medium text-gray-400 mb-3",children:"LLM Provider"}),(0,a.jsx)("div",{className:"space-y-2",children:Object.entries(h.llmProviders).map(e=>{let[t,s]=e;return(0,a.jsxs)("div",{className:"flex items-center justify-between",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("span",{className:"text-xs text-gray-500 uppercase",children:t}),(0,a.jsx)("p",{className:"text-sm text-gray-200 font-mono",children:s.model})]}),(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)("span",{className:(0,n.A)("w-2 h-2 rounded-full",s.available?"bg-green-500":"bg-red-500")}),(0,a.jsx)("span",{className:(0,n.A)("text-xs",s.available?"text-green-400":"text-red-400"),children:s.available?"online":"offline"})]})]},t)})})]})]}),p&&(0,a.jsxs)("section",{children:[(0,a.jsx)("h2",{className:"text-lg font-medium text-gray-300 mb-3",children:"LLM Kosten & Token-Verbrauch"}),(0,a.jsxs)("div",{className:"grid gap-3 grid-cols-2 md:grid-cols-4",children:[(0,a.jsxs)("div",{className:"bg-[#111111] border border-[#1f1f1f] rounded-xl p-4",children:[(0,a.jsx)("p",{className:"text-xs text-gray-500 mb-1",children:"Heute"}),(0,a.jsx)("p",{className:"text-2xl font-bold text-blue-400",children:b?d(b.totalCostUsd):"$0"}),(0,a.jsxs)("p",{className:"text-xs text-gray-500 mt-1",children:[null!=(c=null==b?void 0:b.totalCalls)?c:0," Calls"]})]}),(0,a.jsxs)("div",{className:"bg-[#111111] border border-[#1f1f1f] rounded-xl p-4",children:[(0,a.jsx)("p",{className:"text-xs text-gray-500 mb-1",children:"Letzte 7 Tage"}),(0,a.jsx)("p",{className:"text-2xl font-bold text-blue-400",children:d(y)}),(0,a.jsxs)("p",{className:"text-xs text-gray-500 mt-1",children:[j.reduce((e,t)=>e+t.totalCalls,0)," Calls"]})]}),(0,a.jsxs)("div",{className:"bg-[#111111] border border-[#1f1f1f] rounded-xl p-4",children:[(0,a.jsx)("p",{className:"text-xs text-gray-500 mb-1",children:"Tokens heute"}),(0,a.jsxs)("p",{className:"text-lg font-semibold text-gray-200",children:[(0,a.jsx)("span",{className:"text-green-400",children:i(null!=(o=null==b?void 0:b.totalInputTokens)?o:0)}),(0,a.jsx)("span",{className:"text-gray-500 mx-1",children:"/"}),(0,a.jsx)("span",{className:"text-amber-500",children:i(null!=(x=null==b?void 0:b.totalOutputTokens)?x:0)})]}),(0,a.jsx)("p",{className:"text-xs text-gray-500 mt-1",children:"Input / Output"})]}),(0,a.jsxs)("div",{className:"bg-[#111111] border border-[#1f1f1f] rounded-xl p-4",children:[(0,a.jsx)("p",{className:"text-xs text-gray-500 mb-1",children:"Gesamt (All-Time)"}),(0,a.jsx)("p",{className:"text-2xl font-bold text-gray-300",children:d(N.reduce((e,t)=>e+t.costUsd,0))}),(0,a.jsxs)("p",{className:"text-xs text-gray-500 mt-1",children:[N.reduce((e,t)=>e+t.calls,0)," Calls"]})]})]}),j.length>0&&(0,a.jsxs)("div",{className:"mt-4 bg-[#111111] border border-[#1f1f1f] rounded-xl p-4",children:[(0,a.jsx)("p",{className:"text-sm text-gray-400 mb-3",children:"Kosten letzte 7 Tage"}),(0,a.jsx)("div",{className:"flex items-end gap-1",style:{height:"96px"},children:j.map(e=>{let t=Math.max(...j.map(e=>e.totalCostUsd),.001),s=Math.max(4,Math.round(e.totalCostUsd/t*80));return(0,a.jsxs)("div",{className:"flex-1 flex flex-col items-center justify-end",style:{height:"96px"},children:[(0,a.jsx)("div",{className:"w-full bg-blue-600 rounded-t",style:{height:"".concat(s,"px")},title:"".concat(e.date,": ").concat(d(e.totalCostUsd)," (").concat(e.totalCalls," Calls)")}),(0,a.jsx)("span",{className:"text-[10px] text-gray-500 mt-1",children:e.date.slice(5)})]},e.date)})})]}),N.length>0&&(0,a.jsx)("div",{className:"mt-4 bg-[#111111] border border-[#1f1f1f] rounded-xl overflow-hidden",children:(0,a.jsxs)("table",{className:"w-full text-sm",children:[(0,a.jsx)("thead",{className:"bg-[#0d0d0d] text-gray-400",children:(0,a.jsxs)("tr",{children:[(0,a.jsx)("th",{className:"text-left px-4 py-2 font-medium",children:"Model"}),(0,a.jsx)("th",{className:"text-right px-4 py-2 font-medium",children:"Calls"}),(0,a.jsx)("th",{className:"text-right px-4 py-2 font-medium hidden md:table-cell",children:"Input"}),(0,a.jsx)("th",{className:"text-right px-4 py-2 font-medium hidden md:table-cell",children:"Output"}),(0,a.jsx)("th",{className:"text-right px-4 py-2 font-medium",children:"Kosten"})]})}),(0,a.jsx)("tbody",{children:N.sort((e,t)=>t.costUsd-e.costUsd).map(e=>(0,a.jsxs)("tr",{className:"border-t border-[#1f1f1f]",children:[(0,a.jsx)("td",{className:"px-4 py-2 text-gray-200 font-mono text-xs",children:e.model}),(0,a.jsx)("td",{className:"px-4 py-2 text-gray-400 text-right",children:e.calls}),(0,a.jsx)("td",{className:"px-4 py-2 text-gray-400 text-right hidden md:table-cell",children:i(e.inputTokens)}),(0,a.jsx)("td",{className:"px-4 py-2 text-gray-400 text-right hidden md:table-cell",children:i(e.outputTokens)}),(0,a.jsx)("td",{className:"px-4 py-2 text-blue-400 text-right font-medium",children:d(e.costUsd)})]},e.model))})]})})]}),(0,a.jsxs)("section",{children:[(0,a.jsxs)("h2",{className:"text-lg font-medium text-gray-300 mb-3",children:["Aktive Watches (",h.watches.length,")"]}),0===h.watches.length?(0,a.jsx)("p",{className:"text-gray-500 text-sm",children:"Keine aktiven Watches."}):(0,a.jsx)("div",{className:"grid gap-3 grid-cols-1 md:grid-cols-2 lg:grid-cols-3",children:h.watches.map(e=>(0,a.jsxs)("div",{className:"bg-[#111111] border border-[#1f1f1f] rounded-xl p-4",children:[(0,a.jsxs)("div",{className:"flex justify-between items-start mb-2",children:[(0,a.jsx)("h3",{className:"font-medium text-gray-200 text-sm",children:e.name}),(0,a.jsx)("span",{className:(0,n.A)("text-xs px-2 py-0.5 rounded-full",e.enabled?"bg-green-500/10 text-green-400":"bg-red-500/10 text-red-400"),children:e.enabled?"aktiv":"inaktiv"})]}),(0,a.jsxs)("p",{className:"text-xs text-gray-500 mb-1",children:["Skill: ",e.skillName," | alle ",e.intervalMinutes,"min"]}),e.lastValue&&(0,a.jsxs)("p",{className:"text-xs text-gray-400 truncate",children:["Letzter Wert: ",e.lastValue]}),e.lastTriggeredAt&&(0,a.jsxs)("p",{className:"text-xs text-gray-500",children:["Letzter Trigger: ",new Date(e.lastTriggeredAt).toLocaleString("de-AT")]})]},e.id))})]}),(0,a.jsxs)("section",{children:[(0,a.jsxs)("h2",{className:"text-lg font-medium text-gray-300 mb-3",children:["Geplante Tasks (",h.scheduled.length,")"]}),0===h.scheduled.length?(0,a.jsx)("p",{className:"text-gray-500 text-sm",children:"Keine geplanten Tasks."}):(0,a.jsx)("div",{className:"bg-[#111111] border border-[#1f1f1f] rounded-xl overflow-hidden",children:(0,a.jsxs)("table",{className:"w-full text-sm",children:[(0,a.jsx)("thead",{className:"bg-[#0d0d0d] text-gray-400",children:(0,a.jsxs)("tr",{children:[(0,a.jsx)("th",{className:"text-left px-4 py-2 font-medium",children:"Name"}),(0,a.jsx)("th",{className:"text-left px-4 py-2 font-medium",children:"Schedule"}),(0,a.jsx)("th",{className:"text-left px-4 py-2 font-medium hidden md:table-cell",children:"N\xe4chste Ausf\xfchrung"})]})}),(0,a.jsx)("tbody",{children:h.scheduled.map(e=>(0,a.jsxs)("tr",{className:"border-t border-[#1f1f1f]",children:[(0,a.jsx)("td",{className:"px-4 py-2 text-gray-200",children:e.name}),(0,a.jsx)("td",{className:"px-4 py-2 text-gray-400 font-mono text-xs",children:e.scheduleValue}),(0,a.jsx)("td",{className:"px-4 py-2 text-gray-500 text-xs hidden md:table-cell",children:e.nextRunAt?new Date(e.nextRunAt).toLocaleString("de-AT"):"—"})]},e.id))})]})})]}),(null!=(m=null==(e=h.reminders)?void 0:e.length)?m:0)>0&&(0,a.jsxs)("section",{children:[(0,a.jsxs)("h2",{className:"text-lg font-medium text-gray-300 mb-3",children:["Offene Reminder (",h.reminders.length,")"]}),(0,a.jsx)("div",{className:"grid gap-3 grid-cols-1 md:grid-cols-2 lg:grid-cols-3",children:h.reminders.map(e=>{let t=new Date(e.triggerAt),s=t<new Date;return(0,a.jsxs)("div",{className:"bg-[#111111] border border-[#1f1f1f] rounded-xl p-4",children:[(0,a.jsxs)("div",{className:"flex justify-between items-start mb-1",children:[(0,a.jsx)("p",{className:"text-sm text-gray-200",children:e.message}),(0,a.jsx)("span",{className:(0,n.A)("text-xs px-2 py-0.5 rounded-full",s?"bg-red-500/10 text-red-400":"bg-blue-500/10 text-blue-400"),children:s?"\xfcberf\xe4llig":"aktiv"})]}),(0,a.jsxs)("p",{className:"text-xs text-gray-500",children:[t.toLocaleString("de-AT")," • ",e.platform]})]},e.id)})})]}),(0,a.jsxs)("section",{children:[(0,a.jsx)("h2",{className:"text-lg font-medium text-gray-300 mb-3",children:"Skill Health"}),0===h.skillHealth.length?(0,a.jsx)("p",{className:"text-gray-500 text-sm",children:"Keine Skill-Health-Daten."}):(0,a.jsx)("div",{className:"grid gap-3 grid-cols-2 md:grid-cols-3 lg:grid-cols-4",children:h.skillHealth.map(e=>{let t=e.disabledUntil?"red":e.consecutiveFails>=3?"amber":"green";return(0,a.jsxs)("div",{className:"bg-[#111111] border border-[#1f1f1f] rounded-xl p-3",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2 mb-1",children:[(0,a.jsx)("span",{className:(0,n.A)("w-2 h-2 rounded-full",{"bg-green-500":"green"===t,"bg-amber-500":"amber"===t,"bg-red-500":"red"===t})}),(0,a.jsx)("span",{className:"text-sm text-gray-200 font-mono",children:e.skillName})]}),(0,a.jsxs)("p",{className:"text-xs text-gray-500",children:[e.totalSuccesses,"x OK / ",e.totalFailures,"x Fehler"]}),e.disabledUntil&&(0,a.jsxs)("p",{className:"text-xs text-red-400 mt-1",children:["Deaktiviert bis ",new Date(e.disabledUntil).toLocaleTimeString("de-AT")]}),e.lastError&&(0,a.jsx)("p",{className:"text-xs text-gray-500 truncate mt-1",title:e.lastError,children:e.lastError})]},e.skillName)})})]})]})}}},e=>{e.O(0,[814,743,358],()=>e(e.s=5224)),_N_E=e.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[105],{5224:(e,t,s)=>{Promise.resolve().then(s.bind(s,9772))},5242:(e,t,s)=>{"use strict";s.d(t,{A:()=>a});let a=function(){for(var e,t,s=0,a="",l=arguments.length;s<l;s++)(e=arguments[s])&&(t=function e(t){var s,a,l="";if("string"==typeof t||"number"==typeof t)l+=t;else if("object"==typeof t)if(Array.isArray(t)){var r=t.length;for(s=0;s<r;s++)t[s]&&(a=e(t[s]))&&(l&&(l+=" "),l+=a)}else for(a in t)t[a]&&(l&&(l+=" "),l+=a);return l}(e))&&(a&&(a+=" "),a+=t);return a}},8719:(e,t,s)=>{"use strict";s.d(t,{ConfigProvider:()=>o,U:()=>x});var a,l=s(8111),r=s(5271);async function*n(e){var t,s;let a=null==(t=e.body)?void 0:t.getReader();if(!a)return;let l=new TextDecoder,r="",n="",d="";try{for(;;){let{done:e,value:t}=await a.read();if(e)break;let i=(r+=l.decode(t,{stream:!0})).split("\n");for(let e of(r=null!=(s=i.pop())?s:"",i))e.startsWith("event: ")?n=e.slice(7).trim():e.startsWith("data: ")?d+=(d?"\n":"")+e.slice(6):""===e&&(n&&d&&(yield{event:n,data:d}),n="",d="")}n&&d&&(yield{event:n,data:d})}finally{a.releaseLock()}}class d{updateConfig(e,t){this.baseUrl=e,this.token=t}streamMessage(e,t,s,a){let l=new AbortController;return(async()=>{var r,d,i,c,o,x;try{let x=await fetch("".concat(this.baseUrl,"/api/message"),{method:"POST",headers:{"Content-Type":"application/json",...this.token?{Authorization:"Bearer ".concat(this.token)}:{}},body:JSON.stringify({text:e,chatId:t,userId:s}),signal:l.signal});if(!x.ok)return void a.onError("HTTP ".concat(x.status,": ").concat(x.statusText));for await(let{event:e,data:t}of n(x))try{let s=JSON.parse(t);switch(e){case"status":a.onStatus(null!=(d=null!=(r=s.text)?r:s.status)?d:t);break;case"response":a.onResponse(null!=(i=s.text)?i:t);break;case"attachment":a.onAttachment(s);break;case"done":a.onDone();break;case"error":a.onError(null!=(o=null!=(c=s.error)?c:s.message)?o:t)}}catch(s){"response"===e?a.onResponse(t):"error"===e&&a.onError(t)}a.onDone()}catch(e){"AbortError"!==e.name&&a.onError(null!=(x=e.message)?x:"Connection failed")}})(),()=>l.abort()}async fetchDashboard(){let e=await fetch("".concat(this.baseUrl,"/api/dashboard"),{headers:this.token?{Authorization:"Bearer ".concat(this.token)}:{}});if(!e.ok)throw Error("Dashboard: HTTP ".concat(e.status));return e.json()}async fetchHealth(){let e=await fetch("".concat(this.baseUrl,"/api/health"),{headers:this.token?{Authorization:"Bearer ".concat(this.token)}:{}});if(!e.ok)throw Error("Health: HTTP ".concat(e.status));return e.json()}constructor(e,t){this.baseUrl=e,this.token=t}}let i={apiUrl:null!=(a=s(1756).env.NEXT_PUBLIC_ALFRED_API_URL)?a:"",apiToken:""},c=(0,r.createContext)(null);function o(e){let{children:t}=e,[s,a]=(0,r.useState)(i),[n]=(0,r.useState)(()=>new d(i.apiUrl,i.apiToken));return(0,r.useEffect)(()=>{try{let e=localStorage.getItem("alfred-config");if(e){let t=JSON.parse(e);a(t),n.updateConfig(t.apiUrl,t.apiToken)}}catch(e){}},[n]),(0,l.jsx)(c.Provider,{value:{config:s,setConfig:e=>{a(e),n.updateConfig(e.apiUrl,e.apiToken),localStorage.setItem("alfred-config",JSON.stringify(e))},client:n},children:t})}function x(){let e=(0,r.useContext)(c);if(!e)throw Error("useConfig must be used within ConfigProvider");return e}},9772:(e,t,s)=>{"use strict";s.d(t,{DashboardPage:()=>c});var a=s(8111),l=s(5271),r=s(8719),n=s(5242);function d(e){return e<.01?"$".concat((100*e).toFixed(2),"c"):"$".concat(e.toFixed(4))}function i(e){return e>=1e6?"".concat((e/1e6).toFixed(1),"M"):e>=1e3?"".concat((e/1e3).toFixed(1),"K"):String(e)}function c(){var e,t,s,c,o,x,m;let{data:h,loading:u,error:g,refresh:f}=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:3e4,{client:t}=(0,r.U)(),[s,a]=(0,l.useState)(null),[n,d]=(0,l.useState)(!0),[i,c]=(0,l.useState)(null),o=(0,l.useCallback)(async()=>{try{let e=await t.fetchDashboard();a(e),c(null)}catch(e){c(e.message)}finally{d(!1)}},[t]);return(0,l.useEffect)(()=>{o();let t=setInterval(o,e);return()=>clearInterval(t)},[o,e]),{data:s,loading:n,error:i,refresh:o}}();if(u)return(0,a.jsx)("div",{className:"p-8 text-gray-400",children:"Laden..."});if(g)return(0,a.jsxs)("div",{className:"p-8 text-red-400",children:["Fehler: ",g]});if(!h)return null;let p=h.usage,b=null==p?void 0:p.today,j=null!=(t=null==p?void 0:p.week)?t:[],N=null!=(s=null==p?void 0:p.total)?s:[],y=j.reduce((e,t)=>e+t.totalCostUsd,0);return(0,a.jsxs)("div",{className:"p-6 max-w-6xl mx-auto space-y-8",children:[(0,a.jsxs)("div",{className:"flex justify-between items-center",children:[(0,a.jsx)("h1",{className:"text-xl font-semibold text-gray-200",children:"Dashboard"}),(0,a.jsxs)("div",{className:"flex items-center gap-4",children:[null!=h.uptime&&(0,a.jsxs)("span",{className:"text-xs text-gray-500",children:["Uptime: ",function(e){let t=Math.floor(e/3600),s=Math.floor(e%3600/60);return t>24?"".concat(Math.floor(t/24),"d ").concat(t%24,"h"):"".concat(t,"h ").concat(s,"m")}(h.uptime)]}),(0,a.jsx)("button",{onClick:f,className:"text-sm text-blue-400 hover:text-blue-300",children:"Aktualisieren"})]})]}),(0,a.jsxs)("section",{className:"grid gap-3 grid-cols-1 md:grid-cols-2",children:[h.adapters&&(0,a.jsxs)("div",{className:"bg-[#111111] border border-[#1f1f1f] rounded-xl p-4",children:[(0,a.jsx)("h3",{className:"text-sm font-medium text-gray-400 mb-3",children:"Messaging-Adapter"}),(0,a.jsx)("div",{className:"space-y-2",children:Object.entries(h.adapters).map(e=>{let[t,s]=e;return(0,a.jsxs)("div",{className:"flex items-center justify-between",children:[(0,a.jsx)("span",{className:"text-sm text-gray-200 capitalize",children:t}),(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)("span",{className:(0,n.A)("w-2 h-2 rounded-full","connected"===s?"bg-green-500":"bg-red-500")}),(0,a.jsx)("span",{className:(0,n.A)("text-xs","connected"===s?"text-green-400":"text-red-400"),children:s})]})]},t)})})]}),h.llmProviders&&(0,a.jsxs)("div",{className:"bg-[#111111] border border-[#1f1f1f] rounded-xl p-4",children:[(0,a.jsx)("h3",{className:"text-sm font-medium text-gray-400 mb-3",children:"LLM Provider"}),(0,a.jsx)("div",{className:"space-y-2",children:Object.entries(h.llmProviders).map(e=>{let[t,s]=e;return(0,a.jsxs)("div",{className:"flex items-center justify-between",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("span",{className:"text-xs text-gray-500 uppercase",children:t}),(0,a.jsx)("p",{className:"text-sm text-gray-200 font-mono",children:s.model})]}),(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)("span",{className:(0,n.A)("w-2 h-2 rounded-full",s.available?"bg-green-500":"bg-red-500")}),(0,a.jsx)("span",{className:(0,n.A)("text-xs",s.available?"text-green-400":"text-red-400"),children:s.available?"online":"offline"})]})]},t)})})]})]}),p&&(0,a.jsxs)("section",{children:[(0,a.jsx)("h2",{className:"text-lg font-medium text-gray-300 mb-3",children:"LLM Kosten & Token-Verbrauch"}),(0,a.jsxs)("div",{className:"grid gap-3 grid-cols-2 md:grid-cols-4",children:[(0,a.jsxs)("div",{className:"bg-[#111111] border border-[#1f1f1f] rounded-xl p-4",children:[(0,a.jsx)("p",{className:"text-xs text-gray-500 mb-1",children:"Heute"}),(0,a.jsx)("p",{className:"text-2xl font-bold text-blue-400",children:b?d(b.totalCostUsd):"$0"}),(0,a.jsxs)("p",{className:"text-xs text-gray-500 mt-1",children:[null!=(c=null==b?void 0:b.totalCalls)?c:0," Calls"]})]}),(0,a.jsxs)("div",{className:"bg-[#111111] border border-[#1f1f1f] rounded-xl p-4",children:[(0,a.jsx)("p",{className:"text-xs text-gray-500 mb-1",children:"Letzte 7 Tage"}),(0,a.jsx)("p",{className:"text-2xl font-bold text-blue-400",children:d(y)}),(0,a.jsxs)("p",{className:"text-xs text-gray-500 mt-1",children:[j.reduce((e,t)=>e+t.totalCalls,0)," Calls"]})]}),(0,a.jsxs)("div",{className:"bg-[#111111] border border-[#1f1f1f] rounded-xl p-4",children:[(0,a.jsx)("p",{className:"text-xs text-gray-500 mb-1",children:"Tokens heute"}),(0,a.jsxs)("p",{className:"text-lg font-semibold text-gray-200",children:[(0,a.jsx)("span",{className:"text-green-400",children:i(null!=(o=null==b?void 0:b.totalInputTokens)?o:0)}),(0,a.jsx)("span",{className:"text-gray-500 mx-1",children:"/"}),(0,a.jsx)("span",{className:"text-amber-500",children:i(null!=(x=null==b?void 0:b.totalOutputTokens)?x:0)})]}),(0,a.jsx)("p",{className:"text-xs text-gray-500 mt-1",children:"Input / Output"})]}),(0,a.jsxs)("div",{className:"bg-[#111111] border border-[#1f1f1f] rounded-xl p-4",children:[(0,a.jsx)("p",{className:"text-xs text-gray-500 mb-1",children:"Gesamt (All-Time)"}),(0,a.jsx)("p",{className:"text-2xl font-bold text-gray-300",children:d(N.reduce((e,t)=>e+t.costUsd,0))}),(0,a.jsxs)("p",{className:"text-xs text-gray-500 mt-1",children:[N.reduce((e,t)=>e+t.calls,0)," Calls"]})]})]}),j.length>0&&(0,a.jsxs)("div",{className:"mt-4 bg-[#111111] border border-[#1f1f1f] rounded-xl p-4",children:[(0,a.jsx)("p",{className:"text-sm text-gray-400 mb-3",children:"Kosten letzte 7 Tage"}),(0,a.jsx)("div",{className:"flex items-end gap-1 h-24",children:j.map(e=>{let t=Math.max(...j.map(e=>e.totalCostUsd),.001),s=Math.max(2,e.totalCostUsd/t*100);return(0,a.jsxs)("div",{className:"flex-1 flex flex-col items-center gap-1",children:[(0,a.jsx)("div",{className:"w-full bg-blue-600 rounded-t",style:{height:"".concat(s,"%")},title:"".concat(e.date,": ").concat(d(e.totalCostUsd)," (").concat(e.totalCalls," Calls)")}),(0,a.jsx)("span",{className:"text-[10px] text-gray-500",children:e.date.slice(5)})]},e.date)})})]}),N.length>0&&(0,a.jsx)("div",{className:"mt-4 bg-[#111111] border border-[#1f1f1f] rounded-xl overflow-hidden",children:(0,a.jsxs)("table",{className:"w-full text-sm",children:[(0,a.jsx)("thead",{className:"bg-[#0d0d0d] text-gray-400",children:(0,a.jsxs)("tr",{children:[(0,a.jsx)("th",{className:"text-left px-4 py-2 font-medium",children:"Model"}),(0,a.jsx)("th",{className:"text-right px-4 py-2 font-medium",children:"Calls"}),(0,a.jsx)("th",{className:"text-right px-4 py-2 font-medium hidden md:table-cell",children:"Input"}),(0,a.jsx)("th",{className:"text-right px-4 py-2 font-medium hidden md:table-cell",children:"Output"}),(0,a.jsx)("th",{className:"text-right px-4 py-2 font-medium",children:"Kosten"})]})}),(0,a.jsx)("tbody",{children:N.sort((e,t)=>t.costUsd-e.costUsd).map(e=>(0,a.jsxs)("tr",{className:"border-t border-[#1f1f1f]",children:[(0,a.jsx)("td",{className:"px-4 py-2 text-gray-200 font-mono text-xs",children:e.model}),(0,a.jsx)("td",{className:"px-4 py-2 text-gray-400 text-right",children:e.calls}),(0,a.jsx)("td",{className:"px-4 py-2 text-gray-400 text-right hidden md:table-cell",children:i(e.inputTokens)}),(0,a.jsx)("td",{className:"px-4 py-2 text-gray-400 text-right hidden md:table-cell",children:i(e.outputTokens)}),(0,a.jsx)("td",{className:"px-4 py-2 text-blue-400 text-right font-medium",children:d(e.costUsd)})]},e.model))})]})})]}),(0,a.jsxs)("section",{children:[(0,a.jsxs)("h2",{className:"text-lg font-medium text-gray-300 mb-3",children:["Aktive Watches (",h.watches.length,")"]}),0===h.watches.length?(0,a.jsx)("p",{className:"text-gray-500 text-sm",children:"Keine aktiven Watches."}):(0,a.jsx)("div",{className:"grid gap-3 grid-cols-1 md:grid-cols-2 lg:grid-cols-3",children:h.watches.map(e=>(0,a.jsxs)("div",{className:"bg-[#111111] border border-[#1f1f1f] rounded-xl p-4",children:[(0,a.jsxs)("div",{className:"flex justify-between items-start mb-2",children:[(0,a.jsx)("h3",{className:"font-medium text-gray-200 text-sm",children:e.name}),(0,a.jsx)("span",{className:(0,n.A)("text-xs px-2 py-0.5 rounded-full",e.enabled?"bg-green-500/10 text-green-400":"bg-red-500/10 text-red-400"),children:e.enabled?"aktiv":"inaktiv"})]}),(0,a.jsxs)("p",{className:"text-xs text-gray-500 mb-1",children:["Skill: ",e.skillName," | alle ",e.intervalMinutes,"min"]}),e.lastValue&&(0,a.jsxs)("p",{className:"text-xs text-gray-400 truncate",children:["Letzter Wert: ",e.lastValue]}),e.lastTriggeredAt&&(0,a.jsxs)("p",{className:"text-xs text-gray-500",children:["Letzter Trigger: ",new Date(e.lastTriggeredAt).toLocaleString("de-AT")]})]},e.id))})]}),(0,a.jsxs)("section",{children:[(0,a.jsxs)("h2",{className:"text-lg font-medium text-gray-300 mb-3",children:["Geplante Tasks (",h.scheduled.length,")"]}),0===h.scheduled.length?(0,a.jsx)("p",{className:"text-gray-500 text-sm",children:"Keine geplanten Tasks."}):(0,a.jsx)("div",{className:"bg-[#111111] border border-[#1f1f1f] rounded-xl overflow-hidden",children:(0,a.jsxs)("table",{className:"w-full text-sm",children:[(0,a.jsx)("thead",{className:"bg-[#0d0d0d] text-gray-400",children:(0,a.jsxs)("tr",{children:[(0,a.jsx)("th",{className:"text-left px-4 py-2 font-medium",children:"Name"}),(0,a.jsx)("th",{className:"text-left px-4 py-2 font-medium",children:"Schedule"}),(0,a.jsx)("th",{className:"text-left px-4 py-2 font-medium hidden md:table-cell",children:"N\xe4chste Ausf\xfchrung"})]})}),(0,a.jsx)("tbody",{children:h.scheduled.map(e=>(0,a.jsxs)("tr",{className:"border-t border-[#1f1f1f]",children:[(0,a.jsx)("td",{className:"px-4 py-2 text-gray-200",children:e.name}),(0,a.jsx)("td",{className:"px-4 py-2 text-gray-400 font-mono text-xs",children:e.scheduleValue}),(0,a.jsx)("td",{className:"px-4 py-2 text-gray-500 text-xs hidden md:table-cell",children:e.nextRunAt?new Date(e.nextRunAt).toLocaleString("de-AT"):"—"})]},e.id))})]})})]}),(null!=(m=null==(e=h.reminders)?void 0:e.length)?m:0)>0&&(0,a.jsxs)("section",{children:[(0,a.jsxs)("h2",{className:"text-lg font-medium text-gray-300 mb-3",children:["Offene Reminder (",h.reminders.length,")"]}),(0,a.jsx)("div",{className:"grid gap-3 grid-cols-1 md:grid-cols-2 lg:grid-cols-3",children:h.reminders.map(e=>{let t=new Date(e.triggerAt),s=t<new Date;return(0,a.jsxs)("div",{className:"bg-[#111111] border border-[#1f1f1f] rounded-xl p-4",children:[(0,a.jsxs)("div",{className:"flex justify-between items-start mb-1",children:[(0,a.jsx)("p",{className:"text-sm text-gray-200",children:e.message}),(0,a.jsx)("span",{className:(0,n.A)("text-xs px-2 py-0.5 rounded-full",s?"bg-red-500/10 text-red-400":"bg-blue-500/10 text-blue-400"),children:s?"\xfcberf\xe4llig":"aktiv"})]}),(0,a.jsxs)("p",{className:"text-xs text-gray-500",children:[t.toLocaleString("de-AT")," • ",e.platform]})]},e.id)})})]}),(0,a.jsxs)("section",{children:[(0,a.jsx)("h2",{className:"text-lg font-medium text-gray-300 mb-3",children:"Skill Health"}),0===h.skillHealth.length?(0,a.jsx)("p",{className:"text-gray-500 text-sm",children:"Keine Skill-Health-Daten."}):(0,a.jsx)("div",{className:"grid gap-3 grid-cols-2 md:grid-cols-3 lg:grid-cols-4",children:h.skillHealth.map(e=>{let t=e.disabledUntil?"red":e.consecutiveFails>=3?"amber":"green";return(0,a.jsxs)("div",{className:"bg-[#111111] border border-[#1f1f1f] rounded-xl p-3",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2 mb-1",children:[(0,a.jsx)("span",{className:(0,n.A)("w-2 h-2 rounded-full",{"bg-green-500":"green"===t,"bg-amber-500":"amber"===t,"bg-red-500":"red"===t})}),(0,a.jsx)("span",{className:"text-sm text-gray-200 font-mono",children:e.skillName})]}),(0,a.jsxs)("p",{className:"text-xs text-gray-500",children:[e.totalSuccesses,"x OK / ",e.totalFailures,"x Fehler"]}),e.disabledUntil&&(0,a.jsxs)("p",{className:"text-xs text-red-400 mt-1",children:["Deaktiviert bis ",new Date(e.disabledUntil).toLocaleTimeString("de-AT")]}),e.lastError&&(0,a.jsx)("p",{className:"text-xs text-gray-500 truncate mt-1",title:e.lastError,children:e.lastError})]},e.skillName)})})]})]})}}},e=>{e.O(0,[814,743,358],()=>e(e.s=5224)),_N_E=e.O()}]);
@@ -0,0 +1 @@
1
+ /*! tailwindcss v4.2.1 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,::backdrop,:after,:before{--tw-space-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial}}}@layer theme{:host,:root{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-amber-500:oklch(76.9% .188 70.08);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-white:#fff;--spacing:.25rem;--container-2xl:42rem;--container-4xl:56rem;--container-6xl:72rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1) infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,::backdrop,:after,:before{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}:host,html{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}menu,ol,ul{list-style:none}audio,canvas,embed,iframe,img,object,svg,video{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,optgroup,select,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit,::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.mx-1{margin-inline:calc(var(--spacing) * 1)}.mx-auto{margin-inline:auto}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-20{margin-top:calc(var(--spacing) * 20)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.h-2{height:calc(var(--spacing) * 2)}.h-full{height:100%}.h-screen{height:100vh}.w-2{width:calc(var(--spacing) * 2)}.w-16{width:calc(var(--spacing) * 16)}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-\[85\%\]{max-width:85%}.max-w-full{max-width:100%}.max-w-none{max-width:none}.flex-1{flex:1}.animate-pulse{animation:var(--animate-pulse)}.resize-none{resize:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-1{gap:calc(var(--spacing) * 1)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap}.overflow-hidden,.truncate{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:3.40282e+38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-\[\#1f1f1f\]{border-color:#1f1f1f}.border-\[\#2a2a2a\]{border-color:#2a2a2a}.bg-\[\#0a0a0a\]{background-color:#0a0a0a}.bg-\[\#0d0d0d\]{background-color:#0d0d0d}.bg-\[\#1a1a1a\]{background-color:#1a1a1a}.bg-\[\#111111\]{background-color:#111}.bg-amber-500{background-color:var(--color-amber-500)}.bg-blue-500\/10{background-color:#3080ff1a}@supports (color:color-mix(in lab,red,red)){.bg-blue-500\/10{background-color:color-mix(in oklab,var(--color-blue-500) 10%,transparent)}}.bg-blue-600{background-color:var(--color-blue-600)}.bg-green-500{background-color:var(--color-green-500)}.bg-green-500\/10{background-color:#00c7581a}@supports (color:color-mix(in lab,red,red)){.bg-green-500\/10{background-color:color-mix(in oklab,var(--color-green-500) 10%,transparent)}}.bg-red-500{background-color:var(--color-red-500)}.bg-red-500\/10{background-color:#fb2c361a}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/10{background-color:color-mix(in oklab,var(--color-red-500) 10%,transparent)}}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-500{color:var(--color-amber-500)}.text-blue-400{color:var(--color-blue-400)}.text-blue-500{color:var(--color-blue-500)}.text-gray-200{color:var(--color-gray-200)}.text-gray-300{color:var(--color-gray-300)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-green-400{color:var(--color-green-400)}.text-red-400{color:var(--color-red-400)}.text-white{color:var(--color-white)}.capitalize{text-transform:capitalize}.uppercase{text-transform:uppercase}.underline{text-decoration-line:underline}.placeholder-gray-500::placeholder{color:var(--color-gray-500)}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.hover\:bg-\[\#1a1a1a\]:hover{background-color:#1a1a1a}.hover\:bg-\[\#222\]:hover{background-color:#222}.hover\:bg-blue-700:hover{background-color:var(--color-blue-700)}.hover\:text-blue-300:hover{color:var(--color-blue-300)}.hover\:text-gray-200:hover{color:var(--color-gray-200)}.hover\:text-gray-400:hover{color:var(--color-gray-400)}}.focus\:border-blue-500:focus{border-color:var(--color-blue-500)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}@media (min-width:48rem){.md\:block{display:block}.md\:inline{display:inline}.md\:table-cell{display:table-cell}.md\:w-56{width:calc(var(--spacing) * 56)}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (min-width:64rem){.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}.\[\&_a\]\:text-blue-400 a{color:var(--color-blue-400)}.\[\&_code\]\:text-blue-300 code{color:var(--color-blue-300)}.\[\&_pre\]\:rounded-lg pre{border-radius:var(--radius-lg)}.\[\&_pre\]\:bg-\[\#0d0d0d\] pre{background-color:#0d0d0d}.\[\&_pre\]\:p-3 pre{padding:calc(var(--spacing) * 3)}}body,html{color:#e5e7eb;background:#0a0a0a;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}::-webkit-scrollbar{width:6px}::-webkit-scrollbar-track{background:#0a0a0a}::-webkit-scrollbar-thumb{background:#333;border-radius:3px}::-webkit-scrollbar-thumb:hover{background:#555}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@keyframes pulse{50%{opacity:.5}}
@@ -0,0 +1 @@
1
+ /*! tailwindcss v4.2.1 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,::backdrop,:after,:before{--tw-space-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial}}}@layer theme{:host,:root{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-amber-500:oklch(76.9% .188 70.08);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-white:#fff;--spacing:.25rem;--container-2xl:42rem;--container-4xl:56rem;--container-6xl:72rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1) infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,::backdrop,:after,:before{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}:host,html{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}menu,ol,ul{list-style:none}audio,canvas,embed,iframe,img,object,svg,video{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,optgroup,select,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit,::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.mx-1{margin-inline:calc(var(--spacing) * 1)}.mx-auto{margin-inline:auto}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-20{margin-top:calc(var(--spacing) * 20)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.h-2{height:calc(var(--spacing) * 2)}.h-24{height:calc(var(--spacing) * 24)}.h-full{height:100%}.h-screen{height:100vh}.w-2{width:calc(var(--spacing) * 2)}.w-16{width:calc(var(--spacing) * 16)}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-\[85\%\]{max-width:85%}.max-w-full{max-width:100%}.max-w-none{max-width:none}.flex-1{flex:1}.animate-pulse{animation:var(--animate-pulse)}.resize-none{resize:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-1{gap:calc(var(--spacing) * 1)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap}.overflow-hidden,.truncate{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:3.40282e+38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-\[\#1f1f1f\]{border-color:#1f1f1f}.border-\[\#2a2a2a\]{border-color:#2a2a2a}.bg-\[\#0a0a0a\]{background-color:#0a0a0a}.bg-\[\#0d0d0d\]{background-color:#0d0d0d}.bg-\[\#1a1a1a\]{background-color:#1a1a1a}.bg-\[\#111111\]{background-color:#111}.bg-amber-500{background-color:var(--color-amber-500)}.bg-blue-500\/10{background-color:#3080ff1a}@supports (color:color-mix(in lab,red,red)){.bg-blue-500\/10{background-color:color-mix(in oklab,var(--color-blue-500) 10%,transparent)}}.bg-blue-600{background-color:var(--color-blue-600)}.bg-green-500{background-color:var(--color-green-500)}.bg-green-500\/10{background-color:#00c7581a}@supports (color:color-mix(in lab,red,red)){.bg-green-500\/10{background-color:color-mix(in oklab,var(--color-green-500) 10%,transparent)}}.bg-red-500{background-color:var(--color-red-500)}.bg-red-500\/10{background-color:#fb2c361a}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/10{background-color:color-mix(in oklab,var(--color-red-500) 10%,transparent)}}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-500{color:var(--color-amber-500)}.text-blue-400{color:var(--color-blue-400)}.text-blue-500{color:var(--color-blue-500)}.text-gray-200{color:var(--color-gray-200)}.text-gray-300{color:var(--color-gray-300)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-green-400{color:var(--color-green-400)}.text-red-400{color:var(--color-red-400)}.text-white{color:var(--color-white)}.capitalize{text-transform:capitalize}.uppercase{text-transform:uppercase}.underline{text-decoration-line:underline}.placeholder-gray-500::placeholder{color:var(--color-gray-500)}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.hover\:bg-\[\#1a1a1a\]:hover{background-color:#1a1a1a}.hover\:bg-\[\#222\]:hover{background-color:#222}.hover\:bg-blue-700:hover{background-color:var(--color-blue-700)}.hover\:text-blue-300:hover{color:var(--color-blue-300)}.hover\:text-gray-200:hover{color:var(--color-gray-200)}.hover\:text-gray-400:hover{color:var(--color-gray-400)}}.focus\:border-blue-500:focus{border-color:var(--color-blue-500)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}@media (min-width:48rem){.md\:block{display:block}.md\:inline{display:inline}.md\:table-cell{display:table-cell}.md\:w-56{width:calc(var(--spacing) * 56)}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (min-width:64rem){.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}.\[\&_a\]\:text-blue-400 a{color:var(--color-blue-400)}.\[\&_code\]\:text-blue-300 code{color:var(--color-blue-300)}.\[\&_pre\]\:rounded-lg pre{border-radius:var(--radius-lg)}.\[\&_pre\]\:bg-\[\#0d0d0d\] pre{background-color:#0d0d0d}.\[\&_pre\]\:p-3 pre{padding:calc(var(--spacing) * 3)}}body,html{color:#e5e7eb;background:#0a0a0a;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}::-webkit-scrollbar{width:6px}::-webkit-scrollbar-track{background:#0a0a0a}::-webkit-scrollbar-thumb{background:#333;border-radius:3px}::-webkit-scrollbar-thumb:hover{background:#555}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@keyframes pulse{50%{opacity:.5}}
@@ -1 +1 @@
1
- <!DOCTYPE html><!--MVm365HKyeUw6JuHrli2h--><html lang="de"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/alfred/_next/static/css/c6dce7a29a70612c.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/alfred/_next/static/chunks/webpack-dd89effdde862170.js"/><script src="/alfred/_next/static/chunks/8e6518bb-c26e82767f1faf66.js" async=""></script><script src="/alfred/_next/static/chunks/743-05c790de389fcbe8.js" async=""></script><script src="/alfred/_next/static/chunks/main-app-bf91f7268c1fdab4.js" async=""></script><script src="/alfred/_next/static/chunks/app/layout-ab17f30494d646ca.js" async=""></script><script src="/alfred/_next/static/chunks/188-dca4c90c7e992695.js" async=""></script><script src="/alfred/_next/static/chunks/624-3cd10e0b2e585d67.js" async=""></script><script src="/alfred/_next/static/chunks/app/chat/page-62b98eb665eb19d4.js" async=""></script><title>Alfred AI</title><meta name="description" content="Self-hosted AI Assistant"/><script src="/alfred/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="bg-[#0a0a0a] text-gray-200 h-screen overflow-hidden"><div hidden=""><!--$--><!--/$--></div><div class="flex h-full"><aside class="w-16 md:w-56 bg-[#111111] border-r border-[#1f1f1f] flex flex-col h-full"><div class="p-4 border-b border-[#1f1f1f]"><a href="/alfred/" class="flex items-center gap-2"><span class="text-xl font-bold text-blue-500 font-mono">A</span><span class="hidden md:inline text-sm font-semibold text-gray-200">Alfred</span></a></div><nav class="flex-1 p-2 space-y-1"><a href="/alfred/chat/" class="flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors text-gray-400 hover:bg-[#1a1a1a] hover:text-gray-200"><span>💬</span><span class="hidden md:inline">Chat</span></a><a href="/alfred/dashboard/" class="flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors text-gray-400 hover:bg-[#1a1a1a] hover:text-gray-200"><span>📊</span><span class="hidden md:inline">Dashboard</span></a><a href="/alfred/settings/" class="flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors text-gray-400 hover:bg-[#1a1a1a] hover:text-gray-200"><span>⚙️</span><span class="hidden md:inline">Settings</span></a></nav><div class="p-4 border-t border-[#1f1f1f]"><a href="https://github.com/madh99/alfred-ai" target="_blank" rel="noopener noreferrer" class="text-xs text-gray-500 hover:text-gray-400 hidden md:block">GitHub</a></div></aside><main class="flex-1 overflow-y-auto"><div class="flex flex-col h-full"><div class="flex-1 overflow-y-auto p-4"><div class="max-w-4xl mx-auto"><div class="text-center text-gray-500 mt-20"><p class="text-4xl mb-4 font-mono font-bold text-blue-500">Alfred</p><p class="text-sm">Self-hosted AI Assistant</p><p class="text-xs mt-2 text-gray-600">Stelle eine Frage oder gib einen Befehl ein.</p><p class="text-xs mt-4 text-gray-700">User: <span class="font-mono text-gray-500">web-user</span><br/><span class="text-gray-600">Sage &quot;Link my account&quot; um mit Telegram/Matrix zu verknüpfen.</span></p></div></div></div><div class="border-t border-[#1f1f1f] bg-[#111111] p-4"><div class="flex gap-3 max-w-4xl mx-auto"><textarea placeholder="Nachricht an Alfred..." rows="1" class="flex-1 bg-[#1a1a1a] text-gray-200 border border-[#2a2a2a] rounded-xl px-4 py-3 text-sm resize-none focus:outline-none focus:border-blue-500 placeholder-gray-500 disabled:opacity-50"></textarea><button disabled="" class="bg-blue-600 hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed text-white rounded-xl px-5 py-3 text-sm font-medium transition-colors">Senden</button></div></div></div><!--$--><!--/$--></main></div><script src="/alfred/_next/static/chunks/webpack-dd89effdde862170.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[8719,[\"177\",\"static/chunks/app/layout-ab17f30494d646ca.js\"],\"ConfigProvider\"]\n3:I[4314,[\"177\",\"static/chunks/app/layout-ab17f30494d646ca.js\"],\"Sidebar\"]\n4:I[8954,[],\"\"]\n5:I[5640,[],\"\"]\n6:I[1740,[\"188\",\"static/chunks/188-dca4c90c7e992695.js\",\"624\",\"static/chunks/624-3cd10e0b2e585d67.js\",\"457\",\"static/chunks/app/chat/page-62b98eb665eb19d4.js\"],\"ChatPage\"]\n7:I[2051,[],\"OutletBoundary\"]\n9:I[6658,[],\"AsyncMetadataOutlet\"]\nb:I[2051,[],\"ViewportBoundary\"]\nd:I[2051,[],\"MetadataBoundary\"]\ne:\"$Sreact.suspense\"\n10:I[7698,[],\"\"]\n:HL[\"/alfred/_next/static/css/c6dce7a29a70612c.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"MVm365HKyeUw6JuHrli2h\",\"p\":\"/alfred\",\"c\":[\"\",\"chat\",\"\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"chat\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/alfred/_next/static/css/c6dce7a29a70612c.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"de\",\"children\":[\"$\",\"body\",null,{\"className\":\"bg-[#0a0a0a] text-gray-200 h-screen overflow-hidden\",\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"div\",null,{\"className\":\"flex h-full\",\"children\":[[\"$\",\"$L3\",null,{}],[\"$\",\"main\",null,{\"className\":\"flex-1 overflow-y-auto\",\"children\":[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$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.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]]}]}]}]}]]}],{\"children\":[\"chat\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"$L6\",null,{}],null,[\"$\",\"$L7\",null,{\"children\":[\"$L8\",[\"$\",\"$L9\",null,{\"promise\":\"$@a\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[[\"$\",\"$Lb\",null,{\"children\":\"$Lc\"}],null],[\"$\",\"$Ld\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$e\",null,{\"fallback\":null,\"children\":\"$Lf\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$10\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"c:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n8:null\n"])</script><script>self.__next_f.push([1,"a:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"Alfred AI\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Self-hosted AI Assistant\"}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"f:\"$a:metadata\"\n"])</script></body></html>
1
+ <!DOCTYPE html><!--IjgSY_l4QaNVEU2a3w7qJ--><html lang="de"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/alfred/_next/static/css/250d2ae3e56f3d90.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/alfred/_next/static/chunks/webpack-dd89effdde862170.js"/><script src="/alfred/_next/static/chunks/8e6518bb-c26e82767f1faf66.js" async=""></script><script src="/alfred/_next/static/chunks/743-05c790de389fcbe8.js" async=""></script><script src="/alfred/_next/static/chunks/main-app-bf91f7268c1fdab4.js" async=""></script><script src="/alfred/_next/static/chunks/app/layout-ab17f30494d646ca.js" async=""></script><script src="/alfred/_next/static/chunks/188-dca4c90c7e992695.js" async=""></script><script src="/alfred/_next/static/chunks/624-3cd10e0b2e585d67.js" async=""></script><script src="/alfred/_next/static/chunks/app/chat/page-62b98eb665eb19d4.js" async=""></script><title>Alfred AI</title><meta name="description" content="Self-hosted AI Assistant"/><script src="/alfred/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="bg-[#0a0a0a] text-gray-200 h-screen overflow-hidden"><div hidden=""><!--$--><!--/$--></div><div class="flex h-full"><aside class="w-16 md:w-56 bg-[#111111] border-r border-[#1f1f1f] flex flex-col h-full"><div class="p-4 border-b border-[#1f1f1f]"><a href="/alfred/" class="flex items-center gap-2"><span class="text-xl font-bold text-blue-500 font-mono">A</span><span class="hidden md:inline text-sm font-semibold text-gray-200">Alfred</span></a></div><nav class="flex-1 p-2 space-y-1"><a href="/alfred/chat/" class="flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors text-gray-400 hover:bg-[#1a1a1a] hover:text-gray-200"><span>💬</span><span class="hidden md:inline">Chat</span></a><a href="/alfred/dashboard/" class="flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors text-gray-400 hover:bg-[#1a1a1a] hover:text-gray-200"><span>📊</span><span class="hidden md:inline">Dashboard</span></a><a href="/alfred/settings/" class="flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors text-gray-400 hover:bg-[#1a1a1a] hover:text-gray-200"><span>⚙️</span><span class="hidden md:inline">Settings</span></a></nav><div class="p-4 border-t border-[#1f1f1f]"><a href="https://github.com/madh99/alfred-ai" target="_blank" rel="noopener noreferrer" class="text-xs text-gray-500 hover:text-gray-400 hidden md:block">GitHub</a></div></aside><main class="flex-1 overflow-y-auto"><div class="flex flex-col h-full"><div class="flex-1 overflow-y-auto p-4"><div class="max-w-4xl mx-auto"><div class="text-center text-gray-500 mt-20"><p class="text-4xl mb-4 font-mono font-bold text-blue-500">Alfred</p><p class="text-sm">Self-hosted AI Assistant</p><p class="text-xs mt-2 text-gray-600">Stelle eine Frage oder gib einen Befehl ein.</p><p class="text-xs mt-4 text-gray-700">User: <span class="font-mono text-gray-500">web-user</span><br/><span class="text-gray-600">Sage &quot;Link my account&quot; um mit Telegram/Matrix zu verknüpfen.</span></p></div></div></div><div class="border-t border-[#1f1f1f] bg-[#111111] p-4"><div class="flex gap-3 max-w-4xl mx-auto"><textarea placeholder="Nachricht an Alfred..." rows="1" class="flex-1 bg-[#1a1a1a] text-gray-200 border border-[#2a2a2a] rounded-xl px-4 py-3 text-sm resize-none focus:outline-none focus:border-blue-500 placeholder-gray-500 disabled:opacity-50"></textarea><button disabled="" class="bg-blue-600 hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed text-white rounded-xl px-5 py-3 text-sm font-medium transition-colors">Senden</button></div></div></div><!--$--><!--/$--></main></div><script src="/alfred/_next/static/chunks/webpack-dd89effdde862170.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[8719,[\"177\",\"static/chunks/app/layout-ab17f30494d646ca.js\"],\"ConfigProvider\"]\n3:I[4314,[\"177\",\"static/chunks/app/layout-ab17f30494d646ca.js\"],\"Sidebar\"]\n4:I[8954,[],\"\"]\n5:I[5640,[],\"\"]\n6:I[1740,[\"188\",\"static/chunks/188-dca4c90c7e992695.js\",\"624\",\"static/chunks/624-3cd10e0b2e585d67.js\",\"457\",\"static/chunks/app/chat/page-62b98eb665eb19d4.js\"],\"ChatPage\"]\n7:I[2051,[],\"OutletBoundary\"]\n9:I[6658,[],\"AsyncMetadataOutlet\"]\nb:I[2051,[],\"ViewportBoundary\"]\nd:I[2051,[],\"MetadataBoundary\"]\ne:\"$Sreact.suspense\"\n10:I[7698,[],\"\"]\n:HL[\"/alfred/_next/static/css/250d2ae3e56f3d90.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"IjgSY_l4QaNVEU2a3w7qJ\",\"p\":\"/alfred\",\"c\":[\"\",\"chat\",\"\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"chat\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/alfred/_next/static/css/250d2ae3e56f3d90.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"de\",\"children\":[\"$\",\"body\",null,{\"className\":\"bg-[#0a0a0a] text-gray-200 h-screen overflow-hidden\",\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"div\",null,{\"className\":\"flex h-full\",\"children\":[[\"$\",\"$L3\",null,{}],[\"$\",\"main\",null,{\"className\":\"flex-1 overflow-y-auto\",\"children\":[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$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.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]]}]}]}]}]]}],{\"children\":[\"chat\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"$L6\",null,{}],null,[\"$\",\"$L7\",null,{\"children\":[\"$L8\",[\"$\",\"$L9\",null,{\"promise\":\"$@a\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[[\"$\",\"$Lb\",null,{\"children\":\"$Lc\"}],null],[\"$\",\"$Ld\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$e\",null,{\"fallback\":null,\"children\":\"$Lf\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$10\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"c:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n8:null\n"])</script><script>self.__next_f.push([1,"a:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"Alfred AI\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Self-hosted AI Assistant\"}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"f:\"$a:metadata\"\n"])</script></body></html>
@@ -10,8 +10,8 @@ b:I[2051,[],"ViewportBoundary"]
10
10
  d:I[2051,[],"MetadataBoundary"]
11
11
  e:"$Sreact.suspense"
12
12
  10:I[7698,[],""]
13
- :HL["/alfred/_next/static/css/c6dce7a29a70612c.css","style"]
14
- 0:{"P":null,"b":"MVm365HKyeUw6JuHrli2h","p":"/alfred","c":["","chat",""],"i":false,"f":[[["",{"children":["chat",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/alfred/_next/static/css/c6dce7a29a70612c.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"de","children":["$","body",null,{"className":"bg-[#0a0a0a] text-gray-200 h-screen overflow-hidden","children":["$","$L2",null,{"children":["$","div",null,{"className":"flex h-full","children":[["$","$L3",null,{}],["$","main",null,{"className":"flex-1 overflow-y-auto","children":["$","$L4",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$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."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]]}]}]}]}]]}],{"children":["chat",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$L6",null,{}],null,["$","$L7",null,{"children":["$L8",["$","$L9",null,{"promise":"$@a"}]]}]]}],{},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,[["$","$Lb",null,{"children":"$Lc"}],null],["$","$Ld",null,{"children":["$","div",null,{"hidden":true,"children":["$","$e",null,{"fallback":null,"children":"$Lf"}]}]}]]}],false]],"m":"$undefined","G":["$10",[]],"s":false,"S":true}
13
+ :HL["/alfred/_next/static/css/250d2ae3e56f3d90.css","style"]
14
+ 0:{"P":null,"b":"IjgSY_l4QaNVEU2a3w7qJ","p":"/alfred","c":["","chat",""],"i":false,"f":[[["",{"children":["chat",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/alfred/_next/static/css/250d2ae3e56f3d90.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"de","children":["$","body",null,{"className":"bg-[#0a0a0a] text-gray-200 h-screen overflow-hidden","children":["$","$L2",null,{"children":["$","div",null,{"className":"flex h-full","children":[["$","$L3",null,{}],["$","main",null,{"className":"flex-1 overflow-y-auto","children":["$","$L4",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$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."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]]}]}]}]}]]}],{"children":["chat",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$L6",null,{}],null,["$","$L7",null,{"children":["$L8",["$","$L9",null,{"promise":"$@a"}]]}]]}],{},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,[["$","$Lb",null,{"children":"$Lc"}],null],["$","$Ld",null,{"children":["$","div",null,{"hidden":true,"children":["$","$e",null,{"fallback":null,"children":"$Lf"}]}]}]]}],false]],"m":"$undefined","G":["$10",[]],"s":false,"S":true}
15
15
  c:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
16
16
  8:null
17
17
  a:{"metadata":[["$","title","0",{"children":"Alfred AI"}],["$","meta","1",{"name":"description","content":"Self-hosted AI Assistant"}]],"error":null,"digest":"$undefined"}
@@ -1 +1 @@
1
- <!DOCTYPE html><!--MVm365HKyeUw6JuHrli2h--><html lang="de"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/alfred/_next/static/css/c6dce7a29a70612c.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/alfred/_next/static/chunks/webpack-dd89effdde862170.js"/><script src="/alfred/_next/static/chunks/8e6518bb-c26e82767f1faf66.js" async=""></script><script src="/alfred/_next/static/chunks/743-05c790de389fcbe8.js" async=""></script><script src="/alfred/_next/static/chunks/main-app-bf91f7268c1fdab4.js" async=""></script><script src="/alfred/_next/static/chunks/app/layout-ab17f30494d646ca.js" async=""></script><script src="/alfred/_next/static/chunks/app/dashboard/page-3b946bb6905fdb45.js" async=""></script><title>Alfred AI</title><meta name="description" content="Self-hosted AI Assistant"/><script src="/alfred/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="bg-[#0a0a0a] text-gray-200 h-screen overflow-hidden"><div hidden=""><!--$--><!--/$--></div><div class="flex h-full"><aside class="w-16 md:w-56 bg-[#111111] border-r border-[#1f1f1f] flex flex-col h-full"><div class="p-4 border-b border-[#1f1f1f]"><a href="/alfred/" class="flex items-center gap-2"><span class="text-xl font-bold text-blue-500 font-mono">A</span><span class="hidden md:inline text-sm font-semibold text-gray-200">Alfred</span></a></div><nav class="flex-1 p-2 space-y-1"><a href="/alfred/chat/" class="flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors text-gray-400 hover:bg-[#1a1a1a] hover:text-gray-200"><span>💬</span><span class="hidden md:inline">Chat</span></a><a href="/alfred/dashboard/" class="flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors text-gray-400 hover:bg-[#1a1a1a] hover:text-gray-200"><span>📊</span><span class="hidden md:inline">Dashboard</span></a><a href="/alfred/settings/" class="flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors text-gray-400 hover:bg-[#1a1a1a] hover:text-gray-200"><span>⚙️</span><span class="hidden md:inline">Settings</span></a></nav><div class="p-4 border-t border-[#1f1f1f]"><a href="https://github.com/madh99/alfred-ai" target="_blank" rel="noopener noreferrer" class="text-xs text-gray-500 hover:text-gray-400 hidden md:block">GitHub</a></div></aside><main class="flex-1 overflow-y-auto"><div class="p-8 text-gray-400">Laden...</div><!--$--><!--/$--></main></div><script src="/alfred/_next/static/chunks/webpack-dd89effdde862170.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[8719,[\"177\",\"static/chunks/app/layout-ab17f30494d646ca.js\"],\"ConfigProvider\"]\n3:I[4314,[\"177\",\"static/chunks/app/layout-ab17f30494d646ca.js\"],\"Sidebar\"]\n4:I[8954,[],\"\"]\n5:I[5640,[],\"\"]\n6:I[9772,[\"105\",\"static/chunks/app/dashboard/page-3b946bb6905fdb45.js\"],\"DashboardPage\"]\n7:I[2051,[],\"OutletBoundary\"]\n9:I[6658,[],\"AsyncMetadataOutlet\"]\nb:I[2051,[],\"ViewportBoundary\"]\nd:I[2051,[],\"MetadataBoundary\"]\ne:\"$Sreact.suspense\"\n10:I[7698,[],\"\"]\n:HL[\"/alfred/_next/static/css/c6dce7a29a70612c.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"MVm365HKyeUw6JuHrli2h\",\"p\":\"/alfred\",\"c\":[\"\",\"dashboard\",\"\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"dashboard\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/alfred/_next/static/css/c6dce7a29a70612c.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"de\",\"children\":[\"$\",\"body\",null,{\"className\":\"bg-[#0a0a0a] text-gray-200 h-screen overflow-hidden\",\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"div\",null,{\"className\":\"flex h-full\",\"children\":[[\"$\",\"$L3\",null,{}],[\"$\",\"main\",null,{\"className\":\"flex-1 overflow-y-auto\",\"children\":[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$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.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]]}]}]}]}]]}],{\"children\":[\"dashboard\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"$L6\",null,{}],null,[\"$\",\"$L7\",null,{\"children\":[\"$L8\",[\"$\",\"$L9\",null,{\"promise\":\"$@a\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[[\"$\",\"$Lb\",null,{\"children\":\"$Lc\"}],null],[\"$\",\"$Ld\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$e\",null,{\"fallback\":null,\"children\":\"$Lf\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$10\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"c:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n8:null\n"])</script><script>self.__next_f.push([1,"a:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"Alfred AI\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Self-hosted AI Assistant\"}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"f:\"$a:metadata\"\n"])</script></body></html>
1
+ <!DOCTYPE html><!--IjgSY_l4QaNVEU2a3w7qJ--><html lang="de"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/alfred/_next/static/css/250d2ae3e56f3d90.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/alfred/_next/static/chunks/webpack-dd89effdde862170.js"/><script src="/alfred/_next/static/chunks/8e6518bb-c26e82767f1faf66.js" async=""></script><script src="/alfred/_next/static/chunks/743-05c790de389fcbe8.js" async=""></script><script src="/alfred/_next/static/chunks/main-app-bf91f7268c1fdab4.js" async=""></script><script src="/alfred/_next/static/chunks/app/layout-ab17f30494d646ca.js" async=""></script><script src="/alfred/_next/static/chunks/app/dashboard/page-45fc77ad2e3e996f.js" async=""></script><title>Alfred AI</title><meta name="description" content="Self-hosted AI Assistant"/><script src="/alfred/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="bg-[#0a0a0a] text-gray-200 h-screen overflow-hidden"><div hidden=""><!--$--><!--/$--></div><div class="flex h-full"><aside class="w-16 md:w-56 bg-[#111111] border-r border-[#1f1f1f] flex flex-col h-full"><div class="p-4 border-b border-[#1f1f1f]"><a href="/alfred/" class="flex items-center gap-2"><span class="text-xl font-bold text-blue-500 font-mono">A</span><span class="hidden md:inline text-sm font-semibold text-gray-200">Alfred</span></a></div><nav class="flex-1 p-2 space-y-1"><a href="/alfred/chat/" class="flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors text-gray-400 hover:bg-[#1a1a1a] hover:text-gray-200"><span>💬</span><span class="hidden md:inline">Chat</span></a><a href="/alfred/dashboard/" class="flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors text-gray-400 hover:bg-[#1a1a1a] hover:text-gray-200"><span>📊</span><span class="hidden md:inline">Dashboard</span></a><a href="/alfred/settings/" class="flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors text-gray-400 hover:bg-[#1a1a1a] hover:text-gray-200"><span>⚙️</span><span class="hidden md:inline">Settings</span></a></nav><div class="p-4 border-t border-[#1f1f1f]"><a href="https://github.com/madh99/alfred-ai" target="_blank" rel="noopener noreferrer" class="text-xs text-gray-500 hover:text-gray-400 hidden md:block">GitHub</a></div></aside><main class="flex-1 overflow-y-auto"><div class="p-8 text-gray-400">Laden...</div><!--$--><!--/$--></main></div><script src="/alfred/_next/static/chunks/webpack-dd89effdde862170.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[8719,[\"177\",\"static/chunks/app/layout-ab17f30494d646ca.js\"],\"ConfigProvider\"]\n3:I[4314,[\"177\",\"static/chunks/app/layout-ab17f30494d646ca.js\"],\"Sidebar\"]\n4:I[8954,[],\"\"]\n5:I[5640,[],\"\"]\n6:I[9772,[\"105\",\"static/chunks/app/dashboard/page-45fc77ad2e3e996f.js\"],\"DashboardPage\"]\n7:I[2051,[],\"OutletBoundary\"]\n9:I[6658,[],\"AsyncMetadataOutlet\"]\nb:I[2051,[],\"ViewportBoundary\"]\nd:I[2051,[],\"MetadataBoundary\"]\ne:\"$Sreact.suspense\"\n10:I[7698,[],\"\"]\n:HL[\"/alfred/_next/static/css/250d2ae3e56f3d90.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"IjgSY_l4QaNVEU2a3w7qJ\",\"p\":\"/alfred\",\"c\":[\"\",\"dashboard\",\"\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"dashboard\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/alfred/_next/static/css/250d2ae3e56f3d90.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"de\",\"children\":[\"$\",\"body\",null,{\"className\":\"bg-[#0a0a0a] text-gray-200 h-screen overflow-hidden\",\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"div\",null,{\"className\":\"flex h-full\",\"children\":[[\"$\",\"$L3\",null,{}],[\"$\",\"main\",null,{\"className\":\"flex-1 overflow-y-auto\",\"children\":[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$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.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]]}]}]}]}]]}],{\"children\":[\"dashboard\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"$L6\",null,{}],null,[\"$\",\"$L7\",null,{\"children\":[\"$L8\",[\"$\",\"$L9\",null,{\"promise\":\"$@a\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[[\"$\",\"$Lb\",null,{\"children\":\"$Lc\"}],null],[\"$\",\"$Ld\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$e\",null,{\"fallback\":null,\"children\":\"$Lf\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$10\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"c:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n8:null\n"])</script><script>self.__next_f.push([1,"a:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"Alfred AI\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Self-hosted AI Assistant\"}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"f:\"$a:metadata\"\n"])</script></body></html>
@@ -3,15 +3,15 @@
3
3
  3:I[4314,["177","static/chunks/app/layout-ab17f30494d646ca.js"],"Sidebar"]
4
4
  4:I[8954,[],""]
5
5
  5:I[5640,[],""]
6
- 6:I[9772,["105","static/chunks/app/dashboard/page-3b946bb6905fdb45.js"],"DashboardPage"]
6
+ 6:I[9772,["105","static/chunks/app/dashboard/page-45fc77ad2e3e996f.js"],"DashboardPage"]
7
7
  7:I[2051,[],"OutletBoundary"]
8
8
  9:I[6658,[],"AsyncMetadataOutlet"]
9
9
  b:I[2051,[],"ViewportBoundary"]
10
10
  d:I[2051,[],"MetadataBoundary"]
11
11
  e:"$Sreact.suspense"
12
12
  10:I[7698,[],""]
13
- :HL["/alfred/_next/static/css/c6dce7a29a70612c.css","style"]
14
- 0:{"P":null,"b":"MVm365HKyeUw6JuHrli2h","p":"/alfred","c":["","dashboard",""],"i":false,"f":[[["",{"children":["dashboard",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/alfred/_next/static/css/c6dce7a29a70612c.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"de","children":["$","body",null,{"className":"bg-[#0a0a0a] text-gray-200 h-screen overflow-hidden","children":["$","$L2",null,{"children":["$","div",null,{"className":"flex h-full","children":[["$","$L3",null,{}],["$","main",null,{"className":"flex-1 overflow-y-auto","children":["$","$L4",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$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."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]]}]}]}]}]]}],{"children":["dashboard",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$L6",null,{}],null,["$","$L7",null,{"children":["$L8",["$","$L9",null,{"promise":"$@a"}]]}]]}],{},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,[["$","$Lb",null,{"children":"$Lc"}],null],["$","$Ld",null,{"children":["$","div",null,{"hidden":true,"children":["$","$e",null,{"fallback":null,"children":"$Lf"}]}]}]]}],false]],"m":"$undefined","G":["$10",[]],"s":false,"S":true}
13
+ :HL["/alfred/_next/static/css/250d2ae3e56f3d90.css","style"]
14
+ 0:{"P":null,"b":"IjgSY_l4QaNVEU2a3w7qJ","p":"/alfred","c":["","dashboard",""],"i":false,"f":[[["",{"children":["dashboard",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/alfred/_next/static/css/250d2ae3e56f3d90.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"de","children":["$","body",null,{"className":"bg-[#0a0a0a] text-gray-200 h-screen overflow-hidden","children":["$","$L2",null,{"children":["$","div",null,{"className":"flex h-full","children":[["$","$L3",null,{}],["$","main",null,{"className":"flex-1 overflow-y-auto","children":["$","$L4",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$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."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]]}]}]}]}]]}],{"children":["dashboard",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$L6",null,{}],null,["$","$L7",null,{"children":["$L8",["$","$L9",null,{"promise":"$@a"}]]}]]}],{},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,[["$","$Lb",null,{"children":"$Lc"}],null],["$","$Ld",null,{"children":["$","div",null,{"hidden":true,"children":["$","$e",null,{"fallback":null,"children":"$Lf"}]}]}]]}],false]],"m":"$undefined","G":["$10",[]],"s":false,"S":true}
15
15
  c:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
16
16
  8:null
17
17
  a:{"metadata":[["$","title","0",{"children":"Alfred AI"}],["$","meta","1",{"name":"description","content":"Self-hosted AI Assistant"}]],"error":null,"digest":"$undefined"}
@@ -1 +1 @@
1
- <!DOCTYPE html><!--MVm365HKyeUw6JuHrli2h--><html lang="de"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/alfred/_next/static/css/c6dce7a29a70612c.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/alfred/_next/static/chunks/webpack-dd89effdde862170.js"/><script src="/alfred/_next/static/chunks/8e6518bb-c26e82767f1faf66.js" async=""></script><script src="/alfred/_next/static/chunks/743-05c790de389fcbe8.js" async=""></script><script src="/alfred/_next/static/chunks/main-app-bf91f7268c1fdab4.js" async=""></script><script src="/alfred/_next/static/chunks/app/layout-ab17f30494d646ca.js" async=""></script><script src="/alfred/_next/static/chunks/188-dca4c90c7e992695.js" async=""></script><script src="/alfred/_next/static/chunks/624-3cd10e0b2e585d67.js" async=""></script><script src="/alfred/_next/static/chunks/app/page-291dc9884a6d63cc.js" async=""></script><title>Alfred AI</title><meta name="description" content="Self-hosted AI Assistant"/><script src="/alfred/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="bg-[#0a0a0a] text-gray-200 h-screen overflow-hidden"><div hidden=""><!--$--><!--/$--></div><div class="flex h-full"><aside class="w-16 md:w-56 bg-[#111111] border-r border-[#1f1f1f] flex flex-col h-full"><div class="p-4 border-b border-[#1f1f1f]"><a href="/alfred/" class="flex items-center gap-2"><span class="text-xl font-bold text-blue-500 font-mono">A</span><span class="hidden md:inline text-sm font-semibold text-gray-200">Alfred</span></a></div><nav class="flex-1 p-2 space-y-1"><a href="/alfred/chat/" class="flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors text-gray-400 hover:bg-[#1a1a1a] hover:text-gray-200"><span>💬</span><span class="hidden md:inline">Chat</span></a><a href="/alfred/dashboard/" class="flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors text-gray-400 hover:bg-[#1a1a1a] hover:text-gray-200"><span>📊</span><span class="hidden md:inline">Dashboard</span></a><a href="/alfred/settings/" class="flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors text-gray-400 hover:bg-[#1a1a1a] hover:text-gray-200"><span>⚙️</span><span class="hidden md:inline">Settings</span></a></nav><div class="p-4 border-t border-[#1f1f1f]"><a href="https://github.com/madh99/alfred-ai" target="_blank" rel="noopener noreferrer" class="text-xs text-gray-500 hover:text-gray-400 hidden md:block">GitHub</a></div></aside><main class="flex-1 overflow-y-auto"><div class="flex flex-col h-full"><div class="flex-1 overflow-y-auto p-4"><div class="max-w-4xl mx-auto"><div class="text-center text-gray-500 mt-20"><p class="text-4xl mb-4 font-mono font-bold text-blue-500">Alfred</p><p class="text-sm">Self-hosted AI Assistant</p><p class="text-xs mt-2 text-gray-600">Stelle eine Frage oder gib einen Befehl ein.</p><p class="text-xs mt-4 text-gray-700">User: <span class="font-mono text-gray-500">web-user</span><br/><span class="text-gray-600">Sage &quot;Link my account&quot; um mit Telegram/Matrix zu verknüpfen.</span></p></div></div></div><div class="border-t border-[#1f1f1f] bg-[#111111] p-4"><div class="flex gap-3 max-w-4xl mx-auto"><textarea placeholder="Nachricht an Alfred..." rows="1" class="flex-1 bg-[#1a1a1a] text-gray-200 border border-[#2a2a2a] rounded-xl px-4 py-3 text-sm resize-none focus:outline-none focus:border-blue-500 placeholder-gray-500 disabled:opacity-50"></textarea><button disabled="" class="bg-blue-600 hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed text-white rounded-xl px-5 py-3 text-sm font-medium transition-colors">Senden</button></div></div></div><!--$--><!--/$--></main></div><script src="/alfred/_next/static/chunks/webpack-dd89effdde862170.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[8719,[\"177\",\"static/chunks/app/layout-ab17f30494d646ca.js\"],\"ConfigProvider\"]\n3:I[4314,[\"177\",\"static/chunks/app/layout-ab17f30494d646ca.js\"],\"Sidebar\"]\n4:I[8954,[],\"\"]\n5:I[5640,[],\"\"]\n6:I[1740,[\"188\",\"static/chunks/188-dca4c90c7e992695.js\",\"624\",\"static/chunks/624-3cd10e0b2e585d67.js\",\"974\",\"static/chunks/app/page-291dc9884a6d63cc.js\"],\"ChatPage\"]\n7:I[2051,[],\"OutletBoundary\"]\n9:I[6658,[],\"AsyncMetadataOutlet\"]\nb:I[2051,[],\"ViewportBoundary\"]\nd:I[2051,[],\"MetadataBoundary\"]\ne:\"$Sreact.suspense\"\n10:I[7698,[],\"\"]\n:HL[\"/alfred/_next/static/css/c6dce7a29a70612c.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"MVm365HKyeUw6JuHrli2h\",\"p\":\"/alfred\",\"c\":[\"\",\"\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/alfred/_next/static/css/c6dce7a29a70612c.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"de\",\"children\":[\"$\",\"body\",null,{\"className\":\"bg-[#0a0a0a] text-gray-200 h-screen overflow-hidden\",\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"div\",null,{\"className\":\"flex h-full\",\"children\":[[\"$\",\"$L3\",null,{}],[\"$\",\"main\",null,{\"className\":\"flex-1 overflow-y-auto\",\"children\":[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$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.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]]}]}]}]}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"$L6\",null,{}],null,[\"$\",\"$L7\",null,{\"children\":[\"$L8\",[\"$\",\"$L9\",null,{\"promise\":\"$@a\"}]]}]]}],{},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[[\"$\",\"$Lb\",null,{\"children\":\"$Lc\"}],null],[\"$\",\"$Ld\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$e\",null,{\"fallback\":null,\"children\":\"$Lf\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$10\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"c:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n8:null\n"])</script><script>self.__next_f.push([1,"a:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"Alfred AI\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Self-hosted AI Assistant\"}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"f:\"$a:metadata\"\n"])</script></body></html>
1
+ <!DOCTYPE html><!--IjgSY_l4QaNVEU2a3w7qJ--><html lang="de"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/alfred/_next/static/css/250d2ae3e56f3d90.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/alfred/_next/static/chunks/webpack-dd89effdde862170.js"/><script src="/alfred/_next/static/chunks/8e6518bb-c26e82767f1faf66.js" async=""></script><script src="/alfred/_next/static/chunks/743-05c790de389fcbe8.js" async=""></script><script src="/alfred/_next/static/chunks/main-app-bf91f7268c1fdab4.js" async=""></script><script src="/alfred/_next/static/chunks/app/layout-ab17f30494d646ca.js" async=""></script><script src="/alfred/_next/static/chunks/188-dca4c90c7e992695.js" async=""></script><script src="/alfred/_next/static/chunks/624-3cd10e0b2e585d67.js" async=""></script><script src="/alfred/_next/static/chunks/app/page-291dc9884a6d63cc.js" async=""></script><title>Alfred AI</title><meta name="description" content="Self-hosted AI Assistant"/><script src="/alfred/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="bg-[#0a0a0a] text-gray-200 h-screen overflow-hidden"><div hidden=""><!--$--><!--/$--></div><div class="flex h-full"><aside class="w-16 md:w-56 bg-[#111111] border-r border-[#1f1f1f] flex flex-col h-full"><div class="p-4 border-b border-[#1f1f1f]"><a href="/alfred/" class="flex items-center gap-2"><span class="text-xl font-bold text-blue-500 font-mono">A</span><span class="hidden md:inline text-sm font-semibold text-gray-200">Alfred</span></a></div><nav class="flex-1 p-2 space-y-1"><a href="/alfred/chat/" class="flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors text-gray-400 hover:bg-[#1a1a1a] hover:text-gray-200"><span>💬</span><span class="hidden md:inline">Chat</span></a><a href="/alfred/dashboard/" class="flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors text-gray-400 hover:bg-[#1a1a1a] hover:text-gray-200"><span>📊</span><span class="hidden md:inline">Dashboard</span></a><a href="/alfred/settings/" class="flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors text-gray-400 hover:bg-[#1a1a1a] hover:text-gray-200"><span>⚙️</span><span class="hidden md:inline">Settings</span></a></nav><div class="p-4 border-t border-[#1f1f1f]"><a href="https://github.com/madh99/alfred-ai" target="_blank" rel="noopener noreferrer" class="text-xs text-gray-500 hover:text-gray-400 hidden md:block">GitHub</a></div></aside><main class="flex-1 overflow-y-auto"><div class="flex flex-col h-full"><div class="flex-1 overflow-y-auto p-4"><div class="max-w-4xl mx-auto"><div class="text-center text-gray-500 mt-20"><p class="text-4xl mb-4 font-mono font-bold text-blue-500">Alfred</p><p class="text-sm">Self-hosted AI Assistant</p><p class="text-xs mt-2 text-gray-600">Stelle eine Frage oder gib einen Befehl ein.</p><p class="text-xs mt-4 text-gray-700">User: <span class="font-mono text-gray-500">web-user</span><br/><span class="text-gray-600">Sage &quot;Link my account&quot; um mit Telegram/Matrix zu verknüpfen.</span></p></div></div></div><div class="border-t border-[#1f1f1f] bg-[#111111] p-4"><div class="flex gap-3 max-w-4xl mx-auto"><textarea placeholder="Nachricht an Alfred..." rows="1" class="flex-1 bg-[#1a1a1a] text-gray-200 border border-[#2a2a2a] rounded-xl px-4 py-3 text-sm resize-none focus:outline-none focus:border-blue-500 placeholder-gray-500 disabled:opacity-50"></textarea><button disabled="" class="bg-blue-600 hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed text-white rounded-xl px-5 py-3 text-sm font-medium transition-colors">Senden</button></div></div></div><!--$--><!--/$--></main></div><script src="/alfred/_next/static/chunks/webpack-dd89effdde862170.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[8719,[\"177\",\"static/chunks/app/layout-ab17f30494d646ca.js\"],\"ConfigProvider\"]\n3:I[4314,[\"177\",\"static/chunks/app/layout-ab17f30494d646ca.js\"],\"Sidebar\"]\n4:I[8954,[],\"\"]\n5:I[5640,[],\"\"]\n6:I[1740,[\"188\",\"static/chunks/188-dca4c90c7e992695.js\",\"624\",\"static/chunks/624-3cd10e0b2e585d67.js\",\"974\",\"static/chunks/app/page-291dc9884a6d63cc.js\"],\"ChatPage\"]\n7:I[2051,[],\"OutletBoundary\"]\n9:I[6658,[],\"AsyncMetadataOutlet\"]\nb:I[2051,[],\"ViewportBoundary\"]\nd:I[2051,[],\"MetadataBoundary\"]\ne:\"$Sreact.suspense\"\n10:I[7698,[],\"\"]\n:HL[\"/alfred/_next/static/css/250d2ae3e56f3d90.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"IjgSY_l4QaNVEU2a3w7qJ\",\"p\":\"/alfred\",\"c\":[\"\",\"\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/alfred/_next/static/css/250d2ae3e56f3d90.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"de\",\"children\":[\"$\",\"body\",null,{\"className\":\"bg-[#0a0a0a] text-gray-200 h-screen overflow-hidden\",\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"div\",null,{\"className\":\"flex h-full\",\"children\":[[\"$\",\"$L3\",null,{}],[\"$\",\"main\",null,{\"className\":\"flex-1 overflow-y-auto\",\"children\":[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$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.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]]}]}]}]}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"$L6\",null,{}],null,[\"$\",\"$L7\",null,{\"children\":[\"$L8\",[\"$\",\"$L9\",null,{\"promise\":\"$@a\"}]]}]]}],{},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[[\"$\",\"$Lb\",null,{\"children\":\"$Lc\"}],null],[\"$\",\"$Ld\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$e\",null,{\"fallback\":null,\"children\":\"$Lf\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$10\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"c:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n8:null\n"])</script><script>self.__next_f.push([1,"a:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"Alfred AI\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Self-hosted AI Assistant\"}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"f:\"$a:metadata\"\n"])</script></body></html>
@@ -10,8 +10,8 @@ b:I[2051,[],"ViewportBoundary"]
10
10
  d:I[2051,[],"MetadataBoundary"]
11
11
  e:"$Sreact.suspense"
12
12
  10:I[7698,[],""]
13
- :HL["/alfred/_next/static/css/c6dce7a29a70612c.css","style"]
14
- 0:{"P":null,"b":"MVm365HKyeUw6JuHrli2h","p":"/alfred","c":["",""],"i":false,"f":[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/alfred/_next/static/css/c6dce7a29a70612c.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"de","children":["$","body",null,{"className":"bg-[#0a0a0a] text-gray-200 h-screen overflow-hidden","children":["$","$L2",null,{"children":["$","div",null,{"className":"flex h-full","children":[["$","$L3",null,{}],["$","main",null,{"className":"flex-1 overflow-y-auto","children":["$","$L4",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$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."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]]}]}]}]}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$L6",null,{}],null,["$","$L7",null,{"children":["$L8",["$","$L9",null,{"promise":"$@a"}]]}]]}],{},null,false]},null,false],["$","$1","h",{"children":[null,[["$","$Lb",null,{"children":"$Lc"}],null],["$","$Ld",null,{"children":["$","div",null,{"hidden":true,"children":["$","$e",null,{"fallback":null,"children":"$Lf"}]}]}]]}],false]],"m":"$undefined","G":["$10",[]],"s":false,"S":true}
13
+ :HL["/alfred/_next/static/css/250d2ae3e56f3d90.css","style"]
14
+ 0:{"P":null,"b":"IjgSY_l4QaNVEU2a3w7qJ","p":"/alfred","c":["",""],"i":false,"f":[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/alfred/_next/static/css/250d2ae3e56f3d90.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"de","children":["$","body",null,{"className":"bg-[#0a0a0a] text-gray-200 h-screen overflow-hidden","children":["$","$L2",null,{"children":["$","div",null,{"className":"flex h-full","children":[["$","$L3",null,{}],["$","main",null,{"className":"flex-1 overflow-y-auto","children":["$","$L4",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$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."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]]}]}]}]}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$L6",null,{}],null,["$","$L7",null,{"children":["$L8",["$","$L9",null,{"promise":"$@a"}]]}]]}],{},null,false]},null,false],["$","$1","h",{"children":[null,[["$","$Lb",null,{"children":"$Lc"}],null],["$","$Ld",null,{"children":["$","div",null,{"hidden":true,"children":["$","$e",null,{"fallback":null,"children":"$Lf"}]}]}]]}],false]],"m":"$undefined","G":["$10",[]],"s":false,"S":true}
15
15
  c:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
16
16
  8:null
17
17
  a:{"metadata":[["$","title","0",{"children":"Alfred AI"}],["$","meta","1",{"name":"description","content":"Self-hosted AI Assistant"}]],"error":null,"digest":"$undefined"}
@@ -1 +1 @@
1
- <!DOCTYPE html><!--MVm365HKyeUw6JuHrli2h--><html lang="de"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/alfred/_next/static/css/c6dce7a29a70612c.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/alfred/_next/static/chunks/webpack-dd89effdde862170.js"/><script src="/alfred/_next/static/chunks/8e6518bb-c26e82767f1faf66.js" async=""></script><script src="/alfred/_next/static/chunks/743-05c790de389fcbe8.js" async=""></script><script src="/alfred/_next/static/chunks/main-app-bf91f7268c1fdab4.js" async=""></script><script src="/alfred/_next/static/chunks/app/layout-ab17f30494d646ca.js" async=""></script><script src="/alfred/_next/static/chunks/app/settings/page-6cea9fa8997a3a59.js" async=""></script><title>Alfred AI</title><meta name="description" content="Self-hosted AI Assistant"/><script src="/alfred/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="bg-[#0a0a0a] text-gray-200 h-screen overflow-hidden"><div hidden=""><!--$--><!--/$--></div><div class="flex h-full"><aside class="w-16 md:w-56 bg-[#111111] border-r border-[#1f1f1f] flex flex-col h-full"><div class="p-4 border-b border-[#1f1f1f]"><a href="/alfred/" class="flex items-center gap-2"><span class="text-xl font-bold text-blue-500 font-mono">A</span><span class="hidden md:inline text-sm font-semibold text-gray-200">Alfred</span></a></div><nav class="flex-1 p-2 space-y-1"><a href="/alfred/chat/" class="flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors text-gray-400 hover:bg-[#1a1a1a] hover:text-gray-200"><span>💬</span><span class="hidden md:inline">Chat</span></a><a href="/alfred/dashboard/" class="flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors text-gray-400 hover:bg-[#1a1a1a] hover:text-gray-200"><span>📊</span><span class="hidden md:inline">Dashboard</span></a><a href="/alfred/settings/" class="flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors text-gray-400 hover:bg-[#1a1a1a] hover:text-gray-200"><span>⚙️</span><span class="hidden md:inline">Settings</span></a></nav><div class="p-4 border-t border-[#1f1f1f]"><a href="https://github.com/madh99/alfred-ai" target="_blank" rel="noopener noreferrer" class="text-xs text-gray-500 hover:text-gray-400 hidden md:block">GitHub</a></div></aside><main class="flex-1 overflow-y-auto"><div class="p-6 max-w-2xl mx-auto"><h1 class="text-xl font-semibold text-gray-200 mb-6">Einstellungen</h1><div class="bg-[#111111] border border-[#1f1f1f] rounded-xl p-6 space-y-5"><div><label class="block text-sm text-gray-400 mb-1">Alfred API URL</label><input type="text" placeholder="http://localhost:3420" class="w-full bg-[#0d0d0d] border border-[#2a2a2a] rounded-lg px-4 py-2.5 text-sm text-gray-200 focus:outline-none focus:border-blue-500" value=""/></div><div><label class="block text-sm text-gray-400 mb-1">API Token</label><input type="password" placeholder="Optional — Bearer Token" class="w-full bg-[#0d0d0d] border border-[#2a2a2a] rounded-lg px-4 py-2.5 text-sm text-gray-200 focus:outline-none focus:border-blue-500" value=""/></div><div class="flex gap-3"><button class="bg-blue-600 hover:bg-blue-700 text-white rounded-lg px-5 py-2.5 text-sm font-medium transition-colors">Speichern</button><button class="bg-[#1a1a1a] border border-[#2a2a2a] hover:bg-[#222] text-gray-300 rounded-lg px-5 py-2.5 text-sm transition-colors disabled:opacity-50">Verbindung testen</button></div></div><p class="text-xs text-gray-600 mt-4">Konfiguration wird in deinem Browser (localStorage) gespeichert. Token wird nie an Dritte gesendet.</p></div><!--$--><!--/$--></main></div><script src="/alfred/_next/static/chunks/webpack-dd89effdde862170.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[8719,[\"177\",\"static/chunks/app/layout-ab17f30494d646ca.js\"],\"ConfigProvider\"]\n3:I[4314,[\"177\",\"static/chunks/app/layout-ab17f30494d646ca.js\"],\"Sidebar\"]\n4:I[8954,[],\"\"]\n5:I[5640,[],\"\"]\n6:I[8171,[\"662\",\"static/chunks/app/settings/page-6cea9fa8997a3a59.js\"],\"SettingsPage\"]\n7:I[2051,[],\"OutletBoundary\"]\n9:I[6658,[],\"AsyncMetadataOutlet\"]\nb:I[2051,[],\"ViewportBoundary\"]\nd:I[2051,[],\"MetadataBoundary\"]\ne:\"$Sreact.suspense\"\n10:I[7698,[],\"\"]\n:HL[\"/alfred/_next/static/css/c6dce7a29a70612c.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"MVm365HKyeUw6JuHrli2h\",\"p\":\"/alfred\",\"c\":[\"\",\"settings\",\"\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"settings\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/alfred/_next/static/css/c6dce7a29a70612c.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"de\",\"children\":[\"$\",\"body\",null,{\"className\":\"bg-[#0a0a0a] text-gray-200 h-screen overflow-hidden\",\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"div\",null,{\"className\":\"flex h-full\",\"children\":[[\"$\",\"$L3\",null,{}],[\"$\",\"main\",null,{\"className\":\"flex-1 overflow-y-auto\",\"children\":[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$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.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]]}]}]}]}]]}],{\"children\":[\"settings\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"$L6\",null,{}],null,[\"$\",\"$L7\",null,{\"children\":[\"$L8\",[\"$\",\"$L9\",null,{\"promise\":\"$@a\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[[\"$\",\"$Lb\",null,{\"children\":\"$Lc\"}],null],[\"$\",\"$Ld\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$e\",null,{\"fallback\":null,\"children\":\"$Lf\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$10\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"c:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n8:null\n"])</script><script>self.__next_f.push([1,"a:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"Alfred AI\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Self-hosted AI Assistant\"}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"f:\"$a:metadata\"\n"])</script></body></html>
1
+ <!DOCTYPE html><!--IjgSY_l4QaNVEU2a3w7qJ--><html lang="de"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/alfred/_next/static/css/250d2ae3e56f3d90.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/alfred/_next/static/chunks/webpack-dd89effdde862170.js"/><script src="/alfred/_next/static/chunks/8e6518bb-c26e82767f1faf66.js" async=""></script><script src="/alfred/_next/static/chunks/743-05c790de389fcbe8.js" async=""></script><script src="/alfred/_next/static/chunks/main-app-bf91f7268c1fdab4.js" async=""></script><script src="/alfred/_next/static/chunks/app/layout-ab17f30494d646ca.js" async=""></script><script src="/alfred/_next/static/chunks/app/settings/page-6cea9fa8997a3a59.js" async=""></script><title>Alfred AI</title><meta name="description" content="Self-hosted AI Assistant"/><script src="/alfred/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="bg-[#0a0a0a] text-gray-200 h-screen overflow-hidden"><div hidden=""><!--$--><!--/$--></div><div class="flex h-full"><aside class="w-16 md:w-56 bg-[#111111] border-r border-[#1f1f1f] flex flex-col h-full"><div class="p-4 border-b border-[#1f1f1f]"><a href="/alfred/" class="flex items-center gap-2"><span class="text-xl font-bold text-blue-500 font-mono">A</span><span class="hidden md:inline text-sm font-semibold text-gray-200">Alfred</span></a></div><nav class="flex-1 p-2 space-y-1"><a href="/alfred/chat/" class="flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors text-gray-400 hover:bg-[#1a1a1a] hover:text-gray-200"><span>💬</span><span class="hidden md:inline">Chat</span></a><a href="/alfred/dashboard/" class="flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors text-gray-400 hover:bg-[#1a1a1a] hover:text-gray-200"><span>📊</span><span class="hidden md:inline">Dashboard</span></a><a href="/alfred/settings/" class="flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors text-gray-400 hover:bg-[#1a1a1a] hover:text-gray-200"><span>⚙️</span><span class="hidden md:inline">Settings</span></a></nav><div class="p-4 border-t border-[#1f1f1f]"><a href="https://github.com/madh99/alfred-ai" target="_blank" rel="noopener noreferrer" class="text-xs text-gray-500 hover:text-gray-400 hidden md:block">GitHub</a></div></aside><main class="flex-1 overflow-y-auto"><div class="p-6 max-w-2xl mx-auto"><h1 class="text-xl font-semibold text-gray-200 mb-6">Einstellungen</h1><div class="bg-[#111111] border border-[#1f1f1f] rounded-xl p-6 space-y-5"><div><label class="block text-sm text-gray-400 mb-1">Alfred API URL</label><input type="text" placeholder="http://localhost:3420" class="w-full bg-[#0d0d0d] border border-[#2a2a2a] rounded-lg px-4 py-2.5 text-sm text-gray-200 focus:outline-none focus:border-blue-500" value=""/></div><div><label class="block text-sm text-gray-400 mb-1">API Token</label><input type="password" placeholder="Optional — Bearer Token" class="w-full bg-[#0d0d0d] border border-[#2a2a2a] rounded-lg px-4 py-2.5 text-sm text-gray-200 focus:outline-none focus:border-blue-500" value=""/></div><div class="flex gap-3"><button class="bg-blue-600 hover:bg-blue-700 text-white rounded-lg px-5 py-2.5 text-sm font-medium transition-colors">Speichern</button><button class="bg-[#1a1a1a] border border-[#2a2a2a] hover:bg-[#222] text-gray-300 rounded-lg px-5 py-2.5 text-sm transition-colors disabled:opacity-50">Verbindung testen</button></div></div><p class="text-xs text-gray-600 mt-4">Konfiguration wird in deinem Browser (localStorage) gespeichert. Token wird nie an Dritte gesendet.</p></div><!--$--><!--/$--></main></div><script src="/alfred/_next/static/chunks/webpack-dd89effdde862170.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[8719,[\"177\",\"static/chunks/app/layout-ab17f30494d646ca.js\"],\"ConfigProvider\"]\n3:I[4314,[\"177\",\"static/chunks/app/layout-ab17f30494d646ca.js\"],\"Sidebar\"]\n4:I[8954,[],\"\"]\n5:I[5640,[],\"\"]\n6:I[8171,[\"662\",\"static/chunks/app/settings/page-6cea9fa8997a3a59.js\"],\"SettingsPage\"]\n7:I[2051,[],\"OutletBoundary\"]\n9:I[6658,[],\"AsyncMetadataOutlet\"]\nb:I[2051,[],\"ViewportBoundary\"]\nd:I[2051,[],\"MetadataBoundary\"]\ne:\"$Sreact.suspense\"\n10:I[7698,[],\"\"]\n:HL[\"/alfred/_next/static/css/250d2ae3e56f3d90.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"IjgSY_l4QaNVEU2a3w7qJ\",\"p\":\"/alfred\",\"c\":[\"\",\"settings\",\"\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"settings\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/alfred/_next/static/css/250d2ae3e56f3d90.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"de\",\"children\":[\"$\",\"body\",null,{\"className\":\"bg-[#0a0a0a] text-gray-200 h-screen overflow-hidden\",\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"div\",null,{\"className\":\"flex h-full\",\"children\":[[\"$\",\"$L3\",null,{}],[\"$\",\"main\",null,{\"className\":\"flex-1 overflow-y-auto\",\"children\":[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$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.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]]}]}]}]}]]}],{\"children\":[\"settings\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"$L6\",null,{}],null,[\"$\",\"$L7\",null,{\"children\":[\"$L8\",[\"$\",\"$L9\",null,{\"promise\":\"$@a\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[[\"$\",\"$Lb\",null,{\"children\":\"$Lc\"}],null],[\"$\",\"$Ld\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$e\",null,{\"fallback\":null,\"children\":\"$Lf\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$10\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"c:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n8:null\n"])</script><script>self.__next_f.push([1,"a:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"Alfred AI\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Self-hosted AI Assistant\"}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"f:\"$a:metadata\"\n"])</script></body></html>
@@ -10,8 +10,8 @@ b:I[2051,[],"ViewportBoundary"]
10
10
  d:I[2051,[],"MetadataBoundary"]
11
11
  e:"$Sreact.suspense"
12
12
  10:I[7698,[],""]
13
- :HL["/alfred/_next/static/css/c6dce7a29a70612c.css","style"]
14
- 0:{"P":null,"b":"MVm365HKyeUw6JuHrli2h","p":"/alfred","c":["","settings",""],"i":false,"f":[[["",{"children":["settings",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/alfred/_next/static/css/c6dce7a29a70612c.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"de","children":["$","body",null,{"className":"bg-[#0a0a0a] text-gray-200 h-screen overflow-hidden","children":["$","$L2",null,{"children":["$","div",null,{"className":"flex h-full","children":[["$","$L3",null,{}],["$","main",null,{"className":"flex-1 overflow-y-auto","children":["$","$L4",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$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."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]]}]}]}]}]]}],{"children":["settings",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$L6",null,{}],null,["$","$L7",null,{"children":["$L8",["$","$L9",null,{"promise":"$@a"}]]}]]}],{},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,[["$","$Lb",null,{"children":"$Lc"}],null],["$","$Ld",null,{"children":["$","div",null,{"hidden":true,"children":["$","$e",null,{"fallback":null,"children":"$Lf"}]}]}]]}],false]],"m":"$undefined","G":["$10",[]],"s":false,"S":true}
13
+ :HL["/alfred/_next/static/css/250d2ae3e56f3d90.css","style"]
14
+ 0:{"P":null,"b":"IjgSY_l4QaNVEU2a3w7qJ","p":"/alfred","c":["","settings",""],"i":false,"f":[[["",{"children":["settings",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/alfred/_next/static/css/250d2ae3e56f3d90.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"de","children":["$","body",null,{"className":"bg-[#0a0a0a] text-gray-200 h-screen overflow-hidden","children":["$","$L2",null,{"children":["$","div",null,{"className":"flex h-full","children":[["$","$L3",null,{}],["$","main",null,{"className":"flex-1 overflow-y-auto","children":["$","$L4",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$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."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]]}]}]}]}]]}],{"children":["settings",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[["$","$L6",null,{}],null,["$","$L7",null,{"children":["$L8",["$","$L9",null,{"promise":"$@a"}]]}]]}],{},null,false]},null,false]},null,false],["$","$1","h",{"children":[null,[["$","$Lb",null,{"children":"$Lc"}],null],["$","$Ld",null,{"children":["$","div",null,{"hidden":true,"children":["$","$e",null,{"fallback":null,"children":"$Lf"}]}]}]]}],false]],"m":"$undefined","G":["$10",[]],"s":false,"S":true}
15
15
  c:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
16
16
  8:null
17
17
  a:{"metadata":[["$","title","0",{"children":"Alfred AI"}],["$","meta","1",{"name":"description","content":"Self-hosted AI Assistant"}]],"error":null,"digest":"$undefined"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@madh-io/alfred-ai",
3
- "version": "0.17.5",
3
+ "version": "0.17.7",
4
4
  "description": "Alfred — Personal AI Assistant across Telegram, Discord, WhatsApp, Matrix & Signal",
5
5
  "type": "module",
6
6
  "bin": {