@madh-io/alfred-ai 0.9.58 → 0.9.60

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.
Files changed (2) hide show
  1. package/bundle/index.js +2 -2
  2. package/package.json +1 -1
package/bundle/index.js CHANGED
@@ -318,7 +318,7 @@ var ri=Object.defineProperty;var u=(c,e)=>ri(c,"name",{value:e,configurable:!0})
318
318
  COUNT(*) as total
319
319
  FROM todos WHERE user_id = ? GROUP BY list ORDER BY list`).all(e).map(s=>({list:s.list,open:Number(s.open),completed:Number(s.completed),total:Number(s.total)}))}mapRow(e){return{id:e.id,userId:e.user_id,list:e.list,title:e.title,description:e.description,priority:e.priority,dueDate:e.due_date,completed:e.completed===1,createdAt:e.created_at,updatedAt:e.updated_at}}}});var xo=y(()=>{"use strict";Ti();bi();_i();$i();vi();hr();Ro();Si();ki();Ai();Ii();Ri();xi();Li();Ni()});function Qe(c){if(Co[c])return Co[c];let e=Object.entries(Co).sort((t,s)=>s[0].length-t[0].length);for(let[t,s]of e)if(c.startsWith(t))return s}var Co,Jl,_e,ft=y(()=>{"use strict";Co={"claude-opus-4-20250514":{maxInputTokens:2e5,maxOutputTokens:32e3},"claude-sonnet-4-20250514":{maxInputTokens:2e5,maxOutputTokens:16e3},"claude-haiku-3-5-20241022":{maxInputTokens:2e5,maxOutputTokens:8192},"gpt-4o":{maxInputTokens:128e3,maxOutputTokens:16384},"gpt-4o-mini":{maxInputTokens:128e3,maxOutputTokens:16384},"gpt-4-turbo":{maxInputTokens:128e3,maxOutputTokens:4096},"gpt-4":{maxInputTokens:8192,maxOutputTokens:4096},"gpt-3.5-turbo":{maxInputTokens:16384,maxOutputTokens:4096},o1:{maxInputTokens:2e5,maxOutputTokens:1e5},"o1-mini":{maxInputTokens:128e3,maxOutputTokens:65536},"o3-mini":{maxInputTokens:2e5,maxOutputTokens:1e5},"llama3.2":{maxInputTokens:128e3,maxOutputTokens:4096},"llama3.1":{maxInputTokens:128e3,maxOutputTokens:4096},llama3:{maxInputTokens:8192,maxOutputTokens:4096},mistral:{maxInputTokens:32e3,maxOutputTokens:4096},"mistral-small":{maxInputTokens:32e3,maxOutputTokens:4096},mixtral:{maxInputTokens:32e3,maxOutputTokens:4096},gemma2:{maxInputTokens:8192,maxOutputTokens:4096},"qwen2.5":{maxInputTokens:128e3,maxOutputTokens:4096},phi3:{maxInputTokens:128e3,maxOutputTokens:4096},"deepseek-r1":{maxInputTokens:128e3,maxOutputTokens:8192},"command-r":{maxInputTokens:128e3,maxOutputTokens:4096},"gemini-2.0-flash":{maxInputTokens:1048576,maxOutputTokens:8192},"gemini-2.0-pro":{maxInputTokens:1048576,maxOutputTokens:8192},"gemini-1.5-pro":{maxInputTokens:2097152,maxOutputTokens:8192},"gemini-1.5-flash":{maxInputTokens:1048576,maxOutputTokens:8192},"mistral-large-latest":{maxInputTokens:256e3,maxOutputTokens:8192},"mistral-medium-latest":{maxInputTokens:128e3,maxOutputTokens:8192},"mistral-small-latest":{maxInputTokens:128e3,maxOutputTokens:8192},"codestral-latest":{maxInputTokens:256e3,maxOutputTokens:8192},"magistral-medium-latest":{maxInputTokens:4e4,maxOutputTokens:8192},"magistral-small-latest":{maxInputTokens:4e4,maxOutputTokens:8192},"ministral-8b-latest":{maxInputTokens:128e3,maxOutputTokens:4096}},Jl={maxInputTokens:8192,maxOutputTokens:4096};u(Qe,"lookupContextWindow");_e=class{static{u(this,"LLMProvider")}config;contextWindow=Jl;constructor(e){this.config=e}getContextWindow(){return this.contextWindow}async embed(e){}supportsEmbeddings(){return!1}}});import Zl from"@anthropic-ai/sdk";var ws,Lo=y(()=>{"use strict";ft();ws=class extends _e{static{u(this,"AnthropicProvider")}client;constructor(e){super(e)}async initialize(){this.client=new Zl({apiKey:this.config.apiKey});let e=Qe(this.config.model);e&&(this.contextWindow=e)}async complete(e){let t=this.mapMessages(e.messages),s=e.tools?this.mapTools(e.tools):void 0,r={model:this.config.model,max_tokens:e.maxTokens??this.config.maxTokens??4096,temperature:e.temperature??this.config.temperature,system:e.system,messages:t,tools:s},o=await this.client.messages.create(r);return this.mapResponse(o)}async*stream(e){let t=this.mapMessages(e.messages),s=e.tools?this.mapTools(e.tools):void 0,r=this.client.messages.stream({model:this.config.model,max_tokens:e.maxTokens??this.config.maxTokens??4096,temperature:e.temperature??this.config.temperature,system:e.system,messages:t,tools:s});for await(let o of r)if(o.type==="content_block_delta")o.delta.type==="text_delta"?yield{type:"text_delta",text:o.delta.text}:o.delta.type==="input_json_delta"&&(yield{type:"tool_use_delta",toolCall:{input:o.delta.partial_json}});else if(o.type==="content_block_start")o.content_block.type==="tool_use"&&(yield{type:"tool_use_start",toolCall:{id:o.content_block.id,name:o.content_block.name}});else if(o.type==="message_stop"){let n=await r.finalMessage();yield{type:"message_complete",response:this.mapResponse(n)}}}isAvailable(){return!!this.config.apiKey}mapMessages(e){return e.map(t=>{if(typeof t.content=="string")return{role:t.role,content:t.content};let s=t.content.map(r=>{switch(r.type){case"text":return{type:"text",text:r.text};case"image":return{type:"image",source:{type:"base64",media_type:r.source.media_type,data:r.source.data}};case"tool_use":return{type:"tool_use",id:r.id,name:r.name,input:r.input};case"tool_result":return{type:"tool_result",tool_use_id:r.tool_use_id,content:r.content,is_error:r.is_error};default:return{type:"text",text:"[Unsupported block type]"}}}).filter(r=>r!==void 0);return{role:t.role,content:s}})}mapTools(e){return e.map(t=>({name:t.name,description:t.description,input_schema:t.inputSchema}))}mapResponse(e){let t="",s=[];for(let r of e.content)r.type==="text"?t+=r.text:r.type==="tool_use"&&s.push({id:r.id,name:r.name,input:r.input});return{content:t,toolCalls:s.length>0?s:void 0,usage:{inputTokens:e.usage.input_tokens,outputTokens:e.usage.output_tokens},stopReason:e.stop_reason}}}});import Ql from"openai";var ge,et=y(()=>{"use strict";ft();ge=class extends _e{static{u(this,"OpenAIProvider")}client;constructor(e){super(e)}async initialize(){this.client=new Ql({apiKey:this.config.apiKey,baseURL:this.config.baseUrl});let e=Qe(this.config.model);e&&(this.contextWindow=e)}async complete(e){let t=this.mapMessages(e.messages,e.system),s=e.tools?this.mapTools(e.tools):void 0,r={model:this.config.model,max_tokens:e.maxTokens??this.config.maxTokens??4096,temperature:e.temperature??this.config.temperature,messages:t,...s?{tools:s}:{}},o=await this.client.chat.completions.create(r);return this.mapResponse(o)}async*stream(e){let t=this.mapMessages(e.messages,e.system),s=e.tools?this.mapTools(e.tools):void 0,r=await this.client.chat.completions.create({model:this.config.model,max_tokens:e.maxTokens??this.config.maxTokens??4096,temperature:e.temperature??this.config.temperature,messages:t,...s?{tools:s}:{},stream:!0}),o,n,i="",a="",l=[],d=null,m=0,p=0;for await(let w of r){let T=w.choices[0];if(!T)continue;let g=T.delta;if(g?.content&&(a+=g.content,yield{type:"text_delta",text:g.content}),g?.tool_calls)for(let b of g.tool_calls)if(b.id){if(o){let $;try{$=JSON.parse(i||"{}")}catch{$={}}l.push({id:o,name:n,input:$})}o=b.id,n=b.function?.name,i=b.function?.arguments??"",yield{type:"tool_use_start",toolCall:{id:o,name:n}}}else b.function?.arguments&&(i+=b.function.arguments,yield{type:"tool_use_delta",toolCall:{input:b.function.arguments}});T.finish_reason&&(d=T.finish_reason),w.usage&&(m=w.usage.prompt_tokens,p=w.usage.completion_tokens)}if(o){let w;try{w=JSON.parse(i||"{}")}catch{w={}}l.push({id:o,name:n,input:w})}yield{type:"message_complete",response:{content:a,toolCalls:l.length>0?l:void 0,usage:{inputTokens:m,outputTokens:p},stopReason:this.mapStopReason(d)}}}isAvailable(){return!!this.config.apiKey}async embed(e){try{let s=(await this.client.embeddings.create({model:"text-embedding-3-small",input:e})).data[0];return{embedding:s.embedding,model:"text-embedding-3-small",dimensions:s.embedding.length}}catch{return}}supportsEmbeddings(){return!0}mapMessages(e,t){let s=[];t&&s.push({role:"system",content:t});for(let r of e){if(typeof r.content=="string"){s.push({role:r.role,content:r.content});continue}let o=[],n=[],i=[];for(let a of r.content)switch(a.type){case"text":o.push({type:"text",text:a.text});break;case"image":o.push({type:"image_url",image_url:{url:`data:${a.source.media_type};base64,${a.source.data}`}});break;case"tool_use":n.push({id:a.id,type:"function",function:{name:a.name,arguments:JSON.stringify(a.input)}});break;case"tool_result":i.push({tool_call_id:a.tool_use_id,content:a.content});break}if(r.role==="assistant"&&n.length>0){let a=o.map(l=>l.text).join("");s.push({role:"assistant",content:a||null,tool_calls:n})}else if(i.length>0)for(let a of i)s.push({role:"tool",tool_call_id:a.tool_call_id,content:a.content});else o.length>0&&(r.role==="user"?s.push({role:"user",content:o}):s.push({role:r.role,content:o.map(a=>a.text).join("")}))}return s}mapTools(e){return e.map(t=>({type:"function",function:{name:t.name,description:t.description,parameters:t.inputSchema}}))}mapResponse(e){let t=e.choices[0],s=t?.message,r=s?.content??"",o=s?.tool_calls?.map(n=>({id:n.id,name:n.function.name,input:(()=>{try{return JSON.parse(n.function.arguments)}catch{return{}}})()}));return{content:r,toolCalls:o&&o.length>0?o:void 0,usage:{inputTokens:e.usage?.prompt_tokens??0,outputTokens:e.usage?.completion_tokens??0},stopReason:this.mapStopReason(t?.finish_reason??null)}}mapStopReason(e){switch(e){case"stop":return"end_turn";case"tool_calls":return"tool_use";case"length":return"max_tokens";default:return"end_turn"}}}});var Ts,No=y(()=>{"use strict";et();Ts=class extends ge{static{u(this,"OpenRouterProvider")}constructor(e){super({...e,baseUrl:e.baseUrl??"https://openrouter.ai/api/v1"})}isAvailable(){return!!this.config.apiKey}supportsEmbeddings(){return!1}}});var Es,Mo=y(()=>{"use strict";ft();Es=class extends _e{static{u(this,"OllamaProvider")}baseUrl="";constructor(e){super(e)}apiKey="";async initialize(){let e=this.config.baseUrl??"http://localhost:11434";this.baseUrl=e.replace(/\/v1\/?$/,"").replace(/\/+$/,""),this.apiKey=this.config.apiKey??"";let t=Qe(this.config.model);t?this.contextWindow=t:await this.fetchModelContextWindow()}async fetchModelContextWindow(){try{let e=await fetch(`${this.baseUrl}/api/show`,{method:"POST",headers:this.getHeaders(),body:JSON.stringify({name:this.config.model})});if(!e.ok)return;let s=(await e.json()).model_info??{},r=Object.keys(s).find(n=>n.includes("context_length")||n==="num_ctx"),o=r?Number(s[r]):0;o>0&&(this.contextWindow={maxInputTokens:o,maxOutputTokens:Math.min(o,4096)})}catch{}}getHeaders(){let e={"Content-Type":"application/json"};return this.apiKey&&(e.Authorization=`Bearer ${this.apiKey}`),e}async complete(e){let t=this.buildMessages(e.messages,e.system),s=e.tools?this.mapTools(e.tools):void 0,r={model:this.config.model,messages:t,stream:!1,options:this.buildOptions(e)};s&&s.length>0&&(r.tools=s);let o=await fetch(`${this.baseUrl}/api/chat`,{method:"POST",headers:this.getHeaders(),body:JSON.stringify(r)});if(!o.ok){let i=await o.text();throw new Error(`Ollama API error (${o.status}): ${i}`)}let n=await o.json();return this.mapResponse(n)}async*stream(e){let t=this.buildMessages(e.messages,e.system),s=e.tools?this.mapTools(e.tools):void 0,r={model:this.config.model,messages:t,stream:!0,options:this.buildOptions(e)};s&&s.length>0&&(r.tools=s);let o=await fetch(`${this.baseUrl}/api/chat`,{method:"POST",headers:this.getHeaders(),body:JSON.stringify(r)});if(!o.ok){let w=await o.text();throw new Error(`Ollama API error (${o.status}): ${w}`)}if(!o.body)throw new Error("Ollama streaming response has no body");let n=o.body.getReader(),i=new TextDecoder,a="",l="",d=0,m=0,p=[];try{for(;;){let{done:w,value:T}=await n.read();if(w)break;a+=i.decode(T,{stream:!0});let g=a.split(`
