@madh-io/alfred-ai 0.16.4 → 0.16.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bundle/index.js CHANGED
@@ -1403,7 +1403,7 @@ Alfred: ${t}
1403
1403
  data: ${JSON.stringify(s)}
1404
1404
 
1405
1405
  `)}}});var _t={};pe(_t,{CLIAdapter:()=>ei,DiscordAdapter:()=>Yo,HttpAdapter:()=>si,MatrixAdapter:()=>Jo,MessagingAdapter:()=>ye,SignalAdapter:()=>Qo,TelegramAdapter:()=>Ko,WhatsAppAdapter:()=>Zo});var kt=T(()=>{"use strict";ct();wm();Tm();_m();km();bm();Em();vm()});import rr from"node:fs";import Oe from"node:path";import Dg from"js-yaml";var Vt,$m=T(()=>{"use strict";Gi();co();nt();aa();mo();re();Va();Ja();Za();Qa();ec();tc();sc();rc();nc();oc();ic();ac();cc();mm();dc();fc();gc();yc();wc();Tc();_c();kc();bc();vc();$c();Vt=class{static{m(this,"Alfred")}config;logger;database;pipeline;llmProvider;reminderScheduler;backgroundTaskRunner;proactiveScheduler;watchEngine;confirmationQueue;adapters=new Map;formatter=new Tn;userRepo;skillRegistry;mcpManager;calendarSkill;calendarWatcher;todoWatcher;reasoningEngine;usageRepo;auditRepo;summaryRepo;activityRepo;memoryRepo;watchRepo;scheduledActionRepo;skillHealthRepo;skillHealthTracker;healthCheckTimer;startedAt=new Date().toISOString();constructor(e){this.config=e,this.logger=Ar("alfred",e.logger.level)}async initialize(){this.logger.info("Initializing Alfred..."),this.database=new mt(this.config.storage.path);let e=this.database.getDb(),t=new es(e),s=new ts(e);this.userRepo=s;let r=new pt(e);this.auditRepo=r;let n=new ss(e);this.memoryRepo=n;let o=new rs(e),i=new ns(e),a=new os(e),c=new is(e),d=new as(e),u=new ls(e);this.scheduledActionRepo=u;let p=new ft(e);this.activityRepo=p;let h=new Dn(p,this.logger.child({component:"activity"})),f=new gs(e);this.skillHealthRepo=f;let g=new Mn(f,this.logger.child({component:"skill-health"}),h);this.skillHealthTracker=g,this.logger.info("Storage initialized");let y=new Ur,_=this.loadSecurityRules();y.loadRules(_);let S=new Fr(y,r,this.logger.child({component:"security"}));this.logger.info({ruleCount:_.length},"Security engine initialized");let E=oa(this.config.llm,this.logger.child({component:"llm"}));await E.initialize(),this.llmProvider=E;let v=new fs(e);this.usageRepo=v,E.setPersist((C,j,Z,te,Se,or)=>{v.record(C,j,Z,te,Se,or)});let I=new _n(E,a,this.logger.child({component:"embeddings"})),M=this.config.activeLearning?.enabled!==!1,q,G;M&&(q=new Rn({llm:E,memoryRepo:n,logger:this.logger.child({component:"active-learning"}),embeddingService:I,minMessageLength:this.config.activeLearning?.minMessageLength,minConfidence:this.config.activeLearning?.minConfidence,maxExtractionsPerMinute:this.config.activeLearning?.maxExtractionsPerMinute}),G=new xn(n,this.logger.child({component:"memory-retriever"}),I),this.logger.info("Active learning & memory retriever initialized"));let P=new hs(e);this.summaryRepo=P;let ee=new Cn(E,P,this.logger.child({component:"summarizer"}));this.logger.info("Conversation summarizer initialized");let ue=new ks(this.logger.child({component:"sandbox"})),L=this.skillRegistry=new _s;L.register(new bs),L.register(new Es),L.register(new Ss(this.config.search?{provider:this.config.search.provider,apiKey:this.config.search.apiKey,baseUrl:this.config.search.baseUrl}:void 0)),L.register(new vs(o)),L.register(new $s(i));let ne=new us(e);if(L.register(new zs(ne)),L.register(new As),L.register(new Is),L.register(new Rs(n,I)),L.register(new xs(E,L,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 jr(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 gt(C):new gt;j.setLLM(E),L.register(j)}else{let C=new gt;C.setLLM(E),L.register(C)}L.register(new Cs),L.register(new Ns);let ie=new Ks;ie.setReloadCallback(C=>this.reloadService(C)),L.register(ie),L.register(new Ds),L.register(new Ms),L.register(new Os),L.register(new Ps(s)),L.register(new Us(s,c,this.adapters,(C,j)=>t.findByPlatformAndUser(C,j)));let Q=new Fs(d);L.register(Q),L.register(new js(u));let B=new ds(e),he=new kn(B,I,this.logger.child({component:"documents"}));L.register(new Bs(B,he,I));let Ke,le;if(this.config.calendar)try{le=await Wr(this.config.calendar),Ke=new Ft(le),L.register(Ke),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=Ke,le&&this.config.calendar?.vorlauf?.enabled){let C=new ht(e),j=this.config.security?.ownerUserId;j&&(this.calendarWatcher=new Nn(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 ht(e);this.todoWatcher=new Ln(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(),ce));this.mcpManager=new C(this.logger.child({component:"mcp"})),await this.mcpManager.initialize(this.config.mcp);for(let j of this.mcpManager.getSkills())L.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(),ce));L.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(),ce));L.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(),ce)),{ProjectAgentSessionRepository:j}=await Promise.resolve().then(()=>(co(),sd)),Z=new j(e),te=new C({...this.config.projectAgents,agents:this.config.codeAgents.agents},E,Z),{ProjectAgentRunner:Se}=await Promise.resolve().then(()=>(Ac(),gm)),or=new Se(new Map(this.config.codeAgents.agents.map(ir=>[ir.name,ir])),E,Z,this.adapters,this.logger.child({component:"project-agent"}));te.setRunner(or),L.register(te),this.logger.info("Project agent skill enabled")}if(this.config.proxmox){let{ProxmoxSkill:C}=await Promise.resolve().then(()=>(re(),ce));L.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(),ce));L.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(),ce));L.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(),ce)),Z=await j(this.config.contacts);L.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(),ce));L.register(new C(this.config.docker)),this.logger.info("Docker skill enabled")}if(this.config.bmw){let{BMWSkill:C}=await Promise.resolve().then(()=>(re(),ce));L.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(),ce));L.register(new C(this.config.routing)),this.logger.info("Routing skill enabled")}if(this.config.todo){let{MicrosoftTodoSkill:C}=await Promise.resolve().then(()=>(re(),ce));L.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(),ce));L.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(),ce));L.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(),ce));L.register(new C(this.config.marketplace)),this.logger.info("Marketplace skill registered")}{let{BriefingSkill:C}=await Promise.resolve().then(()=>(re(),ce));L.register(new C(L,this.config,n)),this.logger.info("Briefing skill registered")}L.register(new Js(n)),this.logger.info("Feed reader skill registered"),this.logger.info({skills:L.getAll().map(C=>C.metadata.name)},"Skills registered");let Ee;if(this.config.speech?.apiKey&&(Ee=new fn(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 gn(this.config.speech,this.logger.child({component:"tts"}));L.register(new Hs(C)),this.logger.info("Text-to-speech skill registered")}let me=this.detectImageGenProvider();if(me){let C=new yn(me,this.logger.child({component:"image-gen"}));L.register(new Ws(C)),this.logger.info({provider:me.provider},"Image generation skill registered")}try{let C=new wn(this.logger.child({component:"transit"}));L.register(new Gs(C)),this.logger.info("Public transit skill registered")}catch(C){this.logger.warn({err:C},"Failed to register transit skill")}let Pe=new mn(t),Ze=Oe.resolve(Oe.dirname(this.config.storage.path),"inbox");this.pipeline=new pn({llm:E,conversationManager:Pe,users:s,logger:this.logger.child({component:"pipeline"}),skillRegistry:L,skillSandbox:ue,securityManager:S,memoryRepo:n,speechTranscriber:Ee,inboxPath:Ze,embeddingService:I,activeLearning:q,memoryRetriever:G,maxHistoryMessages:this.config.conversation?.maxHistoryMessages??100,documentProcessor:he,conversationSummarizer:ee}),this.reminderScheduler=new hn(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:m(C=>s.getMasterUserId(C),"getMasterUserId"),getLinkedUsers:m(C=>s.getLinkedUsers(C),"getLinkedUsers"),findConversation:m((C,j)=>t.findByPlatformAndUser(C,j),"findConversation")}),this.backgroundTaskRunner=new bn(L,ue,d,this.adapters,s,this.logger.child({component:"background-tasks"}),h,g);let Ve=new En(L,ue,d,this.adapters,s,this.logger.child({component:"persistent-agents"}),h);this.backgroundTaskRunner.setPersistentRunner(Ve),Q.setPersistentRunner(Ve),this.proactiveScheduler=new Sn(u,L,ue,E,this.adapters,s,this.logger.child({component:"proactive-scheduler"}),this.pipeline,this.formatter,Pe,h);let Qe=new ms(e);this.watchRepo=Qe,L.register(new Vs(Qe,L));let De=new ps(e);this.confirmationQueue=new An(De,L,ue,this.adapters,this.logger.child({component:"confirmation-queue"}),h);let Et=new ws(e),St=new tr(Et,n,this.logger.child({component:"feedback"}));this.confirmationQueue.setFeedbackService(St),q&&q.setFeedbackService(St),this.watchEngine=new qo(Qe,L,ue,this.adapters,s,this.logger.child({component:"watch-engine"}),this.confirmationQueue,h,g,E);let et=new ys(e),X=new Ys(et);L.register(X);let z=new On(et,L,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 ht(e);this.reasoningEngine=new Un(le,ne,Qe,n,p,f,j,L,ue,E,this.adapters,s,C,"telegram",this.config.reasoning,this.logger.child({component:"reasoning-engine"}),h,this.config.briefing?.location,Et,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(()=>(kt(),_t));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(()=>(kt(),_t));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(()=>(kt(),_t));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(()=>(kt(),_t));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(()=>(kt(),_t));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(()=>(kt(),_t)),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,healthCheck:m(()=>{let n;try{let o=this.config.storage.path,i=rr.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:m(()=>this.buildPrometheusMetrics(),"metricsCallback"),dashboardCallback:m(()=>{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()??[],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:m(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(()=>(kt(),_t)),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{zi();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(),ce));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(),ce));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(),ce));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(),ce)),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(),ce));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(),ce));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(),ce));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(),ce));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=Oe.dirname(new URL(import.meta.url).pathname),process.platform==="win32"&&e.startsWith("/")&&(e=e.slice(1))}catch{e=process.cwd()}let t=[Oe.join(process.cwd(),"web-ui"),Oe.join(e,"..","web-ui"),Oe.join(e,"web-ui"),Oe.join(e,"..","..","web-ui"),Oe.join(e,"..","..","apps","web","out")];for(let s of t)try{let r=Oe.resolve(s);if(rr.existsSync(Oe.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(`
