@madh-io/alfred-ai 0.9.85 → 0.9.86
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 +8 -3
- package/package.json +1 -1
package/bundle/index.js
CHANGED
|
@@ -265,7 +265,11 @@ var ji=Object.defineProperty;var u=(c,e)=>ji(c,"name",{value:e,configurable:!0})
|
|
|
265
265
|
`).run(o.id,o.platform,o.chatId,o.userId,o.createdAt,o.updatedAt),o}findById(e){let t=this.db.prepare("SELECT * FROM conversations WHERE id = ?").get(e);if(t)return this.mapRow(t)}findByPlatformChat(e,t){let s=this.db.prepare("SELECT * FROM conversations WHERE platform = ? AND chat_id = ?").get(e,t);if(s)return this.mapRow(s)}findByPlatformAndUser(e,t){let s=this.db.prepare("SELECT * FROM conversations WHERE platform = ? AND user_id = ? ORDER BY updated_at DESC LIMIT 1").get(e,t);if(s)return this.mapRow(s)}addMessage(e,t,s,r){let o={id:ra.randomUUID(),conversationId:e,role:t,content:s,toolCalls:r,createdAt:new Date().toISOString()};return this.db.prepare(`
|
|
266
266
|
INSERT INTO messages (id, conversation_id, role, content, tool_calls, created_at)
|
|
267
267
|
VALUES (?, ?, ?, ?, ?, ?)
|
|
268
|
-
`).run(o.id,o.conversationId,o.role,o.content,o.toolCalls??null,o.createdAt),o}getMessages(e,t=50){return this.db.prepare("SELECT * FROM (SELECT *, rowid AS _rn FROM messages WHERE conversation_id = ? ORDER BY created_at DESC, _rn DESC LIMIT ?) ORDER BY created_at ASC, _rn ASC").all(e,t).map(r=>({id:r.id,conversationId:r.conversation_id,role:r.role,content:r.content,toolCalls:r.tool_calls??void 0,createdAt:r.created_at}))}updateTimestamp(e){this.db.prepare("UPDATE conversations SET updated_at = ? WHERE id = ?").run(new Date().toISOString(),e)}
|
|
268
|
+
`).run(o.id,o.conversationId,o.role,o.content,o.toolCalls??null,o.createdAt),o}getMessages(e,t=50){return this.db.prepare("SELECT * FROM (SELECT *, rowid AS _rn FROM messages WHERE conversation_id = ? ORDER BY created_at DESC, _rn DESC LIMIT ?) ORDER BY created_at ASC, _rn ASC").all(e,t).map(r=>({id:r.id,conversationId:r.conversation_id,role:r.role,content:r.content,toolCalls:r.tool_calls??void 0,createdAt:r.created_at}))}updateTimestamp(e){this.db.prepare("UPDATE conversations SET updated_at = ? WHERE id = ?").run(new Date().toISOString(),e)}pruneMessages(e,t){return this.db.prepare(`
|
|
269
|
+
DELETE FROM messages WHERE conversation_id = ? AND id NOT IN (
|
|
270
|
+
SELECT id FROM messages WHERE conversation_id = ? ORDER BY created_at DESC LIMIT ?
|
|
271
|
+
)
|
|
272
|
+
`).run(e,e,t).changes}mapRow(e){return{id:e.id,platform:e.platform,chatId:e.chat_id,userId:e.user_id,createdAt:e.created_at,updatedAt:e.updated_at}}}});import Xd from"node:crypto";var $s,na=E(()=>{"use strict";$s=class{static{u(this,"UserRepository")}db;constructor(e){this.db=e}findOrCreate(e,t,s,r){let o=this.db.prepare("SELECT * FROM users WHERE platform = ? AND platform_user_id = ?").get(e,t);if(o)return this.mapRow(o);let n=new Date().toISOString(),i={id:Xd.randomUUID(),platform:e,platformUserId:t,username:s,displayName:r,createdAt:n,updatedAt:n};return this.db.prepare(`
|
|
269
273
|
INSERT INTO users (id, platform, platform_user_id, username, display_name, created_at, updated_at)
|
|
270
274
|
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
271
275
|
`).run(i.id,i.platform,i.platformUserId,i.username??null,i.displayName??null,i.createdAt,i.updatedAt),i}findById(e){let t=this.db.prepare("SELECT * FROM users WHERE id = ?").get(e);if(t)return this.mapRow(t)}update(e,t){let s=[],r=[];t.username!==void 0&&(s.push("username = ?"),r.push(t.username??null)),t.displayName!==void 0&&(s.push("display_name = ?"),r.push(t.displayName??null)),s.length!==0&&(s.push("updated_at = ?"),r.push(new Date().toISOString()),r.push(e),this.db.prepare(`UPDATE users SET ${s.join(", ")} WHERE id = ?`).run(...r))}updateProfile(e,t){let s=[],r=[];t.timezone!==void 0&&(s.push("timezone = ?"),r.push(t.timezone??null)),t.language!==void 0&&(s.push("language = ?"),r.push(t.language??null)),t.bio!==void 0&&(s.push("bio = ?"),r.push(t.bio??null)),t.preferences!==void 0&&(s.push("preferences = ?"),r.push(t.preferences?JSON.stringify(t.preferences):null)),s.length!==0&&(s.push("updated_at = ?"),r.push(new Date().toISOString()),r.push(e),this.db.prepare(`UPDATE users SET ${s.join(", ")} WHERE id = ?`).run(...r))}getProfile(e){let t=this.db.prepare("SELECT display_name, timezone, language, bio, preferences FROM users WHERE id = ?").get(e);if(t)return{displayName:t.display_name??void 0,timezone:t.timezone??void 0,language:t.language??void 0,bio:t.bio??void 0,preferences:t.preferences?JSON.parse(t.preferences):void 0}}setMasterUser(e,t){this.db.prepare("UPDATE users SET master_user_id = ?, updated_at = ? WHERE id = ?").run(t,new Date().toISOString(),e)}getLinkedUsers(e){return this.db.prepare("SELECT DISTINCT * FROM users WHERE master_user_id = ? OR id = ?").all(e,e).map(s=>this.mapRow(s))}findFirstByPlatformNotIn(e){let t=e.map(()=>"?").join(", "),s=this.db.prepare(`SELECT * FROM users WHERE platform NOT IN (${t}) LIMIT 1`).get(...e);if(s)return this.mapRow(s)}getMasterUserId(e){return this.db.prepare("SELECT master_user_id FROM users WHERE id = ?").get(e)?.master_user_id??e}mapRow(e){return{id:e.id,platform:e.platform,platformUserId:e.platform_user_id,username:e.username??void 0,displayName:e.display_name??void 0,timezone:e.timezone??void 0,language:e.language??void 0,bio:e.bio??void 0,preferences:e.preferences?JSON.parse(e.preferences):void 0,masterUserId:e.master_user_id??void 0,createdAt:e.created_at,updatedAt:e.updated_at}}}});var at,ia=E(()=>{"use strict";at=class{static{u(this,"AuditRepository")}db;constructor(e){this.db=e}log(e){this.db.prepare(`
|
|
@@ -718,7 +722,7 @@ ${e.allModifiedFiles.map(r=>`- ${r}`).join(`
|
|
|
718
722
|
|
|
719
723
|
**Git:**
|
|
720
724
|
${s.join(`
|
|
721
|
-
`)}`:"";return{...t,data:{...t.data,git:{branch:r.branch,commit:r.commit,pullRequest:r.pullRequest,warnings:r.warnings}},display:(t.display??"")+o}}}});var Kc=E(()=>{"use strict";Gc();no();Jn();Vn();Xn()});var re={};oe(re,{ActivityTracker:()=>ut,BMWSkill:()=>so,BackgroundTaskSkill:()=>Vt,BrowserSkill:()=>qt,CalculatorSkill:()=>xt,CalendarProvider:()=>Re,CalendarSkill:()=>mt,ClipboardSkill:()=>Bt,CodeAgentSkill:()=>rr,CodeExecutionSkill:()=>Xs,CodeExecutor:()=>ft,ConfigureSkill:()=>Qt,ContactsProvider:()=>Ce,ContactsSkill:()=>Zs,CrossPlatformSkill:()=>Wt,DelegateSkill:()=>Pt,DockerSkill:()=>Qr,DocumentSkill:()=>Xt,EmailProvider:()=>He,EmailSkill:()=>Ge,FileSkill:()=>Ft,ForgeClient:()=>yt,HomeAssistantSkill:()=>Kr,HttpSkill:()=>Ut,MCPClient:()=>pt,MCPManager:()=>Ks,MCPSkillAdapter:()=>ht,MemorySkill:()=>Ot,NoteSkill:()=>Nt,PluginLoader:()=>Ur,ProfileSkill:()=>zt,ProxmoxSkill:()=>Vr,ReminderSkill:()=>Lt,RoutingSkill:()=>ro,ScheduledTaskSkill:()=>Gt,ScreenshotSkill:()=>Ht,ShellSkill:()=>Mt,Skill:()=>x,SkillRegistry:()=>At,SkillSandbox:()=>It,SystemInfoSkill:()=>Rt,TTSSkill:()=>Yt,TodoSkill:()=>Jt,UniFiSkill:()=>Gr,WeatherSkill:()=>Dt,WebSearchSkill:()=>Ct,allUserIds:()=>W,createCalendarProvider:()=>Gs,createContactsProvider:()=>Mn,createEmailProvider:()=>zs,createForgeClient:()=>ss,effectiveUserId:()=>Z,gitAddRemote:()=>tr,gitGetRemoteUrl:()=>es,gitInitRepo:()=>er,orchestrate:()=>wt,orchestrateWithGit:()=>sr,parseRemoteUrl:()=>ts});var te=E(()=>{"use strict";F();Me();Sa();ka();_n();Aa();Ia();xa();Ra();Ca();La();Na();Oa();Pa();Ua();Ha();za();Va();Ga();Xa();Ja();Za();oc();nc();ic();ac();lc();uc();mc();pc();hc();fc();yc();$c();vc();xc();Oc();Pc();jc();Kc()});var or,Zn=E(()=>{"use strict";or=class{static{u(this,"ConversationManager")}conversations;constructor(e){this.conversations=e}getOrCreateConversation(e,t,s){let r=this.conversations.findByPlatformChat(e,t);return r?(this.conversations.updateTimestamp(r.id),r):this.conversations.create(e,t,s)}addMessage(e,t,s,r){return this.conversations.addMessage(e,t,s,r)}getHistory(e,t=20){return this.conversations.getMessages(e,t)}}});function Tt(c,e){let t;if(e.platformUserId)t=c.findOrCreate(e.platform,e.platformUserId,e.userName,e.displayName);else if(e.userId)t=c.findById(e.userId)??c.findOrCreate(e.platform,e.userId);else throw new Error("ContextSource must provide either platformUserId or userId");let s="getMasterUserId"in c?c.getMasterUserId(t.id):t.id,r=[];"getLinkedUsers"in c&&(r=c.getLinkedUsers(s).map(a=>a.platformUserId));let o;try{"getProfile"in c?o=c.getProfile(s)?.timezone||Intl.DateTimeFormat().resolvedOptions().timeZone:o=Intl.DateTimeFormat().resolvedOptions().timeZone}catch{o=Intl.DateTimeFormat().resolvedOptions().timeZone}return{context:{userId:t.platformUserId,masterUserId:s,linkedPlatformUserIds:r,chatId:e.chatId,chatType:e.chatType,platform:e.platform,conversationId:e.conversationId??"",timezone:o},user:t,masterUserId:s,linkedPlatformUserIds:r}}var nr=E(()=>{"use strict";u(Tt,"buildSkillContext")});function Xc(c,e){let t=new Set(["core"]),s=!1;for(let[r,o]of Object.entries(om))e.has(r)&&o.test(c)&&(t.add(r),s=!0);if(!s)for(let r of e)t.add(r);return t}function Yc(c,e){return c.filter(t=>e.has(t.category??"core"))}var om,Jc=E(()=>{"use strict";om={productivity:/\b(todo|note|remind|calendar|termin|event|email|e-mail|mail|contact|kontakt)\b/i,information:/\b(search|such|weather|wetter|calculat|rechn|time|date|zeit|datum|uhrzeit|system.?info)\b/i,media:/\b(voice|stimme|tts|speak|sprech|sprich|screenshot|clipboard|zwischenablage|brows)\b/i,automation:/\b(background|hintergrund|shell|bash|cron|schedul|code.?agent|sandbox|automat)\b/i,files:/\b(file|datei|document|dokument|pdf|http|download|upload)\b/i,infrastructure:/\b(proxmox|vm|container|docker|unifi|wifi|wlan|homeassistant|home.?assistant|smarthome|smart.?home|licht|light|schalter|switch)\b/i,identity:/\b(link|verknüpf|cross.?platform|identity|identität)\b/i,mcp:/\bmcp\b/i};u(Xc,"selectCategories");u(Yc,"filterSkills")});import Zc from"node:fs";import Qc from"node:path";var nm,el,im,tl,am,cm,lm,sl,ir,Qn=E(()=>{"use strict";wn();nr();Jc();nm=15*60*1e3,el=50,im=2,tl=.85,am=1e5,cm=2e3,lm=.1,sl=3,ir=class{static{u(this,"MessagePipeline")}promptBuilder;llm;conversationManager;users;logger;skillRegistry;skillSandbox;securityManager;memoryRepo;speechTranscriber;inboxPath;embeddingService;activeLearning;memoryRetriever;maxHistoryMessages;activeAgents=new Map;agentIdCounter=0;constructor(e){this.llm=e.llm,this.conversationManager=e.conversationManager,this.users=e.users,this.logger=e.logger,this.skillRegistry=e.skillRegistry,this.skillSandbox=e.skillSandbox,this.securityManager=e.securityManager,this.memoryRepo=e.memoryRepo,this.speechTranscriber=e.speechTranscriber,this.inboxPath=e.inboxPath,this.embeddingService=e.embeddingService,this.activeLearning=e.activeLearning,this.memoryRetriever=e.memoryRetriever,this.maxHistoryMessages=e.maxHistoryMessages??100,this.promptBuilder=new Fs}async process(e,t){let s=Date.now();this.logger.info({platform:e.platform,userId:e.userId,chatId:e.chatId},"Processing message");try{let{user:r,masterUserId:o,linkedPlatformUserIds:n,context:i}=Tt(this.users,{platformUserId:e.userId,platform:e.platform,chatId:e.chatId,chatType:e.chatType,userName:e.userName,displayName:e.displayName}),a=this.conversationManager.getOrCreateConversation(e.platform,e.chatId,r.id),l=this.conversationManager.getHistory(a.id,this.maxHistoryMessages);this.conversationManager.addMessage(a.id,"user",e.text);let d,m=this.isSyntheticLabel(e.text),p=e.attachments?.some(H=>H.type==="audio")??!1,T=m&&!p;if(this.memoryRetriever&&e.text&&!T)try{d=await this.memoryRetriever.retrieve(o,e.text,15,n)}catch(H){this.logger.debug({err:H},"Hybrid memory retrieval failed")}if(!d&&this.memoryRepo&&!T)try{let H=[o,...(n??[]).filter(Y=>Y!==o)];if(this.embeddingService&&e.text&&this.llm.supportsEmbeddings()){let Y=new Set;d=[];for(let ee of H)for(let J of await this.embeddingService.semanticSearch(ee,e.text,10))Y.has(J.key)||(Y.add(J.key),d.push(J));for(let ee of H)for(let J of this.memoryRepo.getRecentForPrompt(ee,5))Y.has(J.key)||(Y.add(J.key),d.push(J))}else{let Y=new Set;d=[];for(let ee of H)for(let J of this.memoryRepo.getRecentForPrompt(ee,20))Y.has(J.key)||(Y.add(J.key),d.push(J))}}catch(H){this.logger.debug({err:H},"Memory loading failed")}d&&d.length>0&&(d=this.applyMemoryBudget(d));let y;try{"getProfile"in this.users&&(y=this.users.getProfile(o),y&&!y.displayName&&(y.displayName=r.displayName??r.username))}catch(H){this.logger.debug({err:H},"Profile loading failed")}let f=i.timezone??Intl.DateTimeFormat().resolvedOptions().timeZone,_=this.skillRegistry?this.skillRegistry.getAll().map(H=>H.metadata):void 0,S=_;if(_&&e.text){let H=new Set(_.map(ee=>ee.category??"core")),Y=Xc(e.text,H);S=Yc(_,Y)}let A=S?this.promptBuilder.buildTools(S):void 0,I=this.promptBuilder.buildSystemPrompt({memories:d,skills:S,userProfile:y}),P=this.buildActiveAgentStatus();P&&(I+=`
|
|
725
|
+
`)}`:"";return{...t,data:{...t.data,git:{branch:r.branch,commit:r.commit,pullRequest:r.pullRequest,warnings:r.warnings}},display:(t.display??"")+o}}}});var Kc=E(()=>{"use strict";Gc();no();Jn();Vn();Xn()});var re={};oe(re,{ActivityTracker:()=>ut,BMWSkill:()=>so,BackgroundTaskSkill:()=>Vt,BrowserSkill:()=>qt,CalculatorSkill:()=>xt,CalendarProvider:()=>Re,CalendarSkill:()=>mt,ClipboardSkill:()=>Bt,CodeAgentSkill:()=>rr,CodeExecutionSkill:()=>Xs,CodeExecutor:()=>ft,ConfigureSkill:()=>Qt,ContactsProvider:()=>Ce,ContactsSkill:()=>Zs,CrossPlatformSkill:()=>Wt,DelegateSkill:()=>Pt,DockerSkill:()=>Qr,DocumentSkill:()=>Xt,EmailProvider:()=>He,EmailSkill:()=>Ge,FileSkill:()=>Ft,ForgeClient:()=>yt,HomeAssistantSkill:()=>Kr,HttpSkill:()=>Ut,MCPClient:()=>pt,MCPManager:()=>Ks,MCPSkillAdapter:()=>ht,MemorySkill:()=>Ot,NoteSkill:()=>Nt,PluginLoader:()=>Ur,ProfileSkill:()=>zt,ProxmoxSkill:()=>Vr,ReminderSkill:()=>Lt,RoutingSkill:()=>ro,ScheduledTaskSkill:()=>Gt,ScreenshotSkill:()=>Ht,ShellSkill:()=>Mt,Skill:()=>x,SkillRegistry:()=>At,SkillSandbox:()=>It,SystemInfoSkill:()=>Rt,TTSSkill:()=>Yt,TodoSkill:()=>Jt,UniFiSkill:()=>Gr,WeatherSkill:()=>Dt,WebSearchSkill:()=>Ct,allUserIds:()=>W,createCalendarProvider:()=>Gs,createContactsProvider:()=>Mn,createEmailProvider:()=>zs,createForgeClient:()=>ss,effectiveUserId:()=>Z,gitAddRemote:()=>tr,gitGetRemoteUrl:()=>es,gitInitRepo:()=>er,orchestrate:()=>wt,orchestrateWithGit:()=>sr,parseRemoteUrl:()=>ts});var te=E(()=>{"use strict";F();Me();Sa();ka();_n();Aa();Ia();xa();Ra();Ca();La();Na();Oa();Pa();Ua();Ha();za();Va();Ga();Xa();Ja();Za();oc();nc();ic();ac();lc();uc();mc();pc();hc();fc();yc();$c();vc();xc();Oc();Pc();jc();Kc()});var or,Zn=E(()=>{"use strict";or=class{static{u(this,"ConversationManager")}conversations;constructor(e){this.conversations=e}getOrCreateConversation(e,t,s){let r=this.conversations.findByPlatformChat(e,t);return r?(this.conversations.updateTimestamp(r.id),r):this.conversations.create(e,t,s)}addMessage(e,t,s,r){return this.conversations.addMessage(e,t,s,r)}getHistory(e,t=20){return this.conversations.getMessages(e,t)}pruneMessages(e,t){return this.conversations.pruneMessages(e,t)}}});function Tt(c,e){let t;if(e.platformUserId)t=c.findOrCreate(e.platform,e.platformUserId,e.userName,e.displayName);else if(e.userId)t=c.findById(e.userId)??c.findOrCreate(e.platform,e.userId);else throw new Error("ContextSource must provide either platformUserId or userId");let s="getMasterUserId"in c?c.getMasterUserId(t.id):t.id,r=[];"getLinkedUsers"in c&&(r=c.getLinkedUsers(s).map(a=>a.platformUserId));let o;try{"getProfile"in c?o=c.getProfile(s)?.timezone||Intl.DateTimeFormat().resolvedOptions().timeZone:o=Intl.DateTimeFormat().resolvedOptions().timeZone}catch{o=Intl.DateTimeFormat().resolvedOptions().timeZone}return{context:{userId:t.platformUserId,masterUserId:s,linkedPlatformUserIds:r,chatId:e.chatId,chatType:e.chatType,platform:e.platform,conversationId:e.conversationId??"",timezone:o},user:t,masterUserId:s,linkedPlatformUserIds:r}}var nr=E(()=>{"use strict";u(Tt,"buildSkillContext")});function Xc(c,e){let t=new Set(["core"]),s=!1;for(let[r,o]of Object.entries(om))e.has(r)&&o.test(c)&&(t.add(r),s=!0);if(!s)for(let r of e)t.add(r);return t}function Yc(c,e){return c.filter(t=>e.has(t.category??"core"))}var om,Jc=E(()=>{"use strict";om={productivity:/\b(todo|note|remind|calendar|termin|event|email|e-mail|mail|contact|kontakt)\b/i,information:/\b(search|such|weather|wetter|calculat|rechn|time|date|zeit|datum|uhrzeit|system.?info)\b/i,media:/\b(voice|stimme|tts|speak|sprech|sprich|screenshot|clipboard|zwischenablage|brows)\b/i,automation:/\b(background|hintergrund|shell|bash|cron|schedul|code.?agent|sandbox|automat)\b/i,files:/\b(file|datei|document|dokument|pdf|http|download|upload)\b/i,infrastructure:/\b(proxmox|vm|container|docker|unifi|wifi|wlan|homeassistant|home.?assistant|smarthome|smart.?home|licht|light|schalter|switch)\b/i,identity:/\b(link|verknüpf|cross.?platform|identity|identität)\b/i,mcp:/\bmcp\b/i};u(Xc,"selectCategories");u(Yc,"filterSkills")});import Zc from"node:fs";import Qc from"node:path";var nm,el,im,tl,am,cm,lm,sl,ir,Qn=E(()=>{"use strict";wn();nr();Jc();nm=15*60*1e3,el=50,im=2,tl=.85,am=1e5,cm=2e3,lm=.1,sl=3,ir=class{static{u(this,"MessagePipeline")}promptBuilder;llm;conversationManager;users;logger;skillRegistry;skillSandbox;securityManager;memoryRepo;speechTranscriber;inboxPath;embeddingService;activeLearning;memoryRetriever;maxHistoryMessages;activeAgents=new Map;agentIdCounter=0;constructor(e){this.llm=e.llm,this.conversationManager=e.conversationManager,this.users=e.users,this.logger=e.logger,this.skillRegistry=e.skillRegistry,this.skillSandbox=e.skillSandbox,this.securityManager=e.securityManager,this.memoryRepo=e.memoryRepo,this.speechTranscriber=e.speechTranscriber,this.inboxPath=e.inboxPath,this.embeddingService=e.embeddingService,this.activeLearning=e.activeLearning,this.memoryRetriever=e.memoryRetriever,this.maxHistoryMessages=e.maxHistoryMessages??100,this.promptBuilder=new Fs}async process(e,t){let s=Date.now();this.logger.info({platform:e.platform,userId:e.userId,chatId:e.chatId},"Processing message");try{let{user:r,masterUserId:o,linkedPlatformUserIds:n,context:i}=Tt(this.users,{platformUserId:e.userId,platform:e.platform,chatId:e.chatId,chatType:e.chatType,userName:e.userName,displayName:e.displayName}),a=this.conversationManager.getOrCreateConversation(e.platform,e.chatId,r.id),l=this.conversationManager.getHistory(a.id,this.maxHistoryMessages);this.conversationManager.addMessage(a.id,"user",e.text);let d,m=this.isSyntheticLabel(e.text),p=e.attachments?.some(H=>H.type==="audio")??!1,T=m&&!p;if(this.memoryRetriever&&e.text&&!T)try{d=await this.memoryRetriever.retrieve(o,e.text,15,n)}catch(H){this.logger.debug({err:H},"Hybrid memory retrieval failed")}if(!d&&this.memoryRepo&&!T)try{let H=[o,...(n??[]).filter(Y=>Y!==o)];if(this.embeddingService&&e.text&&this.llm.supportsEmbeddings()){let Y=new Set;d=[];for(let ee of H)for(let J of await this.embeddingService.semanticSearch(ee,e.text,10))Y.has(J.key)||(Y.add(J.key),d.push(J));for(let ee of H)for(let J of this.memoryRepo.getRecentForPrompt(ee,5))Y.has(J.key)||(Y.add(J.key),d.push(J))}else{let Y=new Set;d=[];for(let ee of H)for(let J of this.memoryRepo.getRecentForPrompt(ee,20))Y.has(J.key)||(Y.add(J.key),d.push(J))}}catch(H){this.logger.debug({err:H},"Memory loading failed")}d&&d.length>0&&(d=this.applyMemoryBudget(d));let y;try{"getProfile"in this.users&&(y=this.users.getProfile(o),y&&!y.displayName&&(y.displayName=r.displayName??r.username))}catch(H){this.logger.debug({err:H},"Profile loading failed")}let f=i.timezone??Intl.DateTimeFormat().resolvedOptions().timeZone,_=this.skillRegistry?this.skillRegistry.getAll().map(H=>H.metadata):void 0,S=_;if(_&&e.text){let H=new Set(_.map(ee=>ee.category??"core")),Y=Xc(e.text,H);S=Yc(_,Y)}let A=S?this.promptBuilder.buildTools(S):void 0,I=this.promptBuilder.buildSystemPrompt({memories:d,skills:S,userProfile:y}),P=this.buildActiveAgentStatus();P&&(I+=`
|
|
722
726
|
|
|
723
727
|
`+P);let L=this.promptBuilder.buildMessages(l),X=this.collapseRepeatedToolErrors(L),Oe=await this.buildUserContent(e,t);X.push({role:"user",content:Oe});let ve=A?xe(JSON.stringify(A)):0,Pe=1,ae=this.trimToContextWindow(I,X,ve,Pe),V,pe=0,he=Date.now(),C="",U=0,fe=0,Ue=0,os=[];for(t?.("Thinking...");;){pe>0&&this.compressToolLoop(ae,I,ve);try{V=await this.llm.complete({messages:ae,system:I,tools:A&&A.length>0?A:void 0}),fe+=V.usage?.inputTokens??0,Ue+=V.usage?.outputTokens??0}catch(Te){if((Te instanceof Error?Te.message:String(Te)).includes("prompt is too long")&&Pe>.3){Pe*=.5,this.logger.warn({budgetMultiplier:Pe},"Prompt too long, retrimming with reduced budget"),ae=this.trimToContextWindow(I,X,ve,Pe);continue}throw Te}if(!V.toolCalls||V.toolCalls.length===0)break;let H=Date.now()-he;if(H>=nm){let Te=Math.round(H/6e4);this.logger.warn({iteration:pe,elapsedMin:Te,pendingToolCalls:V.toolCalls.length},"Tool loop timeout reached"),V=await this.abortToolLoop(ae,V,a.id,I,`Das Zeitlimit von ${Te} Minuten f\xFCr Tool-Aufrufe wurde erreicht.`);break}if(pe>=el){this.logger.warn({iteration:pe,pendingToolCalls:V.toolCalls.length},"Tool loop iteration cap reached"),V=await this.abortToolLoop(ae,V,a.id,I,`Das Iterationslimit von ${el} Tool-Aufrufen wurde erreicht.`);break}pe++,this.logger.info({iteration:pe,toolCalls:V.toolCalls.length},"Processing tool calls");let Y=[];V.content&&Y.push({type:"text",text:V.content});for(let Te of V.toolCalls)Y.push({type:"tool_use",id:Te.id,name:Te.name,input:Te.input});ae.push({role:"assistant",content:Y});let ee=await this.executeToolCallsParallel(V.toolCalls,{...i,conversationId:a.id,timezone:f},t),J=ee.blocks;ee.attachments.length>0&&os.push(...ee.attachments),this.conversationManager.addMessage(a.id,"assistant",V.content??"",JSON.stringify(V.toolCalls)),this.conversationManager.addMessage(a.id,"user","",JSON.stringify(J));let bt=this.buildErrorSignature(J);if(bt){if(bt===C?U++:(U=1,C=bt),U>=im){this.logger.warn({iteration:pe,consecutiveErrors:U,errorSignature:bt},"Tool loop aborted: same error repeated consecutively"),V=await this.abortToolLoop(ae,V,a.id,I,`Der gleiche Tool-Fehler ist ${U}x hintereinander aufgetreten: "${C.slice(0,200)}". Erkl\xE4re dem User kurz was nicht funktioniert hat und schlage eine Alternative vor.`,!0);break}}else U=0,C="";ae.push({role:"user",content:J}),t?.("Thinking...")}let Q=V.content;if(!Q)for(let H=ae.length-1;H>=0;H--){let Y=ae[H];if(Y.role==="assistant"&&Array.isArray(Y.content)){let ee=Y.content.find(J=>J.type==="text");if(ee&&"text"in ee&&ee.text){Q=ee.text;break}}}Q||(Q="(no response)"),this.conversationManager.addMessage(a.id,"assistant",Q),this.activeLearning&&this.activeLearning.onMessageProcessed(o,e.text,Q);let ns=Date.now()-s;return this.logger.info({duration:ns,tokens:V.usage,totalTokens:{inputTokens:fe,outputTokens:Ue},stopReason:V.stopReason,toolIterations:pe},"Message processed"),{text:Q,attachments:os.length>0?os:void 0}}catch(r){throw this.logger.error({err:r},"Failed to process message"),r}}async abortToolLoop(e,t,s,r,o,n=!1){if(!n){let a=[];t.content&&a.push({type:"text",text:t.content});for(let l of t.toolCalls)a.push({type:"tool_use",id:l.id,name:l.name,input:l.input});e.push({role:"assistant",content:a})}let i=t.toolCalls.map(a=>({type:"tool_result",tool_use_id:a.id,content:`Error: tool loop aborted \u2014 ${o}`,is_error:!0}));return e.push({role:"user",content:i}),n||this.conversationManager.addMessage(s,"assistant",t.content??"",JSON.stringify(t.toolCalls)),this.conversationManager.addMessage(s,"user","",JSON.stringify(i)),e.push({role:"user",content:`[System: ${o} Fasse dem User kurz zusammen was du bisher geschafft hast und was noch offen ist.]`}),await this.llm.complete({messages:e,system:r})}buildErrorSignature(e){let t=[];for(let s of e)s.type==="tool_result"&&s.is_error&&t.push(s.content);return t.length>0?t.join("|"):""}collapseRepeatedToolErrors(e){let t=[],s=0;for(;s<e.length;){let r=e[s];if(r.role==="assistant"&&Array.isArray(r.content)&&r.content.some(o=>o.type==="tool_use")){let o=s+1<e.length?e[s+1]:null;if(o&&o.role==="user"&&Array.isArray(o.content)&&o.content.every(n=>n.type==="tool_result"&&n.is_error)){let n=this.toolPairSignature(r,o),i=1,a=s+2;for(;a+1<e.length;){let l=e[a],d=e[a+1];if(l.role==="assistant"&&d?.role==="user"&&this.toolPairSignature(l,d)===n)i++,a+=2;else break}if(i>1){t.push(r),t.push(o),t.push({role:"assistant",content:`[System: The above tool error repeated ${i} times with identical input. The loop was aborted.]`}),s=a;continue}}}t.push(r),s++}return t}toolPairSignature(e,t){let s=Array.isArray(e.content)?e.content.filter(o=>o.type==="tool_use").map(o=>`${o.name}:${JSON.stringify(o.input)}`).join(","):"",r=Array.isArray(t.content)?t.content.filter(o=>o.type==="tool_result").map(o=>o.content).join(","):"";return`${s}|${r}`}async executeToolCallsParallel(e,t,s){let r=[],o=u((a,l)=>{let d=l.content;if(l.attachments&&l.attachments.length>0){r.push(...l.attachments);let m=l.attachments.map(p=>p.fileName).join(", ");d+=`
|
|
724
728
|
|
|
@@ -746,7 +750,8 @@ Error: ${n.error}`;await a.sendMessage(e.chatId,l)}}catch(t){let s=t instanceof
|
|
|
746
750
|
|
|
747
751
|
Error: ${s}`)}}}});import dm from"node:crypto";var hr,ai=E(()=>{"use strict";nr();hr=class{static{u(this,"ProactiveScheduler")}actionRepo;skillRegistry;skillSandbox;llm;adapters;users;logger;pipeline;formatter;conversationManager;tickTimer;tickIntervalMs=6e4;constructor(e,t,s,r,o,n,i,a,l,d){this.actionRepo=e,this.skillRegistry=t,this.skillSandbox=s,this.llm=r,this.adapters=o,this.users=n,this.logger=i,this.pipeline=a,this.formatter=l,this.conversationManager=d}start(){this.tickTimer=setInterval(()=>this.tick(),this.tickIntervalMs),this.logger.info("Proactive scheduler started")}stop(){this.tickTimer&&(clearInterval(this.tickTimer),this.tickTimer=void 0),this.logger.info("Proactive scheduler stopped")}async tick(){try{let e=this.actionRepo.getDue();for(let t of e)try{await this.executeAction(t)}catch(s){this.logger.error({err:s,actionId:t.id},"Failed to execute scheduled action")}}catch(e){this.logger.error({err:e},"Error during proactive scheduler tick")}}async executeAction(e){let t=new Date().toISOString();this.logger.info({actionId:e.id,name:e.name},"Executing scheduled action");let s;if(e.promptTemplate&&this.pipeline)try{let i=`scheduled-${e.id}`,a={id:`scheduled-${dm.randomUUID()}`,platform:e.platform,chatId:i,chatType:"dm",userId:e.userId,userName:e.userId,text:e.promptTemplate,timestamp:new Date},l=await this.pipeline.process(a);s=(this.formatter?this.formatter.format(l.text,e.platform):{text:l.text,parseMode:"text"}).text;let m=this.adapters.get(e.platform);if(m&&l.attachments)for(let p of l.attachments)try{let T=p.mimeType.startsWith("image/"),y=p.mimeType==="audio/ogg"||p.mimeType==="audio/opus";T?await m.sendPhoto(e.chatId,p.data,p.fileName):y?await m.sendVoice(e.chatId,p.data):await m.sendFile(e.chatId,p.data,p.fileName)}catch(T){this.logger.warn({err:T,fileName:p.fileName,actionId:e.id},"Failed to send scheduled action attachment")}}catch(i){let a=i instanceof Error?i.message:String(i);this.logger.error({actionId:e.id,err:i},"Pipeline execution failed for scheduled action"),s=`Scheduled action "${e.name}" failed: ${a}`}else if(e.promptTemplate)try{s=(await this.llm.complete({messages:[{role:"user",content:e.promptTemplate}],maxTokens:1024,tier:"fast"})).content}catch(i){let a=i instanceof Error?i.message:String(i);this.logger.error({actionId:e.id,err:i},"LLM call failed for scheduled action"),s=`Scheduled action "${e.name}" failed: ${a}`}else{let i=this.skillRegistry.get(e.skillName);if(!i)this.logger.warn({actionId:e.id,skillName:e.skillName},"Unknown skill for scheduled action"),s=`Scheduled action "${e.name}" failed: unknown skill "${e.skillName}"`;else try{let a;try{a=JSON.parse(e.skillInput)}catch{a={},this.logger.warn({actionId:e.id},"Invalid skillInput JSON, using empty input")}let{context:l}=Tt(this.users,{userId:e.userId,platform:e.platform,chatId:e.chatId,chatType:"dm"}),d=await this.skillSandbox.execute(i,a,l);s=d.success?`\u{1F514} Scheduled: ${e.name}
|
|
748
752
|
|
|
749
|
-
${d.display??JSON.stringify(d.data)}`:`\u274C Scheduled action "${e.name}" failed: ${d.error}`}catch(a){let l=a instanceof Error?a.message:String(a);s=`\u274C Scheduled action "${e.name}" failed: ${l}`}}let r=s.trim();if(!r||r.length<3)this.logger.info({actionId:e.id,name:e.name},"Scheduled action produced no output \u2014 skipping notification");else{let i=this.adapters.get(e.platform);if(i)try{if(await i.sendMessage(e.chatId,s),this.conversationManager){let a=this.conversationManager.getOrCreateConversation(e.platform,e.chatId,e.userId)
|
|
753
|
+
${d.display??JSON.stringify(d.data)}`:`\u274C Scheduled action "${e.name}" failed: ${d.error}`}catch(a){let l=a instanceof Error?a.message:String(a);s=`\u274C Scheduled action "${e.name}" failed: ${l}`}}let r=s.trim();if(!r||r.length<3||/^(alles\s+(in\s+ordnung|ok|gut|klar)|no\s+issues?|nothing\s+to\s+report|all\s+(clear|good|ok)|keine\s+(probleme|auff[aä]lligkeiten|fehler))/i.test(r))this.logger.info({actionId:e.id,name:e.name},"Scheduled action produced no actionable output \u2014 skipping notification");else{let i=this.adapters.get(e.platform);if(i)try{if(await i.sendMessage(e.chatId,s),this.conversationManager){let a=this.conversationManager.getOrCreateConversation(e.platform,e.chatId,e.userId),l=`[Scheduled Alert: ${e.name}]
|
|
754
|
+
${s}`;this.conversationManager.addMessage(a.id,"system",l)}}catch(a){this.logger.error({err:a,actionId:e.id},"Failed to send scheduled action result")}}if(e.promptTemplate&&this.conversationManager)try{let i=`scheduled-${e.id}`,a=this.conversationManager.getOrCreateConversation(e.platform,i,e.userId);this.conversationManager.pruneMessages(a.id,20)}catch{}let n=this.calculateNextRun(e);n?this.actionRepo.updateLastRun(e.id,t,n):(this.actionRepo.updateLastRun(e.id,t,null),this.actionRepo.setEnabled(e.id,!1))}calculateNextRun(e){let t=new Date;switch(e.scheduleType){case"interval":{let s=parseInt(e.scheduleValue,10);return isNaN(s)||s<=0?null:new Date(t.getTime()+s*6e4).toISOString()}case"once":return null;case"cron":return this.getNextCronDate(e.scheduleValue,t)?.toISOString()??null;default:return null}}getNextCronDate(e,t){let s=e.trim().split(/\s+/);if(s.length!==5)return null;let r=new Date(t.getTime()+6e4);r.setSeconds(0,0);for(let o=0;o<1440;o++){if(this.matchesCron(s,r))return r;r.setTime(r.getTime()+6e4)}return null}matchesCron(e,t){let s=t.getMinutes(),r=t.getHours(),o=t.getDate(),n=t.getMonth()+1,i=t.getDay();return this.matchCronField(e[0],s)&&this.matchCronField(e[1],r)&&this.matchCronField(e[2],o)&&this.matchCronField(e[3],n)&&this.matchCronField(e[4],i)}matchCronField(e,t){if(e==="*")return!0;let s=/^\*\/(\d+)$/.exec(e);if(s){let o=parseInt(s[1],10);return t%o===0}let r=parseInt(e,10);return isNaN(r)?!1:t===r}}});function ci(c){let e=c.trim();if(e.length<10)return{level:"low",matchedPatterns:[]};for(let s of um)if(s.test(e))return{level:"low",matchedPatterns:[]};let t=[];for(let s of mm)for(let r of s.patterns)if(r.test(e)){t.push(s.name);break}return t.length>0?{level:"high",matchedPatterns:t}:{level:"low",matchedPatterns:[]}}var um,mm,li=E(()=>{"use strict";um=[/^(what|where|when|who|why|how|which|can you|could you|do you|is there|are there|was |wer |wo |wann |warum |wie |welch|kannst du|könntest du|gibt es)/i,/^(hi|hey|hello|hallo|guten (morgen|tag|abend)|moin|servus|grüß|na\b|yo\b|sup\b|good (morning|evening|night))\b/i,/^(tell me|show me|find|search|help|explain|describe|translate|summarize|zeig|such|hilf|erklär|beschreib|übersetze|fass zusammen)/i,/^(ok|okay|yes|no|ja|nein|danke|thanks|thank you|sure|alright|klar|gut|cool|nice|great|perfect|genau|stimmt|richtig)\b/i],mm=[{name:"fact:name",patterns:[/\b(my name is|i'm called|i am called|ich heiße|ich bin der|ich bin die|mein name ist)\b/i]},{name:"fact:location",patterns:[/\b(i live in|i'm from|i am from|ich wohne|ich lebe in|ich komme aus|ich bin aus)\b/i]},{name:"fact:work",patterns:[/\b(i work at|i work as|i work for|ich arbeite|mein job|mein beruf|ich bin .{0,20}(entwickler|ingenieur|lehrer|arzt|designer))\b/i]},{name:"fact:birthday",patterns:[/\b(my birthday|i was born|ich bin geboren|mein geburtstag|ich habe am .{1,15} geburtstag)\b/i]},{name:"fact:age",patterns:[/\b(i'm \d+ years|i am \d+ years|ich bin \d+ (jahre|jahr))\b/i]},{name:"preference:like",patterns:[/\b(i love|i really like|i enjoy|ich liebe|ich mag|mir gefällt|mir gefallen)\b/i]},{name:"preference:dislike",patterns:[/\b(i hate|i dislike|i can't stand|ich hasse|ich mag .{0,5} nicht|ich kann .{0,10} nicht leiden)\b/i]},{name:"preference:prefer",patterns:[/\b(i prefer|i'd rather|ich bevorzuge|ich nehme lieber|mir ist .{0,10} lieber)\b/i]},{name:"preference:favorite",patterns:[/\b(my fav|my favorite|my favourite|mein lieblings|meine lieblings|am liebsten)\b/i]},{name:"correction",patterns:[/\b(actually|actually,? (i|my|it)|eigentlich|das stimmt nicht|nein,? ich|that's not right|that's wrong|nicht ganz)\b/i]},{name:"relationship:family",patterns:[/\b(my wife|my husband|my partner|meine frau|mein mann|mein partner|meine partnerin|my daughter|my son|mein sohn|meine tochter|my kids|meine kinder|my mother|my father|meine mutter|mein vater)\b/i]},{name:"relationship:professional",patterns:[/\b(my boss|my manager|my colleague|mein chef|mein vorgesetzter|mein kollege|meine kollegin)\b/i]},{name:"relationship:social",patterns:[/\b(my friend|my best friend|mein freund|meine freundin|mein bester freund)\b/i]},{name:"fact:language",patterns:[/\b(i speak|ich spreche|my native|meine muttersprache)\b/i]},{name:"fact:education",patterns:[/\b(i studied|i went to|ich habe .{0,10} studiert|ich war auf der|mein studium)\b/i]},{name:"fact:hobby",patterns:[/\b(my hobby|i play .{0,10}(guitar|piano|football|tennis|chess)|mein hobby|ich spiele|in my free time|in meiner freizeit)\b/i]},{name:"decision",patterns:[/\b(i've decided|i decided|i will always|ich habe (mich )?entschieden|ich werde immer)\b/i]},{name:"commitment",patterns:[/\b(i always|i never|ich mache immer|ich mache nie|i'm trying to|ich versuche)\b/i]}];u(ci,"scanSignal")});var pm,hm,fr,di=E(()=>{"use strict";pm=["fact","preference","correction","entity","decision","relationship","principle","commitment","moment","skill"],hm=`You are a memory extraction system. Analyze the user message and extract personal facts about the USER (not about what they're asking).
|
|
750
755
|
|
|
751
756
|
Rules:
|
|
752
757
|
- Only extract information the user STATES about themselves
|