320
320
  `);a=g.pop()??"";for(let b of g){let $=b.trim();if(!$)continue;let A;try{A=JSON.parse($)}catch{continue}if(A.message?.content&&(l+=A.message.content,yield{type:"text_delta",text:A.message.content}),A.message?.tool_calls)for(let R of A.message.tool_calls){let O={id:`ollama_tool_${p.length}`,name:R.function.name,input:R.function.arguments};p.push(O),yield{type:"tool_use_start",toolCall:{id:O.id,name:O.name}},yield{type:"tool_use_delta",toolCall:{input:O.input}}}A.done&&(d=A.prompt_eval_count??0,m=A.eval_count??0,yield{type:"message_complete",response:{content:l,toolCalls:p.length>0?p:void 0,usage:{inputTokens:d,outputTokens:m},stopReason:p.length>0?"tool_use":"end_turn"}})}}if(a.trim()){let w;try{w=JSON.parse(a.trim())}catch{return}if(w.message?.content&&(l+=w.message.content,yield{type:"text_delta",text:w.message.content}),w.message?.tool_calls)for(let T of w.message.tool_calls){let g={id:`ollama_tool_${p.length}`,name:T.function.name,input:T.function.arguments};p.push(g),yield{type:"tool_use_start",toolCall:{id:g.id,name:g.name}},yield{type:"tool_use_delta",toolCall:{input:g.input}}}w.done&&(d=w.prompt_eval_count??0,m=w.eval_count??0,yield{type:"message_complete",response:{content:l,toolCalls:p.length>0?p:void 0,usage:{inputTokens:d,outputTokens:m},stopReason:p.length>0?"tool_use":"end_turn"}})}}finally{n.releaseLock()}}isAvailable(){try{return this.baseUrl.length>0}catch{return!1}}async embed(e){try{let t=await fetch(`${this.baseUrl}/api/embed`,{method:"POST",headers:this.getHeaders(),body:JSON.stringify({model:"nomic-embed-text",input:e})});if(!t.ok)return;let s=await t.json();if(!s.embeddings||s.embeddings.length===0)return;let r=s.embeddings[0];return{embedding:r,model:"nomic-embed-text",dimensions:r.length}}catch{return}}supportsEmbeddings(){return!0}buildOptions(e){let t={},s=e.temperature??this.config.temperature;s!==void 0&&(t.temperature=s);let r=e.maxTokens??this.config.maxTokens;return r!==void 0&&(t.num_predict=r),t}buildMessages(e,t){let s=[];t&&s.push({role:"system",content:t});for(let r of e)typeof r.content=="string"?s.push({role:r.role,content:r.content}):s.push(this.mapContentBlocks(r.role,r.content));return s}mapContentBlocks(e,t){let s=[],r=[];for(let n of t)switch(n.type){case"text":s.push(n.text);break;case"image":r.push(n.source.data);break;case"tool_use":s.push(`[Tool call: ${n.name}(${JSON.stringify(n.input)})]`);break;case"tool_result":s.push(`[Tool result for ${n.tool_use_id}]: ${n.content}`);break}let o={role:e,content:s.join(`