1406
- `)}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=m(async a=>{if(a!==n){n=a;try{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=Oe.resolve(this.config.security.rulesPath),t=[];if(!rr.existsSync(e))return this.logger.warn({rulesPath:e},"Security rules directory not found, using default deny"),t;if(!rr.statSync(e).isDirectory())return this.logger.warn({rulesPath:e},"Security rules path is not a directory"),t;let r=rr.readdirSync(e).filter(n=>n.endsWith(".yml")||n.endsWith(".yaml"));for(let n of r)try{let o=Oe.join(e,n),i=rr.readFileSync(o,"utf-8"),a=Dg.load(i);if(a?.rules&&Array.isArray(a.rules)){let d=new it().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 Am=T(()=>{"use strict"});var Cc=T(()=>{"use strict";gc();hc()});var Nc=T(()=>{"use strict";$m();Ja();Va();Za();Qa();ec();rc();nc();ic();ac();cc();wt();oc();tc();sc();fc();yc();pc();Am();mc();wc();vn();Sc();dc();Cc();Ac();Cc();Tc();_c();kc();zo();bc();vc();$c()});import ri from"node:fs";import Im from"node:path";import Mg from"node:os";function Rm(){try{let l=ri.readFileSync(Lc,"utf-8"),e=JSON.parse(l);if(e?.version===1&&e.providers)return e}catch{}return{version:1,providers:{}}}function xm(l){try{let e=Im.dirname(Lc);ri.existsSync(e)||ri.mkdirSync(e,{recursive:!0}),ri.writeFileSync(Lc,JSON.stringify(l,null,2),"utf-8")}catch{}}async function Yt(l,e){let t=new AbortController,s=setTimeout(()=>t.abort(),Pg);try{return await fetch(l,{...e,signal:t.signal})}finally{clearTimeout(s)}}async function Cm(l,e,t){switch(l){case"anthropic":{let s=await Yt("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 Yt(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 Yt(s);return r.ok?((await r.json()).models??[]).map(o=>({id:o.name.replace(/^models\//,""),name:o.displayName})):[]}case"mistral":{let s=await Yt("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 Yt("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 Yt(`${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 Yt(`${s}/models`,{headers:{Authorization:`Bearer ${e??""}`}});return r.ok?((await r.json()).data??[]).map(o=>({id:o.id})):[]}default:return[]}}async function Dc(l,e,t){let s=Rm(),r=s.providers[l];if(r&&Date.now()-r.fetchedAt<Og)return r.models;try{let n=await Cm(l,e,t);if(n.length>0)return s.providers[l]={fetchedAt:Date.now(),models:n},xm(s),n}catch{}return r?r.models:[]}function ni(l,e,t){Cm(l,e,t).then(s=>{if(s.length>0){let r=Rm();r.providers[l]={fetchedAt:Date.now(),models:s},xm(r)}}).catch(()=>{})}function Mc(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 Og,Pg,Lc,Oc=T(()=>{"use strict";Og=1440*60*1e3,Pg=5e3,Lc=Im.join(Mg.homedir(),".alfred","model-cache.json");m(Rm,"readCache");m(xm,"writeCache");m(Yt,"fetchWithTimeout");m(Cm,"fetchModelsFromAPI");m(Dc,"getModels");m(ni,"refreshCacheInBackground");m(Mc,"mergeModels")});var Nm={};pe(Nm,{startCommand:()=>Ug});async function Ug(){let l=new fe,e;try{e=l.loadConfig()}catch(o){console.error("Failed to load configuration:",o.message),process.exit(1)}let t=Ar("cli",e.logger.level);t.info({name:e.name},"Configuration loaded");let s=new Vt(e),r=!1,n=m(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?ni(o.default.provider,o.default.apiKey,o.default.baseUrl):o?.provider&&ni(o.provider,void 0,o.baseUrl);for(let i of["strong","fast"]){let a=o?.[i];a?.provider&&ni(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 Lm=T(()=>{"use strict";nt();Gi();Nc();Oc();m(Ug,"startCommand")});var Mm={};pe(Mm,{chatCommand:()=>Bg});import Dm from"node:http";import Fn from"node:readline";function Fg(l,e){return new Promise(t=>{let s=Dm.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 jg(l,e){let t=Fn.createInterface({input:process.stdin,output:process.stdout,prompt:"You: "});console.log(`
1406
+ `)}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=m(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=Oe.resolve(this.config.security.rulesPath),t=[];if(!rr.existsSync(e))return this.logger.warn({rulesPath:e},"Security rules directory not found, using default deny"),t;if(!rr.statSync(e).isDirectory())return this.logger.warn({rulesPath:e},"Security rules path is not a directory"),t;let r=rr.readdirSync(e).filter(n=>n.endsWith(".yml")||n.endsWith(".yaml"));for(let n of r)try{let o=Oe.join(e,n),i=rr.readFileSync(o,"utf-8"),a=Dg.load(i);if(a?.rules&&Array.isArray(a.rules)){let d=new it().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 Am=T(()=>{"use strict"});var Cc=T(()=>{"use strict";gc();hc()});var Nc=T(()=>{"use strict";$m();Ja();Va();Za();Qa();ec();rc();nc();ic();ac();cc();wt();oc();tc();sc();fc();yc();pc();Am();mc();wc();vn();Sc();dc();Cc();Ac();Cc();Tc();_c();kc();zo();bc();vc();$c()});import ri from"node:fs";import Im from"node:path";import Mg from"node:os";function Rm(){try{let l=ri.readFileSync(Lc,"utf-8"),e=JSON.parse(l);if(e?.version===1&&e.providers)return e}catch{}return{version:1,providers:{}}}function xm(l){try{let e=Im.dirname(Lc);ri.existsSync(e)||ri.mkdirSync(e,{recursive:!0}),ri.writeFileSync(Lc,JSON.stringify(l,null,2),"utf-8")}catch{}}async function Yt(l,e){let t=new AbortController,s=setTimeout(()=>t.abort(),Pg);try{return await fetch(l,{...e,signal:t.signal})}finally{clearTimeout(s)}}async function Cm(l,e,t){switch(l){case"anthropic":{let s=await Yt("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 Yt(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 Yt(s);return r.ok?((await r.json()).models??[]).map(o=>({id:o.name.replace(/^models\//,""),name:o.displayName})):[]}case"mistral":{let s=await Yt("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 Yt("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 Yt(`${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 Yt(`${s}/models`,{headers:{Authorization:`Bearer ${e??""}`}});return r.ok?((await r.json()).data??[]).map(o=>({id:o.id})):[]}default:return[]}}async function Dc(l,e,t){let s=Rm(),r=s.providers[l];if(r&&Date.now()-r.fetchedAt<Og)return r.models;try{let n=await Cm(l,e,t);if(n.length>0)return s.providers[l]={fetchedAt:Date.now(),models:n},xm(s),n}catch{}return r?r.models:[]}function ni(l,e,t){Cm(l,e,t).then(s=>{if(s.length>0){let r=Rm();r.providers[l]={fetchedAt:Date.now(),models:s},xm(r)}}).catch(()=>{})}function Mc(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 Og,Pg,Lc,Oc=T(()=>{"use strict";Og=1440*60*1e3,Pg=5e3,Lc=Im.join(Mg.homedir(),".alfred","model-cache.json");m(Rm,"readCache");m(xm,"writeCache");m(Yt,"fetchWithTimeout");m(Cm,"fetchModelsFromAPI");m(Dc,"getModels");m(ni,"refreshCacheInBackground");m(Mc,"mergeModels")});var Nm={};pe(Nm,{startCommand:()=>Ug});async function Ug(){let l=new fe,e;try{e=l.loadConfig()}catch(o){console.error("Failed to load configuration:",o.message),process.exit(1)}let t=Ar("cli",e.logger.level);t.info({name:e.name},"Configuration loaded");let s=new Vt(e),r=!1,n=m(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?ni(o.default.provider,o.default.apiKey,o.default.baseUrl):o?.provider&&ni(o.provider,void 0,o.baseUrl);for(let i of["strong","fast"]){let a=o?.[i];a?.provider&&ni(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 Lm=T(()=>{"use strict";nt();Gi();Nc();Oc();m(Ug,"startCommand")});var Mm={};pe(Mm,{chatCommand:()=>Bg});import Dm from"node:http";import Fn from"node:readline";function Fg(l,e){return new Promise(t=>{let s=Dm.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 jg(l,e){let t=Fn.createInterface({input:process.stdin,output:process.stdout,prompt:"You: "});console.log(`
1407
1407
  Alfred Chat (connected to server) \u2014 type your message and press Enter. Use /quit or /exit to leave.
1408
1408
  `),t.prompt(),t.on("line",s=>{let r=s.trim();if(!r){t.prompt();return}(r==="/quit"||r==="/exit")&&(console.log(`
1409
1409
  Goodbye!
@@ -1 +1 @@
1
- <!DOCTYPE html><!--w_ENoiVMByU6aCeEFU1TE--><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\":\"w-ENoiVMByU6aCeEFU1TE\",\"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><!--61x0eTgHxWRkxlyhVYG3U--><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\":\"61x0eTgHxWRkxlyhVYG3U\",\"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 +1 @@
1
- <!DOCTYPE html><!--w_ENoiVMByU6aCeEFU1TE--><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\":\"w-ENoiVMByU6aCeEFU1TE\",\"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><!--61x0eTgHxWRkxlyhVYG3U--><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\":\"61x0eTgHxWRkxlyhVYG3U\",\"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>
@@ -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([[624],{1740:(e,t,a)=>{"use strict";a.d(t,{ChatPage:()=>m});var r=a(8111),s=a(5271),n=a(346),l=a(839);function o(e){var t;let{message:a}=e,s="user"===a.role;return(0,r.jsx)("div",{className:"flex ".concat(s?"justify-end":"justify-start"," mb-4"),children:(0,r.jsxs)("div",{className:"max-w-[85%] rounded-2xl px-4 py-3 ".concat(s?"bg-blue-600 text-white":"bg-[#1a1a1a] text-gray-200 border border-[#2a2a2a]"),children:[s?(0,r.jsx)("p",{className:"text-sm whitespace-pre-wrap",children:a.content}):(0,r.jsx)("div",{className:"prose prose-invert prose-sm max-w-none [&_pre]:bg-[#0d0d0d] [&_pre]:rounded-lg [&_pre]:p-3 [&_code]:text-blue-300 [&_a]:text-blue-400",children:(0,r.jsx)(n.oz,{remarkPlugins:[l.A],children:a.content||"..."})}),null==(t=a.attachments)?void 0:t.map((e,t)=>{var a,s;return(0,r.jsxs)("div",{className:"mt-2",children:["image"===e.type&&(0,r.jsx)("img",{src:"data:image/png;base64,".concat(e.data),alt:null!=(a=e.caption)?a:"Image",className:"rounded-lg max-w-full"}),"file"===e.type&&(0,r.jsx)("a",{href:"data:application/octet-stream;base64,".concat(e.data),download:e.fileName,className:"text-blue-400 underline text-sm",children:null!=(s=e.fileName)?s:"Download"}),"voice"===e.type&&(0,r.jsx)("audio",{controls:!0,src:"data:audio/ogg;base64,".concat(e.data),className:"mt-1"})]},t)})]})})}function c(e){let{onSend:t,disabled:a}=e,[n,l]=(0,s.useState)(""),o=(0,s.useRef)(null),c=()=>{var e;n.trim()&&!a&&(t(n.trim()),l(""),null==(e=o.current)||e.focus())};return(0,r.jsx)("div",{className:"border-t border-[#1f1f1f] bg-[#111111] p-4",children:(0,r.jsxs)("div",{className:"flex gap-3 max-w-4xl mx-auto",children:[(0,r.jsx)("textarea",{ref:o,value:n,onChange:e=>l(e.target.value),onKeyDown:e=>{"Enter"!==e.key||e.shiftKey||(e.preventDefault(),c())},placeholder:"Nachricht an Alfred...",disabled:a,rows:1,className:"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"}),(0,r.jsx)("button",{onClick:c,disabled:a||!n.trim(),className:"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",children:"Senden"})]})})}var i=a(8719);function u(e,t){switch(t.type){case"ADD_USER":return{...e,messages:[...e.messages,{id:"user-".concat(Date.now()),role:"user",content:t.text,timestamp:Date.now()}],error:null};case"START_ASSISTANT":return{...e,streaming:!0,currentStatus:null,messages:[...e.messages,{id:"asst-".concat(Date.now()),role:"assistant",content:"",timestamp:Date.now()}]};case"APPEND_RESPONSE":{let a=[...e.messages],r=a[a.length-1];return(null==r?void 0:r.role)==="assistant"&&(a[a.length-1]={...r,content:r.content+t.text}),{...e,messages:a,currentStatus:null}}case"SET_STATUS":return{...e,currentStatus:t.text};case"ADD_ATTACHMENT":{let r=[...e.messages],s=r[r.length-1];if((null==s?void 0:s.role)==="assistant"){var a;let e=[...null!=(a=s.attachments)?a:[],t.attachment];r[r.length-1]={...s,attachments:e}}return{...e,messages:r}}case"DONE":return{...e,streaming:!1,currentStatus:null};case"ERROR":return{...e,streaming:!1,currentStatus:null,error:t.error}}}function d(){return Math.random().toString(36).slice(2,10)+Date.now().toString(36)}function m(){let{messages:e,streaming:t,currentStatus:a,error:n,sendMessage:l,userId:m}=function(){let{client:e}=(0,i.U)(),t=(0,s.useMemo)(()=>(function(){let e="alfred-user-id",t=localStorage.getItem(e);return t||(t="web-".concat(d()),localStorage.setItem(e,t)),t})(),[]),a=(0,s.useMemo)(()=>(function(){let e="alfred-chat-id",t=localStorage.getItem(e);return t||(t="web-chat-".concat(d()),localStorage.setItem(e,t)),t})(),[]),[r,n]=(0,s.useReducer)(u,{messages:[],streaming:!1,currentStatus:null,error:null}),l=(0,s.useRef)(null),o=(0,s.useCallback)(s=>{s.trim()&&!r.streaming&&(n({type:"ADD_USER",text:s}),n({type:"START_ASSISTANT"}),l.current=e.streamMessage(s,a,t,{onStatus:e=>n({type:"SET_STATUS",text:e}),onResponse:e=>n({type:"APPEND_RESPONSE",text:e}),onAttachment:e=>n({type:"ADD_ATTACHMENT",attachment:e}),onDone:()=>n({type:"DONE"}),onError:e=>n({type:"ERROR",error:e})}))},[e,a,t,r.streaming]),c=(0,s.useCallback)(()=>{var e;null==(e=l.current)||e.call(l),n({type:"DONE"})},[]);return{...r,sendMessage:o,cancel:c,userId:t,chatId:a}}(),h=(0,s.useRef)(null);return(0,s.useEffect)(()=>{var e;null==(e=h.current)||e.scrollTo({top:h.current.scrollHeight,behavior:"smooth"})},[e,a]),(0,r.jsxs)("div",{className:"flex flex-col h-full",children:[(0,r.jsx)("div",{ref:h,className:"flex-1 overflow-y-auto p-4",children:(0,r.jsxs)("div",{className:"max-w-4xl mx-auto",children:[0===e.length&&(0,r.jsxs)("div",{className:"text-center text-gray-500 mt-20",children:[(0,r.jsx)("p",{className:"text-4xl mb-4 font-mono font-bold text-blue-500",children:"Alfred"}),(0,r.jsx)("p",{className:"text-sm",children:"Self-hosted AI Assistant"}),(0,r.jsx)("p",{className:"text-xs mt-2 text-gray-600",children:"Stelle eine Frage oder gib einen Befehl ein."}),(0,r.jsxs)("p",{className:"text-xs mt-4 text-gray-700",children:["User: ",(0,r.jsx)("span",{className:"font-mono text-gray-500",children:m}),(0,r.jsx)("br",{}),(0,r.jsx)("span",{className:"text-gray-600",children:'Sage "Link my account" um mit Telegram/Matrix zu verkn\xfcpfen.'})]})]}),e.map(e=>(0,r.jsx)(o,{message:e},e.id)),a&&(0,r.jsx)("div",{className:"flex justify-start mb-4",children:(0,r.jsx)("div",{className:"bg-[#1a1a1a] border border-[#2a2a2a] rounded-2xl px-4 py-2 text-xs text-gray-400 animate-pulse",children:a})}),n&&(0,r.jsx)("div",{className:"text-center text-red-400 text-sm mt-4 bg-red-500/10 rounded-lg p-3",children:n})]})}),(0,r.jsx)(c,{onSend:l,disabled:t})]})}},8719:(e,t,a)=>{"use strict";a.d(t,{ConfigProvider:()=>u,U:()=>d});var r,s=a(8111),n=a(5271);async function*l(e){var t,a;let r=null==(t=e.body)?void 0:t.getReader();if(!r)return;let s=new TextDecoder,n="",l="",o="";try{for(;;){let{done:e,value:t}=await r.read();if(e)break;let c=(n+=s.decode(t,{stream:!0})).split("\n");for(let e of(n=null!=(a=c.pop())?a:"",c))e.startsWith("event: ")?l=e.slice(7).trim():e.startsWith("data: ")?o+=(o?"\n":"")+e.slice(6):""===e&&(l&&o&&(yield{event:l,data:o}),l="",o="")}l&&o&&(yield{event:l,data:o})}finally{r.releaseLock()}}class o{updateConfig(e,t){this.baseUrl=e,this.token=t}streamMessage(e,t,a,r){let s=new AbortController;return(async()=>{var n,o,c,i,u,d;try{let d=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:a}),signal:s.signal});if(!d.ok)return void r.onError("HTTP ".concat(d.status,": ").concat(d.statusText));for await(let{event:e,data:t}of l(d))try{let a=JSON.parse(t);switch(e){case"status":r.onStatus(null!=(o=null!=(n=a.text)?n:a.status)?o:t);break;case"response":r.onResponse(null!=(c=a.text)?c:t);break;case"attachment":r.onAttachment(a);break;case"done":r.onDone();break;case"error":r.onError(null!=(u=null!=(i=a.error)?i:a.message)?u:t)}}catch(a){"response"===e?r.onResponse(t):"error"===e&&r.onError(t)}r.onDone()}catch(e){"AbortError"!==e.name&&r.onError(null!=(d=e.message)?d:"Connection failed")}})(),()=>s.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 c={apiUrl:null!=(r=a(1756).env.NEXT_PUBLIC_ALFRED_API_URL)?r:"",apiToken:""},i=(0,n.createContext)(null);function u(e){let{children:t}=e,[a,r]=(0,n.useState)(c),[l]=(0,n.useState)(()=>new o(c.apiUrl,c.apiToken));return(0,n.useEffect)(()=>{try{let e=localStorage.getItem("alfred-config");if(e){let t=JSON.parse(e);r(t),l.updateConfig(t.apiUrl,t.apiToken)}}catch(e){}},[l]),(0,s.jsx)(i.Provider,{value:{config:a,setConfig:e=>{r(e),l.updateConfig(e.apiUrl,e.apiToken),localStorage.setItem("alfred-config",JSON.stringify(e))},client:l},children:t})}function d(){let e=(0,n.useContext)(i);if(!e)throw Error("useConfig must be used within ConfigProvider");return e}},9624:(e,t,a)=>{Promise.resolve().then(a.bind(a,1740))}}]);
@@ -1 +1 @@
1
- <!DOCTYPE html><!--w_ENoiVMByU6aCeEFU1TE--><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-42ccbd8ac63d6c53.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-42ccbd8ac63d6c53.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\":\"w-ENoiVMByU6aCeEFU1TE\",\"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><!--61x0eTgHxWRkxlyhVYG3U--><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\":\"61x0eTgHxWRkxlyhVYG3U\",\"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>
@@ -3,7 +3,7 @@
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[1740,["188","static/chunks/188-dca4c90c7e992695.js","624","static/chunks/624-42ccbd8ac63d6c53.js","457","static/chunks/app/chat/page-62b98eb665eb19d4.js"],"ChatPage"]
6
+ 6:I[1740,["188","static/chunks/188-dca4c90c7e992695.js","624","static/chunks/624-3cd10e0b2e585d67.js","457","static/chunks/app/chat/page-62b98eb665eb19d4.js"],"ChatPage"]
7
7
  7:I[2051,[],"OutletBoundary"]
8
8
  9:I[6658,[],"AsyncMetadataOutlet"]
9
9
  b:I[2051,[],"ViewportBoundary"]
@@ -11,7 +11,7 @@ d:I[2051,[],"MetadataBoundary"]
11
11
  e:"$Sreact.suspense"
12
12
  10:I[7698,[],""]
13
13
  :HL["/alfred/_next/static/css/c6dce7a29a70612c.css","style"]
14
- 0:{"P":null,"b":"w-ENoiVMByU6aCeEFU1TE","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}
14
+ 0:{"P":null,"b":"61x0eTgHxWRkxlyhVYG3U","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}
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><!--w_ENoiVMByU6aCeEFU1TE--><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-7d7d529a5ce0f287.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-7d7d529a5ce0f287.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\":\"w-ENoiVMByU6aCeEFU1TE\",\"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><!--61x0eTgHxWRkxlyhVYG3U--><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-7d7d529a5ce0f287.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-7d7d529a5ce0f287.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\":\"61x0eTgHxWRkxlyhVYG3U\",\"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>
@@ -11,7 +11,7 @@ d:I[2051,[],"MetadataBoundary"]
11
11
  e:"$Sreact.suspense"
12
12
  10:I[7698,[],""]
13
13
  :HL["/alfred/_next/static/css/c6dce7a29a70612c.css","style"]
14
- 0:{"P":null,"b":"w-ENoiVMByU6aCeEFU1TE","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}
14
+ 0:{"P":null,"b":"61x0eTgHxWRkxlyhVYG3U","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}
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><!--w_ENoiVMByU6aCeEFU1TE--><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-42ccbd8ac63d6c53.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-42ccbd8ac63d6c53.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\":\"w-ENoiVMByU6aCeEFU1TE\",\"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><!--61x0eTgHxWRkxlyhVYG3U--><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\":\"61x0eTgHxWRkxlyhVYG3U\",\"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>
@@ -3,7 +3,7 @@
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[1740,["188","static/chunks/188-dca4c90c7e992695.js","624","static/chunks/624-42ccbd8ac63d6c53.js","974","static/chunks/app/page-291dc9884a6d63cc.js"],"ChatPage"]
6
+ 6:I[1740,["188","static/chunks/188-dca4c90c7e992695.js","624","static/chunks/624-3cd10e0b2e585d67.js","974","static/chunks/app/page-291dc9884a6d63cc.js"],"ChatPage"]
7
7
  7:I[2051,[],"OutletBoundary"]
8
8
  9:I[6658,[],"AsyncMetadataOutlet"]
9
9
  b:I[2051,[],"ViewportBoundary"]
@@ -11,7 +11,7 @@ d:I[2051,[],"MetadataBoundary"]
11
11
  e:"$Sreact.suspense"
12
12
  10:I[7698,[],""]
13
13
  :HL["/alfred/_next/static/css/c6dce7a29a70612c.css","style"]
14
- 0:{"P":null,"b":"w-ENoiVMByU6aCeEFU1TE","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}
14
+ 0:{"P":null,"b":"61x0eTgHxWRkxlyhVYG3U","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}
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><!--w_ENoiVMByU6aCeEFU1TE--><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\":\"w-ENoiVMByU6aCeEFU1TE\",\"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><!--61x0eTgHxWRkxlyhVYG3U--><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\":\"61x0eTgHxWRkxlyhVYG3U\",\"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>
@@ -11,7 +11,7 @@ d:I[2051,[],"MetadataBoundary"]
11
11
  e:"$Sreact.suspense"
12
12
  10:I[7698,[],""]
13
13
  :HL["/alfred/_next/static/css/c6dce7a29a70612c.css","style"]
14
- 0:{"P":null,"b":"w-ENoiVMByU6aCeEFU1TE","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}
14
+ 0:{"P":null,"b":"61x0eTgHxWRkxlyhVYG3U","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}
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.16.4",
3
+ "version": "0.16.6",
4
4
  "description": "Alfred — Personal AI Assistant across Telegram, Discord, WhatsApp, Matrix & Signal",
5
5
  "type": "module",
6
6
  "bin": {