agentix-cli 0.2.0

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.
@@ -0,0 +1,106 @@
1
+ import{a as le}from"./chunk-6PVFYFUE.js";import{D as j,E as I,F as W,h as Re,l as ie,p as Me,q as Ie,r as Oe,t as ae,x as _,y as De}from"./chunk-NZ6W33BD.js";import{a as Ce,c as re,d as Pe}from"./chunk-FRFR27IN.js";import{a as Te,b as M,c as ce}from"./chunk-SFQUP3BP.js";import{a as y,m as z}from"./chunk-FUYKPFUV.js";import{execa as gt}from"execa";import{existsSync as Ee,promises as de}from"fs";import P from"path";import Ne from"node-fetch";async function us(i,e){let t=i.split("/");if(t.length<2)throw new Error(`Invalid skill package ID: ${i}. Expected format: owner/repo`);let s=t[0],n=t[1],o=t[2];try{let r=o?`${s}/${n}/${o}`:`${s}/${n}`;await gt("npx",["-y","skills","add",r],{cwd:e,stdio:"pipe"}),y.success(`Installed skill package: ${i}`);let a=P.resolve(e,".skills",`${s}_${n}`);if(Ee(a))return await je(a,i);let c=P.resolve(e,".skills");return Ee(c)?await je(c,i):[]}catch{return y.info(`Fetching skills directly from GitHub: ${s}/${n}`),await pt(s,n,o,e)}}async function pt(i,e,t,s){let n=[];try{let o=`https://api.github.com/repos/${i}/${e}/git/trees/main?recursive=1`,r=await Ne(o);if(!r.ok)throw new Error(`GitHub API error: ${r.status}`);let c=(await r.json()).tree.filter(l=>l.type==="blob"&&l.path.endsWith("SKILL.md"));if(t){let l=c.find(d=>d.path.includes(`/${t}/`)||d.path===`${t}/SKILL.md`);if(l){let d=await _e(i,e,l.path,s);d&&n.push(d)}}else for(let l of c){let d=await _e(i,e,l.path,s);d&&n.push(d)}}catch(o){y.error(`Failed to fetch skills from GitHub: ${o.message}`)}return n}async function _e(i,e,t,s){try{let n=`https://raw.githubusercontent.com/${i}/${e}/main/${t}`,o=await Ne(n);if(!o.ok)return null;let r=await o.text(),a=re(r);if(a){a.source="remote",a.packageId=`${i}/${e}`;let c=P.dirname(t),l=P.resolve(s,".skills",`${i}_${e}`,c);await de.mkdir(l,{recursive:!0}),await de.writeFile(P.resolve(l,"SKILL.md"),r),a.path=P.resolve(l,"SKILL.md")}return a}catch{return null}}async function je(i,e){let t=[],{default:s}=await import("fast-glob"),n=await s.glob("**/SKILL.md",{cwd:i,deep:5});for(let o of n)try{let r=P.resolve(i,o),a=await de.readFile(r,"utf8"),c=re(a);c&&(c.source="remote",c.path=r,c.packageId=e,t.push(c))}catch{}return t}async function ms(i,e,t,s,n){let o=["---",`name: ${i}`,`description: ${e}`];if(s?.length){o.push("tags:");for(let r of s)o.push(` - ${r}`)}if(n?.length){o.push("globs:");for(let r of n)o.push(` - ${r}`)}return o.push("---"),`${o.join(`
2
+ `)}
3
+
4
+ ${t}`}async function fs(i){let{loadLocalSkills:e}=await import("./loader-PHU6STSZ.js");return e(i)}async function ks(i,e,t,s,n){let r=[{role:"system",content:`You are a skill author for the Agent Skills ecosystem (skills.sh).
5
+ You create high-quality SKILL.md files that provide reusable instructions for AI coding agents.
6
+
7
+ A skill is a markdown document with YAML frontmatter that teaches an agent how to perform a specific task.
8
+ Skills should be:
9
+ - Clear and actionable
10
+ - Tech-stack aware (use the right patterns for the project)
11
+ - Complete but concise
12
+ - Include examples where helpful
13
+ - Follow the Agent Skills specification
14
+
15
+ The project's tech stack:
16
+ ${M(s)}
17
+
18
+ Output ONLY the SKILL.md content (frontmatter + markdown instructions). Do not wrap in code fences.`},{role:"user",content:`Create a skill called "${e}" with this description: "${t}"${n?.tags?.length?`
19
+ Tags: ${n.tags.join(", ")}`:""}${n?.outputType?`
20
+ Primary output type: ${n.outputType}`:""}
21
+
22
+ The skill should contain detailed instructions for an AI agent to follow when performing this task in a project with the above tech stack. Include:
23
+ 1. Step-by-step instructions
24
+ 2. Code patterns and conventions to follow
25
+ 3. Common pitfalls to avoid
26
+ 4. Examples where helpful`}],c=(await i.generate(r,{temperature:.7,maxTokens:4096})).content.trim(),l={frontmatter:{name:e,description:t},instructions:c,source:"generated"},d=c.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);return d&&(l.instructions=d[2].trim()),{skill:l,content:c}}import{existsSync as ht,promises as Le}from"fs";import ge from"path";var ut={enabled:!0,autoSkills:!0,minFrequency:3,provider:"claude-code"},N=class{constructor(e,t,s){this.cwd=e;this.memory=t;this.config={...ut,...s}}config;async enhance(){if(!this.config.enabled)return{skillsCreated:[],skillsUpdated:[],insights:[]};let e={skillsCreated:[],skillsUpdated:[],insights:[]};if(this.config.autoSkills){let n=await this.createSkillsFromPatterns();e.skillsCreated.push(...n)}let t=this.analyzeFailures();e.insights.push(...t);let s=this.analyzePreferences();return e.insights.push(...s),e}async createSkillsFromPatterns(){let t=this.memory.getPatterns().filter(o=>o.frequency>=this.config.minFrequency);if(!t.length)return[];let s=[],n=ge.resolve(this.cwd,".skills","_auto");for(let o of t.slice(0,3)){let r=mt(o),a=ge.resolve(n,r,"SKILL.md");if(!ht(a))try{let c=await this.generateSkillFromPattern(o);c&&(await Le.mkdir(ge.dirname(a),{recursive:!0}),await Le.writeFile(a,c,"utf8"),s.push(r))}catch{}}return s}async generateSkillFromPattern(e){let t=this.memory.getRecentGenerations(20).filter(a=>a.success&&a.userFeedback!=="negative").slice(0,3);if(!t.length)return null;let s=z(this.config.provider,this.config.apiKey),n=await Te(this.cwd),o=[{role:"system",content:`You are a skill author. Create a SKILL.md file that captures a successful pattern.
27
+ Tech stack: ${M(n)}
28
+ Output ONLY the SKILL.md content with YAML frontmatter. No code fences.`},{role:"user",content:`Create a skill from this recurring pattern:
29
+
30
+ Pattern: ${e.description}
31
+ Frequency: used ${e.frequency} times
32
+ Tech stack: ${e.techStack.join(", ")||"general"}
33
+
34
+ Successful examples:
35
+ ${t.map(a=>`- "${a.task}" \u2192 ${a.files.join(", ")}`).join(`
36
+ `)}
37
+
38
+ Create a concise, reusable skill that captures what worked.`}];return(await s.generate(o,{maxTokens:2048,temperature:.7})).content.trim()||null}analyzeFailures(){let e=[],t=this.memory.getFailedGenerations(20);if(t.length<2)return e;let s=new Map;for(let o of t){let r=(o.error||"unknown").split(`
39
+ `)[0].slice(0,80),a=s.get(r)||[];a.push(o),s.set(r,a)}for(let[o,r]of s)r.length>=2&&e.push(`Recurring error (${r.length}x): "${o}" \u2014 consider creating a skill to prevent this`);let n=this.memory.getStats();return n.successRate<.7&&n.totalGenerations>5&&e.push(`Success rate is ${(n.successRate*100).toFixed(0)}% \u2014 review recent failures and update skills`),e}analyzePreferences(){let e=[],s=this.memory.getPreferences().filter(n=>n.confidence>.8);return s.length&&e.push(`Strong preferences detected: ${s.map(n=>`${n.key}=${n.value}`).join(", ")}`),e}};function mt(i){return i.description.toLowerCase().replace(/[^a-z0-9\s-]/g,"").replace(/\s+/g,"-").slice(0,40).replace(/-+$/,"")}var L=class{middleware=[];use(e,t){return this.middleware.push({name:e,fn:t}),this}async execute(e){let t={id:e.id,success:!1,files:[],content:"",outputType:e.outputType||"auto",duration:0},s={startTime:Date.now()},n=0,o=async()=>{if(n>=this.middleware.length)return;await this.middleware[n++].fn(e,t,s,o)};try{await o(),t.duration=Date.now()-s.startTime}catch(r){t.success=!1,t.error=r.message,t.duration=Date.now()-s.startTime}return t}getMiddlewareNames(){return this.middleware.map(e=>e.name)}};import{createServer as ft}from"http";var yt={port:3170,host:"0.0.0.0",provider:"claude-code",cwd:process.cwd(),memory:{enabled:!0},heal:{enabled:!0},enhance:{enabled:!0,autoSkills:!0},cors:!0},he=class{config;memory;healEngine;enhanceEngine;pipeline;requestCount=0;log;constructor(e){this.config={...yt,...e},this.memory=new ce(this.config.cwd),this.healEngine=new le(this.config.cwd,{enabled:this.config.heal.enabled,testCommand:this.config.heal.testCommand,buildCommand:this.config.heal.buildCommand,provider:this.config.provider,model:this.config.model,apiKey:this.config.apiKey}),this.enhanceEngine=new N(this.config.cwd,this.memory,{enabled:this.config.enhance.enabled,autoSkills:this.config.enhance.autoSkills,provider:this.config.provider,model:this.config.model,apiKey:this.config.apiKey}),this.pipeline=this.buildPipeline(),this.log=console.error.bind(console,"[agentx]")}buildPipeline(){let e=new L;return e.use("memory",this.memoryMiddleware()),e.use("context",this.contextMiddleware()),e.use("generate",this.generateMiddleware()),e.use("heal",this.healMiddleware()),e.use("record",this.recordMiddleware()),e.use("enhance",this.enhanceMiddleware()),e}async start(){await this.memory.load(),ft(async(t,s)=>{if(this.config.cors&&(s.setHeader("Access-Control-Allow-Origin","*"),s.setHeader("Access-Control-Allow-Methods","GET, POST, OPTIONS"),s.setHeader("Access-Control-Allow-Headers","Content-Type, Authorization"),t.method==="OPTIONS")){s.writeHead(204),s.end();return}await this.handleRequest(t,s)}).listen(this.config.port,this.config.host,()=>{this.log(`
40
+ agentx runtime v0.1.0`),this.log(` Listening on http://${this.config.host}:${this.config.port}`),this.log(` Provider: ${this.config.provider}`),this.log(` Memory: ${this.config.memory.enabled?"enabled":"disabled"}`),this.log(` Auto-heal: ${this.config.heal.enabled?"enabled":"disabled"}`),this.log(` Self-enhance: ${this.config.enhance.enabled?"enabled":"disabled"}`),this.log(` Pipeline: ${this.pipeline.getMiddlewareNames().join(" \u2192 ")}`),this.log(` Working dir: ${this.config.cwd}`),this.log(""),this.log(" Endpoints:"),this.log(" POST /generate \u2014 generate code/content"),this.log(" POST /evolve \u2014 transform existing code"),this.log(" GET /inspect \u2014 project analysis"),this.log(" GET /memory \u2014 view learning history"),this.log(" POST /feedback \u2014 provide feedback on a generation"),this.log(" GET /health \u2014 health check"),this.log(" POST /enhance \u2014 trigger self-enhancement"),this.log("")})}async handleRequest(e,t){let s=new URL(e.url||"/",`http://${e.headers.host||"localhost"}`),n=e.method||"GET",o=s.pathname;this.log(`${n} ${o}`);try{switch(`${n} ${o}`){case"POST /generate":await this.handleGenerate(e,t);break;case"POST /evolve":await this.handleEvolve(e,t);break;case"GET /inspect":await this.handleInspect(t);break;case"GET /memory":await this.handleMemory(t);break;case"POST /feedback":await this.handleFeedback(e,t);break;case"GET /health":this.sendJson(t,200,{status:"ok",uptime:process.uptime(),requests:this.requestCount,stats:this.memory.getStats(),pipeline:this.pipeline.getMiddlewareNames()});break;case"POST /enhance":await this.handleEnhance(t);break;default:this.sendJson(t,404,{error:"Not found",endpoints:["POST /generate","POST /evolve","GET /inspect","GET /memory","POST /feedback","GET /health","POST /enhance"]})}}catch(r){this.log("Error:",r.message),this.sendJson(t,500,{error:r.message})}this.requestCount++}async handleGenerate(e,t){let s=await pe(e);if(!s.task){this.sendJson(t,400,{error:"Missing required field: task"});return}let n={id:`req-${Date.now().toString(36)}`,task:s.task,outputType:s.type||s.outputType||"auto",outputDir:s.outputDir||s.output_dir,provider:s.provider||this.config.provider,model:s.model||this.config.model,apiKey:s.apiKey||s.api_key||this.config.apiKey,cwd:this.config.cwd,overwrite:s.overwrite??!0,metadata:s.metadata},o=await this.pipeline.execute(n);this.sendJson(t,o.success?200:500,o)}async handleEvolve(e,t){let s=await pe(e);if(!s.task||!s.glob){this.sendJson(t,400,{error:"Missing required fields: task, glob"});return}this.sendJson(t,200,{message:'Use the CLI for evolve: agentx evolve "'+s.task+'" --glob "'+s.glob+'"',hint:"The evolve endpoint requires interactive diff review. Use the CLI for full functionality."})}async handleInspect(e){let t=await j(this.config.cwd,"inspect",{context7:{enabled:!1}});this.sendJson(e,200,{techStack:{languages:t.techStack.languages,frameworks:t.techStack.frameworks,packageManager:t.techStack.packageManager,databases:t.techStack.databases,styling:t.techStack.styling,testing:t.techStack.testing,deployment:t.techStack.deployment,monorepo:t.techStack.monorepo},schemas:{database:t.schemas.database?{type:t.schemas.database.type,tables:t.schemas.database.tables}:null,api:t.schemas.api?{type:t.schemas.api.type}:null,env:t.schemas.env,models:t.schemas.models?.map(s=>({path:s.path,type:s.type}))},skills:t.skills.map(s=>({name:s.frontmatter.name,description:s.frontmatter.description,source:s.source,tags:s.frontmatter.tags})),dependencies:Object.keys(t.techStack.dependencies).length,devDependencies:Object.keys(t.techStack.devDependencies).length})}async handleMemory(e){this.sendJson(e,200,{stats:this.memory.getStats(),recent:this.memory.getRecentGenerations(10),patterns:this.memory.getPatterns().slice(0,10),preferences:this.memory.getPreferences()})}async handleFeedback(e,t){let s=await pe(e);if(!s.entryId||!s.feedback){this.sendJson(t,400,{error:"Missing required fields: entryId, feedback (positive/negative/neutral)"});return}await this.memory.recordFeedback(s.entryId,s.feedback),this.sendJson(t,200,{recorded:!0})}async handleEnhance(e){let t=await this.enhanceEngine.enhance();this.sendJson(e,200,t)}memoryMiddleware(){let e=this.memory;return async(t,s,n,o)=>{n.memory=e;let r=e.buildMemoryContext(t.task);r&&(n.memoryContext=r),await o()}}contextMiddleware(){return async(e,t,s,n)=>{s.agentContext=await j(e.cwd,e.task,{provider:e.provider,context7:{enabled:!0}}),await n()}}generateMiddleware(){return async(e,t,s,n)=>{let o=await I({task:s.memoryContext?`${e.task}
41
+
42
+ ${s.memoryContext}`:e.task,outputType:e.outputType,outputDir:e.outputDir,overwrite:e.overwrite??!0,cwd:e.cwd,provider:e.provider||this.config.provider,model:e.model||this.config.model,apiKey:e.apiKey||this.config.apiKey,context7:!0,interactive:!1,maxSteps:5});t.success=o.files.errors.length===0,t.files=o.files.written.map(r=>({path:r})),t.content=o.content,t.outputType=o.outputType,t.tokensUsed=o.tokensUsed,await n()}}healMiddleware(){let e=this.healEngine;return async(t,s,n,o)=>{if(this.config.heal.enabled&&s.files.length>0){let r=await e.detectAndHeal(s.files.map(a=>a.path),t.task,s.memoryEntryId);r.attempts>0&&(s.healed=r.healed,s.healAttempts=r.attempts,r.healed&&(s.success=!0))}await o()}}recordMiddleware(){let e=this.memory;return async(t,s,n,o)=>{if(this.config.memory.enabled){let r=await e.recordGeneration({task:t.task,outputType:s.outputType,files:s.files.map(a=>a.path),success:s.success,error:s.error,context:{techStack:n.agentContext?.techStack.languages.map(a=>a.name),frameworks:n.agentContext?.techStack.frameworks.map(a=>a.name)}});s.memoryEntryId=r,t.outputType&&t.outputType!=="auto"&&await e.learnPreference("preferred-output-type",t.outputType,`generation request: ${t.task.slice(0,50)}`)}await o()}}enhanceMiddleware(){let e=this.enhanceEngine;return async(t,s,n,o)=>{this.config.enhance.enabled&&this.requestCount%10===0&&this.requestCount>0&&e.enhance().then(r=>{if(r.skillsCreated.length&&this.log(`Auto-created ${r.skillsCreated.length} skill(s): ${r.skillsCreated.join(", ")}`),r.insights.length)for(let a of r.insights)this.log(`Insight: ${a}`)}).catch(()=>{}),await o()}}sendJson(e,t,s){e.writeHead(t,{"Content-Type":"application/json"}),e.end(JSON.stringify(s,null,2))}};async function pe(i){return new Promise((e,t)=>{let s="";i.on("data",n=>s+=n),i.on("end",()=>{try{e(s?JSON.parse(s):{})}catch{e({})}}),i.on("error",t)})}var wt={name:"agentx",version:"0.1.0"},kt="2024-11-05",vt={tools:{}},St=[{name:"agentx_generate",description:"Generate code, components, pages, APIs, documents, tests, workflows, schemas, emails, diagrams, and more using AI. Understands the project's tech stack, schemas, and skills automatically.",inputSchema:{type:"object",properties:{task:{type:"string",description:"Describe what to generate (e.g., 'a responsive pricing card', 'REST API for users', 'GitHub Actions CI pipeline')"},type:{type:"string",description:"Output type: component, page, api, website, document, script, config, skill, media, report, test, workflow, schema, email, diagram, auto",default:"auto"},output_dir:{type:"string",description:"Optional output directory (relative to project root)"},cwd:{type:"string",description:"Project working directory (defaults to current directory)"}},required:["task"]}},{name:"agentx_inspect",description:"Analyze a project and return its tech stack, frameworks, databases, schemas, installed skills, and dependencies. Use this to understand a project before generating code.",inputSchema:{type:"object",properties:{cwd:{type:"string",description:"Project working directory (defaults to current directory)"}}}},{name:"agentx_skill_match",description:"Find installed skills that are relevant to a given task description. Returns matched skills with relevance scores.",inputSchema:{type:"object",properties:{task:{type:"string",description:"The task to match skills against"},cwd:{type:"string",description:"Project working directory"}},required:["task"]}},{name:"agentx_detect_output_type",description:"Auto-detect the best output type for a given task description based on keyword analysis.",inputSchema:{type:"object",properties:{task:{type:"string",description:"The task description to analyze"}},required:["task"]}}];async function xt(i,e){let t=e.cwd||process.cwd();switch(i){case"agentx_generate":{let s=e.task,n=e.type||"auto",o=e.output_dir,r=await I({task:s,outputType:n,outputDir:o,cwd:t,overwrite:!0,dryRun:!1,context7:!0,interactive:!1,maxSteps:5}),a=[];return r.content&&a.push(r.content),r.files.written.length&&a.push(`
43
+ Created ${r.files.written.length} file(s):
44
+ ${r.files.written.map(c=>` - ${c}`).join(`
45
+ `)}`),r.files.skipped.length&&a.push(`
46
+ Skipped ${r.files.skipped.length} existing file(s):
47
+ ${r.files.skipped.map(c=>` - ${c}`).join(`
48
+ `)}`),r.followUp&&a.push(`
49
+ Needs clarification: ${r.followUp}`),{content:[{type:"text",text:a.join(`
50
+ `)||"Generation complete."}]}}case"agentx_inspect":{let s=await j(t,"inspect",{context7:{enabled:!1}}),n={languages:s.techStack.languages,frameworks:s.techStack.frameworks,packageManager:s.techStack.packageManager,databases:s.techStack.databases,styling:s.techStack.styling,testing:s.techStack.testing,deployment:s.techStack.deployment,monorepo:s.techStack.monorepo,srcDir:s.techStack.srcDir,dependencyCount:Object.keys(s.techStack.dependencies).length,devDependencyCount:Object.keys(s.techStack.devDependencies).length,schemas:{database:s.schemas.database?{type:s.schemas.database.type,tables:s.schemas.database.tables}:null,api:s.schemas.api?{type:s.schemas.api.type}:null,env:s.schemas.env?{variableCount:s.schemas.env.variables.length}:null,models:s.schemas.models?.map(o=>o.path)||[]},skills:s.skills.map(o=>({name:o.frontmatter.name,description:o.frontmatter.description,source:o.source}))};return{content:[{type:"text",text:`Project analysis:
51
+
52
+ ${M(s.techStack)}
53
+
54
+ ${JSON.stringify(n,null,2)}`}]}}case"agentx_skill_match":{let s=e.task,n=await Ce(t),o=Pe(n,s);return o.length?{content:[{type:"text",text:`Matching skills:
55
+
56
+ ${o.map(a=>`- **${a.skill.frontmatter.name}** (relevance: ${(a.relevance*100).toFixed(0)}%)
57
+ ${a.skill.frontmatter.description}
58
+ Match: ${a.matchReason}`).join(`
59
+
60
+ `)}`}]}:{content:[{type:"text",text:"No matching skills found. Install skills with: agentx skill install <owner/repo>"}]}}case"agentx_detect_output_type":{let s=e.task;return{content:[{type:"text",text:`Detected output type: ${Re(void 0,s)}`}]}}default:throw new Error(`Unknown tool: ${i}`)}}async function zs(){let i=(...t)=>console.error("[agentx-mcp]",...t);i("Starting MCP server (stdio transport)...");let e="";process.stdin.setEncoding("utf8"),process.stdin.on("data",t=>{for(e+=t;;){let s=e.indexOf(`\r
61
+ \r
62
+ `);if(s===-1)break;let o=e.slice(0,s).match(/Content-Length:\s*(\d+)/);if(!o){let d=e.indexOf(`
63
+ `);if(d===-1)break;let p=e.slice(0,d).trim();if(e=e.slice(d+1),p)try{let f=JSON.parse(p);Ge(f,i).catch(k=>i("Error:",k))}catch{}continue}let r=parseInt(o[1],10),a=s+4,c=a+r;if(e.length<c)break;let l=e.slice(a,c);e=e.slice(c);try{let d=JSON.parse(l);Ge(d,i).catch(p=>i("Error:",p))}catch(d){i("Failed to parse message:",d)}}}),process.stdin.on("end",()=>{i("stdin closed, shutting down."),process.exit(0)})}function O(i){let e=JSON.stringify(i),t=`Content-Length: ${Buffer.byteLength(e)}\r
64
+ \r
65
+ `;process.stdout.write(t+e)}async function Ge(i,e){let{method:t,id:s,params:n}=i;switch(e(`Received: ${t}`),t){case"initialize":{O({jsonrpc:"2.0",id:s,result:{protocolVersion:kt,capabilities:vt,serverInfo:wt}});break}case"notifications/initialized":{e("Client initialized.");break}case"tools/list":{O({jsonrpc:"2.0",id:s,result:{tools:St}});break}case"tools/call":{let o=n?.name,r=n?.arguments||{};try{let a=await xt(o,r);O({jsonrpc:"2.0",id:s,result:a})}catch(a){O({jsonrpc:"2.0",id:s,result:{content:[{type:"text",text:`Error: ${a.message}`}],isError:!0}})}break}case"ping":{O({jsonrpc:"2.0",id:s,result:{}});break}default:s!==void 0&&O({jsonrpc:"2.0",id:s,error:{code:-32601,message:`Method not found: ${t}`}})}}import{execa as x}from"execa";var R=class{constructor(e){this.cwd=e}async isRepo(){try{return await x("git",["rev-parse","--is-inside-work-tree"],{cwd:this.cwd,reject:!1}),!0}catch{return!1}}async status(){let t=(await x("git",["status","--porcelain","-b"],{cwd:this.cwd,reject:!1})).stdout.trim().split(`
66
+ `).filter(Boolean),s="unknown",n=[],o=[],r=[],a=[];for(let c of t){if(c.startsWith("## ")){s=c.slice(3).split("...")[0];continue}let l=c[0],d=c[1],p=c.slice(3).trim();(l==="A"||l==="M"||l==="R")&&n.push(p),l==="D"&&(a.push(p),n.push(p)),d==="M"&&o.push(p),d==="D"&&a.push(p),l==="?"&&d==="?"&&r.push(p)}return{staged:n,modified:o,untracked:r,deleted:[...new Set(a)],branch:s,isClean:n.length===0&&o.length===0&&r.length===0}}async diff(e=!1){return(await x("git",e?["diff","--cached"]:["diff"],{cwd:this.cwd,reject:!1})).stdout}async diffStat(e=!1){let s=await x("git",e?["diff","--cached","--numstat"]:["diff","--numstat"],{cwd:this.cwd,reject:!1}),n=[];for(let o of s.stdout.trim().split(`
67
+ `).filter(Boolean)){let[r,a,c]=o.split(" ");if(!c)continue;let l="modified";r==="-"&&a==="-"&&(l="renamed"),n.push({path:c,status:l,additions:parseInt(r)||0,deletions:parseInt(a)||0})}return n}async log(e=10){let t=await x("git",["log",`--max-count=${e}`,"--format=%H|%h|%s|%an|%ai"],{cwd:this.cwd,reject:!1});return t.stdout.trim()?t.stdout.trim().split(`
68
+ `).filter(Boolean).map(s=>{let[n,o,r,a,c]=s.split("|");return{hash:n,shortHash:o,message:r,author:a,date:c}}):[]}async add(e){e.length&&await x("git",["add",...e],{cwd:this.cwd})}async addAll(){await x("git",["add","-A"],{cwd:this.cwd})}async commit(e){let t=await x("git",["commit","-m",e],{cwd:this.cwd,reject:!1});if(t.exitCode!==0)throw new Error(t.stderr||t.stdout||"Git commit failed");let n=t.stdout.match(/\[[\w/.-]+\s+(\w+)\]/)?.[1]||"unknown",o=t.stdout.match(/(\d+)\s+files?\s+changed/),r=parseInt(o?.[1]||"0");return{hash:n,message:e,filesChanged:r}}async currentBranch(){return(await x("git",["branch","--show-current"],{cwd:this.cwd,reject:!1})).stdout.trim()}async createBranch(e){await x("git",["checkout","-b",e],{cwd:this.cwd})}async checkout(e){await x("git",["checkout",e],{cwd:this.cwd})}async stash(e){let t=["stash","push"];e&&t.push("-m",e),await x("git",t,{cwd:this.cwd})}async stashPop(){await x("git",["stash","pop"],{cwd:this.cwd})}async generateCommitMessage(e){let t=await this.diff(!0);if(!t.trim())throw new Error("No staged changes to commit");return e?(await e.generate([{role:"system",content:`You are a git commit message generator. Generate a conventional commit message (type(scope): subject) from the given diff.
69
+ Rules:
70
+ - Use conventional commit format: feat|fix|refactor|docs|test|chore|style(scope): message
71
+ - Keep the subject line under 72 characters
72
+ - Be specific about what changed
73
+ - Output ONLY the commit message, nothing else`},{role:"user",content:`Generate a commit message for this diff:
74
+
75
+ ${t.slice(0,4e3)}`}])).content.trim().split(`
76
+ `)[0]:this.fallbackCommitMessage(t)}fallbackCommitMessage(e){let t=e.split(`
77
+ `),s=[];for(let n of t)if(n.startsWith("diff --git")){let o=n.match(/b\/(.+)$/);o&&s.push(o[1])}return s.length===0?"chore: update files":s.length===1?`chore: update ${s[0]}`:`chore: update ${s.length} files`}};import{existsSync as Je,mkdirSync as bt,readFileSync as ue,readdirSync as Fe,writeFileSync as $t}from"fs";import G from"path";import At from"os";var T=G.join(At.homedir(),".agentx","sessions");function me(){Je(T)||bt(T,{recursive:!0})}function J(i){return{id:Tt(),createdAt:new Date().toISOString(),updatedAt:new Date().toISOString(),cwd:i,messages:[],tokensUsed:0,filesGenerated:[]}}function F(i){me();let e=G.join(T,`${i.id}.json`);i.updatedAt=new Date().toISOString(),$t(e,JSON.stringify(i,null,2),"utf8")}function D(i){let e=G.join(T,`${i}.json`);if(!Je(e))return null;try{return JSON.parse(ue(e,"utf8"))}catch{return null}}function fe(){me();let i=Fe(T).filter(t=>t.endsWith(".json")).map(t=>({name:t,path:G.join(T,t)}));if(!i.length)return null;let e=null;for(let t of i)try{let s=JSON.parse(ue(t.path,"utf8"));(!e||s.updatedAt>e.session.updatedAt)&&(e={name:t.name,session:s})}catch{}return e?.session??null}function ye(){me();let i=Fe(T).filter(t=>t.endsWith(".json")),e=[];for(let t of i)try{let s=JSON.parse(ue(G.join(T,t),"utf8"));e.push(s)}catch{}return e.sort((t,s)=>s.updatedAt.localeCompare(t.updatedAt)),e}function Tt(){return Math.random().toString(36).slice(2,10)+Date.now().toString(36).slice(-4)}import u from"chalk";import{writeFileSync as Ct}from"fs";import Pt from"path";import h from"chalk";function Ue(i,e){console.log(),console.log(h.bold.cyan(" agentx")+h.dim(` v${i}`)),console.log(h.dim(` Session: ${e}`)),console.log(h.dim(" Type /help for commands, /quit to exit")),console.log()}function He(i){if(i.written.length){console.log(),console.log(h.green(` Created ${i.written.length} file(s):`));for(let e of i.written)console.log(` ${h.green("+")} ${e}`)}if(i.skipped.length){console.log(),console.log(h.yellow(` Skipped ${i.skipped.length} file(s):`));for(let e of i.skipped)console.log(` ${h.yellow("~")} ${e}`)}if(i.errors.length){console.log(),console.log(h.red(` Failed ${i.errors.length} file(s):`));for(let e of i.errors)console.log(` ${h.red("x")} ${e}`)}}function U(i){let e=i/1e6*9;console.log(),console.log(h.dim(` Tokens: ${i.toLocaleString()} | Est. cost: $${e.toFixed(4)}`))}function Be(i){process.stdout.write(i)}function Ke(){console.log(),console.log(h.bold(" Commands:")),console.log(),console.log(` ${h.cyan("/help")} Show this help`),console.log(` ${h.cyan("/clear")} Clear conversation history`),console.log(` ${h.cyan("/save")} Save current session`),console.log(` ${h.cyan("/load")} Load a saved session`),console.log(` ${h.cyan("/undo")} Undo last generation`),console.log(` ${h.cyan("/cost")} Show token usage and cost breakdown`),console.log(` ${h.cyan("/export")} Export session as markdown`),console.log(` ${h.cyan("/files")} List generated files`),console.log(` ${h.cyan("/context")} Show session context info`),console.log(` ${h.cyan("/memory")} Show memory stats and preferences`),console.log(` ${h.cyan("/mode")} Switch permission mode`),console.log(` ${h.cyan("/commit")} Commit generated files with AI message`),console.log(` ${h.cyan("/diff")} Show git diff`),console.log(` ${h.cyan("/status")} Show git status`),console.log(` ${h.cyan("/quit")} Exit the REPL`),console.log()}function ze(i){if(console.log(),console.log(h.dim(` Branch: ${i.branch}`)),i.isClean){console.log(h.green(" Working tree clean"));return}i.staged.length&&console.log(h.green(` Staged: ${i.staged.length}`)),i.modified.length&&console.log(h.yellow(` Modified: ${i.modified.length}`)),i.untracked.length&&console.log(h.dim(` Untracked: ${i.untracked.length}`)),console.log()}function We(i){if(console.log(),console.log(h.bold(" Cost Breakdown")),console.log(),console.log(h.dim(` Total: ${i.totalTokens.toLocaleString()} tokens ($${i.totalCost.toFixed(4)})`)),console.log(h.dim(` Input: ${i.totalInputTokens.toLocaleString()} | Output: ${i.totalOutputTokens.toLocaleString()}`)),Object.keys(i.models).length){console.log(),console.log(h.dim(" Per model:"));for(let[e,t]of Object.entries(i.models))console.log(` ${h.cyan(e)}: ${(t.inputTokens+t.outputTokens).toLocaleString()} tokens, $${t.cost.toFixed(4)} (${t.steps} step${t.steps!==1?"s":""})`)}if(i.steps.length>1){console.log(),console.log(h.dim(" Per step:"));for(let e of i.steps)console.log(` Step ${e.step}: ${(e.inputTokens+e.outputTokens).toLocaleString()} tokens ($${e.cost.toFixed(4)})`)}console.log()}function Ve(i){console.log(),console.log(h.bold(" Plan Preview")),console.log(h.dim(" No files will be written in plan mode.")),console.log();for(let e of i){let t=e.action==="create"?h.green("+"):h.yellow("~");console.log(` ${t} ${e.path} (${e.action})`)}console.log()}import Rt from"prompts";var qe={};function S(i,e){qe[i]=e}function we(i){return qe[i]}function ke(i){return i.startsWith("/")}function ve(i){let e=i.trim(),t=e.indexOf(" ");return t===-1?{name:e.slice(1),args:""}:{name:e.slice(1,t),args:e.slice(t+1).trim()}}S("help",async()=>(Ke(),!0));S("quit",async()=>!1);S("exit",async()=>!1);S("q",async()=>!1);S("clear",async(i,e)=>(e.session.messages=[],console.log(u.dim(" Conversation cleared")),!0));S("save",async(i,e)=>(F(e.session),console.log(u.dim(` Session saved: ${e.session.id}`)),!0));S("load",async(i,e)=>{let t=null;if(i){if(t=D(i),!t)return y.warn(`Session not found: ${i}`),!0}else{let s=ye();if(!s.length)return y.info("No saved sessions"),!0;let{sessionId:n}=await Rt({type:"select",name:"sessionId",message:"Select a session",choices:s.slice(0,10).map(o=>({title:`${o.id} \u2014 ${new Date(o.updatedAt).toLocaleDateString()} (${o.messages.length} messages)`,value:o.id}))});if(!n)return!0;t=D(n)}return t&&(e.onSessionChange(t),console.log(u.dim(` Loaded session: ${t.id} (${t.messages.length} messages)`))),!0});S("undo",async(i,e)=>{let t=e.session.messages;return t.length<2?(y.info("Nothing to undo"),!0):(t[t.length-1]?.role==="assistant"&&t.pop(),t[t.length-1]?.role==="user"&&t.pop(),console.log(u.dim(" Undid last exchange")),!0)});S("cost",async(i,e)=>{let t=ie.getSummary();return t.steps.length>0?We(t):U(e.session.tokensUsed),!0});S("export",async(i,e)=>{let t=ie.getSummary(),s=Me(e.session,t.steps.length?t:void 0),n=i||`session-${e.session.id}.md`,o=Pt.resolve(e.cwd,n);return Ct(o,s,"utf8"),y.success(` Session exported to ${o}`),!0});S("files",async(i,e)=>{let t=e.session.filesGenerated;if(!t.length)return y.info("No files generated in this session"),!0;console.log(),console.log(u.dim(` Files generated (${t.length}):`));for(let s of t)console.log(` ${u.green("+")} ${s}`);return console.log(),!0});S("context",async(i,e)=>(console.log(),console.log(u.dim(` Session: ${e.session.id}`)),console.log(u.dim(` CWD: ${e.session.cwd}`)),console.log(u.dim(` Messages: ${e.session.messages.length}`)),console.log(u.dim(` Tokens: ${e.session.tokensUsed.toLocaleString()}`)),console.log(u.dim(` Files: ${e.session.filesGenerated.length}`)),console.log(u.dim(` Created: ${new Date(e.session.createdAt).toLocaleString()}`)),console.log(),!0));S("memory",async(i,e)=>{try{let t=new De(e.cwd);await t.load();let s=t.getStats(),n=t.getPreferences(),o=t.getPatterns(),r=t.getRecentGenerations(5);if(console.log(),console.log(u.bold(" Memory")),console.log(),console.log(u.dim(" Project:")),console.log(u.dim(` Generations: ${s.project.totalGenerations}`)),console.log(u.dim(` Success rate: ${(s.project.successRate*100).toFixed(0)}%`)),console.log(u.dim(` Heals: ${s.project.totalHeals}`)),console.log(),console.log(u.dim(" Global:")),console.log(u.dim(` Generations: ${s.user.totalGenerations}`)),console.log(u.dim(` Success rate: ${(s.user.successRate*100).toFixed(0)}%`)),n.length){console.log(),console.log(u.dim(" Preferences:"));for(let a of n.slice(0,10))console.log(u.dim(` ${a.key}: ${a.value} (${(a.confidence*100).toFixed(0)}%)`))}if(o.length){console.log(),console.log(u.dim(" Patterns:"));for(let a of o.slice(0,5))console.log(u.dim(` ${a.description} (${a.frequency}x)`))}if(r.length){console.log(),console.log(u.dim(" Recent:"));for(let a of r){let c=a.success?u.green("ok"):u.red("fail");console.log(u.dim(` [${c}] ${a.task.slice(0,60)}`))}}console.log()}catch(t){y.error(` ${t.message}`)}return!0});S("mode",async(i,e)=>{if(i&&ae.includes(i))_.setMode(i),y.success(` Permission mode: ${i}`);else if(i)y.warn(` Unknown mode: ${i}. Valid modes: ${ae.join(", ")}`);else{let t=_.getMode();console.log(),console.log(u.dim(` Current mode: ${u.bold(t)}`)),console.log(),console.log(u.dim(" Available modes:")),console.log(u.dim(" default \u2014 confirm each file write")),console.log(u.dim(" acceptEdits \u2014 auto-allow writes, confirm destructive ops")),console.log(u.dim(" plan \u2014 show plan without writing")),console.log(u.dim(" yolo \u2014 auto-allow everything")),console.log(),console.log(u.dim(" Usage: /mode <mode>")),console.log()}return!0});S("commit",async(i,e)=>{try{let t=new R(e.cwd);if(!await t.isRepo())return y.warn("Not a git repository"),!0;let s=e.session.filesGenerated.filter(a=>a);if(s.length&&(await t.add(s),console.log(u.dim(` Staged ${s.length} generated file(s)`))),(await t.status()).staged.length===0)return y.warn("Nothing staged to commit"),!0;let o;try{let a=z();o=await t.generateCommitMessage(a)}catch{o=await t.generateCommitMessage()}console.log(u.dim(` Message: ${o}`));let r=await t.commit(o);y.success(` [${r.hash}] ${r.message}`)}catch(t){y.error(` ${t.message}`)}return!0});S("diff",async(i,e)=>{try{let s=await new R(e.cwd).diff();s.trim()?console.log(s):y.info("No changes")}catch(t){y.error(` ${t.message}`)}return!0});S("status",async(i,e)=>{try{let t=new R(e.cwd);if(!await t.isRepo())return y.warn("Not a git repository"),!0;let s=await t.status();ze(s)}catch(t){y.error(` ${t.message}`)}return!0});import{createInterface as Mt}from"readline";import C from"chalk";import It from"ora";var Se=class{rl=null;session;options;running=!1;constructor(e){if(this.options=e,e.sessionId){let t=D(e.sessionId);t?this.session=t:(y.warn(`Session ${e.sessionId} not found, starting new session`),this.session=J(e.cwd))}else if(e.resume){let t=fe();t?(this.session=t,y.info(`Resumed session: ${t.id}`)):(y.info("No previous session found, starting new session"),this.session=J(e.cwd))}else this.session=J(e.cwd)}async start(){this.running=!0,Ue(this.options.version,this.session.id),this.session.messages.length>0&&(console.log(C.dim(` Resumed with ${this.session.messages.length} messages, ${this.session.tokensUsed.toLocaleString()} tokens`)),console.log()),this.rl=Mt({input:process.stdin,output:process.stdout,prompt:C.cyan("agentx > "),terminal:!0}),this.rl.prompt(),this.rl.on("line",async e=>{let t=e.trim();if(!t){this.rl?.prompt();return}try{if(ke(t)){if(!await this.handleCommand(t)){this.stop();return}}else await this.handleGeneration(t)}catch(s){y.error(` Error: ${s.message}`)}this.running&&this.rl?.prompt()}),this.rl.on("close",()=>{this.stop()}),this.rl.on("SIGINT",()=>{console.log(),this.stop()})}stop(){this.running=!1,F(this.session),console.log(),console.log(C.dim(` Session saved: ${this.session.id}`)),U(this.session.tokensUsed),console.log(),this.rl?.close(),process.exit(0)}async handleCommand(e){let{name:t,args:s}=ve(e),n=we(t);if(!n)return y.warn(` Unknown command: /${t}. Type /help for available commands.`),!0;let o={session:this.session,cwd:this.options.cwd,onSessionChange:r=>{this.session=r}};return n(s,o)}async handleGeneration(e){let t=It({text:"Thinking...",color:"cyan"}).start();try{let s=this.session.messages.filter(a=>a.role!=="system").map(a=>({role:a.role,content:a.content})),n={task:e,cwd:this.options.cwd,provider:this.options.provider||"claude-code",model:this.options.model,apiKey:this.options.apiKey,overwrite:!0,dryRun:!1,interactive:!1,context7:!0,sessionMessages:s},o,r=!1;for await(let a of W(n)){if(a.type==="context_ready"){t.stop(),console.log(),r=!0;continue}if(a.type==="text_delta"){Be(a.text);continue}if(a.type==="done"){console.log();continue}if(a.type==="error")throw new Error(a.error);if(a.type==="step_complete"){a.step>1&&console.log(C.dim(` Step ${a.step}: ${a.filesCount} file(s)`));continue}a.type==="generate_result"&&(o=a.result)}if(r||t.stop(),!o)return;(o.files.written.length||o.files.skipped.length||o.files.errors.length)&&(_.getMode()==="plan"?Ve(o.files.written.map(a=>({path:a,action:"create"}))):He(o.files)),o.tokensUsed&&U(o.tokensUsed),this.session.messages.push({role:"user",content:e}),this.session.messages.push({role:"assistant",content:o.content||""}),this.session.tokensUsed+=o.tokensUsed||0,this.session.filesGenerated.push(...o.files.written),o.followUp&&(console.log(),console.log(C.yellow(` ${o.followUp}`))),o.healResult&&(console.log(),o.healResult.healed?console.log(C.green(` Heal: passed verification${o.healResult.attempts>0?` (fixed in ${o.healResult.attempts} attempt(s))`:""}`)):o.healResult.error&&(console.log(C.red(` Heal: verification failed after ${o.healResult.attempts} attempt(s)`)),console.log(C.dim(` ${o.healResult.error.split(`
78
+ `)[0]}`))))}catch(s){throw t.stop(),s}}};import{createServer as Ot}from"http";var $={TASK_NOT_FOUND:{code:-32001,message:"Task not found"},TASK_NOT_CANCELABLE:{code:-32002,message:"Task cannot be canceled"},INVALID_PARAMS:{code:-32602,message:"Invalid params"},INTERNAL_ERROR:{code:-32603,message:"Internal error"},METHOD_NOT_FOUND:{code:-32601,message:"Method not found"},PARSE_ERROR:{code:-32700,message:"Parse error"}};var Dt={port:3171,host:"0.0.0.0",provider:"claude-code",cwd:process.cwd(),cors:!0},xe=class{config;tasks=new Map;activeCancellations=new Set;log;constructor(e){this.config={...Dt,...e},this.log=console.error.bind(console,"[a2a]")}async start(){Ot(async(t,s)=>{if(this.config.cors&&(s.setHeader("Access-Control-Allow-Origin","*"),s.setHeader("Access-Control-Allow-Methods","GET, POST, OPTIONS"),s.setHeader("Access-Control-Allow-Headers","Content-Type, Authorization"),t.method==="OPTIONS")){s.writeHead(204),s.end();return}await this.handleRequest(t,s)}).listen(this.config.port,this.config.host,()=>{this.log(`
79
+ agentx A2A server v0.1.0`),this.log(` Listening on http://${this.config.host}:${this.config.port}`),this.log(` Provider: ${this.config.provider}`),this.log(` Working dir: ${this.config.cwd}`),this.log(""),this.log(" Discovery:"),this.log(" GET /.well-known/agent-card.json"),this.log(""),this.log(" JSON-RPC 2.0 methods:"),this.log(" tasks/send \u2014 synchronous task execution"),this.log(" tasks/sendSubscribe \u2014 streaming task execution (SSE)"),this.log(" tasks/get \u2014 retrieve task state"),this.log(" tasks/cancel \u2014 cancel running task"),this.log("")})}getAgentCard(){return{name:"agentx",description:"AI-powered agentic code generation agent. Generates components, pages, APIs, documents, skills, and more for any tech stack.",url:`http://${this.config.host}:${this.config.port}`,version:"0.1.0",capabilities:{streaming:!0,pushNotifications:!1,stateTransitionHistory:!0},skills:[{id:"generate",name:"Code Generation",description:"Generate code files from natural language descriptions. Supports components, pages, APIs, tests, schemas, and more.",tags:["code-generation","ai","multi-framework"],examples:["Create a React login form with email and password validation","Generate a REST API for user management with CRUD operations","Build a dashboard page with charts and data tables"]},{id:"evolve",name:"Code Transformation",description:"Transform existing code files based on natural language instructions. Applies targeted edits with diff preview.",tags:["code-transformation","refactoring","ai"],examples:["Add dark mode support to this component","Refactor this API to use async/await instead of callbacks"]},{id:"inspect",name:"Project Analysis",description:"Analyze a project's tech stack, schemas, dependencies, and structure.",tags:["analysis","project-inspection"],examples:["What tech stack does this project use?","List all API schemas in the project"]}],defaultInputModes:["text"],defaultOutputModes:["text","file"]}}async handleRequest(e,t){let s=new URL(e.url||"/",`http://${e.headers.host||"localhost"}`),n=e.method||"GET",o=s.pathname;this.log(`${n} ${o}`);try{if(n==="GET"&&o==="/.well-known/agent-card.json"){this.sendJson(t,200,this.getAgentCard());return}if(n==="POST"&&o==="/"){let r=await Et(e);await this.handleJsonRpc(r,t);return}this.sendJson(t,404,{error:"Not found",hint:"Use GET /.well-known/agent-card.json for discovery or POST / for JSON-RPC"})}catch(r){this.log("Error:",r.message),this.sendJson(t,500,{error:r.message})}}async handleJsonRpc(e,t){if(e.jsonrpc!=="2.0"||!e.method||!e.id){this.sendJsonRpc(t,{jsonrpc:"2.0",id:e.id||0,error:$.PARSE_ERROR});return}let s=e,n=s.params||{};switch(s.method){case"tasks/send":await this.handleTaskSend(s.id,n,t);break;case"tasks/sendSubscribe":await this.handleTaskSendSubscribe(s.id,n,t);break;case"tasks/get":this.handleTaskGet(s.id,n,t);break;case"tasks/cancel":this.handleTaskCancel(s.id,n,t);break;default:this.sendJsonRpc(t,{jsonrpc:"2.0",id:s.id,error:$.METHOD_NOT_FOUND})}}async handleTaskSend(e,t,s){let n=String(t.id||`task-${Date.now().toString(36)}`),o=t.message;if(!o?.parts?.length){this.sendJsonRpc(s,{jsonrpc:"2.0",id:e,error:{...$.INVALID_PARAMS,data:"message with parts is required"}});return}let a=o.parts.filter(l=>l.type==="text").map(l=>l.text).join(`
80
+ `);if(!a){this.sendJsonRpc(s,{jsonrpc:"2.0",id:e,error:{...$.INVALID_PARAMS,data:"No text content in message parts"}});return}let c={id:n,state:"submitted",messages:[{role:"user",parts:o.parts}],artifacts:[],metadata:t.metadata,createdAt:new Date().toISOString(),updatedAt:new Date().toISOString()};this.tasks.set(n,c),c.state="working",c.updatedAt=new Date().toISOString();try{let l=await I({task:a,cwd:this.config.cwd,provider:this.config.provider,model:this.config.model,apiKey:this.config.apiKey,overwrite:!0,interactive:!1,context7:!0}),d=l.files.written.map((f,k)=>({name:f,description:"Generated file",parts:[{type:"text",text:f}],index:k})),p={role:"agent",parts:[{type:"text",text:l.content||"Generation complete."}]};l.followUp?(c.state="input-required",p.parts.push({type:"text",text:`
81
+
82
+ Question: ${l.followUp}`})):c.state="completed",c.messages.push(p),c.artifacts=d,c.updatedAt=new Date().toISOString()}catch(l){c.state="failed",c.messages.push({role:"agent",parts:[{type:"text",text:`Error: ${l.message}`}]}),c.updatedAt=new Date().toISOString()}this.sendJsonRpc(s,{jsonrpc:"2.0",id:e,result:c})}async handleTaskSendSubscribe(e,t,s){let n=String(t.id||`task-${Date.now().toString(36)}`),o=t.message;if(!o?.parts?.length){this.sendJsonRpc(s,{jsonrpc:"2.0",id:e,error:{...$.INVALID_PARAMS,data:"message with parts is required"}});return}let a=o.parts.filter(d=>d.type==="text").map(d=>d.text).join(`
83
+ `);if(!a){this.sendJsonRpc(s,{jsonrpc:"2.0",id:e,error:{...$.INVALID_PARAMS,data:"No text content in message parts"}});return}s.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"});let c={id:n,state:"submitted",messages:[{role:"user",parts:o.parts}],artifacts:[],metadata:t.metadata,createdAt:new Date().toISOString(),updatedAt:new Date().toISOString()};this.tasks.set(n,c);let l=d=>{s.write(`data: ${JSON.stringify(d)}
84
+
85
+ `)};l({id:n,state:"submitted",final:!1}),c.state="working",c.updatedAt=new Date().toISOString(),l({id:n,state:"working",final:!1});try{let d="",p=[];for await(let f of W({task:a,cwd:this.config.cwd,provider:this.config.provider,model:this.config.model,apiKey:this.config.apiKey,overwrite:!0,interactive:!1,context7:!0})){if(this.activeCancellations.has(n)){this.activeCancellations.delete(n),c.state="canceled",c.updatedAt=new Date().toISOString(),l({id:n,state:"canceled",final:!0}),s.end();return}if(f.type==="text_delta"&&(d+=f.text,l({id:n,state:"working",message:{role:"agent",parts:[{type:"text",text:f.text}]},final:!1})),f.type==="generate_result"){let k=f.result,v=k.files.written.map((w,m)=>({name:w,parts:[{type:"text",text:w}],index:m}));p.push(...v);for(let w of v)l({id:n,state:"working",artifact:w,final:!1});k.followUp?c.state="input-required":c.state="completed"}}c.messages.push({role:"agent",parts:[{type:"text",text:d||"Generation complete."}]}),c.artifacts=p,c.updatedAt=new Date().toISOString(),l({id:n,state:c.state,final:!0})}catch(d){c.state="failed",c.messages.push({role:"agent",parts:[{type:"text",text:`Error: ${d.message}`}]}),c.updatedAt=new Date().toISOString(),l({id:n,state:"failed",message:{role:"agent",parts:[{type:"text",text:`Error: ${d.message}`}]},final:!0})}s.end()}handleTaskGet(e,t,s){let n=String(t.id||""),o=this.tasks.get(n);if(!o){this.sendJsonRpc(s,{jsonrpc:"2.0",id:e,error:$.TASK_NOT_FOUND});return}this.sendJsonRpc(s,{jsonrpc:"2.0",id:e,result:o})}handleTaskCancel(e,t,s){let n=String(t.id||""),o=this.tasks.get(n);if(!o){this.sendJsonRpc(s,{jsonrpc:"2.0",id:e,error:$.TASK_NOT_FOUND});return}if(o.state!=="working"&&o.state!=="submitted"){this.sendJsonRpc(s,{jsonrpc:"2.0",id:e,error:$.TASK_NOT_CANCELABLE});return}this.activeCancellations.add(n),o.state="canceled",o.updatedAt=new Date().toISOString(),this.sendJsonRpc(s,{jsonrpc:"2.0",id:e,result:o})}sendJson(e,t,s){e.writeHead(t,{"Content-Type":"application/json"}),e.end(JSON.stringify(s,null,2))}sendJsonRpc(e,t){e.headersSent||e.writeHead(200,{"Content-Type":"application/json"}),e.end(JSON.stringify(t))}};async function Et(i){return new Promise((e,t)=>{let s="";i.on("data",n=>s+=n),i.on("end",()=>{try{e(s?JSON.parse(s):{})}catch{e({})}}),i.on("error",t)})}var H=class{baseUrl;token;constructor(e,t){this.baseUrl=e.replace(/\/$/,""),this.token=t}async getAgentCard(){let e=await fetch(`${this.baseUrl}/.well-known/agent-card.json`,{headers:this.headers()});if(!e.ok)throw new Error(`Failed to fetch agent card: ${e.status}`);return e.json()}async sendTask(e,t){let s=await this.rpc("tasks/send",{id:`task-${Date.now().toString(36)}`,message:{role:"user",parts:[{type:"text",text:e}]},metadata:t});if(s.error)throw new Error(`A2A error: ${s.error.message}`);return s.result}async*sendTaskStream(e,t){let s=JSON.stringify({jsonrpc:"2.0",id:1,method:"tasks/sendSubscribe",params:{id:`task-${Date.now().toString(36)}`,message:{role:"user",parts:[{type:"text",text:e}]},metadata:t}}),n=await fetch(this.baseUrl,{method:"POST",headers:{...this.headers(),"Content-Type":"application/json",Accept:"text/event-stream"},body:s});if(!n.ok||!n.body)throw new Error(`A2A stream error: ${n.status}`);let o=n.body.getReader(),r=new TextDecoder,a="";for(;;){let{done:c,value:l}=await o.read();if(c)break;a+=r.decode(l,{stream:!0});let d=a.split(`
86
+ `);a=d.pop()||"";for(let p of d)if(p.startsWith("data: "))try{let f=JSON.parse(p.slice(6));yield{state:f.state,message:f.message?.parts?.[0]?.text,final:f.final}}catch{}}}async getTask(e){let t=await this.rpc("tasks/get",{id:e});if(t.error)throw new Error(`A2A error: ${t.error.message}`);return t.result}async cancelTask(e){let t=await this.rpc("tasks/cancel",{id:e});if(t.error)throw new Error(`A2A error: ${t.error.message}`);return t.result}async rpc(e,t){let s=await fetch(this.baseUrl,{method:"POST",headers:{...this.headers(),"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:Date.now(),method:e,params:t})});if(!s.ok)throw new Error(`A2A HTTP error: ${s.status}`);return s.json()}headers(){let e={};return this.token&&(e.Authorization=`Bearer ${this.token}`),e}};var B=class{peers=new Map;healthTimer;config;log;constructor(e,t=console.error.bind(console,"[mesh]")){this.config=e,this.log=t;for(let s of e.mesh.peers)this.peers.set(s.name,{peer:s,client:new H(s.url,s.token),healthy:!1,agents:[]})}async start(){this.log(`Mesh starting with ${this.peers.size} peer(s)`),await this.discoverAll();let e=this.config.mesh.healthCheck.interval*1e3;this.healthTimer=setInterval(()=>this.discoverAll(),e)}async stop(){this.healthTimer&&clearInterval(this.healthTimer)}async discoverAll(){let e=await Promise.allSettled(Array.from(this.peers.entries()).map(([s,n])=>this.discoverPeer(s,n))),t=Array.from(this.peers.values()).filter(s=>s.healthy).length;this.log(`Discovery complete: ${t}/${this.peers.size} peers healthy`)}async discoverPeer(e,t){let s=this.config.mesh.healthCheck.timeout*1e3;try{let n=new AbortController,o=setTimeout(()=>n.abort(),s),r=await t.client.getAgentCard();clearTimeout(o),t.healthy=!0,t.lastCheck=new Date,t.agentCard=r,t.agents=r.skills||[],this.log(`Peer "${e}" healthy: ${r.name} (${t.agents.length} skills)`)}catch(n){t.healthy=!1,t.lastCheck=new Date,this.log(`Peer "${e}" unreachable: ${n.message}`)}}async sendTask(e,t,s){let n=this.peers.get(e);if(!n)throw new Error(`Unknown peer: ${e}`);if(!n.healthy)throw new Error(`Peer "${e}" is not healthy`);let o=s||n.agents[0]?.id;if(!o)throw new Error(`Peer "${e}" has no agents`);let r=`${n.peer.url}/task`,a={"Content-Type":"application/json"};n.peer.token&&(a.Authorization=`Bearer ${n.peer.token}`);let c=await fetch(r,{method:"POST",headers:a,body:JSON.stringify({agent:o,message:t})});if(!c.ok)throw new Error(`Peer "${e}" /task error: ${c.status}`);let l=await c.json();if(l.error)throw new Error(`Peer "${e}" agent error: ${l.error}`);return l.content||"No response"}findPeerWithSkill(e){for(let t of this.peers.values())if(t.healthy&&t.agents.some(s=>s.id===e))return t}directory(){return Array.from(this.peers.entries()).map(([e,t])=>({peer:e,peerUrl:t.peer.url,healthy:t.healthy,skills:t.agents,lastCheck:t.lastCheck}))}};import{z as g}from"zod";import{readFileSync as Ye,existsSync as V}from"fs";import{resolve as q}from"path";function _t(i){let e=q(i,".env");if(!V(e))return;let t=Ye(e,"utf-8");for(let s of t.split(`
87
+ `)){let n=s.trim();if(!n||n.startsWith("#"))continue;let o=n.indexOf("=");if(o===-1)continue;let r=n.slice(0,o).trim(),a=n.slice(o+1).trim();process.env[r]||(process.env[r]=a)}}var jt=g.object({apiKey:g.string().optional(),defaultModel:g.string().optional(),baseUrl:g.string().optional()}),Nt=g.object({name:g.string(),workspace:g.string(),tier:g.enum(["claude-code","sdk","orchestrator"]).default("claude-code"),provider:g.string().optional(),model:g.string().optional(),systemPrompt:g.string().optional(),mentions:g.array(g.string()).default([]),maxConcurrent:g.number().default(1),permissionMode:g.string().default("default")}),Lt=g.object({token:g.string(),agentBinding:g.string()}),Gt=g.object({telegram:g.object({enabled:g.boolean().default(!1),accounts:g.record(g.string(),Lt).default({}),policy:g.object({dm:g.enum(["pair","block"]).default("pair"),group:g.enum(["mention-required","all"]).default("mention-required")}).default({})}).default({}),whatsapp:g.object({enabled:g.boolean().default(!1),sessionDir:g.string().default(".agentx/whatsapp-sessions"),agentBinding:g.string().optional()}).default({})}),Jt=g.object({enabled:g.boolean().default(!0),schedule:g.string(),timezone:g.string().default("UTC"),agent:g.string(),prompt:g.string(),timeout:g.number().default(600),model:g.string().optional(),onError:g.enum(["log","notify","disable"]).default("log")}),Ft=g.object({url:g.string(),name:g.string(),token:g.string().optional()}),Ut=g.object({enabled:g.boolean().default(!1),peers:g.array(Ft).default([]),discovery:g.enum(["static","mdns"]).default("static"),healthCheck:g.object({interval:g.number().default(60),timeout:g.number().default(10)}).default({})}),Ht=g.object({node:g.object({id:g.string(),name:g.string(),bind:g.string().default("127.0.0.1:18800")}),providers:g.record(g.string(),jt).default({}),agents:g.record(g.string(),Nt).default({}),channels:Gt.default({}),crons:g.record(g.string(),Jt).default({}),mesh:Ut.default({})});function be(i){if(typeof i=="string")return i.replace(/\$\{(\w+)\}/g,(e,t)=>process.env[t]||"");if(Array.isArray(i))return i.map(be);if(i!==null&&typeof i=="object"){let e={};for(let[t,s]of Object.entries(i))e[t]=be(s);return e}return i}function Xe(i){let e=i?[i]:[q(process.cwd(),"agentx.json"),q(process.cwd(),".agentx/config.json")];_t(process.cwd());let t,s;for(let a of e)if(V(a)){t=Ye(a,"utf-8"),s=a;break}if(!t||!s)throw new Error(`No config found. Create agentx.json or .agentx/config.json
88
+ Searched: ${e.join(", ")}`);let n;try{n=JSON.parse(t)}catch(a){throw new Error(`Invalid JSON in ${s}: ${a.message}`)}let o=be(n),r=Ht.safeParse(o);if(!r.success){let a=r.error.issues.map(c=>` ${c.path.join(".")}: ${c.message}`).join(`
89
+ `);throw new Error(`Config validation failed (${s}):
90
+ ${a}`)}return r.data}function Ze(i){let e=[];for(let[t,s]of Object.entries(i.agents)){if(!V(s.workspace)){e.push(`Agent "${t}": workspace not found at ${s.workspace}`);continue}if(s.tier==="claude-code"){let r=q(s.workspace,".claude");V(r)||e.push(`Agent "${t}": no .claude/ directory in workspace ${s.workspace}. Claude Code native features (hooks, MCP, skills) won't be available.`)}let n=s.provider||"claude",o=i.providers[n];s.tier!=="claude-code"&&(!o||!o.apiKey)&&e.push(`Agent "${t}": provider "${n}" has no API key configured. Set providers.${n}.apiKey in config or use tier "claude-code" for subscription.`)}for(let[t,s]of Object.entries(i.crons))i.agents[s.agent]||e.push(`Cron "${t}": references unknown agent "${s.agent}"`);if(i.channels.telegram.enabled)for(let[t,s]of Object.entries(i.channels.telegram.accounts))i.agents[s.agentBinding]||e.push(`Telegram account "${t}": references unknown agent "${s.agentBinding}"`);return e}import{execa as Bt}from"execa";import{execFile as Kt}from"child_process";function Qe(i,e,t){let s=[];if(i.systemPrompt&&s.push(i.systemPrompt),e.context){let n=e.context,o=["","[Environment]"];if(n.channel&&o.push(`Channel: ${n.channel}`),n.group&&o.push(`Group: ${n.group}`),n.sender&&o.push(`Message from: ${n.sender}`),n.myHandle&&o.push(`Your handle on this channel: ${n.myHandle}`),n.peers?.length){o.push(""),o.push("[Team \u2014 other agents you can mention to delegate or collaborate]");for(let r of n.peers){let a=r.handle?` (mention: ${r.handle})`:"",c=r.role?` \u2014 ${r.role}`:"";o.push(`\u2022 ${r.name}${a}${c}`)}o.push(""),o.push("To involve another agent, mention their handle in your response and they will automatically see it and reply.")}s.push(o.join(`
91
+ `))}return t&&(s.push(""),s.push(t)),s.push(""),s.push(e.message),s.join(`
92
+ `)}function et(i,e,t,s){let n=["-p",e,"--output-format",t?"stream-json":"text"];return s&&n.push("--resume",s),i.model&&n.push("--model",i.model),i.permissionMode==="bypassPermissions"&&n.push("--dangerously-skip-permissions"),n}function zt(i){return(i.match(/session[:\s]+([a-f0-9-]{36})/i)||i.match(/sessionId[:\s]+"?([a-f0-9-]{36})"?/i))?.[1]}async function Wt(i,e,t,s){let n=Date.now(),o=Qe(i,e,s?void 0:t),r=et(i,o,!1,s);try{let{stdout:a,stderr:c}=await new Promise((d,p)=>{Kt("claude",r,{cwd:i.workspace,timeout:6e5,maxBuffer:10485760,env:process.env},(f,k,v)=>{f&&!k?p(f):d({stdout:k||"",stderr:v||""})})}),l=zt(c);return{content:a,duration:Date.now()-n,claudeSessionId:l}}catch(a){return{content:"",error:a.message||"Claude Code failed",duration:Date.now()-n}}}async function Vt(i,e,t,s,n){let o=Date.now(),r=Qe(i,e,n?void 0:s),a=et(i,r,!0,n),c="";try{let l=Bt("claude",a,{cwd:i.workspace,timeout:6e5,reject:!1,env:process.env,buffer:!1});if(l.stdout){let p="";l.stdout.on("data",f=>{p+=f.toString();let k=p.split(`
93
+ `);p=k.pop()||"";for(let v of k)if(v.trim())try{let w=JSON.parse(v);if(w.type==="assistant"&&w.message?.content){for(let m of w.message.content)if(m.type==="text"&&m.text){let b=m.text.slice(c.length);b&&(c=m.text,t(b,c))}}if(w.type==="content_block_delta"&&w.delta?.text&&(c+=w.delta.text,t(w.delta.text,c)),w.type==="result"&&w.result){let m=(typeof w.result=="string",w.result);if(typeof m=="string"&&m.length>c.length){let b=m.slice(c.length);c=m,b&&t(b,c)}}}catch{v.trim()&&!v.startsWith("{")&&(c+=v+`
94
+ `,t(v+`
95
+ `,c))}})}let d=await l;return!c&&d.stdout&&(c=typeof d.stdout=="string"?d.stdout:""),d.exitCode!==0&&!c?{content:"",error:(typeof d.stderr=="string"?d.stderr:"")||`Claude Code exited with code ${d.exitCode}`,duration:Date.now()-o}:{content:c,duration:Date.now()-o}}catch(l){return{content:c||"",error:l.message,duration:Date.now()-o}}}async function qt(i,e,t){let s=Date.now();try{let n=await import("@anthropic-ai/claude-agent-sdk"),{query:o}=n,r=i.systemPrompt?`${i.systemPrompt}
96
+
97
+ ${e.message}`:e.message,a="",c=o({prompt:r,options:{model:i.model,cwd:i.workspace,permissionMode:"bypassPermissions"}});for await(let l of c)l.type==="result"&&l.subtype==="success"&&(a=l.result||"");return{content:a,duration:Date.now()-s}}catch(n){return{content:"",error:`SDK error: ${n.message}`,duration:Date.now()-s}}}async function Yt(i,e,t){let s=Date.now();try{let{generate:n}=await import("./agent-AI6DUEPU.js"),o=i.provider||"claude-code",r=await n({task:e.message,cwd:i.workspace,provider:o,model:i.model,apiKey:t,overwrite:!0,interactive:!1,context7:!1});return{content:r.content||"Done.",tokensUsed:r.tokensUsed,duration:Date.now()-s}}catch(n){return{content:"",error:`Orchestrator error: ${n.message}`,duration:Date.now()-s}}}async function tt(i,e,t,s,n,o){switch(i.tier){case"claude-code":return s?Vt(i,e,s,n,o):Wt(i,e,n,o);case"sdk":{let r=i.provider||"claude",a=t[r]?.apiKey;return a?qt(i,e,a):{content:"",error:`No API key for provider "${r}". Configure providers.${r}.apiKey`}}case"orchestrator":{let r=i.provider||"claude-code",a=t[r]?.apiKey;return Yt(i,e,a)}default:return{content:"",error:`Unknown tier: ${i.tier}`}}}import{readFileSync as Xt,writeFileSync as Zt,mkdirSync as Qt,existsSync as st}from"fs";import{resolve as nt}from"path";var es=12e3,ot=30,Y=class{sessionsDir;cache=new Map;constructor(e=process.cwd()){this.sessionsDir=nt(e,".agentx/sessions"),st(this.sessionsDir)||Qt(this.sessionsDir,{recursive:!0})}sessionKey(e,t,s){let n=new Date().toISOString().slice(0,10);return`${e}:${t}:${s}:${n}`}sessionFile(e){let t=e.replace(/[^a-zA-Z0-9_:-]/g,"_");return nt(this.sessionsDir,`${t}.json`)}getSession(e,t,s){let n=this.sessionKey(e,t,s);if(this.cache.has(n))return this.cache.get(n);let o=this.sessionFile(n);if(st(o))try{let c=JSON.parse(Xt(o,"utf-8"));return this.cache.set(n,c),c}catch{}let r=new Date().toISOString().slice(0,10),a={id:n,agentId:e,channel:t,chatId:s,day:r,messages:[],createdAt:new Date().toISOString(),updatedAt:new Date().toISOString()};return this.cache.set(n,a),this.save(a),a}addUserMessage(e,t,s,n,o){let r=this.getSession(e,t,s);r.messages.push({role:"user",name:n,content:o,timestamp:new Date().toISOString()}),this.trim(r),r.updatedAt=new Date().toISOString(),this.save(r)}addAgentMessage(e,t,s,n){let o=this.getSession(e,t,s);o.messages.push({role:"agent",name:e,content:n,timestamp:new Date().toISOString()}),this.trim(o),o.updatedAt=new Date().toISOString(),this.save(o)}getClaudeSessionId(e,t,s){return this.getSession(e,t,s).claudeSessionId}setClaudeSessionId(e,t,s,n){let o=this.getSession(e,t,s);o.claudeSessionId=n,o.updatedAt=new Date().toISOString(),this.save(o)}buildHistoryContext(e,t,s){let n=this.getSession(e,t,s);if(n.messages.length===0)return"";let o=[`[Conversation history for today (${n.day})]`];for(let r of n.messages){let a=r.timestamp.slice(11,16);r.role==="user"?o.push(`[${a}] ${r.name||"User"}: ${r.content}`):o.push(`[${a}] ${r.name||"Agent"}: ${r.content}`)}return o.push("[End of history \u2014 respond to the latest message above]"),o.push(""),o.join(`
98
+ `)}trim(e){e.messages.length>ot&&(e.messages=e.messages.slice(-ot));let t=e.messages.reduce((s,n)=>s+n.content.length,0);for(;t>es&&e.messages.length>2;){let s=e.messages.shift();t-=s.content.length}}save(e){try{let t=this.sessionFile(e.id);Zt(t,JSON.stringify(e,null,2))}catch{}}};var X=class{agents=new Map;config;providers={};sessions;log;constructor(e,t=console.error.bind(console,"[agents]")){this.log=t,this.config=e,this.providers=e.providers,this.sessions=new Y;for(let[s,n]of Object.entries(e.agents))this.agents.set(s,{id:s,def:n,activeTasks:0,totalTasks:0,errors:0})}getAgent(e){return this.agents.get(e)?.def}findByMention(e){let t=e.toLowerCase(),s,n=0;for(let[o,r]of this.agents)for(let a of r.def.mentions){let c=a.toLowerCase();t.includes(c)&&c.length>n&&(s=o,n=c.length)}return s}findAllMentioned(e){let t=e.toLowerCase(),s=[];for(let[n,o]of this.agents)for(let r of o.def.mentions)if(t.includes(r.toLowerCase())){s.push(n);break}return s}getChannelHandle(e,t){let s=this.agents.get(e)?.def;if(s)return t==="telegram"?s.mentions.find(n=>n.startsWith("@")):s.mentions[0]}enrichTaskContext(e){let t=e.context?.channel,s=[];for(let[o,r]of this.agents)o!==e.agentId&&s.push({id:o,name:r.def.name,handle:this.getChannelHandle(o,t),role:r.def.systemPrompt?.split(`
99
+ `)[0]?.slice(0,100)});let n=this.getChannelHandle(e.agentId,t);return{...e,context:{...e.context,myHandle:n,peers:s}}}async execute(e,t){let s=this.agents.get(e.agentId);if(!s)return{content:"",error:`Unknown agent: ${e.agentId}`};if(s.activeTasks>=s.def.maxConcurrent)return{content:"",error:`Agent "${e.agentId}" is busy (${s.activeTasks}/${s.def.maxConcurrent} tasks)`};s.activeTasks++,s.totalTasks++,s.lastActive=new Date,this.log(`[${e.agentId}] executing task (${s.activeTasks}/${s.def.maxConcurrent})`);let n=e.context?.channel||"api",o=e.context?.group||e.context?.sender||"default",r=e.context?.sender||"User";this.sessions.addUserMessage(e.agentId,n,o,r,e.message),e=this.enrichTaskContext(e);let a=s.def.tier==="claude-code"?this.sessions.getClaudeSessionId(e.agentId,n,o):void 0,c=s.def.tier!=="claude-code"?this.sessions.buildHistoryContext(e.agentId,n,o):void 0;try{let l=await tt(s.def,e,this.providers,t,c,a);return l.error?(s.errors++,this.log(`[${e.agentId}] error: ${l.error}`)):(this.sessions.addAgentMessage(e.agentId,n,o,l.content),l.claudeSessionId&&(this.sessions.setClaudeSessionId(e.agentId,n,o,l.claudeSessionId),this.log(`[${e.agentId}] session: ${l.claudeSessionId}`)),this.log(`[${e.agentId}] completed in ${l.duration}ms`+(l.tokensUsed?` (${l.tokensUsed} tokens)`:""))),l}catch(l){return s.errors++,this.log(`[${e.agentId}] unexpected error: ${l.message}`),{content:"",error:l.message}}finally{s.activeTasks--}}list(){return Array.from(this.agents.values()).map(e=>({id:e.id,name:e.def.name,tier:e.def.tier,workspace:e.def.workspace,active:e.activeTasks,total:e.totalTasks,errors:e.errors,lastActive:e.lastActive}))}};var Z=class{registry;config;channels=new Map;hooks;log;constructor(e,t,s,n=console.error.bind(console,"[router]")){this.registry=e,this.config=t,this.hooks=s,this.log=n}addChannel(e){this.channels.set(e.name,e),e.onMessage(t=>this.handleMessage(e,t))}async startAll(){for(let[e,t]of this.channels)this.log(`Starting channel: ${e}`),await t.start()}async stopAll(){for(let[e,t]of this.channels)this.log(`Stopping channel: ${e}`),await t.stop()}async handleMessage(e,t){if(this.hooks?.has("pre:channel-message")){let m=await this.hooks.execute("pre:channel-message",{event:"pre:channel-message",channel:t.channel,sender:t.sender.name,text:t.text,group:t.group?.name});if(m.blocked){this.log(`Message blocked by hook: ${m.message}`);return}m.modified?.text&&(t={...t,text:m.modified.text})}let s=this.resolveAgent(t);if(!s)return;if(t.group&&t.channel==="telegram"){let m=this.getAccountForAgent(s);if(m&&m!==t.accountId)return}let n=t.group?.id||t.sender.id,r=this.registry.getAgent(s)?.name||s,a=this.getAccountForAgent(s)||t.accountId;this.log(`Routing [${t.channel}/${t.sender.name}] -> "${r}": ${t.text.slice(0,80)}`),this.adapterReact(e,n,t.id,"\u{1F440}",a);let c=this.startTypingLoop(e,n,a),l=typeof e.editMessage=="function",d,p=0,f=l?async(m,b)=>{let E=Date.now();if(!(E-p<1500))if(d)try{await this.adapterEdit(e,n,d,b,void 0,a),p=E}catch{}else{let oe=b.length>20?b:`_${r} is writing..._
100
+
101
+ ${b}`;try{d=await this.adapterSend(e,{channel:t.channel,chatId:n,text:oe,replyTo:t.id,accountId:a}),p=E}catch{}}}:void 0,k=await this.registry.execute({message:t.text,agentId:s,context:{channel:t.channel,sender:t.sender.name,group:t.group?.name}},f);if(clearInterval(c),k.error){this.log(`Agent error: ${k.error}`);let m=`Error: ${k.error}`;d?await this.adapterEdit(e,n,d,m,"plain",a):await this.adapterSend(e,{channel:t.channel,chatId:n,text:m,replyTo:t.id,parseMode:"plain",accountId:a});return}let v=k.content;if(this.hooks?.has("post:channel-message")){let m=await this.hooks.execute("post:channel-message",{event:"post:channel-message",channel:t.channel,sender:t.sender.name,response:v,agentId:s});if(m.blocked){this.log(`Response blocked by hook: ${m.message}`);return}m.modified?.response&&(v=m.modified.response)}let w;v&&(d?(await this.adapterEdit(e,n,d,v,void 0,a),w=d):w=await this.adapterSend(e,{channel:t.channel,chatId:n,text:v,replyTo:t.id,accountId:a})),v&&w&&this.handleBotToBotMentions(e,t,s,v,w).catch(m=>{this.log(`Bot-to-bot error: ${m.message}`)})}async handleBotToBotMentions(e,t,s,n,o){for(let[r,a]of Object.entries(this.config.agents)){if(r===s||!a.mentions.some(p=>n.toLowerCase().includes(p.toLowerCase())))continue;this.log(`Bot-to-bot: "${s}" mentioned "${r}" \u2014 routing`);let l=t.group?.id||t.sender.id,d=this.getAccountForAgent(r);try{this.adapterReact(e,l,o,"\u{1F440}",d);let p=this.startTypingLoop(e,l,d),f=await this.registry.execute({message:n,agentId:r,context:{channel:t.channel,sender:`agent:${s}`,group:t.group?.name}});clearInterval(p),f.content&&!f.error?await this.adapterSend(e,{channel:t.channel,chatId:l,text:f.content,accountId:d}):f.error&&this.log(`Bot-to-bot "${r}" error: ${f.error}`)}catch(p){this.log(`Bot-to-bot "${r}" failed: ${p.message}`)}break}}async adapterSend(e,t){return e.name==="telegram"&&t.accountId?e.send({...t,parseMode:t.parseMode,accountId:t.accountId}):e.send(t)||""}async adapterEdit(e,t,s,n,o,r){return e.name==="telegram"&&r?e.editMessage(t,s,n,o,r):e.editMessage?.(t,s,n,o)??!1}adapterReact(e,t,s,n,o){e.name==="telegram"&&o?e.react(t,s,n,o):e.react?.(t,s,n)}startTypingLoop(e,t,s){let n=()=>{e.name==="telegram"&&s?e.sendTyping(t,s):e.sendTyping?.(t)};return n(),setInterval(n,4e3)}getAccountForAgent(e){for(let[t,s]of Object.entries(this.config.channels.telegram.accounts))if(s.agentBinding===e)return t}resolveAgent(e){if(!e.group)return e.channel==="telegram"?this.config.channels.telegram.accounts[e.accountId]?.agentBinding:e.channel==="whatsapp"?this.config.channels.whatsapp.agentBinding:void 0;if(e.channel==="telegram"&&this.config.channels.telegram.policy.group==="mention-required"){let n=this.registry.findByMention(e.text);return n||void 0}let t=this.registry.findByMention(e.text);return t||(e.channel==="telegram"?this.config.channels.telegram.accounts[e.accountId]?.agentBinding:this.config.channels.whatsapp.agentBinding)}};var ts=/([_*\[\]()~`>#+=|{}.!\-\\])/g;function A(i){return i.replace(ts,"\\$1")}function ee(i){return i.replace(/([`\\])/g,"\\$1")}function $e(i){let e=i.split(`
102
+ `),t=[],s=!1,n="",o=[];for(let r=0;r<e.length;r++){let a=e[r];if(a.trimStart().startsWith("```"))if(s){s=!1;let p=o.join(`
103
+ `);n?t.push("```"+ee(n)):t.push("```"),t.push(ee(p)),t.push("```");continue}else{s=!0,n=a.trimStart().slice(3).trim(),o=[];continue}if(s){o.push(a);continue}let c=a.match(/^(#{1,6})\s+(.+)$/);if(c){t.push(""),t.push("*"+rt(c[2])+"*");continue}if(/^[-*_]{3,}\s*$/.test(a.trim())){t.push("\u2014\u2014\u2014");continue}if(a.trimStart().startsWith("> ")){let p=a.replace(/^>\s*/,"");t.push(">"+Q(p));continue}let l=a.match(/^(\s*)[-*+]\s+(.+)$/);if(l){let p=l[1].length>0?" ":"";t.push(p+"\u2022 "+Q(l[2]));continue}let d=a.match(/^(\s*)\d+[.)]\s+(.+)$/);if(d){let p=d[1].length>0?" ":"",f=a.match(/^(\s*)(\d+)/)?.[2]||"1";t.push(p+A(f)+"\\. "+Q(d[2]));continue}if(!a.trim()){t.push("");continue}t.push(Q(a))}return s&&(t.push("```"),t.push(ee(o.join(`
104
+ `))),t.push("```")),t.join(`
105
+ `).trim()}function Q(i){let e=[],t=i.replace(/`([^`]+)`/g,(o,r)=>{let a=e.length;return e.push("`"+ee(r)+"`"),`\0CODE${a}\0`}),s=[];t=t.replace(/@(\w{5,})/g,(o,r)=>{let a=s.length;return s.push("@"+A(r)),`\0MENTION${a}\0`});let n=[];return t=t.replace(/\[([^\]]+)\]\(([^)]+)\)/g,(o,r,a)=>{let c=n.length;return n.push("["+rt(r)+"]("+a.replace(/([)\\])/g,"\\$1")+")"),`\0LINK${c}\0`}),t=t.replace(/\*\*\*(.+?)\*\*\*/g,(o,r)=>"*_"+A(r)+"_*"),t=t.replace(/\*\*(.+?)\*\*/g,(o,r)=>"*"+A(r)+"*"),t=t.replace(/(?<!\*)\*([^*]+?)\*(?!\*)/g,(o,r)=>"_"+A(r)+"_"),t=t.replace(/(?<!_)_([^_]+?)_(?!_)/g,(o,r)=>"_"+A(r)+"_"),t=t.replace(/~~(.+?)~~/g,(o,r)=>"~"+A(r)+"~"),t=ss(t),t=t.replace(/\x00CODE(\d+)\x00/g,(o,r)=>e[parseInt(r)]),t=t.replace(/\x00MENTION(\d+)\x00/g,(o,r)=>s[parseInt(r)]),t=t.replace(/\x00LINK(\d+)\x00/g,(o,r)=>n[parseInt(r)]),t}function rt(i){return A(i)}function ss(i){return i.split(/(\*[^*]+\*|_[^_]+_|~[^~]+~|\x00\w+\d+\x00)/g).map(t=>/^\*[^*]+\*$/.test(t)||/^_[^_]+_$/.test(t)||/^~[^~]+~$/.test(t)||/^\x00/.test(t)?t:A(t)).join("")}var te=class{name="telegram";accounts;offsets=new Map;handler;polling=!1;log;constructor(e,t=console.error.bind(console,"[telegram]")){this.accounts=new Map(Object.entries(e)),this.log=t}onMessage(e){this.handler=e}async start(){this.polling=!0;for(let[e,t]of this.accounts){this.log(`Starting polling for account "${e}"`);try{let s=await this.apiCall(t.token,"getMe");this.log(`Bot @${s.result?.username} ready (account: ${e})`)}catch(s){this.log(`Failed to verify bot for account "${e}": ${s.message}`);continue}this.pollLoop(e,t)}}async stop(){this.polling=!1}getTokenForAccount(e){return this.accounts.get(e)?.token}getDefaultToken(){let[,e]=Array.from(this.accounts.entries())[0];return e?.token}resolveToken(e,t){if(t){let s=this.getTokenForAccount(t);if(s)return s}return this.chatAccountMap.get(e)?this.getTokenForAccount(this.chatAccountMap.get(e)):this.getDefaultToken()}chatAccountMap=new Map;async send(e){let t=this.resolveToken(e.chatId,e.accountId);if(!t)return this.log("No telegram token found for sending"),"";let s=4096,n=e.text.length>s?e.text.slice(0,s-3)+"...":e.text,o=e.parseMode==="markdown"||e.parseMode===void 0?$e(n):n,r={chat_id:e.chatId,text:o,parse_mode:"MarkdownV2"};e.replyTo&&(r.reply_to_message_id=parseInt(e.replyTo,10)),e.parseMode==="html"?(r.parse_mode="HTML",r.text=n):e.parseMode==="plain"&&(delete r.parse_mode,r.text=n);try{let a=await this.apiCall(t,"sendMessage",r);return String(a.result?.message_id||"")}catch(a){if(r.parse_mode){delete r.parse_mode,r.text=n;let c=await this.apiCall(t,"sendMessage",r);return String(c.result?.message_id||"")}throw a}}async editMessage(e,t,s,n,o){let r=this.resolveToken(e,o);if(!r)return!1;let a=4096,c=s.length>a?s.slice(0,a-3)+"...":s,l=n!=="html"&&n!=="plain"?$e(c):c,d={chat_id:e,message_id:parseInt(t,10),text:l,parse_mode:"MarkdownV2"};n==="html"?(d.parse_mode="HTML",d.text=c):n==="plain"&&(delete d.parse_mode,d.text=c);try{return await this.apiCall(r,"editMessageText",d),!0}catch(p){if(p.message?.includes("message is not modified"))return!0;if(d.parse_mode){delete d.parse_mode,d.text=c;try{return await this.apiCall(r,"editMessageText",d),!0}catch{return!1}}return!1}}async react(e,t,s="\u{1F440}",n){let o=this.resolveToken(e,n);if(o)try{await this.apiCall(o,"setMessageReaction",{chat_id:e,message_id:parseInt(t,10),reaction:[{type:"emoji",emoji:s}]})}catch{}}async sendTyping(e,t){let s=this.resolveToken(e,t);if(s)try{await this.apiCall(s,"sendChatAction",{chat_id:e,action:"typing"})}catch{}}async pollLoop(e,t){for(;this.polling;)try{let s=this.offsets.get(e)||0,o=(await this.apiCall(t.token,"getUpdates",{offset:s||void 0,timeout:30,allowed_updates:["message"]})).result||[];for(let r of o)if(this.offsets.set(e,r.update_id+1),r.message?.text&&this.handler){let a=r.message,c={id:String(a.message_id),channel:"telegram",accountId:e,sender:{id:String(a.from.id),name:[a.from.first_name,a.from.last_name].filter(Boolean).join(" "),username:a.from.username},group:a.chat.type!=="private"?{id:String(a.chat.id),name:a.chat.title||""}:void 0,text:a.text,replyTo:a.reply_to_message?String(a.reply_to_message.message_id):void 0,timestamp:new Date(a.date*1e3),raw:r};this.chatAccountMap.set(String(a.chat.id),e),this.handler(c).catch(l=>{this.log(`Error handling message: ${l.message}`)})}}catch(s){this.log(`Poll error (${e}): ${s.message}`),await new Promise(n=>setTimeout(n,5e3))}}async apiCall(e,t,s){let n=`https://api.telegram.org/bot${e}/${t}`,o=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:s?JSON.stringify(s):void 0});if(!o.ok){let r=await o.text();throw new Error(`Telegram API error: ${o.status} ${r}`)}return o.json()}};var se=class{name="whatsapp";sessionDir;agentBinding;handler;log;constructor(e,t=console.error.bind(console,"[whatsapp]")){this.sessionDir=e.sessionDir,this.agentBinding=e.agentBinding,this.log=t}onMessage(e){this.handler=e}async start(){this.log("WhatsApp adapter is a placeholder."),this.log("To enable, install @whiskeysockets/baileys and implement the connection logic."),this.log(`Session dir: ${this.sessionDir}`),this.log(`Agent binding: ${this.agentBinding||"(none)"}`)}async stop(){}async send(e){this.log(`[send] Would send to ${e.chatId}: ${e.text.slice(0,100)}...`)}};import{writeFileSync as ns,mkdirSync as it,existsSync as at}from"fs";import{resolve as Ae}from"path";function K(i,e,t){let s=[];for(let n of i.split(","))if(n==="*")for(let o=e;o<=t;o++)s.push(o);else if(n.includes("/")){let[o,r]=n.split("/"),a=parseInt(r,10),c=o==="*"?e:parseInt(o,10);for(let l=c;l<=t;l+=a)s.push(l)}else if(n.includes("-")){let[o,r]=n.split("-").map(Number);for(let a=o;a<=r;a++)s.push(a)}else s.push(parseInt(n,10));return[...new Set(s)].sort((n,o)=>n-o)}function os(i,e,t){let s=i.trim().split(/\s+/);if(s.length!==5)throw new Error(`Invalid cron: ${i}`);let n=K(s[0],0,59),o=K(s[1],0,23),r=K(s[2],1,31),a=K(s[3],1,12),c=K(s[4],0,6),l=new Intl.DateTimeFormat("en-US",{timeZone:t,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",hour12:!1}),d=new Date(e.getTime()+6e4);d.setSeconds(0,0);let p=new Date(d.getTime()+366*24*60*60*1e3);for(;d<p;){let f=l.formatToParts(d),k=oe=>parseInt(f.find(dt=>dt.type===oe)?.value||"0",10),v=k("minute"),w=k("hour"),m=k("day"),b=k("month"),E=d.getDay();if(n.includes(v)&&o.includes(w)&&r.includes(m)&&a.includes(b)&&c.includes(E))return d;d.setTime(d.getTime()+6e4)}throw new Error(`No next run found for cron "${i}" within 1 year`)}var ne=class{jobs=new Map;timers=new Map;registry;hooks;runsDir;running=!1;log;constructor(e,t,s,n=console.error.bind(console,"[cron]")){this.registry=t,this.hooks=s,this.log=n,this.runsDir=Ae(process.cwd(),".agentx/cron/runs");for(let[o,r]of Object.entries(e.crons))this.jobs.set(o,{id:o,enabled:r.enabled,schedule:r.schedule,timezone:r.timezone,agent:r.agent,prompt:r.prompt,timeout:r.timeout,model:r.model,onError:r.onError,consecutiveErrors:0,totalRuns:0})}async start(){this.running=!0,at(this.runsDir)||it(this.runsDir,{recursive:!0});for(let[e,t]of this.jobs){if(!t.enabled){this.log(`Job "${e}" is disabled, skipping`);continue}this.scheduleNext(e)}this.log(`${this.jobs.size} cron job(s) loaded, ${Array.from(this.jobs.values()).filter(e=>e.enabled).length} enabled`)}async stop(){this.running=!1;for(let e of this.timers.values())clearTimeout(e);this.timers.clear()}scheduleNext(e){let t=this.jobs.get(e);if(!(!t||!t.enabled||!this.running))try{let s=os(t.schedule,new Date,t.timezone);t.nextRun=s;let n=s.getTime()-Date.now();this.log(`Job "${e}" next run: ${s.toISOString()} (in ${Math.round(n/1e3)}s)`);let o=setTimeout(()=>this.executeJob(e),n);this.timers.set(e,o)}catch(s){this.log(`Failed to schedule "${e}": ${s.message}`)}}async executeJob(e){let t=this.jobs.get(e);if(!t||!this.running)return;if(this.hooks?.has("pre:cron-run")){let n=await this.hooks.execute("pre:cron-run",{event:"pre:cron-run",jobId:e,agent:t.agent,prompt:t.prompt});if(n.blocked){this.log(`Job "${e}" blocked by hook: ${n.message}`),this.scheduleNext(e);return}}this.log(`Executing job "${e}" -> agent "${t.agent}"`);let s=new Date;t.lastRun=s,t.totalRuns++;try{let n=await this.registry.execute({message:t.prompt,agentId:t.agent,context:{channel:"cron"}}),o={jobId:e,startedAt:s,completedAt:new Date,success:!n.error,response:n.content,error:n.error,duration:n.duration||Date.now()-s.getTime()};n.error?(t.consecutiveErrors++,this.log(`Job "${e}" failed (${t.consecutiveErrors} consecutive): ${n.error}`),t.onError==="disable"&&t.consecutiveErrors>=3&&(t.enabled=!1,this.log(`Job "${e}" disabled after ${t.consecutiveErrors} consecutive errors`))):(t.consecutiveErrors=0,this.log(`Job "${e}" completed in ${o.duration}ms`)),this.logRun(o),this.hooks?.has("post:cron-run")&&await this.hooks.execute("post:cron-run",{event:"post:cron-run",jobId:e,success:o.success,duration:o.duration,error:o.error?new Error(o.error):void 0})}catch(n){t.consecutiveErrors++,this.log(`Job "${e}" threw: ${n.message}`)}this.scheduleNext(e)}logRun(e){try{let t=Ae(this.runsDir,e.jobId);at(t)||it(t,{recursive:!0});let s=`${e.startedAt.toISOString().replace(/[:.]/g,"-")}.json`;ns(Ae(t,s),JSON.stringify(e,null,2))}catch{}}list(){return Array.from(this.jobs.values())}};import{createServer as rs}from"http";var ct=class{config;registry;router;cron;mesh;hooks;httpServer;log;constructor(e){this.log=console.error.bind(console,"[agentx]"),this.log("Loading configuration..."),this.config=Xe(e);let t=Ze(this.config);for(let s of t)this.log(` \u26A0 ${s}`);this.hooks=new Ie,Oe(process.cwd(),this.hooks),this.registry=new X(this.config,this.log),this.router=new Z(this.registry,this.config,this.hooks,this.log),this.cron=new ne(this.config,this.registry,this.hooks,this.log),this.config.mesh.enabled&&(this.mesh=new B(this.config,this.log))}async start(){this.log(""),this.log(" \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510"),this.log(" \u2502 agentx daemon \u2502"),this.log(" \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518"),this.log(""),this.log(` Node: ${this.config.node.name} (${this.config.node.id})`),this.log(` Bind: ${this.config.node.bind}`),this.log(""),await this.startChannels(),await this.cron.start(),this.mesh&&await this.mesh.start(),await this.startHttpApi(),this.log(""),this.log(" Agents:");for(let t of this.registry.list())this.log(` ${t.id} (${t.tier}) \u2192 ${t.workspace}`);let e=this.cron.list();if(e.length){this.log(""),this.log(" Cron Jobs:");for(let t of e){let s=t.enabled?"enabled":"disabled";this.log(` ${t.id} [${s}] \u2192 ${t.agent} (${t.schedule})`)}}if(this.mesh){this.log(""),this.log(" Mesh Peers:");for(let t of this.mesh.directory()){let s=t.healthy?"\u2713":"\u2717";this.log(` ${s} ${t.peer} (${t.peerUrl})`)}}this.log(""),this.log(" Ready."),this.log(""),process.on("SIGINT",()=>this.stop()),process.on("SIGTERM",()=>this.stop())}async stop(){this.log("Shutting down..."),await this.router.stopAll(),await this.cron.stop(),this.mesh&&await this.mesh.stop(),this.httpServer&&this.httpServer.close(),this.log("Goodbye."),process.exit(0)}async startChannels(){if(this.config.channels.telegram.enabled){let e=this.config.channels.telegram.accounts;if(Object.keys(e).length>0){let t=new te(e,this.log);this.router.addChannel(t),this.log(" Telegram: enabled")}}if(this.config.channels.whatsapp.enabled){let e=new se({sessionDir:this.config.channels.whatsapp.sessionDir,agentBinding:this.config.channels.whatsapp.agentBinding},this.log);this.router.addChannel(e),this.log(" WhatsApp: enabled (placeholder)")}await this.router.startAll()}async startHttpApi(){let[e,t]=this.config.node.bind.split(":"),s=parseInt(t||"18800",10);this.httpServer=rs(async(n,o)=>{if(o.setHeader("Access-Control-Allow-Origin","*"),o.setHeader("Access-Control-Allow-Methods","GET, POST, OPTIONS"),o.setHeader("Access-Control-Allow-Headers","Content-Type, Authorization"),n.method==="OPTIONS"){o.writeHead(204),o.end();return}await this.handleHttp(n,o)}),this.httpServer.listen(s,e||"127.0.0.1",()=>{this.log(` HTTP API: http://${e||"127.0.0.1"}:${s}`)})}async handleHttp(e,t){let n=new URL(e.url||"/",`http://${e.headers.host||"localhost"}`).pathname;try{switch(`${e.method} ${n}`){case"GET /health":this.json(t,200,{status:"ok",node:this.config.node,uptime:process.uptime(),agents:this.registry.list(),crons:this.cron.list().map(o=>({id:o.id,enabled:o.enabled,nextRun:o.nextRun})),mesh:this.mesh?.directory()||[]});break;case"GET /agents":this.json(t,200,this.registry.list());break;case"GET /crons":this.json(t,200,this.cron.list());break;case"GET /mesh":this.json(t,200,this.mesh?.directory()||[]);break;case"POST /task":{let o=await lt(e);if(!o.agent||!o.message){this.json(t,400,{error:"Missing: agent, message"});return}let r=await this.registry.execute({agentId:o.agent,message:o.message,context:o.context});this.json(t,r.error?500:200,r);break}case"POST /mesh/task":{let o=await lt(e);if(!o.peer||!o.message){this.json(t,400,{error:"Missing: peer, message"});return}if(!this.mesh){this.json(t,400,{error:"Mesh not enabled"});return}let r=await this.mesh.sendTask(o.peer,o.message);this.json(t,200,{response:r});break}case"GET /.well-known/agent-card.json":this.json(t,200,{name:this.config.node.name,description:`AgentX daemon node "${this.config.node.name}"`,url:`http://${this.config.node.bind}`,version:"1.0.0",capabilities:{streaming:!1,pushNotifications:!1,stateTransitionHistory:!1},skills:this.registry.list().map(o=>({id:o.id,name:o.name,description:`Agent "${o.name}" (${o.tier})`,tags:[o.tier]})),defaultInputModes:["text"],defaultOutputModes:["text"]});break;default:this.json(t,404,{error:"Not found",endpoints:["GET /health","GET /agents","GET /crons","GET /mesh","POST /task { agent, message, context? }","POST /mesh/task { peer, message }","GET /.well-known/agent-card.json"]})}}catch(o){this.json(t,500,{error:o.message})}}json(e,t,s){e.writeHead(t,{"Content-Type":"application/json"}),e.end(JSON.stringify(s,null,2))}};async function lt(i){return new Promise((e,t)=>{let s="";i.on("data",n=>s+=n.toString()),i.on("end",()=>{try{e(s?JSON.parse(s):{})}catch{e({})}}),i.on("error",t)})}function To(i){typeof i=="string"&&(y.error(i),process.exit(1)),i instanceof Error&&(y.error(i.message),process.exit(1)),y.error("Something went wrong. Please try again."),process.exit(1)}import is from"path";import as from"fs-extra";function Mo(){let i=is.join("package.json");return as.readJSONSync(i)}export{us as a,ms as b,fs as c,ks as d,N as e,L as f,he as g,zs as h,R as i,J as j,F as k,D as l,fe as m,ye as n,S as o,we as p,ke as q,ve as r,Se as s,xe as t,H as u,B as v,Ht as w,Xe as x,Ze as y,Wt as z,qt as A,Yt as B,tt as C,X as D,Z as E,te as F,se as G,ne as H,ct as I,To as J,Mo as K};
106
+ //# sourceMappingURL=chunk-THMHQELC.js.map