321
- `)};return r.length>0&&(o.images=r),o}mapTools(e){return e.map(t=>({type:"function",function:{name:t.name,description:t.description,parameters:t.inputSchema}}))}mapResponse(e){let t=[];if(e.message.tool_calls)for(let s of e.message.tool_calls)t.push({id:`ollama_tool_${t.length}`,name:s.function.name,input:s.function.arguments});return{content:e.message.content,toolCalls:t.length>0?t:void 0,usage:{inputTokens:e.prompt_eval_count??0,outputTokens:e.eval_count??0},stopReason:t.length>0?"tool_use":"end_turn"}}}});var bs,Do=y(()=>{"use strict";et();bs=class extends ge{static{u(this,"OpenWebUIProvider")}constructor(e){super({...e,apiKey:e.apiKey||"openwebui",baseUrl:e.baseUrl??"http://localhost:3000/api/v1"})}isAvailable(){return!0}supportsEmbeddings(){return!1}}});var _s,Oo=y(()=>{"use strict";et();_s=class extends ge{static{u(this,"GoogleProvider")}constructor(e){super({...e,baseUrl:e.baseUrl??"https://generativelanguage.googleapis.com/v1beta/openai/"})}isAvailable(){return!!this.config.apiKey}supportsEmbeddings(){return!1}}});var $s,Uo=y(()=>{"use strict";et();$s=class extends ge{static{u(this,"MistralProvider")}constructor(e){super({...e,baseUrl:e.baseUrl??"https://api.mistral.ai/v1/"})}isAvailable(){return!!this.config.apiKey}supportsEmbeddings(){return!1}}});function Po(c){switch(c.provider){case"anthropic":return new ws(c);case"openai":return new ge(c);case"openrouter":return new Ts(c);case"ollama":return new Es(c);case"openwebui":return new bs(c);case"google":return new _s(c);case"mistral":return new $s(c);default:throw new Error(`Unknown LLM provider: ${c.provider}`)}}var Fo=y(()=>{"use strict";Lo();et();No();Mo();Do();Oo();Uo();u(Po,"createLLMProvider")});function jo(c){return new gr(c)}var ed,gr,Mi=y(()=>{"use strict";ft();Fo();ed=["default","strong","fast","embeddings","local"],gr=class extends _e{static{u(this,"ModelRouter")}providers=new Map;multiConfig;constructor(e){super(e.default),this.multiConfig=e}async initialize(){for(let e of ed){let t=this.multiConfig[e];if(t){let s=Po(t);await s.initialize(),this.providers.set(e,s)}}}resolve(e){return e&&this.providers.has(e)?this.providers.get(e):this.providers.get("default")}async complete(e){return this.resolve(e.tier).complete(e)}async*stream(e){yield*this.resolve(e.tier).stream(e)}async embed(e){return(this.providers.get("embeddings")??this.resolve()).embed(e)}supportsEmbeddings(){return(this.providers.get("embeddings")??this.resolve()).supportsEmbeddings()}isAvailable(){return this.resolve().isAvailable()}getContextWindow(){return this.resolve().getContextWindow()}};u(jo,"createModelRouter")});function $e(c){return Math.ceil(c.length/3.5)}function Ss(c){if(typeof c.content=="string")return $e(c.content)+4;let e=4;for(let t of c.content)switch(t.type){case"text":e+=$e(t.text);break;case"image":e+=1e3;break;case"tool_use":e+=$e(t.name)+$e(JSON.stringify(t.input));break;case"tool_result":e+=$e(t.content);break}return e}var vs,Di=y(()=>{"use strict";u($e,"estimateTokens");u(Ss,"estimateMessageTokens");vs=class{static{u(this,"PromptBuilder")}buildSystemPrompt(e={}){let{memories:t,skills:s,userProfile:r,todayEvents:o}=e,n=process.platform==="darwin"?"macOS":process.platform==="win32"?"Windows":"Linux",i=process.env.HOME||process.env.USERPROFILE||"~",a=`You are Alfred, a personal AI assistant. You run on ${n} (home: ${i}).
321
+ `)};return r.length>0&&(o.images=r),o}mapTools(e){return e.map(t=>({type:"function",function:{name:t.name,description:t.description,parameters:t.inputSchema}}))}mapResponse(e){let t=[];if(e.message.tool_calls)for(let s of e.message.tool_calls)t.push({id:`ollama_tool_${t.length}`,name:s.function.name,input:s.function.arguments});return{content:e.message.content,toolCalls:t.length>0?t:void 0,usage:{inputTokens:e.prompt_eval_count??0,outputTokens:e.eval_count??0},stopReason:t.length>0?"tool_use":"end_turn"}}}});var bs,Do=y(()=>{"use strict";et();bs=class extends ge{static{u(this,"OpenWebUIProvider")}constructor(e){super({...e,apiKey:e.apiKey||"openwebui",baseUrl:e.baseUrl??"http://localhost:3000/api/v1"})}isAvailable(){return!0}supportsEmbeddings(){return!1}}});var _s,Oo=y(()=>{"use strict";et();_s=class extends ge{static{u(this,"GoogleProvider")}constructor(e){super({...e,baseUrl:e.baseUrl??"https://generativelanguage.googleapis.com/v1beta/openai/"})}isAvailable(){return!!this.config.apiKey}supportsEmbeddings(){return!1}}});var $s,Uo=y(()=>{"use strict";et();$s=class extends ge{static{u(this,"MistralProvider")}constructor(e){super({...e,baseUrl:e.baseUrl??"https://api.mistral.ai/v1/"})}isAvailable(){return!!this.config.apiKey}supportsEmbeddings(){return!1}}});function Po(c){switch(c.provider){case"anthropic":return new ws(c);case"openai":return new ge(c);case"openrouter":return new Ts(c);case"ollama":return new Es(c);case"openwebui":return new bs(c);case"google":return new _s(c);case"mistral":return new $s(c);default:throw new Error(`Unknown LLM provider: ${c.provider}`)}}var Fo=y(()=>{"use strict";Lo();et();No();Mo();Do();Oo();Uo();u(Po,"createLLMProvider")});function jo(c){return new gr(c)}var ed,gr,Mi=y(()=>{"use strict";ft();Fo();ed=["default","strong","fast","embeddings","local"],gr=class extends _e{static{u(this,"ModelRouter")}providers=new Map;multiConfig;constructor(e){super(e.default),this.multiConfig=e}async initialize(){for(let e of ed){let t=this.multiConfig[e];if(t){let s=Po(t);await s.initialize(),this.providers.set(e,s)}}}resolve(e){return e&&this.providers.has(e)?this.providers.get(e):this.providers.get("default")}async complete(e){return this.resolve(e.tier).complete(e)}async*stream(e){yield*this.resolve(e.tier).stream(e)}async embed(e){return(this.providers.get("embeddings")??this.resolve()).embed(e)}supportsEmbeddings(){return(this.providers.get("embeddings")??this.resolve()).supportsEmbeddings()}isAvailable(){return this.resolve().isAvailable()}getContextWindow(){return this.resolve().getContextWindow()}};u(jo,"createModelRouter")});function $e(c){return Math.ceil(c.length/2.5)}function Ss(c){if(typeof c.content=="string")return $e(c.content)+4;let e=4;for(let t of c.content)switch(t.type){case"text":e+=$e(t.text);break;case"image":e+=1e3;break;case"tool_use":e+=$e(t.name)+$e(JSON.stringify(t.input));break;case"tool_result":e+=$e(t.content);break}return e}var vs,Di=y(()=>{"use strict";u($e,"estimateTokens");u(Ss,"estimateMessageTokens");vs=class{static{u(this,"PromptBuilder")}buildSystemPrompt(e={}){let{memories:t,skills:s,userProfile:r,todayEvents:o}=e,n=process.platform==="darwin"?"macOS":process.platform==="win32"?"Windows":"Linux",i=process.env.HOME||process.env.USERPROFILE||"~",a=`You are Alfred, a personal AI assistant. You run on ${n} (home: ${i}).
322
322
 
323
323
  ## Core principles
324
324
  - **When the user's intent is clear**, ACT immediately using your tools. Don't explain what you'll do \u2014 just do it.
@@ -711,7 +711,7 @@ ${e.allModifiedFiles.map(r=>`- ${r}`).join(`
711
711
 
712
712
  **Git:**
713
713
  ${s.join(`
714
- `)}`:"";return{...t,data:{...t.data,git:{branch:r.branch,commit:r.commit,pullRequest:r.pullRequest,warnings:r.warnings}},display:(t.display??"")+o}}}});var rc=y(()=>{"use strict";sc();Dr();Tn();fn();yn()});var ue={};re(ue,{ActivityTracker:()=>st,BackgroundTaskSkill:()=>Mt,BrowserSkill:()=>Ct,CalculatorSkill:()=>yt,CalendarProvider:()=>ve,CalendarSkill:()=>rt,ClipboardSkill:()=>Rt,CodeAgentSkill:()=>qs,CodeExecutionSkill:()=>Ms,CodeExecutor:()=>it,ConfigureSkill:()=>Bt,ContactsProvider:()=>Se,ContactsSkill:()=>Us,CrossPlatformSkill:()=>Nt,DelegateSkill:()=>St,DockerSkill:()=>Nr,DocumentSkill:()=>Ut,EmailProvider:()=>Le,EmailSkill:()=>Ue,FileSkill:()=>At,ForgeClient:()=>ct,HomeAssistantSkill:()=>Ir,HttpSkill:()=>kt,MCPClient:()=>ot,MCPManager:()=>Ns,MCPSkillAdapter:()=>nt,MemorySkill:()=>vt,NoteSkill:()=>bt,PluginLoader:()=>wr,ProfileSkill:()=>Lt,ProxmoxSkill:()=>kr,ReminderSkill:()=>Et,ScheduledTaskSkill:()=>Dt,ScreenshotSkill:()=>xt,ShellSkill:()=>$t,Skill:()=>I,SkillRegistry:()=>ht,SkillSandbox:()=>gt,SystemInfoSkill:()=>wt,TTSSkill:()=>Pt,TodoSkill:()=>Ft,UniFiSkill:()=>Ar,WeatherSkill:()=>_t,WebSearchSkill:()=>Tt,createCalendarProvider:()=>Ls,createContactsProvider:()=>on,createEmailProvider:()=>Rs,createForgeClient:()=>zt,gitAddRemote:()=>js,gitGetRemoteUrl:()=>qt,gitInitRepo:()=>Fs,orchestrate:()=>lt,orchestrateWithGit:()=>Bs,parseRemoteUrl:()=>Ht});var ce=y(()=>{"use strict";j();qi();Hi();Ho();zi();Vi();Wi();Xi();Gi();Ki();Yi();Qi();ea();ta();na();aa();la();da();ma();fa();ha();ba();_a();$a();va();ka();Ia();Ra();xa();Ca();La();Ma();ja();Ba();Wa();Ka();rc()});var Hs,En=y(()=>{"use strict";Hs=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)}}});import oc from"node:fs";import nc from"node:path";var Hd,ic,zd,ac,Vd,Wd,Xd,cc,zs,bn=y(()=>{"use strict";Bo();Hd=15*60*1e3,ic=50,zd=2,ac=.85,Vd=1e5,Wd=2e3,Xd=.1,cc=3,zs=class{static{u(this,"MessagePipeline")}promptBuilder;llm;conversationManager;users;logger;skillRegistry;skillSandbox;securityManager;memoryRepo;speechTranscriber;inboxPath;embeddingService;activeLearning;memoryRetriever;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.promptBuilder=new vs}async process(e,t){let s=Date.now();this.logger.info({platform:e.platform,userId:e.userId,chatId:e.chatId},"Processing message");try{let r=this.users.findOrCreate(e.platform,e.userId,e.userName,e.displayName),o="getMasterUserId"in this.users?this.users.getMasterUserId(r.id):r.id,n;"getLinkedUsers"in this.users&&(n=this.users.getLinkedUsers(o).map(F=>F.platformUserId));let i=this.conversationManager.getOrCreateConversation(e.platform,e.chatId,r.id),a=this.conversationManager.getHistory(i.id,200);this.conversationManager.addMessage(i.id,"user",e.text);let l,d=this.isSyntheticLabel(e.text),m=e.attachments?.some(B=>B.type==="audio")??!1,p=d&&!m;if(this.memoryRetriever&&e.text&&!p)try{l=await this.memoryRetriever.retrieve(o,e.text,15,n)}catch(B){this.logger.debug({err:B},"Hybrid memory retrieval failed")}if(!l&&this.memoryRepo&&!p)try{let B=[o,...(n??[]).filter(F=>F!==o)];if(this.embeddingService&&e.text&&this.llm.supportsEmbeddings()){let F=new Set;l=[];for(let Q of B)for(let X of await this.embeddingService.semanticSearch(Q,e.text,10))F.has(X.key)||(F.add(X.key),l.push(X));for(let Q of B)for(let X of this.memoryRepo.getRecentForPrompt(Q,5))F.has(X.key)||(F.add(X.key),l.push(X))}else{let F=new Set;l=[];for(let Q of B)for(let X of this.memoryRepo.getRecentForPrompt(Q,20))F.has(X.key)||(F.add(X.key),l.push(X))}}catch(B){this.logger.debug({err:B},"Memory loading failed")}l&&l.length>0&&(l=this.applyMemoryBudget(l));let w;try{"getProfile"in this.users&&(w=this.users.getProfile(o),w&&!w.displayName&&(w.displayName=r.displayName??r.username))}catch(B){this.logger.debug({err:B},"Profile loading failed")}let T=w?.timezone||Intl.DateTimeFormat().resolvedOptions().timeZone,g=this.skillRegistry?this.skillRegistry.getAll().map(B=>B.metadata):void 0,b=g?this.promptBuilder.buildTools(g):void 0,$=this.promptBuilder.buildSystemPrompt({memories:l,skills:g,userProfile:w}),A=this.buildActiveAgentStatus();A&&($+=`
714
+ `)}`:"";return{...t,data:{...t.data,git:{branch:r.branch,commit:r.commit,pullRequest:r.pullRequest,warnings:r.warnings}},display:(t.display??"")+o}}}});var rc=y(()=>{"use strict";sc();Dr();Tn();fn();yn()});var ue={};re(ue,{ActivityTracker:()=>st,BackgroundTaskSkill:()=>Mt,BrowserSkill:()=>Ct,CalculatorSkill:()=>yt,CalendarProvider:()=>ve,CalendarSkill:()=>rt,ClipboardSkill:()=>Rt,CodeAgentSkill:()=>qs,CodeExecutionSkill:()=>Ms,CodeExecutor:()=>it,ConfigureSkill:()=>Bt,ContactsProvider:()=>Se,ContactsSkill:()=>Us,CrossPlatformSkill:()=>Nt,DelegateSkill:()=>St,DockerSkill:()=>Nr,DocumentSkill:()=>Ut,EmailProvider:()=>Le,EmailSkill:()=>Ue,FileSkill:()=>At,ForgeClient:()=>ct,HomeAssistantSkill:()=>Ir,HttpSkill:()=>kt,MCPClient:()=>ot,MCPManager:()=>Ns,MCPSkillAdapter:()=>nt,MemorySkill:()=>vt,NoteSkill:()=>bt,PluginLoader:()=>wr,ProfileSkill:()=>Lt,ProxmoxSkill:()=>kr,ReminderSkill:()=>Et,ScheduledTaskSkill:()=>Dt,ScreenshotSkill:()=>xt,ShellSkill:()=>$t,Skill:()=>I,SkillRegistry:()=>ht,SkillSandbox:()=>gt,SystemInfoSkill:()=>wt,TTSSkill:()=>Pt,TodoSkill:()=>Ft,UniFiSkill:()=>Ar,WeatherSkill:()=>_t,WebSearchSkill:()=>Tt,createCalendarProvider:()=>Ls,createContactsProvider:()=>on,createEmailProvider:()=>Rs,createForgeClient:()=>zt,gitAddRemote:()=>js,gitGetRemoteUrl:()=>qt,gitInitRepo:()=>Fs,orchestrate:()=>lt,orchestrateWithGit:()=>Bs,parseRemoteUrl:()=>Ht});var ce=y(()=>{"use strict";j();qi();Hi();Ho();zi();Vi();Wi();Xi();Gi();Ki();Yi();Qi();ea();ta();na();aa();la();da();ma();fa();ha();ba();_a();$a();va();ka();Ia();Ra();xa();Ca();La();Ma();ja();Ba();Wa();Ka();rc()});var Hs,En=y(()=>{"use strict";Hs=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)}}});import oc from"node:fs";import nc from"node:path";var Hd,ic,zd,ac,Vd,Wd,Xd,cc,zs,bn=y(()=>{"use strict";Bo();Hd=15*60*1e3,ic=50,zd=2,ac=.75,Vd=1e5,Wd=2e3,Xd=.1,cc=3,zs=class{static{u(this,"MessagePipeline")}promptBuilder;llm;conversationManager;users;logger;skillRegistry;skillSandbox;securityManager;memoryRepo;speechTranscriber;inboxPath;embeddingService;activeLearning;memoryRetriever;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.promptBuilder=new vs}async process(e,t){let s=Date.now();this.logger.info({platform:e.platform,userId:e.userId,chatId:e.chatId},"Processing message");try{let r=this.users.findOrCreate(e.platform,e.userId,e.userName,e.displayName),o="getMasterUserId"in this.users?this.users.getMasterUserId(r.id):r.id,n;"getLinkedUsers"in this.users&&(n=this.users.getLinkedUsers(o).map(F=>F.platformUserId));let i=this.conversationManager.getOrCreateConversation(e.platform,e.chatId,r.id),a=this.conversationManager.getHistory(i.id,200);this.conversationManager.addMessage(i.id,"user",e.text);let l,d=this.isSyntheticLabel(e.text),m=e.attachments?.some(B=>B.type==="audio")??!1,p=d&&!m;if(this.memoryRetriever&&e.text&&!p)try{l=await this.memoryRetriever.retrieve(o,e.text,15,n)}catch(B){this.logger.debug({err:B},"Hybrid memory retrieval failed")}if(!l&&this.memoryRepo&&!p)try{let B=[o,...(n??[]).filter(F=>F!==o)];if(this.embeddingService&&e.text&&this.llm.supportsEmbeddings()){let F=new Set;l=[];for(let Q of B)for(let X of await this.embeddingService.semanticSearch(Q,e.text,10))F.has(X.key)||(F.add(X.key),l.push(X));for(let Q of B)for(let X of this.memoryRepo.getRecentForPrompt(Q,5))F.has(X.key)||(F.add(X.key),l.push(X))}else{let F=new Set;l=[];for(let Q of B)for(let X of this.memoryRepo.getRecentForPrompt(Q,20))F.has(X.key)||(F.add(X.key),l.push(X))}}catch(B){this.logger.debug({err:B},"Memory loading failed")}l&&l.length>0&&(l=this.applyMemoryBudget(l));let w;try{"getProfile"in this.users&&(w=this.users.getProfile(o),w&&!w.displayName&&(w.displayName=r.displayName??r.username))}catch(B){this.logger.debug({err:B},"Profile loading failed")}let T=w?.timezone||Intl.DateTimeFormat().resolvedOptions().timeZone,g=this.skillRegistry?this.skillRegistry.getAll().map(B=>B.metadata):void 0,b=g?this.promptBuilder.buildTools(g):void 0,$=this.promptBuilder.buildSystemPrompt({memories:l,skills:g,userProfile:w}),A=this.buildActiveAgentStatus();A&&($+=`
715
715
 
716
716
  `+A);let R=this.promptBuilder.buildMessages(a),O=this.collapseRepeatedToolErrors(R),N=await this.buildUserContent(e,t);O.push({role:"user",content:N});let K=b?$e(JSON.stringify(b)):0,ie=this.trimToContextWindow($,O,K),V,we=0,xe=Date.now(),Y="",J=0,de=[];for(t?.("Thinking...");we>0&&this.compressToolLoop(ie,$,K),V=await this.llm.complete({messages:ie,system:$,tools:b&&b.length>0?b:void 0}),!(!V.toolCalls||V.toolCalls.length===0);){let B=Date.now()-xe;if(B>=Hd){let Ae=Math.round(B/6e4);this.logger.warn({iteration:we,elapsedMin:Ae,pendingToolCalls:V.toolCalls.length},"Tool loop timeout reached"),V=await this.abortToolLoop(ie,V,i.id,$,`Das Zeitlimit von ${Ae} Minuten f\xFCr Tool-Aufrufe wurde erreicht.`);break}if(we>=ic){this.logger.warn({iteration:we,pendingToolCalls:V.toolCalls.length},"Tool loop iteration cap reached"),V=await this.abortToolLoop(ie,V,i.id,$,`Das Iterationslimit von ${ic} Tool-Aufrufen wurde erreicht.`);break}we++,this.logger.info({iteration:we,toolCalls:V.toolCalls.length},"Processing tool calls");let F=[];V.content&&F.push({type:"text",text:V.content});for(let Ae of V.toolCalls)F.push({type:"tool_use",id:Ae.id,name:Ae.name,input:Ae.input});ie.push({role:"assistant",content:F});let Q=await this.executeToolCallsParallel(V.toolCalls,{userId:e.userId,masterUserId:o,linkedPlatformUserIds:n,chatId:e.chatId,chatType:e.chatType,platform:e.platform,conversationId:i.id,timezone:T},t),X=Q.blocks;Q.attachments.length>0&&de.push(...Q.attachments),this.conversationManager.addMessage(i.id,"assistant",V.content??"",JSON.stringify(V.toolCalls)),this.conversationManager.addMessage(i.id,"user","",JSON.stringify(X));let He=this.buildErrorSignature(X);if(He){if(He===Y?J++:(J=1,Y=He),J>=zd){this.logger.warn({iteration:we,consecutiveErrors:J,errorSignature:He},"Tool loop aborted: same error repeated consecutively"),V=await this.abortToolLoop(ie,V,i.id,$,`Der gleiche Tool-Fehler ist ${J}x hintereinander aufgetreten: "${Y.slice(0,200)}". Erkl\xE4re dem User kurz was nicht funktioniert hat und schlage eine Alternative vor.`,!0);break}}else J=0,Y="";ie.push({role:"user",content:X}),t?.("Thinking...")}let L=V.content;if(!L)for(let B=ie.length-1;B>=0;B--){let F=ie[B];if(F.role==="assistant"&&Array.isArray(F.content)){let Q=F.content.find(X=>X.type==="text");if(Q&&"text"in Q&&Q.text){L=Q.text;break}}}L||(L="(no response)"),this.conversationManager.addMessage(i.id,"assistant",L),this.activeLearning&&this.activeLearning.onMessageProcessed(o,e.text,L);let W=Date.now()-s;return this.logger.info({duration:W,tokens:V.usage,stopReason:V.stopReason,toolIterations:we},"Message processed"),{text:L,attachments:de.length>0?de: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+=`
717
717
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@madh-io/alfred-ai",
3
- "version": "0.9.58",
3
+ "version": "0.9.60",
4
4
  "description": "Alfred — Personal AI Assistant across Telegram, Discord, WhatsApp, Matrix & Signal",
5
5
  "type": "module",
6
6
  "bin": {