@agensis/agensis-agent 0.1.34 → 0.1.36
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/agensis.mjs +37 -37
- package/package.json +1 -1
package/bin/agensis.mjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var
|
|
3
|
-
`),s=String(t.soul??""),i=await
|
|
4
|
-
`}async function
|
|
5
|
-
`)}async function
|
|
2
|
+
var Or=Object.defineProperty;var Me=(e,t)=>()=>(e&&(t=e(e=0)),t);var Lt=(e,t)=>{for(var n in t)Or(e,n,{get:t[n],enumerable:!0})};var en={};Lt(en,{createE2bProvider:()=>so});function Ve(e){return`'${String(e).replace(/'/g,"'\\''")}'`}function so({apiKey:e,anthropicApiKey:t,gitToken:n="",repoUrl:r="",template:o=""}={}){if(!e)throw new Error("E2B_API_KEY is not set on the daemon host.");if(!r)throw new Error("Sandbox needs a repo URL (set sandbox_config.repoUrl or the agent's repo).");return{async ensureEnv(){let s={apiKey:e,envs:t?{ANTHROPIC_API_KEY:t}:{}},i;try{({Sandbox:i}=await import("e2b"))}catch(d){if(d&&(d.code==="ERR_MODULE_NOT_FOUND"||d.code==="MODULE_NOT_FOUND"||/Cannot find package 'e2b'/.test(String(d&&d.message)))){let c=Number(String(process.versions.node).split(".")[0])||0,l=c<20||c===21?` Sandbox mode needs Node >=20.18.1 (<21 or >=22); you have ${process.versions.node}. Upgrade Node, then run \`npm i e2b\` in the daemon.`:" Run `npm i e2b` in the daemon to enable Sandbox mode.";throw new Error(`Sandbox execution requires the optional 'e2b' package, which is not installed.${l}`)}throw d}let a=o?await i.create(o,s):await i.create(s);return await a.commands.run("bash -lc 'command -v claude >/dev/null || npm i -g @anthropic-ai/claude-code'"),{sbx:a,dir:oo}},async putRepo(s){let i=n?r.replace(/^https:\/\//,`https://x-access-token:${n}@`):r;try{let a=await s.sbx.commands.run(`git clone ${Ve(i)} ${Ve(s.dir)}`);if(a&&typeof a.exitCode=="number"&&a.exitCode!==0)throw new Error(`git clone failed: ${a.stderr||`exit ${a.exitCode}`}`)}catch(a){if(a&&String(a.message||"").startsWith("git clone failed:"))throw a;let d=a&&(a.stderr||a.exitCode!=null)?a.stderr||`exit ${a.exitCode}`:String(a?.message||a);throw new Error(`git clone failed: ${d}`)}},async exec(s,{cmd:i,args:a=[],env:d={},onData:c}){let l=`${i} ${a.map(Ve).join(" ")}`,g={cwd:s.dir,envs:{...d,IS_SANDBOX:"1",AGENSIS_ALLOW_ROOT_SKIP_PERMISSIONS:"1"},onStdout:m=>{try{c?.(m)}catch{}}};try{let m=await s.sbx.commands.run(l,g);return{status:m.exitCode,stdout:m.stdout||"",stderr:m.stderr||"",error:null}}catch(m){return m&&typeof m.exitCode=="number"?{status:m.exitCode,stdout:m.stdout||"",stderr:m.stderr||"",error:null}:{status:null,stdout:"",stderr:String(m?.message||m),error:m}}},async getResult(s){try{return{patch:(await s.sbx.commands.run("git add -A && git diff --cached",{cwd:s.dir})).stdout||""}}catch(i){return{patch:i&&i.stdout||""}}},async destroy(s){await s.sbx.kill()}}}var oo,tn=Me(()=>{oo="/home/user/repo"});import Ln from"node:fs";import G from"node:fs/promises";import ss from"node:os";import q from"node:path";function Un(e,t){return String(e||"").trim().replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/\.{2,}/g,".").replace(/^[.-]+/,"").slice(0,96)||t}function K({workspace:e,agent:t,homedir:n=ss.homedir()}={}){return q.join(n,".agensis",Un(e,"workspace"),Un(t,"agent"))}function Hn(e){return q.join(K(e),jn)}function qn(e){return q.join(K(e),dt)}async function Pe(e){let t=K(e);try{return await G.mkdir(t,{recursive:!0}),t}catch{return null}}async function ve(e,t){let n=`${e}.tmp-${process.pid}`;try{return await G.writeFile(n,t),await G.rename(n,e),!0}catch{try{await G.rm(n,{force:!0})}catch{}return!1}}async function mt(e,t){if(!t||typeof t!="object")return!1;let n=await Pe(e);if(!n)return!1;let r={id:t.id??e.agent??"",workspace:t.workspace_id??e.workspace??"",name:t.name??e.name??"",handle:t.handle??e.handle??"",model:t.model??e.model??"",permissionMode:t.permissionMode??t.permission_mode??e.permissionMode??"",description:t.description??"",instructions:t.instructions??"",systemPrompt:t.system_prompt??t.systemPrompt??"",tools:Array.isArray(t.tools)?t.tools:[],skills:Array.isArray(t.skills)?t.skills:[],memoryDir:t.memory_dir??t.memoryDir??"",version:Number(t.version||0),updatedAt:new Date().toISOString()},o=await ve(q.join(n,as),`${JSON.stringify(r,null,2)}
|
|
3
|
+
`),s=String(t.soul??""),i=await ve(q.join(n,cs),s);return o&&i}async function Jn(e,t={}){let n=await Pe(e);return n?ve(q.join(n,Fn),Kn(e,t)):!1}function zn(e,t={}){let n=K(e);try{return Ln.mkdirSync(n,{recursive:!0}),Ln.writeFileSync(q.join(n,Fn),Kn(e,t)),!0}catch{return!1}}function Kn(e,t){let n=Date.now(),r={ts:n,iso:new Date(n).toISOString(),status:t.status||(t.busy?"busy":"online"),busy:!!t.busy,active:Number(t.active||0),queueSize:Number(t.queueSize||0),connected:!!t.connected,model:e.model||"",permissionMode:e.permissionMode||"",handle:e.handle||"",agent:e.agent||"",workspace:e.workspace||"",pid:process.pid,heartbeatMs:e.heartbeatMs,...t.agentStatus?{agentStatus:t.agentStatus}:{},...t.agentNote?{agentNote:t.agentNote}:{}};return`${JSON.stringify(r,null,2)}
|
|
4
|
+
`}async function ft(e){let t=q.join(K(e),jn),n;try{let a=await G.stat(t);if(!a.isFile()||a.size>hs)return null;n=await G.readFile(t,"utf8")}catch{return null}let r;try{r=JSON.parse(n)}catch{return null}if(!r||typeof r!="object"||Array.isArray(r))return null;let o=ut(r.status),s=ut(r.note??r.message);if(!o&&!s)return null;let i={};return o&&(i.status=o),s&&(i.note=s),r.ts!=null&&Number.isFinite(Number(r.ts))&&(i.ts=Number(r.ts)),i}function ut(e){return e==null?"":String(e).trim().replace(/\s+/g," ").slice(0,gs)}function pt(e){return q.join(K(e),is)}async function Wn(e){let t=pt(e),n;try{let i=await G.stat(t);if(!i.isFile()||i.size>ys)return null;n=await G.readFile(t,"utf8")}catch{return null}let r;try{r=JSON.parse(n)}catch{return null}if(!r||typeof r!="object"||Array.isArray(r))return null;let o={};for(let i of Ss){let a=i==="description"&&r.description==null?r.profile:r[i];typeof a!="string"||!a.trim()||(o[i]=a.trim())}let s=bs(r.voice,r.attitude);return s&&(o.voice=s),Object.keys(o).length>0?o:null}function bs(e,t){let n=e&&typeof e=="object"&&!Array.isArray(e)?e:{},r={};for(let o of ws){let s=n[o];typeof s=="string"&&s.trim()?r[o]=s.trim():o==="speed"&&typeof s=="number"&&Number.isFinite(s)&&(r.speed=s)}return!r.emotion&&!r.attitude&&typeof t=="string"&&t.trim()&&(r.attitude=t.trim()),Object.keys(r).length>0?r:null}function Yn(e){return q.join(K(e),ls)}function _s(e){return q.join(K(e),Gn)}async function Vn(e){let t=Yn(e),n;try{let a=await G.stat(t);if(!a.isFile()||a.size>us)return null;n=await G.readFile(t,"utf8")}catch{return null}let r;try{r=JSON.parse(n)}catch{return null}if(!r||typeof r!="object"||Array.isArray(r))return null;let o=String(r.targetVersion||"").trim();if(!ms.test(o))return null;let s={targetVersion:o},i=ut(r.note);return i&&(s.note=i),typeof r.requestedAt=="string"&&(s.requestedAt=r.requestedAt),s}async function Xn(e){try{return await G.rm(Yn(e),{force:!0}),!0}catch{return!1}}async function Le(e){let t=_s(e),n;try{let r=await G.stat(t);if(!r.isFile()||r.size>ds)return null;n=await G.readFile(t,"utf8")}catch{return null}try{let r=JSON.parse(n);return r&&typeof r=="object"&&!Array.isArray(r)?r:null}catch{return null}}async function ue(e,t={}){let n=await Pe(e);if(!n)return!1;let r={...t,updatedAt:new Date().toISOString()};return ve(q.join(n,Gn),`${JSON.stringify(r,null,2)}
|
|
5
|
+
`)}async function Qn(e){let t=await Pe(e);if(!t)return!1;let n=q.join(t,dt);try{return await G.access(n),!0}catch{}return ve(n,ps)}async function Zn(e){let t=q.join(K(e),dt);try{let n=await G.stat(t);return!n.isFile()||n.size>fs?null:(await G.readFile(t,"utf8")).trim()||null}catch{return null}}var jn,is,Fn,dt,as,cs,ls,Gn,us,ds,ms,fs,ps,hs,gs,ys,Ss,ws,Ue=Me(()=>{jn="status.json",is="identity.json",Fn="heartbeat.json",dt="heartbeat.md",as="agent.json",cs="soul.md",ls="update-request.json",Gn="update.json",us=4*1024,ds=16*1024,ms=/^[a-zA-Z0-9._+-]{1,64}$/,fs=16*1024,ps=`# Heartbeat
|
|
6
6
|
|
|
7
7
|
This file tells you what to do on each heartbeat \u2014 the recurring "still here, still
|
|
8
8
|
working" moment. Edit it freely; the daemon reads it but never overwrites your edits.
|
|
@@ -15,57 +15,57 @@ On each heartbeat:
|
|
|
15
15
|
- If you've finished and there's nothing to do, a short idle note is fine.
|
|
16
16
|
|
|
17
17
|
Add your own recurring checks below.
|
|
18
|
-
`,
|
|
19
|
-
`),signal:i,installFn:a
|
|
20
|
-
`}function
|
|
21
|
-
`}function
|
|
22
|
-
`}function
|
|
23
|
-
`}var
|
|
24
|
-
`):
|
|
18
|
+
`,hs=8*1024,gs=400;ys=16*1024,Ss=["name","avatar","accent_color","description","soul"],ws=["cartesia_voice_id","voice_id","id","speed","emotion","attitude"]});import{spawn as Mi,execFile as Ni}from"node:child_process";import Tt from"node:fs";import Te from"node:fs/promises";import Oi from"node:os";import be from"node:path";import{promisify as $i}from"node:util";function Nt({homedir:e=Oi.homedir()}={}){return be.join(e,".agensis","versions")}function Je(e,t){return be.join(e,t)}function Ot(e){return be.join(e,Ri)}function we(e){return be.join(e,"node_modules",Mt,"bin","agensis.mjs")}async function Ar(e,t){await Te.mkdir(be.dirname(e),{recursive:!0}),await Te.rm(e,{force:!0}),await Te.symlink(t,e)}async function $t({root:e,version:t,log:n=()=>{}}){let r=Je(e,t),o=we(r);if(Tt.existsSync(o))return n(`[self-update] ${t} already installed at ${r}`),r;if(await Te.mkdir(r,{recursive:!0}),n(`[self-update] installing ${Mt}@${t} into ${r}`),await Di("npm",["install","--prefix",r,`${Mt}@${t}`,"--no-audit","--no-fund","--no-save","--omit=dev"]),!Tt.existsSync(o))throw new Error(`npm install reported success but ${o} is missing`);return r}function Dt({entry:e,profileName:t,extraArgs:n=[],env:r=process.env}){let o=["connect","--profile",t,...n],s=Mi(process.execPath,[e,...o],{detached:!0,stdio:"inherit",env:r});return s.unref(),s}async function Rt(e,{graceMs:t=5e3}={}){return!e||e.exitCode!==null||e.killed||await new Promise(n=>{let r=!1,o=()=>{r||(r=!0,clearTimeout(s),n())},s=setTimeout(()=>{try{e.kill("SIGKILL")}catch{}},t);s.unref?.(),e.once("exit",o);try{e.kill("SIGTERM")}catch{o()}}),!0}async function Bt({config:e,pid:t,timeoutMs:n=Ir}){let r=be.join(K(e),"heartbeat.json"),o=Date.now()+n;for(;Date.now()<o;){try{let s=await Te.readFile(r,"utf8"),i=JSON.parse(s);if(Number.isFinite(i.ts)&&Date.now()-i.ts<=Pi&&i.connected&&(t==null||i.pid===t))return!0}catch{}await new Promise(s=>setTimeout(s,Bi))}return!1}async function xr({config:e,targetVersion:t,currentVersion:n,root:r=Nt({}),profileName:o="default",runningChild:s=null,installFn:i=$t,spawnFn:a=Dt,stopFn:d=Rt,healthCheckFn:c=Bt,healthTimeoutMs:l=Ir,log:g=()=>{}}={}){let m=await Le(e)||{},y=n||m.currentVersion||null,S=Ot(r),f={version:t,startedAt:new Date().toISOString()};if(t===y){let u={currentVersion:y,previousVersion:m.previousVersion||null,lastAttempt:{...f,result:"noop_already_current"}};return await ue(e,u),{...u,child:s}}let b;try{b=await i({root:r,version:t,log:g})}catch(u){let h={currentVersion:y,previousVersion:m.previousVersion||null,lastAttempt:{...f,result:"install_failed",error:String(u?.message||u)}};return await ue(e,h),{...h,child:s}}s&&await d(s),await Ar(S,b);let w=we(b),E=a({entry:w,profileName:o});if(await c({config:e,pid:E.pid,timeoutMs:l})){let u={currentVersion:t,previousVersion:y,lastAttempt:{...f,result:"ok"}};return await ue(e,u),{...u,child:E}}g(`[self-update] ${t} failed its health check within ${l}ms \u2014 rolling back to ${y||"(no known previous version)"}`),await d(E);let k=!1,N=null;if(y){let u=Je(r,y);Tt.existsSync(we(u))&&(await Ar(S,u),N=a({entry:we(u),profileName:o}),k=!0)}let M={currentVersion:k?y:m.currentVersion||y,previousVersion:y,lastAttempt:{...f,result:k?"rolled_back":"failed_no_fallback"}};return await ue(e,M),{...M,child:N}}var Di,Mt,Ri,Ir,Bi,Pi,Cr=Me(()=>{Ue();Di=$i(Ni),Mt="@agensis/agensis-agent",Ri="current",Ir=3e4,Bi=1e3,Pi=1e4});var Mr={};Lt(Mr,{runSupervisor:()=>Gi});import Li from"node:fs";import Pt from"node:fs/promises";import Ui from"node:path";async function Fi({root:e,runningVersion:t,installFn:n,log:r}){let o=Ot(e);if(Li.existsSync(o))return;r(`[supervise] no current version linked yet \u2014 adopting the running version ${t}`);let s=await n({root:e,version:t,log:r});await Pt.mkdir(Ui.dirname(o),{recursive:!0}),await Pt.rm(o,{force:!0}),await Pt.symlink(s,o)}async function Gi({config:e,runningVersion:t,profileName:n="default",pollIntervalMs:r=ji,root:o=Nt({}),log:s=m=>process.stdout.write(`${m}
|
|
19
|
+
`),signal:i,installFn:a=$t,spawnFn:d=Dt,stopFn:c=Rt,healthCheckFn:l=Bt,maxIterations:g=1/0}={}){if(!e?.workspace||!e?.agent)throw new Error("supervise requires a resolved profile with workspace + agent (run `agensis setup`/`agensis connect` first).");await Fi({root:o,runningVersion:t,installFn:a,log:s});let m=await Le(e);m?.currentVersion||(m={currentVersion:t,previousVersion:null,lastAttempt:null},await ue(e,m));let y=null,S=!1,f=0,b=()=>{let _=Je(o,m.currentVersion);return y=d({entry:we(_),profileName:n}),y.on?.("exit",(k,N)=>{if(S)return;s(`[supervise] daemon (version ${m.currentVersion}) exited (code=${k} signal=${N}); respawning`);let M=Tr[Math.min(f,Tr.length-1)];f+=1,setTimeout(()=>{S||b()},M).unref?.()}),y.on?.("spawn",()=>{f=0}),y};b();let w=async()=>{S=!0,y&&await c(y)};i?.addEventListener("abort",()=>{w()}),process.once("SIGTERM",()=>{w().then(()=>process.exit(0))}),process.once("SIGINT",()=>{w().then(()=>process.exit(0))});let E=0;for(;!S&&!i?.aborted&&E<g&&(E+=1,await new Promise(N=>setTimeout(N,r)),!(S||i?.aborted));){let _=await Vn(e);if(!_||_.targetVersion===m.currentVersion)continue;s(`[supervise] update requested: ${m.currentVersion} -> ${_.targetVersion}${_.note?` (${_.note})`:""}`);let k=await xr({config:e,targetVersion:_.targetVersion,currentVersion:m.currentVersion,root:o,profileName:n,runningChild:y,installFn:a,spawnFn:d,stopFn:c,healthCheckFn:l,log:s});await Xn(e),m=k,y=k.child||y,f=0,s(`[supervise] update attempt "${_.targetVersion}" -> ${k.lastAttempt?.result} (running ${k.currentVersion})`)}return{state:m,child:y}}var ji,Tr,Nr=Me(()=>{Cr();Ue();ji=5e3,Tr=[1e3,5e3,15e3,3e4]});import ne from"node:process";import Ae from"node:fs";import me from"node:path";import Ie from"node:os";import vs from"node:crypto";import C from"node:process";import ke from"ws";import{spawn as $r}from"node:child_process";function Ut(e){let t=Math.max(0,Math.round(e/1e3)),n=Math.floor(t/60),r=t%60;return n>0?`${n}m ${r}s`:`${r}s`}var Dr=50*1024*1024;function Z(e){let{cmd:t,args:n=[],env:r={},cwd:o,timeoutMs:s=0,label:i="working",heartbeatMs:a=15e3,input:d="",now:c=Date.now,log:l=console,signal:g,onData:m}=e||{};return new Promise(y=>{if(g?.aborted){y({status:null,stdout:"",stderr:"",aborted:!0,error:new Error("cancelled")});return}let S;try{let A=n.some(V=>V==="--dangerously-skip-permissions"),x=typeof process.getuid=="function"&&process.getuid()===0,$={...process.env,...r};delete $.AGENSIS_TOKEN,delete $.ANTHROPIC_API_KEY,delete $.ANTHROPIC_AUTH_TOKEN,A&&x&&($.IS_SANDBOX="1"),S=$r(t,n,{cwd:o,detached:!0,env:$})}catch(A){y({status:null,stdout:"",stderr:"",error:A});return}d?S.stdin?.end(String(d)):S.stdin?.end();let f="",b="";S.stdout?.setEncoding("utf8"),S.stderr?.setEncoding("utf8");let w=(A,x)=>A.length>=Dr?A:A+x;S.stdout?.on("data",A=>{if(f=w(f,A),m)try{m(A)}catch{}}),S.stderr?.on("data",A=>b=w(b,A));let E=c(),_=a>0?setInterval(()=>{l.log(` \u2026 still ${i} (${Ut(c()-E)}) \u2014 Ctrl+C to cancel`)},a):null;_?.unref&&_.unref();let k=A=>{if(S.pid!=null)try{process.kill(-S.pid,A)}catch{try{S.kill(A)}catch{}}},N=!1,M=s>0?setTimeout(()=>{N=!0,k("SIGKILL")},s):null;M?.unref&&M.unref();let u=!1,h=null,T=()=>{u=!0,k("SIGTERM"),h=setTimeout(()=>k("SIGKILL"),3e3),h?.unref&&h.unref()};g&&g.addEventListener("abort",T,{once:!0});let p=(A,x)=>{_&&clearInterval(_),M&&clearTimeout(M),h&&clearTimeout(h),g&&g.removeEventListener("abort",T),y({status:A,stdout:f,stderr:b,aborted:u,error:x||(u?new Error("cancelled"):N?new Error(`timed out after ${Ut(s)}`):null)})};S.on("error",A=>p(null,A)),S.on("close",A=>p(A,null))})}import{spawn as Gr}from"node:child_process";import Rr from"node:crypto";var Br=Number(process.env.AGENSIS_PERMISSION_TIMEOUT_MS||10*60*1e3),jt=["once","session","always"];function Ft(e){let t=String(e?.toolName??"").trim();if(!t)return"";let n=String(e?.ruleContent??"").trim();return n?`${t}(${n})`:t}function Pr(e){let t=[];for(let n of Array.isArray(e)?e:[])if(!(!n||n.type!=="addRules"||n.behavior!=="allow"))for(let r of Array.isArray(n.rules)?n.rules:[]){let o=Ft(r);o&&!t.includes(o)&&t.push(o)}return t}var Lr=/\d*>&\d*|&>/g,Ur=/[;&|`]|\$\(/;function jr(e,t){if(String(e||"")!=="Bash")return[];let n=String(t?.command??"").trim();if(!n||Ur.test(n.replace(Lr," ")))return[];let r=n.split(/\s+/),o=r[0];if(!o||o.startsWith("-"))return[];let s=r[1];return[`Bash(${s&&/^[a-z][a-z0-9:_-]*$/i.test(s)?`${o} ${s}`:o}:*)`]}function Gt({toolName:e,input:t,suggestions:n}={}){let r=Pr(n);return r.length>0?r:jr(e,t)}function Fr(e){let t=Array.isArray(e)?e:Array.isArray(e?.allow)?e.allow:[],n=[];for(let r of t){let o=typeof r=="string"?r.trim():Ft(r);o&&!n.includes(o)&&n.push(o)}return n}function Ht(e){return Fr(e?.agent?.metadata?.permission_rules??e?.agent?.permissionRules??e?.permissionRules??e?.permission_rules)}function qt(e,{toolName:t,input:n,suggestions:r}={}){let o=Array.isArray(e)?e:[];if(o.length===0)return!1;let s=String(t||"").trim();return s&&o.includes(s)?!0:Gt({toolName:t,input:n,suggestions:r}).some(i=>o.includes(i))}function pe(e){return{behavior:"deny",message:e}}function Jt({send:e,timeoutMs:t=Br,log:n=()=>{},idFactory:r=()=>Rr.randomUUID()}={}){if(typeof e!="function")throw new Error("createPermissionBroker requires send()");let o=new Map,s=(i,a)=>{let d=o.get(i);return d?(o.delete(i),clearTimeout(d.timer),d.resolve(a),!0):!1};return{request({jobId:i,toolName:a,title:d,description:c,detail:l,input:g,suggestions:m,signal:y}={}){let S=r(),f=Gt({toolName:a,input:g,suggestions:m});return e({action:"agent_permission_request",jobId:i||"",requestId:S,toolName:String(a||"").trim(),title:String(d||"").trim(),description:String(c||"").trim(),detail:String(l||"").trim(),input:g||null,rules:f,scopes:f.length>0?jt:["once","session"],expiresInMs:t})?(n(`permission requested for ${a||"a tool"} (${S})`),new Promise(w=>{let E=setTimeout(()=>{s(S,pe(`Nobody approved this within ${Math.round(t/6e4)} minutes. Ask again in the chat, or have the workspace grant it on the agent.`))},t);E.unref?.();let _={jobId:i||"",timer:E,resolve:w};o.set(S,_),y?.addEventListener?.("abort",()=>{s(S,pe("The job was cancelled before this was approved."))},{once:!0})})):Promise.resolve(pe("Agensis was unreachable, so this tool call could not be approved."))},decide(i){let a=String(i?.requestId||"");if(!a||!o.has(a))return!1;let d=i.behavior==="allow",c=jt.includes(i.scope)?i.scope:"once",l=String(i.decidedBy||"").trim();return n(`permission ${d?`allowed (${c})`:"denied"} for ${a}${l?` by ${l}`:""}`),s(a,d?{behavior:"allow",scope:c,decidedBy:l}:pe(String(i.message||"").trim()||`${l||"The workspace"} denied this tool call.`))},cancelJob(i,a="The job ended before this was approved."){let d=String(i||""),c=0;for(let[l,g]of[...o.entries()])g.jobId===d&&s(l,pe(a))&&(c+=1);return c},shutdown(i="The agent daemon disconnected before this was approved."){let a=0;for(let d of[...o.keys()])s(d,pe(i))&&(a+=1);return a},pendingCount(){return o.size}}}var Wt=10*60*1e3;function Yt(e={}){let t={...process.env,...e};return delete t.AGENSIS_TOKEN,delete t.ANTHROPIC_API_KEY,delete t.ANTHROPIC_AUTH_TOKEN,t}var Ye=class{#e=[];#t=[];#n=!1;push(t){if(this.#n)return;let n=this.#t.shift();n?n({value:t,done:!1}):this.#e.push(t)}close(){this.#n=!0;for(let t of this.#t.splice(0))t({value:void 0,done:!0})}[Symbol.asyncIterator](){return{next:()=>this.#e.length?Promise.resolve({value:this.#e.shift(),done:!1}):this.#n?Promise.resolve({value:void 0,done:!0}):new Promise(t=>this.#t.push(t))}}};function Vt(){let e=new Map;return(t,n)=>{let r=(e.get(t)||Promise.resolve()).then(n,n);return e.set(t,r.catch(()=>{})),r}}var Hr=["mcp__agensis"],qr=["Grep","Glob"];function Jr(e){return e==="yolo"?{permissionMode:"bypassPermissions",allowDangerouslySkipPermissions:!0}:e==="accept_edits"?{permissionMode:"acceptEdits"}:{permissionMode:"default"}}function zr(e){if(!e||e.type!=="content_block_delta")return"";let t=e.delta;return t&&t.type==="text_delta"&&typeof t.text=="string"?t.text:""}function Kr(e){return`${JSON.stringify({type:"stream_event",event:{type:"content_block_delta",delta:{type:"text_delta",text:e}}})}
|
|
20
|
+
`}function Wr(e){return`${JSON.stringify({type:"result",result:e})}
|
|
21
|
+
`}function Yr(e){return`${JSON.stringify({type:"agensis_step",step:e})}
|
|
22
|
+
`}function Vr(e){return`${JSON.stringify({type:"agensis_segment",segment:e})}
|
|
23
|
+
`}var Xr=["file_path","path","pattern","command","description","prompt"],zt=120;function Ne(e){if(!e||typeof e!="object")return"";for(let t of Xr){let n=e[t];if(typeof n!="string")continue;let r=n.replace(/\s+/g," ").trim();if(r)return r.length>zt?`${r.slice(0,zt)}\u2026`:r}return""}function Xt(e){return JSON.stringify({cwd:e.cwd||"",model:e.model||"",permissionMode:e.permissionMode||"default",hostFolders:[...e.hostFolders||[]].sort(),leanCli:!!e.leanCli,mcpUrl:e.mcp?.url||"",mcpToken:e.mcp?.env?.AGENSIS_MCP_TOKEN||"",canAsk:!!e.requestPermission})}function Qr(e,t){return async(n,r,o={})=>{let s=e.activeTurn;if(!s)return{behavior:"deny",message:"This tool call arrived with no active job to ask about."};let i=s.requestPermission||t;if(!i)return{behavior:"deny",message:"This agent has no way to ask for approval right now."};if(qt(s.permissionRules,{toolName:n,input:r,suggestions:o.suggestions}))return{behavior:"allow"};let a=await i({jobId:s.jobId,toolName:n,title:o.title,description:o.description,detail:Ne(r),input:r,suggestions:o.suggestions,signal:o.signal});if(a?.behavior!=="allow")return{behavior:"deny",message:a?.message||"This tool call was not approved."};let d=a.scope==="once"?void 0:o.suggestions;return d?.length?{behavior:"allow",updatedPermissions:d}:{behavior:"allow"}}}function Qt({queryFn:e,idleCloseMs:t=Wt,requestPermission:n}={}){let r=new Map,o=Vt(),s=(c,l,g)=>{let m=r.get(c);if(!(!m||l&&m!==l))if(r.delete(c),clearTimeout(m.idleTimer),m.closed=!0,m.queue.close(),g&&m.activeTurn&&m.activeTurn.finish(g),typeof m.query.close=="function")try{m.query.close()}catch{}else Promise.resolve(m.query.return?.()).catch(()=>{})},i=c=>{let l=r.get(c);l&&(clearTimeout(l.idleTimer),l.idleTimer=setTimeout(()=>s(c),t),l.idleTimer.unref?.())},a=async(c,l)=>{let g=r.get(c),m=Xt(l);if(g&&g.fingerprint===m&&!g.closed)return g;g&&s(c,g),e||(e=(await import("@anthropic-ai/claude-agent-sdk")).query);let y=new Ye,S=Jr(l.permissionMode),f={query:null,queue:y,sessionId:"",idleTimer:null,activeTurn:null,closed:!1,terminalError:null,fingerprint:m},b=l.leanCli&&l.mcp?{agensis:{type:"http",url:l.mcp.url,headers:{Authorization:"Bearer ${AGENSIS_MCP_TOKEN}"}}}:void 0,w=e({prompt:y,options:{cwd:l.cwd,model:l.model,...S,allowedTools:[...Hr,...qr],canUseTool:n||l.requestPermission?Qr(f,n):void 0,additionalDirectories:l.hostFolders&&l.hostFolders.length?l.hostFolders:void 0,mcpServers:b,strictMcpConfig:l.leanCli?!0:void 0,settingSources:l.leanCli?[]:void 0,persistSession:l.leanCli?!1:void 0,includePartialMessages:!0,env:Yt(l.mcp?.env)}});return f.query=w,r.set(c,f),f.pump=(async()=>{let E=null;try{for await(let _ of w){_.session_id&&(f.sessionId=_.session_id);let k=f.activeTurn;if(k){if(_.type==="stream_event"){let N=zr(_.event);N&&(k.streamed+=N,k.onData?.(Kr(N)))}else if(_.type==="result")if(_.subtype==="success"){let N=_.result==null?k.text:String(_.result);k.onData?.(Wr(N)),k.finish({status:0,stdout:N,stderr:"",error:null})}else{let N=Array.isArray(_.errors)?_.errors.filter(Boolean).join(`
|
|
24
|
+
`):_.result,M=new Error(N||`claude-agent-sdk result error: ${_.subtype}`);k.finish({status:1,stdout:k.text,stderr:M.message,error:M})}else if(_.type==="assistant"){let N=_.message?.content;if(Array.isArray(N)){let M=N.filter(u=>u&&u.type==="text"&&typeof u.text=="string").map(u=>u.text).join("");M&&(k.onData?.(Vr({text:M})),k.flushed+=k.streamed,k.streamed="");for(let u of N)!u||u.type!=="tool_use"||!u.name||k.onData?.(Yr({kind:"tool",name:String(u.name),detail:Ne(u.input)}))}}}}E=new Error("claude-agent-sdk connection closed")}catch(_){E=_}finally{f.closed=!0,f.terminalError=E,clearTimeout(f.idleTimer),f.queue.close(),r.get(c)===f&&r.delete(c),f.activeTurn&&f.activeTurn.finish({status:null,stdout:f.activeTurn.text,stderr:String(E?.message||E||""),error:E})}})(),f};return{run:c=>o(c.sessionKey||"default",async()=>{let{sessionKey:l="default",prompt:g,signal:m,onData:y,timeoutMs:S=0}=c;if(m?.aborted)return{status:null,stdout:"",stderr:"",aborted:!0,error:new Error("cancelled")};let f;try{f=await a(l,c)}catch(w){return{status:null,stdout:"",stderr:"",error:w}}if(f.closed){let w=f.terminalError||new Error("claude-agent-sdk connection closed");return{status:null,stdout:"",stderr:String(w.message||w),error:w}}clearTimeout(f.idleTimer);let b=await new Promise(w=>{let E=!1,_=null,k={streamed:"",flushed:"",get text(){return this.flushed+this.streamed},onData:y,jobId:c.job?.id||"",permissionRules:Ht(c.job),requestPermission:c.requestPermission||null,finish(M){E||(E=!0,f.activeTurn===k&&(f.activeTurn=null),m&&m.removeEventListener("abort",N),_&&clearTimeout(_),w(M))}},N=()=>{let M={status:null,stdout:k.text,stderr:"",aborted:!0,error:new Error("cancelled")};Promise.resolve(f.query.interrupt?.()).catch(()=>{}),s(l,f,M)};f.activeTurn=k,m&&m.addEventListener("abort",N,{once:!0}),S>0&&(_=setTimeout(()=>{let M=new Error(`timed out after ${S}ms`);Promise.resolve(f.query.interrupt?.()).catch(()=>{}),s(l,f,{status:null,stdout:k.text,stderr:M.message,error:M})},S),_.unref?.()),f.queue.push({type:"user",message:{role:"user",content:g},parent_tool_use_id:null,session_id:f.sessionId})});return r.get(l)===f&&i(l),b}),shutdown:()=>{for(let c of[...r.keys()])s(c)}}}function Zr(e){let t=1,n="",r=new Map,o=new Set;e.stdout.setEncoding("utf8"),e.stdout.on("data",i=>{n+=i;let a;for(;(a=n.indexOf(`
|
|
25
25
|
`))>=0;){let d=n.slice(0,a);if(n=n.slice(a+1),!d.trim())continue;let c;try{c=JSON.parse(d)}catch{continue}if(c.id!==void 0&&r.has(c.id)){let{resolve:l,reject:g}=r.get(c.id);r.delete(c.id),c.error?g(new Error(c.error.message||"codex app-server error")):l(c.result)}else if(c.method)for(let l of o)l(c.method,c.params,c.id)}});let s=i=>{for(let{reject:a}of r.values())a(i);r.clear()};return e.on("exit",()=>s(new Error("codex app-server exited"))),e.on("error",i=>s(i)),{request(i,a){let d=t++;return new Promise((c,l)=>{r.set(d,{resolve:c,reject:l}),e.stdin.write(`${JSON.stringify({id:d,method:i,params:a})}
|
|
26
26
|
`)})},notify(i,a){e.stdin.write(`${JSON.stringify({method:i,params:a})}
|
|
27
27
|
`)},respond(i,a){e.stdin.write(`${JSON.stringify({id:i,result:a})}
|
|
28
28
|
`)},respondError(i,a){e.stdin.write(`${JSON.stringify({id:i,error:{code:-32601,message:a}})}
|
|
29
|
-
`)},onMessage(i){return o.add(i),()=>o.delete(i)}}}function
|
|
29
|
+
`)},onMessage(i){return o.add(i),()=>o.delete(i)}}}function eo(e){return e==="yolo"?{approvalPolicy:"never",sandbox:"danger-full-access"}:{}}function to(e,t,n){let r=Array.isArray(e)?e.map(String):[];if(r.length){let o=t.find(s=>r.includes(s));if(o)return o}return n}var Ke={preferences:["decline"],fallback:"decline"},no={preferences:["accept","acceptForSession"],fallback:"acceptForSession"},Kt={preferences:["acceptForSession","accept"],fallback:"acceptForSession"};function We(e,t){return to(e,t.preferences,t.fallback)}function ro(e,t){let n=t?.command,r=Array.isArray(n)?n.join(" "):String(n||"");if(r.trim())return r.replace(/\s+/g," ").trim().slice(0,200);let o=t?.fileChanges||t?.changes,s=o&&typeof o=="object"?Object.keys(o):[];return s.length?s.slice(0,4).join(", "):e==="item/fileChange/requestApproval"?"apply a file change":"run a command"}function Zt({spawnFn:e=Gr,idleCloseMs:t=Wt,requestPermission:n}={}){let r=new Map,o=Vt(),s=c=>{let l=r.get(c);if(l){r.delete(c),clearTimeout(l.idleTimer);try{l.child.kill("SIGTERM")}catch{}}},i=c=>{let l=r.get(c);l&&(clearTimeout(l.idleTimer),l.idleTimer=setTimeout(()=>s(c),t),l.idleTimer.unref?.())},a=async(c,l)=>{let g=r.get(c),m=Xt(l);if(g&&g.fingerprint===m)return g;g&&s(c);let y=e("codex",["app-server"],{cwd:l.cwd,env:Yt(l.mcp?.env),stdio:["pipe","pipe","pipe"]}),S=Zr(y);await S.request("initialize",{clientInfo:{name:"agensis-agent",version:l.clientVersion||"unknown"}}),S.notify("initialized");let f=l.leanCli&&l.mcp?{mcp_servers:{agensis:{url:l.mcp.url,bearer_token_env_var:"AGENSIS_MCP_TOKEN"}}}:void 0,b=await S.request("thread/start",{cwd:l.cwd,ephemeral:l.leanCli||void 0,model:l.model,config:f,...eo(l.permissionMode)}),w={child:y,rpc:S,threadId:b.thread.id,fingerprint:m,idleTimer:null};return r.set(c,w),w};return{run:c=>o(c.sessionKey||"default",async()=>{let{sessionKey:l="default",prompt:g,signal:m,onData:y,timeoutMs:S=0}=c;if(m?.aborted)return{status:null,stdout:"",stderr:"",aborted:!0,error:new Error("cancelled")};let f;try{f=await a(l,c)}catch(N){return{status:null,stdout:"",stderr:"",error:N}}let b="",w="",E=null,_=!1,k=await new Promise(N=>{let M=!1,u=x=>{M||(M=!0,A(),N(x))},h=f.rpc.onMessage((x,$,V)=>{if(V!==void 0){let B=x==="item/commandExecution/requestApproval",J=x==="item/fileChange/requestApproval";if(!B&&!J){f.rpc.respondError(V,`Agensis daemon cannot handle Codex request ${x}`);return}let X=c.permissionMode==="yolo"||J&&c.permissionMode==="accept_edits",I=c.requestPermission||n;if(X||!I){let R=We($?.availableDecisions,X?Kt:Ke);f.rpc.respond(V,{decision:R});return}Promise.resolve(I({jobId:c.job?.id||"",toolName:B?"Codex command":"Codex file change",detail:ro(x,$),description:String($?.reason||"").trim(),input:$||null})).then(R=>{let v=R?.behavior!=="allow"?Ke:R.scope==="once"?no:Kt;f.rpc.respond(V,{decision:We($?.availableDecisions,v)})}).catch(()=>{f.rpc.respond(V,{decision:We($?.availableDecisions,Ke)})});return}if(!(!$||$.threadId!==f.threadId)){if(x==="turn/started"){E=$.turn?.id??E;return}if(!(E&&$.turnId&&$.turnId!==E)){if(x==="item/agentMessage/delta")b+=$.delta||"",y?.($.delta||"");else if(x==="item/completed"&&$.item?.type==="agentMessage")w=$.item.text||w;else if(x==="turn/completed"){let B=$.turn?.status==="failed"||$.turn?.error;u({status:B?1:0,stdout:w||b,stderr:B?String($.turn?.error?.message||$.turn?.error||""):"",error:B?new Error(String($.turn?.error?.message||$.turn?.error||"codex turn failed")):null})}}}}),T=()=>{_=!0,f.rpc.request("turn/interrupt",{threadId:f.threadId}).catch(()=>{});let x={status:null,stdout:b,stderr:"",aborted:!0,error:new Error("cancelled")};u(x),s(l)};m&&m.addEventListener("abort",T,{once:!0});let p=S>0?setTimeout(()=>{let x=new Error(`timed out after ${S}ms`);f.rpc.request("turn/interrupt",{threadId:f.threadId}).catch(()=>{}),u({status:null,stdout:b,stderr:x.message,error:x}),s(l)},S):null;p?.unref?.();function A(){h(),m&&m.removeEventListener("abort",T),p&&clearTimeout(p)}f.rpc.request("turn/start",{threadId:f.threadId,input:[{type:"text",text:g}]}).then(x=>{E=x?.turn?.id||E}).catch(x=>u({status:null,stdout:"",stderr:"",error:x}))});return _||i(l),k}),shutdown:()=>{for(let c of[...r.keys()])s(c)}}}function rn({run:e=Z}={}){return{run:t=>e(t)}}var io=null,ao=null,nn=new Set;function co(e){let t=String(e&&e.message||e||"");return/Cannot find module|ERR_MODULE_NOT_FOUND|ENOENT|command not found/i.test(t)}function lo(e,{local:t,pooled:n,log:r=console}={}){let o=t||rn(),s=n||(e==="claude"?io||=Qt():e==="codex"?ao||=Zt():null);return s?{async run(i){if(nn.has(e))return o.run(i);let a=await s.run(i);return a.error&&co(a.error)?(nn.add(e),r.log?.(`[executor] ${e} fast connection unavailable (${a.error.message}); falling back to subprocess mode for this and future jobs.`),o.run(i)):a}}:o}function uo(e){return{async run({cmd:t,args:n=[],env:r={},onData:o,signal:s,job:i}){let a=null;try{a=await e.ensureEnv({job:i,signal:s}),await e.putRepo(a,{job:i,signal:s});let d=await e.exec(a,{cmd:t,args:n,env:r,onData:o,signal:s}),c=await e.getResult(a,{job:i}).catch(()=>({})),l=c&&c.patch?String(c.patch).trim():"",g=l?`${d.stdout||""}
|
|
30
30
|
|
|
31
31
|
\`\`\`diff
|
|
32
32
|
${l}
|
|
33
|
-
\`\`\``:d.stdout||"";return{status:d.status,stdout:g,stderr:d.stderr||"",error:d.error||null}}catch(d){return{status:null,stdout:"",stderr:"",error:d}}finally{if(a)try{await e.destroy(a)}catch{}}}}}function
|
|
34
|
-
`))>=0;)n(e.slice(0,o)),e=e.slice(o+1)},end(){e&&n(e),e=""},get threadId(){return t},get threadUrl(){return
|
|
33
|
+
\`\`\``:d.stdout||"";return{status:d.status,stdout:g,stderr:d.stderr||"",error:d.error||null}}catch(d){return{status:null,stdout:"",stderr:"",error:d}}finally{if(a)try{await e.destroy(a)}catch{}}}}}function on(e,{makeProvider:t,family:n}={}){return(e&&e.agent&&e.agent.run_mode)==="sandbox"?uo((t||mo)(e)):n==="claude"||n==="codex"?lo(n):rn()}function mo(e){let t=e.agent&&e.agent.sandbox_provider||"e2b",n=e.agent&&e.agent.sandbox_config||{};if(t!=="e2b")throw new Error(`Sandbox provider "${t}" is not available yet (only e2b is wired).`);return po({apiKey:process.env.E2B_API_KEY,anthropicApiKey:process.env.ANTHROPIC_API_KEY,gitToken:process.env.GIT_TOKEN||"",repoUrl:e.repoUrl||e.agent&&e.agent.repo_url||n.repoUrl||"",template:n.template||""})}function fo(e=process.versions.node){let[t,n,r]=String(e).split(".").map(o=>Number(o)||0);return t===21?!1:t>=22?!0:t!==20?!1:n>18?!0:n<18?!1:r>=1}function po(e){let t=null,n=async()=>{if(!t){if(!fo())throw new Error(`Sandbox execution requires Node >=20.18.1 (you have ${process.versions.node}). Upgrade Node to use Sandbox agents; Built-in and Remote daemon modes still work on Node 18.`);t=(await Promise.resolve().then(()=>(tn(),en))).createE2bProvider(e)}return t};return{ensureEnv:async r=>(await n()).ensureEnv(r),putRepo:async(r,o)=>(await n()).putRepo(r,o),exec:async(r,o)=>(await n()).exec(r,o),getResult:async(r,o)=>(await n()).getResult(r,o),destroy:async r=>(await n()).destroy(r)}}import sn from"node:fs/promises";import Oe from"node:path";var Qe="amp",ho=/^T-[A-Za-z0-9-]{20,100}$/,Xe={amp_not_installed:"Amp CLI is not installed on the connected machine. Install Amp, then reconnect this agent.",amp_version_unsupported:"The installed Amp CLI does not support orb execute streaming. Update Amp, then reconnect this agent.",amp_not_authenticated:"Amp is not signed in on the connected machine. Run `amp login` there, then try again.",amp_auth_expired:"The Amp sign-in on the connected machine has expired. Run `amp login` there, then try again.",amp_project_not_found:"This repository is not an Amp project. Create or join its Amp project, then try again.",amp_project_forbidden:"The connected Amp account cannot access this repository project.",amp_repo_not_allowed:"This repository is not allowed by the connected Agensis daemon profile.",amp_insufficient_credit:"The connected Amp account does not have enough credit to start or continue this orb.",amp_orb_provision_failed:"Amp could not provision the orb for this turn.",amp_setup_failed:"The repository `.agents/setup` script exists but is not executable.",amp_thread_not_found:"The Amp thread linked to this conversation no longer exists. Start a new Agensis conversation to create a new thread.",amp_stream_invalid:"Amp completed without returning a valid thread stream.",amp_cli_crashed:"The Amp CLI stopped unexpectedly on the connected machine.",amp_turn_cancelled:"The Amp turn was cancelled.",amp_turn_timed_out:"The Amp turn timed out on the connected machine."};function ee(e,t=""){let n=new Error(Xe[e]||Xe.amp_cli_crashed);return n.code=e,t&&(n.detail=String(t).slice(0,1e3)),n}function an(e){return String(e?.agent?.metadata?.runtime||"").trim().toLowerCase()===Qe}function he(e){let t=String(e||"").trim();return ho.test(t)?t:""}function go(e){let t=he(e);return t?`https://ampcode.com/threads/${t}`:""}function cn({prompt:e,threadId:t="",executable:n="amp"}={}){let r=he(t);return r?{cmd:n,args:["threads","continue",r,"-x",String(e||""),"--stream-json"]}:{cmd:n,args:["-o","-x",String(e||""),"--stream-json","--no-archive-after-execute"]}}function ln(){let e="",t="",n=r=>{try{let o=JSON.parse(String(r).trim()),s=he(o?.session_id||o?.sessionId||o?.thread_id||o?.threadId);s&&(t=s)}catch{}};return{feed(r){e+=String(r||"");let o;for(;(o=e.indexOf(`
|
|
34
|
+
`))>=0;)n(e.slice(0,o)),e=e.slice(o+1)},end(){e&&n(e),e=""},get threadId(){return t},get threadUrl(){return go(t)}}}function $e(e={}){let t=`${e?.error?.message||""}
|
|
35
35
|
${e?.stderr||""}
|
|
36
|
-
${e?.stdout||""}`.trim(),n="amp_cli_crashed";return e?.error?.code==="ENOENT"||/spawn\s+amp\s+ENOENT|command not found/i.test(t)?n="amp_not_installed":e?.aborted===!0||/^cancelled$/i.test(String(e?.error?.message||"").trim())?n="amp_turn_cancelled":/timed out|timeout/i.test(t)?n="amp_turn_timed_out":/(?:auth(?:entication)?|session|token|credential)[^\n]*(?:expired|invalid|revoked)/i.test(t)?n="amp_auth_expired":/not (?:logged|signed) in|not authenticated|please (?:log|sign) ?in|(?:log|sign) ?in (?:to|required)|authentication required|unauthenticated|unauthorized/i.test(t)?n="amp_not_authenticated":/insufficient[^\n]*(?:credit|balance)|(?:credit|balance)[^\n]*(?:exhausted|too low|not enough|run out|out of)|(?:run )?out of[^\n]*(?:credit|balance)|(?:usage|spend)[^\n]*limit[^\n]*(?:exceeded|reached)/i.test(t)?n="amp_insufficient_credit":/thread[^\n]*(?:not found|does not exist|unknown)/i.test(t)?n="amp_thread_not_found":/project[^\n]*(?:forbidden|permission|access denied|not allowed)/i.test(t)?n="amp_project_forbidden":/project[^\n]*(?:not found|does not exist|unmatched)/i.test(t)?n="amp_project_not_found":/\.agents\/setup|setup script/i.test(t)?n="amp_setup_failed":/provision|creating orb|start(?:ing)? orb/i.test(t)&&(n="amp_orb_provision_failed"),{code:n,message:
|
|
37
|
-
${a?.stderr||""}`;if(a?.status!==0||!/--stream-json/.test(d)||!/threads[\s\S]*continue/i.test(d)||!/\borb\b/i.test(d))return
|
|
36
|
+
${e?.stdout||""}`.trim(),n="amp_cli_crashed";return e?.error?.code==="ENOENT"||/spawn\s+amp\s+ENOENT|command not found/i.test(t)?n="amp_not_installed":e?.aborted===!0||/^cancelled$/i.test(String(e?.error?.message||"").trim())?n="amp_turn_cancelled":/timed out|timeout/i.test(t)?n="amp_turn_timed_out":/(?:auth(?:entication)?|session|token|credential)[^\n]*(?:expired|invalid|revoked)/i.test(t)?n="amp_auth_expired":/not (?:logged|signed) in|not authenticated|please (?:log|sign) ?in|(?:log|sign) ?in (?:to|required)|authentication required|unauthenticated|unauthorized/i.test(t)?n="amp_not_authenticated":/insufficient[^\n]*(?:credit|balance)|(?:credit|balance)[^\n]*(?:exhausted|too low|not enough|run out|out of)|(?:run )?out of[^\n]*(?:credit|balance)|(?:usage|spend)[^\n]*limit[^\n]*(?:exceeded|reached)/i.test(t)?n="amp_insufficient_credit":/thread[^\n]*(?:not found|does not exist|unknown)/i.test(t)?n="amp_thread_not_found":/project[^\n]*(?:forbidden|permission|access denied|not allowed)/i.test(t)?n="amp_project_forbidden":/project[^\n]*(?:not found|does not exist|unmatched)/i.test(t)?n="amp_project_not_found":/\.agents\/setup|setup script/i.test(t)?n="amp_setup_failed":/provision|creating orb|start(?:ing)? orb/i.test(t)&&(n="amp_orb_provision_failed"),{code:n,message:Xe[n],detail:t.slice(0,1e3)}}async function un({cwd:e,allowedRoots:t=[]}={}){let n=Oe.resolve(String(e||""));if(!t.map(s=>String(s||"").trim()).filter(Boolean).map(s=>Oe.resolve(s)).includes(n))throw ee("amp_repo_not_allowed");try{await sn.access(Oe.join(n,".git"))}catch{throw ee("amp_repo_not_allowed","cwd is not a Git repository root")}let o=Oe.join(n,".agents","setup");try{let s=await sn.stat(o);if(s.isFile()&&!(s.mode&73))throw ee("amp_setup_failed")}catch(s){if(s?.code!=="ENOENT")throw s}return n}function le(e,t){return{id:Qe,available:!1,version:e,reason:t,project:null}}function yo(e){return!e||typeof e!="object"?null:{id:String(e.id||"").slice(0,160),name:String(e.name||e.slug||"").slice(0,200),repository:String(e.repository||e.repo||e.repositoryUrl||"").slice(0,500)}}async function Ze({cwd:e,executable:t="amp",run:n=Z,signal:r}={}){let o=(m,y=1e4)=>n({cmd:t,args:m,cwd:e,timeoutMs:y,heartbeatMs:0,label:"checking Amp",signal:r}),s=await o(["version"],5e3);if(s?.status!==0){let m=$e(s);return le("",m.code)}let i=String(s.stdout||s.stderr||"").trim().split(/\r?\n/).at(-1)?.slice(0,120)||"",a=await o(["--help"],5e3),d=`${a?.stdout||""}
|
|
37
|
+
${a?.stderr||""}`;if(a?.status!==0||!/--stream-json/.test(d)||!/threads[\s\S]*continue/i.test(d)||!/\borb\b/i.test(d))return le(i,"amp_version_unsupported");let c=await o(["usage"]);if(c?.status!==0){let m=$e(c);return le(i,m.code)}let l=await o(["projects","status","--json"]);if(l?.status!==0){let m=$e(l);return le(i,m.code)}let g;try{g=JSON.parse(String(l.stdout||""))}catch{return le(i,"amp_version_unsupported")}return["forbidden","permission_denied","access_denied"].includes(String(g?.status||"").toLowerCase())?le(i,"amp_project_forbidden"):g?.status!=="matched"||!g?.project?le(i,"amp_project_not_found"):{id:Qe,available:!0,version:i,reason:null,project:yo(g.project)}}function dn(e){let t=$e(e);return ee(t.code,t.detail)}function mn(e={}){let{runJob:t}=e,n=Math.max(1,Number(e.concurrency)||1),r=new Map,o=0,s=[];function i(b){let w=r.get(b);return w||(w={queued:[],active:null},r.set(b,w)),w}function a(b){if(b==null)return!1;for(let w of r.values())if(w.active&&!w.active.cancelled&&w.active.job.key===b||w.queued.some(E=>E.key===b))return!0;return!1}function d(){for(let[b,w]of r){if(o>=n)break;if(w.active||w.queued.length===0)continue;let E=w.queued.shift(),_=new AbortController;w.active={job:E,controller:_,cancelled:!1},o+=1,Promise.resolve().then(()=>_.signal.aborted?void 0:t(E,{signal:_.signal})).catch(()=>{}).finally(()=>{w.active=null,o-=1,w.queued.length===0&&!w.active&&r.delete(b),d(),c()})}}function c(){if(o>0)return;for(let w of r.values())if(w.queued.length)return;let b=s;s=[];for(let w of b)w()}function l(b){if(b&&b.key!=null&&a(b.key))return{accepted:!1,deduped:!0,position:0,startedImmediately:!1};let w=b&&b.lane!=null?String(b.lane):"",E=i(w),_=!E.active&&E.queued.length===0&&o<n;E.queued.push(b);let k=E.queued.length+(E.active?1:0);return d(),{accepted:!0,deduped:!1,position:k,startedImmediately:_}}function g(b,w){let E=!1;for(let[_,k]of r)w!=null&&_!==String(w)||k.active&&(k.active.cancelled=!0,k.active.controller.abort(b||"cancelled"),E=!0);return E}function m(b,w){if(b==null)return!1;let E=!1;for(let[_,k]of[...r]){k.active?.job?.key===b&&(k.active.cancelled=!0,k.active.controller.abort(w||"cancelled"),E=!0);let N=k.queued.length;k.queued=k.queued.filter(M=>M.key!==b),k.queued.length!==N&&(E=!0),!k.active&&k.queued.length===0&&r.delete(_)}return c(),E}function y(){let b=0;for(let w of r.values())b+=w.queued.length;return b}function S(){return o}function f(){return o===0&&y()===0?Promise.resolve():new Promise(b=>s.push(b))}return{enqueue:l,cancel:m,cancelActive:g,has:a,size:y,active:S,idle:f}}import Sn from"node:crypto";import So from"node:http";import wn from"node:os";import re from"node:process";var fn=8787,et="claude-haiku-4-5",wo=/^cbk_[a-z0-9_]+_[A-Z2-9]{18}$/,bo=100,_o=new Set(["say","wave","hush","open","choose"]),Be="x-agensis-bridge-secret";function vo(){return`cbs_${Sn.randomBytes(24).toString("base64url")}`}function Eo(e){let t=e?.headers||{},n=String(t[Be]||t[Be.toLowerCase()]||"").trim();if(n)return n;let o=String(t.authorization||t.Authorization||"").trim().match(/^Bearer\s+(.+)$/i);return o?o[1].trim():""}function ko(e,t){let n=String(t||""),r=Eo(e);if(!n||!r)return!1;let o=Buffer.from(r),s=Buffer.from(n);return o.length!==s.length?!1:Sn.timingSafeEqual(o,s)}function Ao(e={},t={}){let n=String(t.authSecret||"").trim();if(n)return n;let r=String(e.cursorBuddyBridgeSecret||"").trim();if(r)return r;let o=String(re.env.AGENSIS_CURSORBUDDY_BRIDGE_SECRET||"").trim();return o||vo()}function Io(e,t){return e==="OPTIONS"||e==="GET"&&t==="/cursorbuddy/health"}function F(e,t,n){e.writeHead(t,{"content-type":"application/json","access-control-allow-origin":"*","access-control-allow-methods":"GET, POST, OPTIONS","access-control-allow-headers":"content-type, authorization, x-agensis-bridge-secret"}),e.end(JSON.stringify(n))}function pn(e){e.writeHead(200,{"content-type":"text/event-stream; charset=utf-8","cache-control":"no-store, no-transform",connection:"keep-alive","access-control-allow-origin":"*","access-control-allow-methods":"GET, POST, OPTIONS","access-control-allow-headers":"content-type, authorization, x-agensis-bridge-secret","x-accel-buffering":"no"})}function W(e,t){e.write(`data: ${typeof t=="string"?t:JSON.stringify(t)}
|
|
38
38
|
|
|
39
|
-
`)}function
|
|
39
|
+
`)}function _e(e){return new Promise((t,n)=>{let r="";e.on("data",o=>{r+=o,r.length>256*1024&&(n(new Error("request body is too large")),e.destroy())}),e.on("error",n),e.on("end",()=>t(r))})}function xo(e){let t=[],n="",r="",o=!1;for(let s of String(e||"")){if(o){n+=s,o=!1;continue}if(s==="\\"){o=!0;continue}if(r){s===r?r="":n+=s;continue}if(s==='"'||s==="'"){r=s;continue}if(/\s/.test(s)){n&&(t.push(n),n="");continue}n+=s}if(n&&t.push(n),!t.length)throw new Error("coding command is empty");return{cmd:t[0],args:t.slice(1)}}function Co(e){return/(^|\/)claude(?:$|\.)/.test(String(e||""))}function De(e,t){return e.some(n=>n===t||String(n).startsWith(`${t}=`))}function hn(e,t){let n=[];t&&n.push("CursorBuddy local runtime context:",JSON.stringify(t,null,2),"");for(let r of Array.isArray(e)?e:[]){let o=String(r?.role||"user"),s=String(r?.content||"");s.trim()&&n.push(`${o.toUpperCase()}:
|
|
40
40
|
${s}`)}return n.join(`
|
|
41
41
|
|
|
42
|
-
`).trim()||"Say that the local Agensis runtime is connected."}function
|
|
43
|
-
`))>=0;)d(t.slice(0,l)),t=t.slice(l+1)},end(){t&&(d(t),t="")},get live(){return r?n:o},get result(){return s??(r?n:o)}}}function fe(e,t,n,r=null){return{id:e,object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:t,choices:[{index:0,delta:n?{content:n}:{},finish_reason:r}]}}function Oe(e){return`http://127.0.0.1:${e}`}function Io(e={},t={}){return String(t.agensisUrl||t.baseUrl||e.url||ee.env.AGENSIS_URL||"https://agensis.io").trim().replace(/\/+$/,"")}function xo(e){return String(e||"").slice(0,18)}function U(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}function Co(e={},t={},n={}){let r=U(e.metadata)||{},o=U(e.page)||U(r.page)||{},s=U(e.client)||U(r.client)||{},i=U(r.runtime)||{},a=U(e.manifest)||U(r.manifest)||null;return{url:String(e.url||o.url||r.websiteSource||e.websiteSource||"").slice(0,2048),title:String(e.title||o.title||"").slice(0,300),surface:String(e.surface||i.surface||t.surface||"").slice(0,80),instanceId:String(e.instanceId||i.instanceId||"").slice(0,140),workspaceId:String(t.workspaceId||e.workspaceId||n.workspace||"").slice(0,120),agentId:String(t.agentId||e.agentId||n.agent||"").slice(0,120),runtime:{...i,local:!0,connected:!0,connection:t},page:o,client:s,project:U(e.project)||U(r.project)||null,manifest:a,selection:U(e.selection)||null,updatedAt:new Date().toISOString()}}function To(e,t){return t?.error?.message||t?.message||`CursorBuddy key claim failed with HTTP ${e.status}`}async function Mo(e,t={},n=globalThis.fetch){let r=String(t.key||"").trim();if(!uo.test(r))throw new Error("Connection key format is invalid. Create a fresh CursorBuddy key first.");if(typeof n!="function")throw new Error("This Node.js runtime does not provide fetch; use a current Node.js release.");let o=Io(e,t),s=await n(`${o}/backend/cursorbuddy/connection-keys/claim`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({key:r,baseUrl:o,host:hn.hostname(),cwd:t.cwd||e.cwd||ee.cwd(),name:t.name||e.name||e.handle||"CursorBuddy runtime",surface:t.surface||"browser_extension",scope:t.scope||"machine",runtimeKind:t.runtimeKind||"agensis-cli-local-bridge",version:t.version||e.version||ee.env.npm_package_version||"",permissionMode:t.permissionMode||e.permissionMode,model:t.model||e.model,metadata:U(t.metadata)||null,websiteSource:t.websiteSource||t.metadata?.websiteSource||"",page:U(t.page)||U(t.metadata?.page)||null,client:U(t.client)||U(t.metadata?.client)||null,manifest:U(t.manifest)||U(t.metadata?.manifest)||null})}),i=await s.json().catch(()=>({}));if(!s.ok)throw new Error(To(s,i));return{key:r,baseUrl:o,data:i?.data||i}}async function Sn(e,t={}){let n=Number(t.port??e.cursorBuddyPort??ee.env.AGENSIS_CURSORBUDDY_PORT??ln),r=yo(e,t),o=new Date().toISOString(),s=[],i=[],a=new Set,d=t.fetchImpl||globalThis.fetch,c=1,l=null,g=n,m=null,y=(u,h={})=>{let M={ts:new Date().toISOString(),event:u,detail:h};return s.push(M),s.length>200&&s.shift(),t.log?.(`CursorBuddy local bridge: ${u}${Object.keys(h).length?` ${JSON.stringify(h)}`:""}`),M},S=()=>({connected:!!e.cursorBuddyRuntime,mode:e.cursorBuddyRuntime?"agensis-cli":"agensis-cli-unclaimed",agentId:e.agent,workspaceId:e.workspace,agensisUrl:e.url,handle:e.handle,name:e.name,cwd:e.cwd,updatedAt:new Date().toISOString()}),f=()=>{if(typeof t.connectionProvider!="function")return null;try{let u=t.connectionProvider();return!u||typeof u!="object"||Array.isArray(u)?null:{...S(),...u,connected:u.connected===!0}}catch{return null}},b=()=>{let u=f();return u?.connected===!1?u:m?{...S(),...u||{},...m,connected:!0,updatedAt:u?.updatedAt||m.updatedAt}:u||S()};function w(u={}){if(!u||typeof u!="object"||Array.isArray(u))return null;let h=String(u.action||u.type||"").trim().toLowerCase();if(!fo.has(h))return null;let M={id:c++,ts:new Date().toISOString(),action:h,text:String(u.text||u.say||u.message||"").slice(0,1200),label:String(u.label||"").slice(0,80),value:String(u.value||u.prompt||"").slice(0,1200),holdMs:Number.isFinite(u.holdMs)?Math.max(0,Math.min(6e4,u.holdMs)):void 0,source:String(u.source||"agensis-daemon").slice(0,80)};return u.options&&Array.isArray(u.options)&&(M.options=u.options.map(p=>({label:String(p?.label||"").slice(0,80),value:String(p?.value||p?.task||"").slice(0,1200)})).filter(p=>p.label).slice(0,6)),M}function E(u){for(i.push(u);i.length>mo;)i.shift();y("control",{id:u.id,action:u.action,chars:u.text.length});for(let h of[...a])try{z(h,{type:"command",command:u})}catch{a.delete(h)}return u}function v(u){let h=Eo(u);if(h){let M=w(h.command);return M&&(E(M),y("chat_control",{id:M.id,action:M.action})),{content:h.content,model:"cursorbuddy-local-control",fast:!0}}return null}async function A(u){let h=v(u);if(h)return h;let M=dn(u?.messages,l),p=fn(e,M,u?.model),I=await V({cmd:p.cmd,args:p.args,cwd:e.cwd,timeoutMs:Math.min(Number(e.timeoutMs||18e5),5*60*1e3),heartbeatMs:e.heartbeatMs,label:"cursorbuddy local chat",input:p.stdin});if(I.error||I.status!==0)throw new Error(I.error?.message||String(I.stderr||"").trim()||`Command exited with status ${I.status}`);return{content:mn(I.stdout||I.stderr),model:p.model}}async function N(u,h){let M=`agensis-cursorbuddy-${Date.now()}`,p=v(u);if(p){let x=p.model||"cursorbuddy-local-control";return z(h,fe(M,x,p.content)),z(h,fe(M,x,"","stop")),z(h,"[DONE]"),y("chat_fast",{chars:p.content.length,model:x}),{content:p.content,model:x,fast:!0}}let I=dn(u?.messages,l),k=fn(e,I,u?.model,{stream:!0}),$="",q=x=>{x&&($+=x,z(h,fe(M,k.model||e.model,x)))},T=k.streamJson?Ao(q):null,R=await V({cmd:k.cmd,args:k.args,cwd:e.cwd,timeoutMs:Math.min(Number(e.timeoutMs||18e5),5*60*1e3),heartbeatMs:e.heartbeatMs,label:"cursorbuddy local chat",input:k.stdin,onData:x=>{if(T)T.feed(x);else{let B=String(x||"");$+=B,z(h,fe(M,k.model||e.model,B))}}});if(T){T.end();let x=T.result||"";!$&&x?q(x):$=x||$}if(R.error||R.status!==0){let x=R.error?.message||String(R.stderr||"").trim()||`Command exited with status ${R.status}`;throw new Error(x)}let _=T?$:mn($||R.stdout||R.stderr);return!T&&_&&_!==$&&(z(h,fe(M,k.model||e.model,_)),$=_),z(h,fe(M,k.model||e.model,"","stop")),z(h,"[DONE]"),{content:$||_,model:k.model}}let O=lo.createServer(async(u,h)=>{if(h.setHeader("access-control-allow-origin","*"),h.setHeader("access-control-allow-methods","GET, POST, OPTIONS"),h.setHeader("access-control-allow-headers","content-type, authorization, x-agensis-bridge-secret"),u.method==="OPTIONS"){h.writeHead(204),h.end();return}let M=new URL(u.url||"/",Oe(g||ln));if(!So(u.method,M.pathname)&&!go(u,r)){F(h,401,{ok:!1,error:"Authentication required",code:"bridge_auth_required"});return}if(u.method==="GET"&&M.pathname==="/cursorbuddy/health"){let p=Oe(g);F(h,200,{ok:!0,runtime:"agensis-cli",backend:e.codingCmd,model:Qe(e),daemonModel:e.model,port:g,host:hn.hostname(),pid:ee.pid,bootedAt:o,authRequired:!0,authHeader:$e,stream:!0,streaming:!0,supportsStreaming:!0,chatStream:!0,capabilities:{chatStream:!0,controlStream:!0,fastAvatarReplies:!1,nativeCursorBuddyControl:!0},latestControlId:i.at(-1)?.id||0,connection:b(),context:l,endpoints:{chat:`${p}/v1/chat/completions`,chatStream:`${p}/v1/chat/completions`,edit:`${p}/cursorbuddy/edit`,context:`${p}/cursorbuddy/context`,control:`${p}/cursorbuddy/control`,controlStream:`${p}/cursorbuddy/control/stream`,logs:`${p}/cursorbuddy/logs`}});return}if(u.method==="GET"&&M.pathname==="/cursorbuddy/logs"){F(h,200,{ok:!0,events:s.slice(-100)});return}if(u.method==="GET"&&M.pathname==="/cursorbuddy/context"){F(h,200,{ok:!0,context:l});return}if(u.method==="GET"&&M.pathname==="/cursorbuddy/control"){let p=Number(M.searchParams.get("after")||0),I=i.filter(k=>k.id>p);F(h,200,{ok:!0,commands:I,latestId:i.at(-1)?.id||0});return}if(u.method==="GET"&&M.pathname==="/cursorbuddy/control/stream"){let p=Number(M.searchParams.get("after")||0);un(h),a.add(h),z(h,{type:"ready",latestId:i.at(-1)?.id||0});for(let k of i.filter($=>$.id>p))z(h,{type:"command",command:k});let I=setInterval(()=>{try{z(h,{type:"ping",ts:new Date().toISOString()})}catch{a.delete(h),clearInterval(I)}},15e3);I.unref&&I.unref(),u.on("close",()=>{a.delete(h),clearInterval(I)});return}if(u.method==="POST"&&M.pathname==="/cursorbuddy/control"){try{let p=JSON.parse(await Se(u)||"{}"),I=w(p);if(!I){F(h,400,{ok:!1,error:"unsupported CursorBuddy control command"});return}let k=E(I);F(h,200,{ok:!0,command:k})}catch(p){y("control_error",{error:String(p?.message||p)}),F(h,400,{ok:!1,error:String(p?.message||p)})}return}if(u.method==="POST"&&M.pathname==="/cursorbuddy/context"){try{let p=JSON.parse(await Se(u)||"{}");l={url:String(p.url||"").slice(0,2048),title:String(p.title||"").slice(0,300),surface:String(p.surface||"").slice(0,80),instanceId:String(p.instanceId||"").slice(0,140),workspaceId:String(p.workspaceId||e.workspace||"").slice(0,120),agentId:String(p.agentId||e.agent||"").slice(0,120),runtime:p.runtime&&typeof p.runtime=="object"?p.runtime:null,page:p.page&&typeof p.page=="object"?p.page:null,client:p.client&&typeof p.client=="object"?p.client:null,project:p.project&&typeof p.project=="object"?p.project:null,manifest:p.manifest&&typeof p.manifest=="object"?p.manifest:null,selection:p.selection&&typeof p.selection=="object"?p.selection:null,updatedAt:new Date().toISOString()},y("context",{url:l.url,surface:l.surface,instanceId:l.instanceId}),F(h,200,{ok:!0,context:l})}catch(p){y("context_error",{error:String(p?.message||p)}),F(h,400,{ok:!1,error:String(p?.message||p)})}return}if(u.method==="POST"&&M.pathname==="/cursorbuddy/connect"){try{let p=JSON.parse(await Se(u)||"{}"),I=await Mo(e,p,d),k=I.data||{};m={connected:!0,mode:"agensis-claimed",keyId:xo(I.key),agentId:String(k.agentId||k.agent?.id||e.agent||""),workspaceId:String(k.workspaceId||k.workspace_id||k.agent?.workspace_id||e.workspace||""),agensisUrl:I.baseUrl,handle:String(k.handle||k.agent?.handle||e.handle||""),name:String(k.agent?.name||p.name||e.name||"CursorBuddy runtime"),cwd:String(p.cwd||e.cwd||ee.cwd()),surface:String(p.surface||"browser_extension"),command:String(k.command||k.localCommand||""),updatedAt:new Date().toISOString()},l=Co(p,m,e),y("connect",{mode:m.mode,keyId:m.keyId,agentId:m.agentId,workspaceId:m.workspaceId,url:l.url}),F(h,200,{ok:!0,connection:m,claim:k})}catch(p){y("connect_error",{error:String(p?.message||p)}),F(h,400,{ok:!1,error:String(p?.message||p)})}return}if(u.method==="POST"&&M.pathname==="/cursorbuddy/edit"){try{let p=JSON.parse(await Se(u)||"{}"),I=[{role:"system",content:"You are the local CursorBuddy edit agent. The user selected a DOM element in their own site. Use the payload to inspect and change the local checkout, then report what changed."},{role:"user",content:JSON.stringify(p,null,2)}];y("edit_request",{selector:p?.target?.selector||""});let k=await A({messages:I,model:p?.model});y("edit_done",{chars:k.content.length}),F(h,200,{ok:!0,backend:e.codingCmd,cwd:e.cwd,content:k.content})}catch(p){y("edit_error",{error:String(p?.message||p)}),F(h,500,{ok:!1,error:String(p?.message||p)})}return}if(u.method==="POST"&&M.pathname.endsWith("/chat/completions")){try{let p=JSON.parse(await Se(u)||"{}");if(y("chat_request",{messages:Array.isArray(p.messages)?p.messages.length:0,model:gn(p.model,Qe(e))}),p.stream===!0){un(h);let k=await N(p,h);y("chat_done",{chars:k.content.length,stream:!0,fast:k.fast===!0}),h.end();return}let I=await A(p);y("chat_done",{chars:I.content.length,fast:I.fast===!0}),F(h,200,{id:`agensis-cursorbuddy-${Date.now()}`,object:"chat.completion",model:I.model||p.model||e.model,choices:[{index:0,message:{role:"assistant",content:I.content},finish_reason:"stop"}],usage:{prompt_tokens:0,completion_tokens:0,total_tokens:0}})}catch(p){y("chat_error",{error:String(p?.message||p)}),F(h,500,{error:{message:String(p?.message||p)}})}return}h.writeHead(404),h.end("CursorBuddy local bridge")});return await new Promise((u,h)=>{O.once("error",h),O.listen(n,"127.0.0.1",()=>{g=O.address().port,O.off("error",h),u()})}),y("listening",{url:`${Oe(g)}/cursorbuddy/health`}),{port:g,url:Oe(g),secret:r,authHeader:$e,close(){return new Promise(u=>O.close(()=>u()))},getContext(){return l}}}import pe from"node:fs/promises";import No from"node:os";import W from"node:path";var wn=200,bn=256*1024,Oo=2,$o=new Set([".md",".markdown",".txt"]);function Do(e){return String(e||"").replace(/[^a-zA-Z0-9]/g,"-")}function Ze({cwd:e,memoryDir:t,homedir:n=No.homedir()}={}){let r=String(t||"").trim();if(r)return r.startsWith("~")?W.join(n,r.slice(1)):W.resolve(r);let o=String(e||"").trim();return o?W.join(n,".claude","projects",Do(o),"memory"):null}async function et(e){if(!e)return null;try{let t=await pe.realpath(e);return(await pe.stat(t)).isDirectory()?t:null}catch{return null}}async function Ro(e,t){if(!e)throw new Error("memory root unavailable");let n=W.isAbsolute(String(t))?String(t):W.join(e,String(t)),r=await pe.realpath(n),o=e.endsWith(W.sep)?e:e+W.sep;if(r!==e&&!r.startsWith(o))throw new Error(`path escapes memory root: ${t}`);return r}function Bo(e){let t=W.basename(e).toLowerCase();return t==="memory.md"?"index":t==="claude.md"?"instructions":"memory"}async function tt(e,t,n,r){if(n>Oo||r.length>=wn)return;let o;try{o=await pe.readdir(t,{withFileTypes:!0})}catch{return}for(let s of o){if(r.length>=wn)break;if(s.name.startsWith("."))continue;let i=W.join(t,s.name);if(s.isDirectory())await tt(e,i,n+1,r);else if(s.isFile()&&$o.has(W.extname(s.name).toLowerCase())){let a=W.relative(e,i);r.push({path:a,kind:Bo(a)})}}}async function Po(e){let t=await et(e);if(!t)return[];let n=[];return await tt(t,t,0,n),n.sort((r,o)=>r.kind==="index"?-1:o.kind==="index"?1:r.path.localeCompare(o.path)),n}async function Lo(e,t){let n=await et(e),r=await Ro(n,t),o=await pe.readFile(r),s=o.length>bn;return{content:o.subarray(0,bn).toString("utf8"),byteSize:o.length,truncated:s}}async function _n(e){let t=await et(e);if(!t)return"";let n=[];await tt(t,t,0,n),n.sort((o,s)=>o.path.localeCompare(s.path));let r=[];for(let o of n)try{let s=await pe.stat(W.join(t,o.path));r.push(`${o.path}:${s.size}:${Math.floor(s.mtimeMs)}`)}catch{}return r.join("|")}async function vn(e){let t=await Po(e),n=[];for(let r of t)try{let{content:o,byteSize:s}=await Lo(e,r.path);n.push({path:r.path,kind:r.kind,content:o,byteSize:s})}catch{}return n}import rt from"node:fs";import te from"node:path";import En from"node:os";function Uo(e){try{return rt.statSync(e).isDirectory()}catch{return!1}}function jo(e){try{return rt.statSync(e).isFile()}catch{return!1}}function nt(e){try{return rt.readdirSync(e,{withFileTypes:!0})}catch{return[]}}function kn({home:e=En.homedir(),cwd:t=process.cwd()}={}){let n=[e&&te.join(e,".claude","commands"),t&&te.join(t,".claude","commands")].filter(Boolean),r=new Set,o=[],s=(i,a)=>{if(!i)return;let d=a?`${a}:${i}`:i;r.has(d)||(r.add(d),o.push({name:i,parent:a||null}))};for(let i of n)for(let a of nt(i)){if(a.name.startsWith("."))continue;if(a.name.endsWith(".md")){s(a.name.slice(0,-3),null);continue}let d=te.join(i,a.name);if(a.isDirectory()||a.isSymbolicLink()&&Uo(d))for(let c of nt(d))c.name.startsWith(".")||c.name.endsWith(".md")&&s(c.name.slice(0,-3),a.name)}return o}function ot({home:e=En.homedir(),cwd:t=process.cwd()}={}){let n=[e&&te.join(e,".claude","skills"),e&&te.join(e,".codex","skills"),t&&te.join(t,".claude","skills")].filter(Boolean),r=new Map,o=(s,i)=>{!s||r.has(s)||r.set(s,{name:s,file:i||""})};for(let s of n)for(let i of nt(s)){if(i.name.startsWith("."))continue;let a=te.join(s,i.name);if(i.name.endsWith(".md"))o(i.name.slice(0,-3),a);else if(i.isDirectory()||i.isSymbolicLink()){let d=te.join(a,"SKILL.md");o(i.name,jo(d)?d:"")}}return[...r.values()].sort((s,i)=>s.name<i.name?-1:s.name>i.name?1:0)}function An(e={}){return ot(e).map(t=>t.name)}import st from"node:fs/promises";var he=64*1024,Fo=200,xn=4*1024*1024,Go=2e3,Ho=512;function In(e,t,n=he){let r=`
|
|
42
|
+
`).trim()||"Say that the local Agensis runtime is connected."}function gn(e){let t=String(e||"").trim();if(!t)return"";try{let n=JSON.parse(t);if(typeof n?.result=="string")return n.result;if(typeof n?.message=="string")return n.message;if(typeof n?.content=="string")return n.content}catch{}return t}function To(e){let t=Array.isArray(e?.messages)?e.messages:[];for(let n=t.length-1;n>=0;n-=1){let r=t[n];if(String(r?.role||"user")!=="user")continue;let o=String(r?.content||"").trim();if(o)return o}return""}function Mo(e,t=280){let n=To(e).replace(/\s+/g," ").trim();if(!n)return"";if(n.length<=t)return n;let r=[/\b(tell me (?:a )?joke)\b/i,/\b(make (?:him|the buddy|cursorbuddy|avatar) wave|wave(?: hello)?|say hi|say hello)\b/i,/\b(what site|which site|what page|where am i|where are you|current url)\b/i,/\b(are you connected|connected|working|online|there)\b/i,/\b(show|guide|tour|walk|around|sections?|features?|important|highlight|what can i do|what should i do|help me)\b/i,/\b(open|show|bring up|get back|display)\b.{0,80}\b(prompt|bubble|dialog|panel|options|menu)\b/i,/\b(hide|hush|close|dismiss|clear|stop|cancel|be quiet)\b.{0,80}\b(bubble|prompt|dialog|panel|options|menu)?\b/i,/^(hi|hello|hey|yo|sup)\b/i];for(let o of r){let s=n.match(o);if(s?.[0])return s[0].trim()}return n.slice(-t).trim()}function No(e){let t=Mo(e);if(!t)return null;if(/\b(?:him|the buddy|cursorbuddy|cursor buddy|avatar|buddy|pet|character)\b/i.test(t)&&/\bwave(?: hello)?\b/i.test(t))return{content:"Waving now.",command:{action:"wave",text:"Hi. How can I help?",source:"chat"}};let r=t.match(/^(?:say|speak)\s+(.{1,180})$/i)||t.match(/\b(?:make|tell)\s+(?:him|the buddy|cursorbuddy|avatar)\s+(?:say|speak)\s+(.{1,180})$/i);return r?.[1]?{content:"Saying it now.",command:{action:"say",text:r[1].trim(),source:"chat"}}:/^(stop|cancel|dismiss|close|hide|hush|be quiet)\b/i.test(t)?{content:"Closed.",command:{action:"hush",source:"chat"}}:/\b(open|show)\b.*\b(options|chat|bubble|prompt)\b/i.test(t)?{content:"Opening options.",command:{action:"open",text:"What should I help with?",source:"chat"}}:null}function Oo(e){let t=String(e||"").trim();return t?/\s/.test(t)||t.startsWith("-")?!0:/^(claude|codex|node|npm|bun|python|python3|sh|bash|zsh)(?:$|\.)/.test(t):!1}function bn(e,t){let n=String(e||"").trim();return!n||Oo(n)?t:n}function _n(e){let t=String(e||"").trim();return!t||t==="haiku-4.5"||t==="claude-haiku-4.5"?et:t}function tt(e={}){return _n(e.cursorBuddyModel||re.env.AGENSIS_CURSORBUDDY_MODEL||et)}function yn(e,t,n,r={}){let{cmd:o,args:s}=xo(e.codingCmd||"claude -p"),i=[...s],a=_n(bn(n,tt(e))),d="",c=!1;return Co(o)?(a&&!De(i,"--model")&&i.push("--model",a),r.stream===!0&&!De(i,"--output-format")?(i.push("--output-format","stream-json","--include-partial-messages"),De(i,"--verbose")||i.push("--verbose"),c=!0):(De(i,"--output-format")||i.push("--output-format","json"),c=i.some(g=>String(g).includes("stream-json"))),d=t):i.push(t),{cmd:o,args:i,model:a,stdin:d,streamJson:c}}function $o(e=()=>{}){let t="",n="",r=!1,o="",s=null,i=c=>{c&&e(c)},a=c=>{if(!c||typeof c!="object")return;let l=c.event&&c.event.delta||c.delta;if(l&&l.type==="text_delta"&&typeof l.text=="string"){r=!0,n+=l.text,i(l.text);return}if(c.type==="result"&&typeof c.result=="string"){s=c.result;return}if(c.type==="assistant"&&c.message&&Array.isArray(c.message.content)){let g=c.message.content.filter(m=>m&&m.type==="text"&&typeof m.text=="string").map(m=>m.text).join("");g&&(o+=g)}},d=c=>{let l=String(c).trim();if(l)try{a(JSON.parse(l))}catch{}};return{feed(c){t+=String(c||"");let l;for(;(l=t.indexOf(`
|
|
43
|
+
`))>=0;)d(t.slice(0,l)),t=t.slice(l+1)},end(){t&&(d(t),t="")},get live(){return r?n:o},get result(){return s??(r?n:o)}}}function ge(e,t,n,r=null){return{id:e,object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:t,choices:[{index:0,delta:n?{content:n}:{},finish_reason:r}]}}function Re(e){return`http://127.0.0.1:${e}`}function Do(e={},t={}){return String(t.agensisUrl||t.baseUrl||e.url||re.env.AGENSIS_URL||"https://agensis.io").trim().replace(/\/+$/,"")}function Ro(e){return String(e||"").slice(0,18)}function j(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}function Bo(e={},t={},n={}){let r=j(e.metadata)||{},o=j(e.page)||j(r.page)||{},s=j(e.client)||j(r.client)||{},i=j(r.runtime)||{},a=j(e.manifest)||j(r.manifest)||null;return{url:String(e.url||o.url||r.websiteSource||e.websiteSource||"").slice(0,2048),title:String(e.title||o.title||"").slice(0,300),surface:String(e.surface||i.surface||t.surface||"").slice(0,80),instanceId:String(e.instanceId||i.instanceId||"").slice(0,140),workspaceId:String(t.workspaceId||e.workspaceId||n.workspace||"").slice(0,120),agentId:String(t.agentId||e.agentId||n.agent||"").slice(0,120),runtime:{...i,local:!0,connected:!0,connection:t},page:o,client:s,project:j(e.project)||j(r.project)||null,manifest:a,selection:j(e.selection)||null,updatedAt:new Date().toISOString()}}function Po(e,t){return t?.error?.message||t?.message||`CursorBuddy key claim failed with HTTP ${e.status}`}async function Lo(e,t={},n=globalThis.fetch){let r=String(t.key||"").trim();if(!wo.test(r))throw new Error("Connection key format is invalid. Create a fresh CursorBuddy key first.");if(typeof n!="function")throw new Error("This Node.js runtime does not provide fetch; use a current Node.js release.");let o=Do(e,t),s=await n(`${o}/backend/cursorbuddy/connection-keys/claim`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({key:r,baseUrl:o,host:wn.hostname(),cwd:t.cwd||e.cwd||re.cwd(),name:t.name||e.name||e.handle||"CursorBuddy runtime",surface:t.surface||"browser_extension",scope:t.scope||"machine",runtimeKind:t.runtimeKind||"agensis-cli-local-bridge",version:t.version||e.version||re.env.npm_package_version||"",permissionMode:t.permissionMode||e.permissionMode,model:t.model||e.model,metadata:j(t.metadata)||null,websiteSource:t.websiteSource||t.metadata?.websiteSource||"",page:j(t.page)||j(t.metadata?.page)||null,client:j(t.client)||j(t.metadata?.client)||null,manifest:j(t.manifest)||j(t.metadata?.manifest)||null})}),i=await s.json().catch(()=>({}));if(!s.ok)throw new Error(Po(s,i));return{key:r,baseUrl:o,data:i?.data||i}}async function vn(e,t={}){let n=Number(t.port??e.cursorBuddyPort??re.env.AGENSIS_CURSORBUDDY_PORT??fn),r=Ao(e,t),o=new Date().toISOString(),s=[],i=[],a=new Set,d=t.fetchImpl||globalThis.fetch,c=1,l=null,g=n,m=null,y=(u,h={})=>{let T={ts:new Date().toISOString(),event:u,detail:h};return s.push(T),s.length>200&&s.shift(),t.log?.(`CursorBuddy local bridge: ${u}${Object.keys(h).length?` ${JSON.stringify(h)}`:""}`),T},S=()=>({connected:!!e.cursorBuddyRuntime,mode:e.cursorBuddyRuntime?"agensis-cli":"agensis-cli-unclaimed",agentId:e.agent,workspaceId:e.workspace,agensisUrl:e.url,handle:e.handle,name:e.name,cwd:e.cwd,updatedAt:new Date().toISOString()}),f=()=>{if(typeof t.connectionProvider!="function")return null;try{let u=t.connectionProvider();return!u||typeof u!="object"||Array.isArray(u)?null:{...S(),...u,connected:u.connected===!0}}catch{return null}},b=()=>{let u=f();return u?.connected===!1?u:m?{...S(),...u||{},...m,connected:!0,updatedAt:u?.updatedAt||m.updatedAt}:u||S()};function w(u={}){if(!u||typeof u!="object"||Array.isArray(u))return null;let h=String(u.action||u.type||"").trim().toLowerCase();if(!_o.has(h))return null;let T={id:c++,ts:new Date().toISOString(),action:h,text:String(u.text||u.say||u.message||"").slice(0,1200),label:String(u.label||"").slice(0,80),value:String(u.value||u.prompt||"").slice(0,1200),holdMs:Number.isFinite(u.holdMs)?Math.max(0,Math.min(6e4,u.holdMs)):void 0,source:String(u.source||"agensis-daemon").slice(0,80)};return u.options&&Array.isArray(u.options)&&(T.options=u.options.map(p=>({label:String(p?.label||"").slice(0,80),value:String(p?.value||p?.task||"").slice(0,1200)})).filter(p=>p.label).slice(0,6)),T}function E(u){for(i.push(u);i.length>bo;)i.shift();y("control",{id:u.id,action:u.action,chars:u.text.length});for(let h of[...a])try{W(h,{type:"command",command:u})}catch{a.delete(h)}return u}function _(u){let h=No(u);if(h){let T=w(h.command);return T&&(E(T),y("chat_control",{id:T.id,action:T.action})),{content:h.content,model:"cursorbuddy-local-control",fast:!0}}return null}async function k(u){let h=_(u);if(h)return h;let T=hn(u?.messages,l),p=yn(e,T,u?.model),A=await Z({cmd:p.cmd,args:p.args,cwd:e.cwd,timeoutMs:Math.min(Number(e.timeoutMs||18e5),5*60*1e3),heartbeatMs:e.heartbeatMs,label:"cursorbuddy local chat",input:p.stdin});if(A.error||A.status!==0)throw new Error(A.error?.message||String(A.stderr||"").trim()||`Command exited with status ${A.status}`);return{content:gn(A.stdout||A.stderr),model:p.model}}async function N(u,h){let T=`agensis-cursorbuddy-${Date.now()}`,p=_(u);if(p){let I=p.model||"cursorbuddy-local-control";return W(h,ge(T,I,p.content)),W(h,ge(T,I,"","stop")),W(h,"[DONE]"),y("chat_fast",{chars:p.content.length,model:I}),{content:p.content,model:I,fast:!0}}let A=hn(u?.messages,l),x=yn(e,A,u?.model,{stream:!0}),$="",V=I=>{I&&($+=I,W(h,ge(T,x.model||e.model,I)))},B=x.streamJson?$o(V):null,J=await Z({cmd:x.cmd,args:x.args,cwd:e.cwd,timeoutMs:Math.min(Number(e.timeoutMs||18e5),5*60*1e3),heartbeatMs:e.heartbeatMs,label:"cursorbuddy local chat",input:x.stdin,onData:I=>{if(B)B.feed(I);else{let R=String(I||"");$+=R,W(h,ge(T,x.model||e.model,R))}}});if(B){B.end();let I=B.result||"";!$&&I?V(I):$=I||$}if(J.error||J.status!==0){let I=J.error?.message||String(J.stderr||"").trim()||`Command exited with status ${J.status}`;throw new Error(I)}let X=B?$:gn($||J.stdout||J.stderr);return!B&&X&&X!==$&&(W(h,ge(T,x.model||e.model,X)),$=X),W(h,ge(T,x.model||e.model,"","stop")),W(h,"[DONE]"),{content:$||X,model:x.model}}let M=So.createServer(async(u,h)=>{if(h.setHeader("access-control-allow-origin","*"),h.setHeader("access-control-allow-methods","GET, POST, OPTIONS"),h.setHeader("access-control-allow-headers","content-type, authorization, x-agensis-bridge-secret"),u.method==="OPTIONS"){h.writeHead(204),h.end();return}let T=new URL(u.url||"/",Re(g||fn));if(!Io(u.method,T.pathname)&&!ko(u,r)){F(h,401,{ok:!1,error:"Authentication required",code:"bridge_auth_required"});return}if(u.method==="GET"&&T.pathname==="/cursorbuddy/health"){let p=Re(g);F(h,200,{ok:!0,runtime:"agensis-cli",backend:e.codingCmd,model:tt(e),daemonModel:e.model,port:g,host:wn.hostname(),pid:re.pid,bootedAt:o,authRequired:!0,authHeader:Be,stream:!0,streaming:!0,supportsStreaming:!0,chatStream:!0,capabilities:{chatStream:!0,controlStream:!0,fastAvatarReplies:!1,nativeCursorBuddyControl:!0},latestControlId:i.at(-1)?.id||0,connection:b(),context:l,endpoints:{chat:`${p}/v1/chat/completions`,chatStream:`${p}/v1/chat/completions`,edit:`${p}/cursorbuddy/edit`,context:`${p}/cursorbuddy/context`,control:`${p}/cursorbuddy/control`,controlStream:`${p}/cursorbuddy/control/stream`,logs:`${p}/cursorbuddy/logs`}});return}if(u.method==="GET"&&T.pathname==="/cursorbuddy/logs"){F(h,200,{ok:!0,events:s.slice(-100)});return}if(u.method==="GET"&&T.pathname==="/cursorbuddy/context"){F(h,200,{ok:!0,context:l});return}if(u.method==="GET"&&T.pathname==="/cursorbuddy/control"){let p=Number(T.searchParams.get("after")||0),A=i.filter(x=>x.id>p);F(h,200,{ok:!0,commands:A,latestId:i.at(-1)?.id||0});return}if(u.method==="GET"&&T.pathname==="/cursorbuddy/control/stream"){let p=Number(T.searchParams.get("after")||0);pn(h),a.add(h),W(h,{type:"ready",latestId:i.at(-1)?.id||0});for(let x of i.filter($=>$.id>p))W(h,{type:"command",command:x});let A=setInterval(()=>{try{W(h,{type:"ping",ts:new Date().toISOString()})}catch{a.delete(h),clearInterval(A)}},15e3);A.unref&&A.unref(),u.on("close",()=>{a.delete(h),clearInterval(A)});return}if(u.method==="POST"&&T.pathname==="/cursorbuddy/control"){try{let p=JSON.parse(await _e(u)||"{}"),A=w(p);if(!A){F(h,400,{ok:!1,error:"unsupported CursorBuddy control command"});return}let x=E(A);F(h,200,{ok:!0,command:x})}catch(p){y("control_error",{error:String(p?.message||p)}),F(h,400,{ok:!1,error:String(p?.message||p)})}return}if(u.method==="POST"&&T.pathname==="/cursorbuddy/context"){try{let p=JSON.parse(await _e(u)||"{}");l={url:String(p.url||"").slice(0,2048),title:String(p.title||"").slice(0,300),surface:String(p.surface||"").slice(0,80),instanceId:String(p.instanceId||"").slice(0,140),workspaceId:String(p.workspaceId||e.workspace||"").slice(0,120),agentId:String(p.agentId||e.agent||"").slice(0,120),runtime:p.runtime&&typeof p.runtime=="object"?p.runtime:null,page:p.page&&typeof p.page=="object"?p.page:null,client:p.client&&typeof p.client=="object"?p.client:null,project:p.project&&typeof p.project=="object"?p.project:null,manifest:p.manifest&&typeof p.manifest=="object"?p.manifest:null,selection:p.selection&&typeof p.selection=="object"?p.selection:null,updatedAt:new Date().toISOString()},y("context",{url:l.url,surface:l.surface,instanceId:l.instanceId}),F(h,200,{ok:!0,context:l})}catch(p){y("context_error",{error:String(p?.message||p)}),F(h,400,{ok:!1,error:String(p?.message||p)})}return}if(u.method==="POST"&&T.pathname==="/cursorbuddy/connect"){try{let p=JSON.parse(await _e(u)||"{}"),A=await Lo(e,p,d),x=A.data||{};m={connected:!0,mode:"agensis-claimed",keyId:Ro(A.key),agentId:String(x.agentId||x.agent?.id||e.agent||""),workspaceId:String(x.workspaceId||x.workspace_id||x.agent?.workspace_id||e.workspace||""),agensisUrl:A.baseUrl,handle:String(x.handle||x.agent?.handle||e.handle||""),name:String(x.agent?.name||p.name||e.name||"CursorBuddy runtime"),cwd:String(p.cwd||e.cwd||re.cwd()),surface:String(p.surface||"browser_extension"),command:String(x.command||x.localCommand||""),updatedAt:new Date().toISOString()},l=Bo(p,m,e),y("connect",{mode:m.mode,keyId:m.keyId,agentId:m.agentId,workspaceId:m.workspaceId,url:l.url}),F(h,200,{ok:!0,connection:m,claim:x})}catch(p){y("connect_error",{error:String(p?.message||p)}),F(h,400,{ok:!1,error:String(p?.message||p)})}return}if(u.method==="POST"&&T.pathname==="/cursorbuddy/edit"){try{let p=JSON.parse(await _e(u)||"{}"),A=[{role:"system",content:"You are the local CursorBuddy edit agent. The user selected a DOM element in their own site. Use the payload to inspect and change the local checkout, then report what changed."},{role:"user",content:JSON.stringify(p,null,2)}];y("edit_request",{selector:p?.target?.selector||""});let x=await k({messages:A,model:p?.model});y("edit_done",{chars:x.content.length}),F(h,200,{ok:!0,backend:e.codingCmd,cwd:e.cwd,content:x.content})}catch(p){y("edit_error",{error:String(p?.message||p)}),F(h,500,{ok:!1,error:String(p?.message||p)})}return}if(u.method==="POST"&&T.pathname.endsWith("/chat/completions")){try{let p=JSON.parse(await _e(u)||"{}");if(y("chat_request",{messages:Array.isArray(p.messages)?p.messages.length:0,model:bn(p.model,tt(e))}),p.stream===!0){pn(h);let x=await N(p,h);y("chat_done",{chars:x.content.length,stream:!0,fast:x.fast===!0}),h.end();return}let A=await k(p);y("chat_done",{chars:A.content.length,fast:A.fast===!0}),F(h,200,{id:`agensis-cursorbuddy-${Date.now()}`,object:"chat.completion",model:A.model||p.model||e.model,choices:[{index:0,message:{role:"assistant",content:A.content},finish_reason:"stop"}],usage:{prompt_tokens:0,completion_tokens:0,total_tokens:0}})}catch(p){y("chat_error",{error:String(p?.message||p)}),F(h,500,{error:{message:String(p?.message||p)}})}return}h.writeHead(404),h.end("CursorBuddy local bridge")});return await new Promise((u,h)=>{M.once("error",h),M.listen(n,"127.0.0.1",()=>{g=M.address().port,M.off("error",h),u()})}),y("listening",{url:`${Re(g)}/cursorbuddy/health`}),{port:g,url:Re(g),secret:r,authHeader:Be,close(){return new Promise(u=>M.close(()=>u()))},getContext(){return l}}}import ye from"node:fs/promises";import Uo from"node:os";import Y from"node:path";var En=200,kn=256*1024,jo=2,Fo=new Set([".md",".markdown",".txt"]);function Go(e){return String(e||"").replace(/[^a-zA-Z0-9]/g,"-")}function nt({cwd:e,memoryDir:t,homedir:n=Uo.homedir()}={}){let r=String(t||"").trim();if(r)return r.startsWith("~")?Y.join(n,r.slice(1)):Y.resolve(r);let o=String(e||"").trim();return o?Y.join(n,".claude","projects",Go(o),"memory"):null}async function rt(e){if(!e)return null;try{let t=await ye.realpath(e);return(await ye.stat(t)).isDirectory()?t:null}catch{return null}}async function Ho(e,t){if(!e)throw new Error("memory root unavailable");let n=Y.isAbsolute(String(t))?String(t):Y.join(e,String(t)),r=await ye.realpath(n),o=e.endsWith(Y.sep)?e:e+Y.sep;if(r!==e&&!r.startsWith(o))throw new Error(`path escapes memory root: ${t}`);return r}function qo(e){let t=Y.basename(e).toLowerCase();return t==="memory.md"?"index":t==="claude.md"?"instructions":"memory"}async function ot(e,t,n,r){if(n>jo||r.length>=En)return;let o;try{o=await ye.readdir(t,{withFileTypes:!0})}catch{return}for(let s of o){if(r.length>=En)break;if(s.name.startsWith("."))continue;let i=Y.join(t,s.name);if(s.isDirectory())await ot(e,i,n+1,r);else if(s.isFile()&&Fo.has(Y.extname(s.name).toLowerCase())){let a=Y.relative(e,i);r.push({path:a,kind:qo(a)})}}}async function Jo(e){let t=await rt(e);if(!t)return[];let n=[];return await ot(t,t,0,n),n.sort((r,o)=>r.kind==="index"?-1:o.kind==="index"?1:r.path.localeCompare(o.path)),n}async function zo(e,t){let n=await rt(e),r=await Ho(n,t),o=await ye.readFile(r),s=o.length>kn;return{content:o.subarray(0,kn).toString("utf8"),byteSize:o.length,truncated:s}}async function An(e){let t=await rt(e);if(!t)return"";let n=[];await ot(t,t,0,n),n.sort((o,s)=>o.path.localeCompare(s.path));let r=[];for(let o of n)try{let s=await ye.stat(Y.join(t,o.path));r.push(`${o.path}:${s.size}:${Math.floor(s.mtimeMs)}`)}catch{}return r.join("|")}async function In(e){let t=await Jo(e),n=[];for(let r of t)try{let{content:o,byteSize:s}=await zo(e,r.path);n.push({path:r.path,kind:r.kind,content:o,byteSize:s})}catch{}return n}import it from"node:fs";import oe from"node:path";import xn from"node:os";function Ko(e){try{return it.statSync(e).isDirectory()}catch{return!1}}function Wo(e){try{return it.statSync(e).isFile()}catch{return!1}}function st(e){try{return it.readdirSync(e,{withFileTypes:!0})}catch{return[]}}function Cn({home:e=xn.homedir(),cwd:t=process.cwd()}={}){let n=[e&&oe.join(e,".claude","commands"),t&&oe.join(t,".claude","commands")].filter(Boolean),r=new Set,o=[],s=(i,a)=>{if(!i)return;let d=a?`${a}:${i}`:i;r.has(d)||(r.add(d),o.push({name:i,parent:a||null}))};for(let i of n)for(let a of st(i)){if(a.name.startsWith("."))continue;if(a.name.endsWith(".md")){s(a.name.slice(0,-3),null);continue}let d=oe.join(i,a.name);if(a.isDirectory()||a.isSymbolicLink()&&Ko(d))for(let c of st(d))c.name.startsWith(".")||c.name.endsWith(".md")&&s(c.name.slice(0,-3),a.name)}return o}function at({home:e=xn.homedir(),cwd:t=process.cwd()}={}){let n=[e&&oe.join(e,".claude","skills"),e&&oe.join(e,".codex","skills"),t&&oe.join(t,".claude","skills")].filter(Boolean),r=new Map,o=(s,i)=>{!s||r.has(s)||r.set(s,{name:s,file:i||""})};for(let s of n)for(let i of st(s)){if(i.name.startsWith("."))continue;let a=oe.join(s,i.name);if(i.name.endsWith(".md"))o(i.name.slice(0,-3),a);else if(i.isDirectory()||i.isSymbolicLink()){let d=oe.join(a,"SKILL.md");o(i.name,Wo(d)?d:"")}}return[...r.values()].sort((s,i)=>s.name<i.name?-1:s.name>i.name?1:0)}function Tn(e={}){return at(e).map(t=>t.name)}import ct from"node:fs/promises";var Se=64*1024,Yo=200,Nn=4*1024*1024,Vo=2e3,Xo=512;function Mn(e,t,n=Se){let r=`
|
|
44
44
|
|
|
45
45
|
... [truncated by agensis-agent: ${t}]
|
|
46
|
-
`,o=Math.max(0,n-Buffer.byteLength(r));return`${Buffer.from(String(e||"")).subarray(0,o).toString("utf8").replace(/\uFFFD+$/,"")}${r}`}function qo(e){let t=String(e||"").split(/\r?\n/),n="";if(t[0]?.trim()==="---")for(let r=1;r<t.length&&r<200&&t[r].trim()!=="---";r+=1){let o=/^description:\s*(.*)$/i.exec(t[r]);if(!o)continue;let s=o[1].trim();if(s&&!/^[|>][-+]?$/.test(s)){n=s.replace(/^["']|["']$/g,"");break}let i=[];for(let a=r+1;a<t.length&&a<200&&!(t[a].trim()==="---"||t[a].trim()&&!/^\s/.test(t[a]));a+=1)i.push(t[a].trim());n=i.join(" ").trim();break}if(!n){let r=t.findIndex((i,a)=>a>0&&i.trim()==="---"),s=(t[0]?.trim()==="---"&&r>0?t.slice(r+1):t).find(i=>i.trim()&&i.trim()!=="---");n=String(s||"").replace(/^#+\s*/,"").trim()}return n.slice(0,Go)}function Cn(e){try{return ot(e).slice(0,Fo)}catch{return[]}}async function Jo(e){let t;try{t=await st.open(e,"r")}catch{return null}try{let n=Buffer.alloc(he+1),{bytesRead:r}=await t.read(n,0,n.length,0);return n.subarray(0,r)}catch{return null}finally{await t.close().catch(()=>{})}}async function Ko(e,t){let n=await Jo(e.file);if(!n)return null;let r=n.toString("utf8"),o=qo(r),s=n.length>he,i=Math.min(he,Math.max(0,t)),a=Buffer.byteLength(r)>i;if(!s&&!a)return{skill:e.name,path:e.file,summary:o,content:r,truncated:!1};let d=s?await zo(e.file):0,c=s&&!a?`the file is ${d?`${d} bytes`:`over ${he} bytes`}; only the first ${he} were synced`:`this sync reached its ${xn}-byte ceiling`,l=i<Ho?In("",c,Number.MAX_SAFE_INTEGER):In(r,c,i);return{skill:e.name,path:e.file,summary:o,content:l,truncated:!0}}async function zo(e){try{return(await st.stat(e)).size}catch{return 0}}async function it(e={}){let t=[];for(let n of Cn(e)){if(!n.file){t.push(`${n.name}:-`);continue}try{let r=await st.stat(n.file);t.push(`${n.name}:${n.file}:${r.size}:${Math.floor(r.mtimeMs)}`)}catch{t.push(`${n.name}:-`)}}return t.join("|")}async function Tn(e={}){let t=[],n=0;for(let r of Cn(e))if(r.file)try{let o=await Ko(r,xn-n);if(!o)continue;n+=Buffer.byteLength(o.content),t.push(o)}catch{}return t}import{readFile as Wo}from"node:fs/promises";var Yo=new Set(["127.0.0.1","localhost","::1","[::1]"]);function Mn(e,t,n){let r=Number(e);return Number.isFinite(r)?Math.max(1,Math.min(n,Math.trunc(r))):t}function Vo(e,t){if(!e||typeof e!="object"||e.shared===!1)return null;let n=String(e.id||e.upstreamModel||`model-${t+1}`).trim();if(!n)return null;if(!/^[a-zA-Z0-9._:@/-]+$/.test(n))throw new Error(`Shared model id '${n}' may only contain letters, numbers, dot, underscore, colon, at, slash, or dash.`);let r=new URL(String(e.baseUrl||"http://127.0.0.1:11434/v1"));if(!Yo.has(r.hostname))throw new Error(`Shared model '${n}' must use a loopback endpoint.`);if(!["http:","https:"].includes(r.protocol))throw new Error(`Shared model '${n}' must use an HTTP endpoint.`);return{id:n.slice(0,160),name:String(e.name||n).trim().slice(0,160)||n,provider:String(e.provider||"local").trim().slice(0,80)||"local",protocol:"openai-chat",baseUrl:r.toString().replace(/\/$/,""),upstreamModel:String(e.upstreamModel||n).trim().slice(0,200)||n,apiKeyEnv:String(e.apiKeyEnv||"").trim().slice(0,120),capabilities:[...new Set((Array.isArray(e.capabilities)?e.capabilities:["text","streaming"]).map(o=>String(o||"").trim().toLowerCase()).filter(Boolean))].slice(0,16),...e.contextWindow?{contextWindow:Mn(e.contextWindow,void 0,1e7)}:{},maxConcurrency:Mn(e.maxConcurrency,1,64),shared:!0}}async function Nn(e){if(!e)return[];let t=JSON.parse(await Wo(e,"utf8")),n=Array.isArray(t)?t:t?.models;if(!Array.isArray(n))throw new Error("Shared model config must contain a models array.");return n.slice(0,32).map(Vo).filter(Boolean)}function On(e){return(Array.isArray(e)?e:[]).filter(t=>t?.shared).map(t=>({id:t.id,name:t.name,provider:t.provider,protocol:t.protocol,upstreamModel:t.upstreamModel,capabilities:[...t.capabilities],...t.contextWindow?{contextWindow:t.contextWindow}:{},maxConcurrency:t.maxConcurrency,shared:!0}))}async function $n({models:e,request:t,send:n,signal:r,fetchImpl:o=fetch,env:s=process.env}){let i=String(t?.requestId||"").trim();if(!i)throw new Error("Inference requestId is required.");let a=(Array.isArray(e)?e:[]).find(w=>w.id===t?.model);if(!a)throw new Error(`Shared model '${t?.model||""}' is not available.`);let d={"content-type":"application/json"},c=a.apiKeyEnv?s[a.apiKeyEnv]:"";c&&(d.authorization=`Bearer ${c}`),n({action:"agent_inference_started",requestId:i,model:a.id});let{requestId:l,model:g,type:m,action:y,...S}=t,f=await o(`${a.baseUrl}/chat/completions`,{method:"POST",headers:d,body:JSON.stringify({...S,model:a.upstreamModel,stream:t.stream===!0}),signal:r});if(!f.ok){let w=await f.text().catch(()=>"");throw new Error(w||`Local model returned HTTP ${f.status}.`)}if(t.stream===!0){if(!f.body)throw new Error("Local model returned an empty stream.");let w=f.body.getReader(),E=new TextDecoder,v="",A,N=h=>{let M=h.trim();if(!M.startsWith("data:"))return!1;let p=M.slice(5).trim();if(!p)return!1;if(p==="[DONE]")return!0;try{let I=JSON.parse(p);I?.usage&&(A=I.usage),n({action:"agent_inference_delta",requestId:i,model:a.id,chunk:I})}catch{}return!1},O=!1;for(;!O;){let{done:h,value:M}=await w.read();v+=E.decode(M||new Uint8Array,{stream:!h});let p=v.split(/\r?\n/);v=h?"":p.pop()||"";for(let I of p)if(N(I)){O=!0;break}if(h)break}v&&N(v);let u={action:"agent_inference_result",requestId:i,model:a.id,...A?{usage:A}:{}};return n(u),u}let b=await f.json();return n({action:"agent_inference_result",requestId:i,model:a.id,response:b}),b}Be();var hs=30*60*1e3,gs=15*1e3,Vn=2,ys=10*1024,Ss="claude-opus-4-8",oe="0.1.34";async function Le(e={}){let t=ws(e);t.sharedModels=t.share?await Nn(t.sharedModelsFile):[];let n=!1,r=null,o=null,s=null,i=null,a=0,d=null,c=null,l="",g=null,m=!1,y=null,S=new Map,f=Ft({send:T=>P(r,T),log:D}),b=null,w={transport:"ws",listening:!1,addrs:[],auth:"hub-pairwise"},E=new Map,v=new Map,A=[],N=()=>w,O=()=>({connected:m&&!!t.cursorBuddyRuntime,mode:t.cursorBuddyRuntime?"agensis-cli":"agensis-cli-unclaimed",agentId:y?.agentId||y?.agent_id||t.agent,workspaceId:y?.workspaceId||y?.workspace_id||t.workspace,agensisUrl:t.url,handle:y?.handle||t.handle,name:y?.name||t.name,cwd:t.cwd,updatedAt:new Date().toISOString()}),u=()=>{b||!t.lanListener||(b=new _e.Server({port:0}),b.on("listening",()=>{let{port:T}=b.address();w={transport:"ws",listening:!0,addrs:Js(T),auth:"hub-pairwise"},D(`Agent-mesh LAN listener on port ${T}`),be(r,t,N())}),b.on("connection",T=>{let R=!1,_=setTimeout(()=>{if(!R)try{T.close(1008,"peer auth required")}catch{}},5e3);T.once("message",x=>{clearTimeout(_);let B=ft(x),j=B?.type==="peer_auth"?E.get(B.ticket):null;if(!j||j.fromAgentId!==B.fromAgentId||Date.now()>j.exp){try{T.close(1008,"invalid ticket")}catch{}return}E.delete(B.ticket),R=!0,T.on("message",J=>{let L=ft(J);L?.type==="agent_job"&&L.job?.id&&c.enqueue({...L.job,key:L.job.id,lane:Xn(L.job),ws:r}).accepted&&D(`Queued peer-handoff job ${L.job.id} from ${B.fromAgentId}`)})})}),b.on("error",T=>D(`LAN listener error: ${T?.message||T}`)))},h=()=>{if(b){try{b.close()}catch{}b=null}w={transport:"ws",listening:!1,addrs:[],auth:"hub-pairwise"}},M=T=>new Promise((R,_)=>{if(!P(r,{action:"peer_ticket_request",targetAgentId:T})){_(new Error("hub socket not open"));return}let x=v.get(T)||[];x.push({resolve:R,reject:_}),v.set(T,x),setTimeout(()=>{let B=v.get(T)||[],j=B.findIndex(J=>J.resolve===R);j>=0&&(B.splice(j,1),_(new Error("peer ticket request timed out")))},1e4)}),p=()=>new Promise((T,R)=>{if(!P(r,{action:"peer_list_request"})){R(new Error("hub socket not open"));return}A.push(T),setTimeout(()=>{let _=A.indexOf(T);_>=0&&(A.splice(_,1),T([]))},1e4)}),I=async(T,R)=>{let _=null;try{let B=(await p()).find(L=>L.agentId===T&&L.reach?.listening&&L.reach.addrs?.length);if(!B)return!1;let j=await M(T),J=j.peer?.addrs?.[0]||B.reach.addrs[0];return!J?.host||!J?.port?!1:(_=new _e(`ws://${J.host}:${J.port}`),await new Promise((L,He)=>{_.once("open",L),_.once("error",He),setTimeout(()=>He(new Error("peer connect timed out")),5e3)}),P(_,{type:"peer_auth",ticket:j.ticket,fromAgentId:t.agent}),P(_,{type:"agent_job",job:R}),!0)}catch(x){return D(`Peer handoff to ${T} failed, falling back to hub relay: ${x?.message||x}`),!1}finally{try{_?.close()}catch{}}},k=()=>{n=!0,tr(S),f.shutdown("The agent daemon shut down before this was approved."),o&&clearTimeout(o),s&&clearInterval(s),i&&clearInterval(i),g&&(g.close().catch(()=>{}),g=null),h(),Gn(t,{status:"stopped",connected:!1});try{r?.close()}catch{}d&&d()};if(c=cn({concurrency:t.once?1:t.maxConcurrency,runJob:async(T,R)=>{await Ds(t,T,{...R,requestPermission:f.request}),t.once&&k()}}),t.cursorBuddyBridge)try{g=await Sn(t,{port:t.cursorBuddyPort,authSecret:t.cursorBuddyBridgeSecret||void 0,log:D,connectionProvider:O}),g?.secret&&(t.cursorBuddyBridgeSecret=g.secret)}catch(T){if(Ys(T)){let R=await Vs(t.cursorBuddyPort);if(R?.ok){let _=R.pid?` pid ${R.pid}`:"";D(`CursorBuddy local bridge already running on http://127.0.0.1:${t.cursorBuddyPort}${_}`)}else D(`CursorBuddy local bridge port ${t.cursorBuddyPort} is in use but did not answer health`)}else D(`CursorBuddy local bridge unavailable: ${T?.message||T}`);g=null}C.once("SIGINT",k),C.once("SIGTERM",k);let $=()=>{if(n)return;let T=_s(t.url,t.token,t);l="",D(`Connecting to ${T.replace(t.token,"redacted")}`),r=new _e(T),r.on("open",async()=>{m=!1,y=null,D(`Connected. Registering @${t.handle||"agent"} from ${t.cwd}`),P(r,{type:"auth",token:t.token});let R=await qn(t);P(r,{action:"agent_register",workspaceId:t.workspace,agentId:t.agent,handle:t.handle,name:t.name,host:Ee.hostname(),cwd:t.cwd,...R?{identity:R}:{},metadata:{codingCmd:t.codingCmd,model:t.model,permissionMode:t.permissionMode,permissionFlags:yt(t.permissionMode),once:t.once,runtime:"agensis",version:oe}}),s=setInterval(()=>{Promise.all([cr(t,N()).catch(()=>null),ut(t).catch(()=>null)]).then(([_,x])=>{P(r,{action:"agent_heartbeat",..._?{capabilitiesHash:_.capabilitiesHash,memoryHash:_.memoryHash}:{},..._?.skillsHash?{skillsHash:_.skillsHash}:{},metadata:mt(t,c,x,nr(t)?g?.getContext?.():null,S)})})},t.heartbeatMs),s.unref&&s.unref()}),r.on("message",R=>{let _=ft(R);if(_){if(_.type==="agent_registered"){m=!0,y=_.connection||_.agent||null,Qn(t,_.agent),D(`Registered as ${_.connection?.name||t.name} on ${_.connection?.host||Ee.hostname()}`),t.onRegistered&&Promise.resolve(t.onRegistered(t,_)).catch(x=>{D(`Profile save failed: ${x?.message||x}`)}),lt(t,_.agent).catch(()=>{}),Wn(t).catch(()=>{}),Zn(r,t),er(r,t),u(),be(r,t,N());return}if(_.type==="agent_config"){Qn(t,_.agent),D(`Updated config for @${t.handle||"agent"}: model=${t.model}, permission=${t.permissionMode}`),lt(t,_.agent).catch(()=>{});return}if(_.type==="agent_memory_refresh"){Zn(r,t),be(r,t,N());return}if(_.type==="agent_capabilities_refresh"){be(r,t,N());return}if(_.type==="agent_skills_refresh"){er(r,t);return}if(_.type==="agent_inference_cancel"){S.get(String(_.requestId||""))?.abort();return}if(_.type==="agent_job_cancel"){let x=String(_.jobId||"");x&&(f.cancelJob(x,_.reason||"Cancelled by Agensis"),c.cancel(x,_.reason||"Cancelled by Agensis")&&D(`Cancelled job ${x}`));return}if(_.type==="agent_permission_decision"){f.decide(_);return}if(_.type==="agent_inference_request"&&_.requestId){let x=String(_.requestId),B=t.sharedModels.find(L=>L.id===_.model),j=[...S.values()].filter(L=>L.model===_.model).length;if(!B){P(r,{action:"agent_inference_error",requestId:x,error:`Shared model '${_.model||""}' is not available.`});return}if(j>=B.maxConcurrency){P(r,{action:"agent_inference_error",requestId:x,error:"Shared model is at capacity.",code:"capacity_exhausted"});return}let J=new AbortController;S.set(x,{abort:()=>J.abort(),model:B.id}),P(r,{action:"agent_heartbeat",metadata:mt(t,c,null,null,S)}),$n({models:t.sharedModels,request:_,signal:J.signal,send:L=>P(r,L)}).catch(L=>{P(r,{action:"agent_inference_error",requestId:x,error:J.signal.aborted?"Inference cancelled.":L?.message||String(L),code:J.signal.aborted?"cancelled":"inference_failed"})}).finally(()=>{S.delete(x),P(r,{action:"agent_heartbeat",metadata:mt(t,c,null,null,S)})});return}if(_.type==="peer_ticket"){let x=_.peer?.agentId,B=v.get(x)||[],j=B.shift();B.length?v.set(x,B):v.delete(x),j&&j.resolve(_);return}if(_.type==="peer_ticket_grant"){E.set(_.ticket,{fromAgentId:_.fromAgentId,exp:_.exp});return}if(_.type==="peer_list"){let x=A.shift();x&&x(Array.isArray(_.peers)?_.peers:[]);return}if(_.type==="agent_reach_disable"){h(),be(r,t,N());return}if(_.type==="error"){D(`Server rejected request: ${_.message||"unknown error"}`);return}if(_.type==="agent_disabled"){m=!1,y=null,D(`Agent disabled by Agensis: ${_.reason||"deactivated"}`),k();return}if(_.type==="agent_job"&&_.job?.id){let x=c.enqueue({..._.job,key:_.job.id,lane:Xn(_.job),ws:r});x.accepted&&(a+=1,D(`Queued job ${_.job.id} at position ${x.position}`),t.once&&c.idle().then(()=>k()))}}}),r.on("close",(R,_)=>{tr(S),f.shutdown(),m=!1,y=null;let x=String(_||"");if(D(`Socket closed (${R||"no-code"}${x?`: ${x}`:""})`),s&&(clearInterval(s),s=null),R===1008&&/agent deactivated|authentication failed/i.test(x)){D("Stopping daemon because Agensis rejected this agent connection."),k();return}if(l==="ECONNREFUSED"&&Es(t.url)){D("Local agent backend is not running on 127.0.0.1:3142."),D("Start it in another terminal with: npm run backend"),D("Then rerun this connect command."),k();return}t.once&&a>0&&c.active()===0&&c.size()===0&&k(),!(n||t.once)&&(o=setTimeout($,2e3),o.unref&&o.unref())}),r.on("error",R=>{l=R?.code||"",D(`Socket error: ${R?.message||R}`)})},q=async()=>{let T=await ut(t).catch(()=>null);await Fn(t,{busy:c.active()>0,active:c.active(),queueSize:c.size(),connected:r?.readyState===_e.OPEN,agentStatus:T?.status,agentNote:T?.note}).catch(()=>{})};q(),i=setInterval(()=>{q()},t.heartbeatMs),i.unref&&i.unref(),$(),await new Promise(T=>{let R=setInterval(async()=>{t.once&&a>0&&c.active()===0&&c.size()===0&&k(),n&&k()},500);d=()=>{clearInterval(R),T()}}),d=null,C.off("SIGINT",k),C.off("SIGTERM",k)}function ws(e){let t=bs(e.cursorBuddyBridge),n=e.noCoding===!0||C.env.AGENSIS_NO_CODING==="1",o=!ne(e.fullCliContext,ne(C.env.AGENSIS_FULL_CLI_CONTEXT,!1))&&ne(e.leanCli,!0),s={url:String(e.url||e.baseUrl||C.env.AGENSIS_URL||"").trim(),token:String(e.token||C.env.AGENSIS_TOKEN||"").trim(),workspace:String(e.workspace||e.workspaceId||C.env.AGENSIS_WORKSPACE||C.env.AGENSIS_WORKSPACE_ID||"").trim(),agent:String(e.agent||e.agentId||C.env.AGENSIS_AGENT||C.env.AGENSIS_AGENT_ID||"").trim(),handle:dr(e.handle||C.env.AGENSIS_HANDLE||e.name||C.env.AGENSIS_NAME||"agent"),name:String(e.name||C.env.AGENSIS_NAME||e.handle||C.env.AGENSIS_HANDLE||"agensis Agent").trim(),cwd:String(e.cwd||C.env.AGENSIS_CWD||C.cwd()).trim(),codingCmd:n?"":String(e.codingCmd||C.env.AGENSIS_CODING_CMD||C.env.CODING_CMD||"claude -p").trim(),ampCmd:String(e.ampCmd||C.env.AGENSIS_AMP_CMD||"amp").trim()||"amp",model:gt(e.model||C.env.AGENSIS_MODEL||C.env.CLAUDE_MODEL||""),permissionMode:Ue(e.permissionMode||e.permission_mode||e.permission||C.env.AGENSIS_PERMISSION_MODE||"default"),timeoutMs:Number(e.timeoutMs||C.env.AGENSIS_TIMEOUT_MS||hs),heartbeatMs:Number(e.heartbeatMs||C.env.AGENSIS_HEARTBEAT_MS||gs),maxConcurrency:Math.max(1,Number(e.maxConcurrency||C.env.AGENSIS_MAX_CONCURRENCY||Vn)||Vn),once:!!(e.once||C.env.AGENSIS_ONCE==="1"),exitOnOnce:!!e.exitOnOnce,onRegistered:typeof e.onRegistered=="function"?e.onRegistered:null,primaryDaemon:!!(e.primaryDaemon||C.env.AGENSIS_PRIMARY_DAEMON==="1"),cursorBuddyRuntime:!!(e.cursorBuddyRuntime||C.env.AGENSIS_CURSORBUDDY_RUNTIME==="1"),cursorBuddyBridge:t,cursorBuddyPort:Number(e.cursorBuddyPort||C.env.AGENSIS_CURSORBUDDY_PORT||8787),cursorBuddyBridgeSecret:String(e.cursorBuddyBridgeSecret||C.env.AGENSIS_CURSORBUDDY_BRIDGE_SECRET||"").trim(),cursorBuddyModel:String(e.cursorBuddyModel||C.env.AGENSIS_CURSORBUDDY_MODEL||"haiku-4.5").trim(),lanListener:!!(e.lanListener||e.lan||C.env.AGENSIS_LAN==="1"),share:!!(e.share||C.env.AGENSIS_SHARE==="1"),sharedModelsFile:String(e.sharedModelsFile||C.env.AGENSIS_SHARED_MODELS_FILE||"").trim(),noCoding:n,leanCli:o,fastConnection:ne(e.fastConnection,ne(C.env.AGENSIS_FAST_CONNECTION,!0)),syncMemory:ne(e.syncMemory,C.env.AGENSIS_SYNC_MEMORY==="1"),syncSkills:ne(e.syncSkills,ne(C.env.AGENSIS_SYNC_SKILLS,!0)),hostFolders:ir(e.hostFolders??e.host_folders??C.env.AGENSIS_HOST_FOLDERS)};s.sharedModelsFile&&!le.isAbsolute(s.sharedModelsFile)&&(s.sharedModelsFile=le.resolve(s.cwd,s.sharedModelsFile));let i=[];if(s.url||i.push("--url"),s.token||i.push("--token"),s.workspace||i.push("--workspace"),s.agent||i.push("--agent"),s.share&&!s.sharedModelsFile&&i.push("--shared-models-file"),i.length)throw new Error(`Missing required option(s): ${i.join(", ")}`);return s}function ne(e,t){return e==null||e===""?t:typeof e=="boolean"?e:!/^(0|false|off|no)$/i.test(String(e).trim())}function bs(e){let t=C.env.AGENSIS_CURSORBUDDY_BRIDGE;return t!==void 0&&t!==""?!/^(0|false|off|no)$/i.test(String(t).trim()):e==null||e===""?!1:typeof e=="boolean"?e:!/^(0|false|off|no)$/i.test(String(e).trim())}function _s(e,t,n={}){let r=ht(e);return r.protocol=r.protocol==="https:"?"wss:":"ws:",r.pathname="/backend/ws",r.search="",n.workspace&&r.searchParams.set("workspaceId",n.workspace),n.agent&&r.searchParams.set("agentId",n.agent),r.toString()}function ht(e){let t=new URL(e);return vs(t)&&(t.protocol="http:",t.hostname="127.0.0.1",t.port="3142"),t}function vs(e){if(!(e.hostname==="localhost"||e.hostname==="127.0.0.1"||e.hostname==="0.0.0.0")||e.port==="3142")return!1;if(e.port==="5173"||e.port==="8888")return!0;let t=Number(e.port||0);return t>=49152&&t<=65535}function Es(e){try{let t=ht(e);return(t.hostname==="localhost"||t.hostname==="127.0.0.1"||t.hostname==="0.0.0.0")&&t.port==="3142"}catch{return!1}}function Xn(e){let t=String(e?.sessionId||""),n=String(e?.threadParentId||"");return`${t}::${n}`}var ks=/\b(cursorbuddy|cursor buddy|avatar|buddy|pet|character|him|guy)\b/i,As=[/\b(?:make|have|tell)\s+(?:the\s+)?(?:cursorbuddy|cursor buddy|avatar|buddy|pet|character|him|guy)\s+(?:say|speak)\s+(.+)$/i];function Is(e){return String(e||"").trim().replace(/^[`"'“”‘’]+|[`"'“”‘’?.!]+$/g,"").trim().slice(0,1200)}function xs(e){for(let t of As){let n=String(e||"").match(t),r=Is(n?.[1]||"");if(r)return r}return""}function Cs(e){let t=String(e||"").replace(/\s+/g," ").trim();if(!t)return"";let n=/latest user message\s*:\s*/gi,r=null,o=null;for(;r=n.exec(t);)o=r;if(!o)return"";let s=t.slice(o.index+o[0].length).trim(),i=s.search(/\b(Return a useful response|Conversation context follows|Previous user|Previous assistant|Diagnostic notes|System prompt|Developer message)\b/i);return(i>=0?s.slice(0,i):s).trim().replace(/^["'“”‘’]+|["'“”‘’]+$/g,"").trim()}function Ts(e){let t=String(e||"").replace(/\s+/g," ").trim(),r=Cs(t)||t;if(!r)return"";if(r.length<=500)return r;let o=[/\b(?:can you\s+)?(?:make|have|tell)\s+(?:the\s+)?(?:cursorbuddy|cursor buddy|avatar|buddy|pet|character|him|guy)\s+(?:wave|waves|waving|say|speak)\b.{0,160}/i,/\b(?:cursorbuddy|cursor buddy|avatar|buddy|pet|character|him|guy)\b.{0,120}\b(?:wave|waves|waving|say|speak|open|show|hide|hush|close|dismiss|clear)\b.{0,160}/i,/\b(?:wave|open|show|hide|hush|close|dismiss|clear)\b.{0,120}\b(?:cursorbuddy|cursor buddy|avatar|buddy|pet|character|him|guy|bubble|prompt|dialog|panel|options|menu)\b/i,/\b(?:say|speak)\s+[`"'“”‘’]?.{1,180}/i];for(let s of o){let i=r.match(s);if(i?.[0])return i[0].trim()}return""}function Ms(e){let t=Ts(e);if(!t)return null;let n=/^(open|show|hide|hush|close|dismiss)\b/i.test(t),r=ks.test(t);if(!n&&!r)return null;let o="agensis-native-control";if(/\b(hide|hush|close|dismiss|clear)\b.*\b(bubble|prompt|dialog|panel|options|menu)\b/i.test(t)||/^hush\b/i.test(t))return{action:"hush",source:o};if(/\b(open|show|bring up|get back|display)\b.*\b(prompt|bubble|dialog|panel|options|menu)\b/i.test(t)||/^open\b/i.test(t))return{action:"open",source:o};let s=xs(t);return s&&r?{action:"say",text:s,source:o}:r&&/\b(wave|waves|waving)\b/i.test(t)?{action:"wave",text:s,source:o}:null}async function Ns(e,t){let r=`http://127.0.0.1:${Number(e.cursorBuddyPort||8787)}/cursorbuddy/control`,o=String(e.cursorBuddyBridgeSecret||C.env.AGENSIS_CURSORBUDDY_BRIDGE_SECRET||"").trim(),s={"content-type":"application/json"};o&&(s.authorization=`Bearer ${o}`,s["x-agensis-bridge-secret"]=o);let i=await fetch(r,{method:"POST",headers:s,body:JSON.stringify(t)}),a=null;try{a=await i.json()}catch{a=null}if(!i.ok||a?.ok===!1)throw new Error(a?.error||`CursorBuddy control failed with HTTP ${i.status}`);return a}function Os(e){return e.action==="wave"?"Sent CursorBuddy a wave command.":e.action==="say"?`Sent CursorBuddy speech: ${e.text||""}`.trim():e.action==="open"?"Opened CursorBuddy's prompt.":e.action==="hush"?"Dismissed CursorBuddy's bubble.":e.action==="choose"?"Sent CursorBuddy options.":"Sent CursorBuddy control command."}function nr(e={}){return e.cursorBuddyBridge===!1?!1:!!(e.cursorBuddyRuntime||e.primaryDaemon)}async function $s(e,t,n,r){let o="cursorbuddy-control",s="native",i=[],a=(l="")=>{P(t.ws,{action:"agent_job_delta",jobId:t.id,content:l,elapsedMs:Date.now()-r,model:o,permissionMode:s,permissionFlags:i})};a("");let d="",c="";try{await Ns(e,n),d=Os(n),a(d)}catch(l){c=String(l?.message||l),d=`CursorBuddy control failed: ${c}`,a(d)}P(t.ws,{action:"agent_job_result",jobId:t.id,response:d,error:c,elapsedMs:Date.now()-r,model:o,permissionMode:s,permissionFlags:i}),D(`Finished native CursorBuddy ${n.action} job ${t.id} in ${Math.round((Date.now()-r)/1e3)}s`)}async function Ds(e,t,{signal:n,requestPermission:r=null}){let o=Date.now();if(D(`Starting job ${t.id}`),nn(t)){await Rs(e,t,{signal:n,started:o}),e.once&&(D("One-shot Amp job complete; exiting."),setTimeout(()=>C.exit(0),150));return}let s=Ms(t.prompt);if(s&&nr(e)){await $s(e,t,s,o),e.once&&(D("One-shot CursorBuddy control job complete; exiting."),setTimeout(()=>C.exit(0),150));return}let i=Ls(e,t),a=await Bs(e,t),d="",c="",l=0,g=(h="")=>{P(t.ws,{action:"agent_job_delta",jobId:t.id,content:h,elapsedMs:Date.now()-o,model:i.model,permissionMode:i.permissionMode,permissionFlags:i.permissionFlags})},m=h=>{P(t.ws,{action:"agent_job_step",jobId:t.id,kind:h.kind,name:h.name,detail:h.detail,elapsedMs:Date.now()-o})},y=h=>{P(t.ws,{action:"agent_job_segment",jobId:t.id,text:h.text,elapsedMs:Date.now()-o})};g("");let S=i.streamJson?rr({onStep:m,onSegment:y}):null,f=setInterval(()=>g(d),1e3);f.unref&&f.unref();let b=!/[\\/]/.test(i.cmd),w=e.fastConnection&&b?lr(i.cmd)?"claude":ur(i.cmd)?"codex":null:null,v=await en(t,{family:w}).run({cmd:i.cmd,args:[...i.args,a],env:i.env,cwd:t.cwd||e.cwd,timeoutMs:e.timeoutMs,heartbeatMs:e.heartbeatMs,label:"agent job",signal:n,job:t,prompt:a,model:i.model,permissionMode:i.permissionMode,hostFolders:ar(e,t),leanCli:e.leanCli,mcp:e.leanCli?pt(e):null,sessionKey:`${t.workspaceId||e.workspace||""}:${e.agent||e.handle||""}`,clientVersion:oe,requestPermission:r,onData:h=>{S?(S.feed(h),d=S.live):(d+=String(h||""),c=Ws(`${c}
|
|
47
|
-
${h}`));let
|
|
46
|
+
`,o=Math.max(0,n-Buffer.byteLength(r));return`${Buffer.from(String(e||"")).subarray(0,o).toString("utf8").replace(/\uFFFD+$/,"")}${r}`}function Qo(e){let t=String(e||"").split(/\r?\n/),n="";if(t[0]?.trim()==="---")for(let r=1;r<t.length&&r<200&&t[r].trim()!=="---";r+=1){let o=/^description:\s*(.*)$/i.exec(t[r]);if(!o)continue;let s=o[1].trim();if(s&&!/^[|>][-+]?$/.test(s)){n=s.replace(/^["']|["']$/g,"");break}let i=[];for(let a=r+1;a<t.length&&a<200&&!(t[a].trim()==="---"||t[a].trim()&&!/^\s/.test(t[a]));a+=1)i.push(t[a].trim());n=i.join(" ").trim();break}if(!n){let r=t.findIndex((i,a)=>a>0&&i.trim()==="---"),s=(t[0]?.trim()==="---"&&r>0?t.slice(r+1):t).find(i=>i.trim()&&i.trim()!=="---");n=String(s||"").replace(/^#+\s*/,"").trim()}return n.slice(0,Vo)}function On(e){try{return at(e).slice(0,Yo)}catch{return[]}}async function Zo(e){let t;try{t=await ct.open(e,"r")}catch{return null}try{let n=Buffer.alloc(Se+1),{bytesRead:r}=await t.read(n,0,n.length,0);return n.subarray(0,r)}catch{return null}finally{await t.close().catch(()=>{})}}async function es(e,t){let n=await Zo(e.file);if(!n)return null;let r=n.toString("utf8"),o=Qo(r),s=n.length>Se,i=Math.min(Se,Math.max(0,t)),a=Buffer.byteLength(r)>i;if(!s&&!a)return{skill:e.name,path:e.file,summary:o,content:r,truncated:!1};let d=s?await ts(e.file):0,c=s&&!a?`the file is ${d?`${d} bytes`:`over ${Se} bytes`}; only the first ${Se} were synced`:`this sync reached its ${Nn}-byte ceiling`,l=i<Xo?Mn("",c,Number.MAX_SAFE_INTEGER):Mn(r,c,i);return{skill:e.name,path:e.file,summary:o,content:l,truncated:!0}}async function ts(e){try{return(await ct.stat(e)).size}catch{return 0}}async function lt(e={}){let t=[];for(let n of On(e)){if(!n.file){t.push(`${n.name}:-`);continue}try{let r=await ct.stat(n.file);t.push(`${n.name}:${n.file}:${r.size}:${Math.floor(r.mtimeMs)}`)}catch{t.push(`${n.name}:-`)}}return t.join("|")}async function $n(e={}){let t=[],n=0;for(let r of On(e))if(r.file)try{let o=await es(r,Nn-n);if(!o)continue;n+=Buffer.byteLength(o.content),t.push(o)}catch{}return t}import{readFile as ns}from"node:fs/promises";var rs=new Set(["127.0.0.1","localhost","::1","[::1]"]);function Dn(e,t,n){let r=Number(e);return Number.isFinite(r)?Math.max(1,Math.min(n,Math.trunc(r))):t}function os(e,t){if(!e||typeof e!="object"||e.shared===!1)return null;let n=String(e.id||e.upstreamModel||`model-${t+1}`).trim();if(!n)return null;if(!/^[a-zA-Z0-9._:@/-]+$/.test(n))throw new Error(`Shared model id '${n}' may only contain letters, numbers, dot, underscore, colon, at, slash, or dash.`);let r=new URL(String(e.baseUrl||"http://127.0.0.1:11434/v1"));if(!rs.has(r.hostname))throw new Error(`Shared model '${n}' must use a loopback endpoint.`);if(!["http:","https:"].includes(r.protocol))throw new Error(`Shared model '${n}' must use an HTTP endpoint.`);return{id:n.slice(0,160),name:String(e.name||n).trim().slice(0,160)||n,provider:String(e.provider||"local").trim().slice(0,80)||"local",protocol:"openai-chat",baseUrl:r.toString().replace(/\/$/,""),upstreamModel:String(e.upstreamModel||n).trim().slice(0,200)||n,apiKeyEnv:String(e.apiKeyEnv||"").trim().slice(0,120),capabilities:[...new Set((Array.isArray(e.capabilities)?e.capabilities:["text","streaming"]).map(o=>String(o||"").trim().toLowerCase()).filter(Boolean))].slice(0,16),...e.contextWindow?{contextWindow:Dn(e.contextWindow,void 0,1e7)}:{},maxConcurrency:Dn(e.maxConcurrency,1,64),shared:!0}}async function Rn(e){if(!e)return[];let t=JSON.parse(await ns(e,"utf8")),n=Array.isArray(t)?t:t?.models;if(!Array.isArray(n))throw new Error("Shared model config must contain a models array.");return n.slice(0,32).map(os).filter(Boolean)}function Bn(e){return(Array.isArray(e)?e:[]).filter(t=>t?.shared).map(t=>({id:t.id,name:t.name,provider:t.provider,protocol:t.protocol,upstreamModel:t.upstreamModel,capabilities:[...t.capabilities],...t.contextWindow?{contextWindow:t.contextWindow}:{},maxConcurrency:t.maxConcurrency,shared:!0}))}async function Pn({models:e,request:t,send:n,signal:r,fetchImpl:o=fetch,env:s=process.env}){let i=String(t?.requestId||"").trim();if(!i)throw new Error("Inference requestId is required.");let a=(Array.isArray(e)?e:[]).find(w=>w.id===t?.model);if(!a)throw new Error(`Shared model '${t?.model||""}' is not available.`);let d={"content-type":"application/json"},c=a.apiKeyEnv?s[a.apiKeyEnv]:"";c&&(d.authorization=`Bearer ${c}`),n({action:"agent_inference_started",requestId:i,model:a.id});let{requestId:l,model:g,type:m,action:y,...S}=t,f=await o(`${a.baseUrl}/chat/completions`,{method:"POST",headers:d,body:JSON.stringify({...S,model:a.upstreamModel,stream:t.stream===!0}),signal:r});if(!f.ok){let w=await f.text().catch(()=>"");throw new Error(w||`Local model returned HTTP ${f.status}.`)}if(t.stream===!0){if(!f.body)throw new Error("Local model returned an empty stream.");let w=f.body.getReader(),E=new TextDecoder,_="",k,N=h=>{let T=h.trim();if(!T.startsWith("data:"))return!1;let p=T.slice(5).trim();if(!p)return!1;if(p==="[DONE]")return!0;try{let A=JSON.parse(p);A?.usage&&(k=A.usage),n({action:"agent_inference_delta",requestId:i,model:a.id,chunk:A})}catch{}return!1},M=!1;for(;!M;){let{done:h,value:T}=await w.read();_+=E.decode(T||new Uint8Array,{stream:!h});let p=_.split(/\r?\n/);_=h?"":p.pop()||"";for(let A of p)if(N(A)){M=!0;break}if(h)break}_&&N(_);let u={action:"agent_inference_result",requestId:i,model:a.id,...k?{usage:k}:{}};return n(u),u}let b=await f.json();return n({action:"agent_inference_result",requestId:i,model:a.id,response:b}),b}Ue();var Es=30*60*1e3,ks=15*1e3,er=2,As=10*1024,Is="claude-opus-4-8",ae="0.1.36";async function Fe(e={}){let t=xs(e);t.sharedModels=t.share?await Rn(t.sharedModelsFile):[];let n=!1,r=null,o=null,s=null,i=null,a=0,d=null,c=null,l="",g=null,m=!1,y=null,S=new Map,f=Jt({send:I=>P(r,I),log:O}),b=[],w=I=>{b.length>=32&&b.shift(),b.push(I),O(`Socket was gone \u2014 parked the result for job ${I.jobId} to re-send on reconnect`)},E=()=>{if(b.length!==0)for(let I of b.splice(0,b.length))P(r,I)?O(`Re-sent the result for job ${I.jobId} after reconnecting`):b.push(I)},_=null,k={transport:"ws",listening:!1,addrs:[],auth:"hub-pairwise"},N=new Map,M=new Map,u=[],h=()=>k,T=()=>({connected:m&&!!t.cursorBuddyRuntime,mode:t.cursorBuddyRuntime?"agensis-cli":"agensis-cli-unclaimed",agentId:y?.agentId||y?.agent_id||t.agent,workspaceId:y?.workspaceId||y?.workspace_id||t.workspace,agensisUrl:t.url,handle:y?.handle||t.handle,name:y?.name||t.name,cwd:t.cwd,updatedAt:new Date().toISOString()}),p=()=>{_||!t.lanListener||(_=new ke.Server({port:0}),_.on("listening",()=>{let{port:I}=_.address();k={transport:"ws",listening:!0,addrs:Zs(I),auth:"hub-pairwise"},O(`Agent-mesh LAN listener on port ${I}`),Ee(r,t,h())}),_.on("connection",I=>{let R=!1,v=setTimeout(()=>{if(!R)try{I.close(1008,"peer auth required")}catch{}},5e3);I.once("message",D=>{clearTimeout(v);let U=gt(D),H=U?.type==="peer_auth"?N.get(U.ticket):null;if(!H||H.fromAgentId!==U.fromAgentId||Date.now()>H.exp){try{I.close(1008,"invalid ticket")}catch{}return}N.delete(U.ticket),R=!0,I.on("message",z=>{let L=gt(z);L?.type==="agent_job"&&L.job?.id&&c.enqueue({...L.job,key:L.job.id,lane:tr(L.job),ws:r}).accepted&&O(`Queued peer-handoff job ${L.job.id} from ${U.fromAgentId}`)})})}),_.on("error",I=>O(`LAN listener error: ${I?.message||I}`)))},A=()=>{if(_){try{_.close()}catch{}_=null}k={transport:"ws",listening:!1,addrs:[],auth:"hub-pairwise"}},x=I=>new Promise((R,v)=>{if(!P(r,{action:"peer_ticket_request",targetAgentId:I})){v(new Error("hub socket not open"));return}let D=M.get(I)||[];D.push({resolve:R,reject:v}),M.set(I,D),setTimeout(()=>{let U=M.get(I)||[],H=U.findIndex(z=>z.resolve===R);H>=0&&(U.splice(H,1),v(new Error("peer ticket request timed out")))},1e4)}),$=()=>new Promise((I,R)=>{if(!P(r,{action:"peer_list_request"})){R(new Error("hub socket not open"));return}u.push(I),setTimeout(()=>{let v=u.indexOf(I);v>=0&&(u.splice(v,1),I([]))},1e4)}),V=async(I,R)=>{let v=null;try{let U=(await $()).find(L=>L.agentId===I&&L.reach?.listening&&L.reach.addrs?.length);if(!U)return!1;let H=await x(I),z=H.peer?.addrs?.[0]||U.reach.addrs[0];return!z?.host||!z?.port?!1:(v=new ke(`ws://${z.host}:${z.port}`),await new Promise((L,ze)=>{v.once("open",L),v.once("error",ze),setTimeout(()=>ze(new Error("peer connect timed out")),5e3)}),P(v,{type:"peer_auth",ticket:H.ticket,fromAgentId:t.agent}),P(v,{type:"agent_job",job:R}),!0)}catch(D){return O(`Peer handoff to ${I} failed, falling back to hub relay: ${D?.message||D}`),!1}finally{try{v?.close()}catch{}}},B=()=>{n=!0,sr(S),f.shutdown("The agent daemon shut down before this was approved."),o&&clearTimeout(o),s&&clearInterval(s),i&&clearInterval(i),g&&(g.close().catch(()=>{}),g=null),A(),zn(t,{status:"stopped",connected:!1});try{r?.close()}catch{}d&&d()};if(c=mn({concurrency:t.once?1:t.maxConcurrency,runJob:async(I,R)=>{await Gs(t,I,{...R,requestPermission:f.request}),t.once&&B()}}),t.cursorBuddyBridge)try{g=await vn(t,{port:t.cursorBuddyPort,authSecret:t.cursorBuddyBridgeSecret||void 0,log:O,connectionProvider:T}),g?.secret&&(t.cursorBuddyBridgeSecret=g.secret)}catch(I){if(ri(I)){let R=await oi(t.cursorBuddyPort);if(R?.ok){let v=R.pid?` pid ${R.pid}`:"";O(`CursorBuddy local bridge already running on http://127.0.0.1:${t.cursorBuddyPort}${v}`)}else O(`CursorBuddy local bridge port ${t.cursorBuddyPort} is in use but did not answer health`)}else O(`CursorBuddy local bridge unavailable: ${I?.message||I}`);g=null}C.once("SIGINT",B),C.once("SIGTERM",B);let J=()=>{if(n)return;let I=Ts(t.url,t.token,t);l="",O(`Connecting to ${I.replace(t.token,"redacted")}`),r=new ke(I),r.on("open",async()=>{m=!1,y=null,O(`Connected. Registering @${t.handle||"agent"} from ${t.cwd}`),P(r,{type:"auth",token:t.token});let R=await Wn(t);P(r,{action:"agent_register",workspaceId:t.workspace,agentId:t.agent,handle:t.handle,name:t.name,host:Ie.hostname(),cwd:t.cwd,...R?{identity:R}:{},metadata:{codingCmd:t.codingCmd,model:t.model,permissionMode:t.permissionMode,permissionFlags:bt(t.permissionMode),once:t.once,runtime:"agensis",version:ae}}),s=setInterval(()=>{Promise.all([mr(t,h()).catch(()=>null),ft(t).catch(()=>null)]).then(([v,D])=>{P(r,{action:"agent_heartbeat",...v?{capabilitiesHash:v.capabilitiesHash,memoryHash:v.memoryHash}:{},...v?.skillsHash?{skillsHash:v.skillsHash}:{},metadata:ht(t,c,D,ir(t)?g?.getContext?.():null,S)})})},t.heartbeatMs),s.unref&&s.unref()}),r.on("message",R=>{let v=gt(R);if(v){if(v.type==="agent_registered"){m=!0,y=v.connection||v.agent||null,nr(t,v.agent),E(),O(`Registered as ${v.connection?.name||t.name} on ${v.connection?.host||Ie.hostname()}`),t.onRegistered&&Promise.resolve(t.onRegistered(t,v)).catch(D=>{O(`Profile save failed: ${D?.message||D}`)}),mt(t,v.agent).catch(()=>{}),Qn(t).catch(()=>{}),rr(r,t),or(r,t),p(),Ee(r,t,h());return}if(v.type==="agent_config"){nr(t,v.agent),O(`Updated config for @${t.handle||"agent"}: model=${t.model}, permission=${t.permissionMode}`),mt(t,v.agent).catch(()=>{});return}if(v.type==="agent_memory_refresh"){rr(r,t),Ee(r,t,h());return}if(v.type==="agent_capabilities_refresh"){Ee(r,t,h());return}if(v.type==="agent_skills_refresh"){or(r,t);return}if(v.type==="agent_inference_cancel"){S.get(String(v.requestId||""))?.abort();return}if(v.type==="agent_job_cancel"){let D=String(v.jobId||"");D&&(f.cancelJob(D,v.reason||"Cancelled by Agensis"),c.cancel(D,v.reason||"Cancelled by Agensis")&&O(`Cancelled job ${D}`));return}if(v.type==="agent_permission_decision"){f.decide(v);return}if(v.type==="agent_inference_request"&&v.requestId){let D=String(v.requestId),U=t.sharedModels.find(L=>L.id===v.model),H=[...S.values()].filter(L=>L.model===v.model).length;if(!U){P(r,{action:"agent_inference_error",requestId:D,error:`Shared model '${v.model||""}' is not available.`});return}if(H>=U.maxConcurrency){P(r,{action:"agent_inference_error",requestId:D,error:"Shared model is at capacity.",code:"capacity_exhausted"});return}let z=new AbortController;S.set(D,{abort:()=>z.abort(),model:U.id}),P(r,{action:"agent_heartbeat",metadata:ht(t,c,null,null,S)}),Pn({models:t.sharedModels,request:v,signal:z.signal,send:L=>P(r,L)}).catch(L=>{P(r,{action:"agent_inference_error",requestId:D,error:z.signal.aborted?"Inference cancelled.":L?.message||String(L),code:z.signal.aborted?"cancelled":"inference_failed"})}).finally(()=>{S.delete(D),P(r,{action:"agent_heartbeat",metadata:ht(t,c,null,null,S)})});return}if(v.type==="peer_ticket"){let D=v.peer?.agentId,U=M.get(D)||[],H=U.shift();U.length?M.set(D,U):M.delete(D),H&&H.resolve(v);return}if(v.type==="peer_ticket_grant"){N.set(v.ticket,{fromAgentId:v.fromAgentId,exp:v.exp});return}if(v.type==="peer_list"){let D=u.shift();D&&D(Array.isArray(v.peers)?v.peers:[]);return}if(v.type==="agent_reach_disable"){A(),Ee(r,t,h());return}if(v.type==="error"){O(`Server rejected request: ${v.message||"unknown error"}`);return}if(v.type==="agent_disabled"){m=!1,y=null,O(`Agent disabled by Agensis: ${v.reason||"deactivated"}`),B();return}if(v.type==="agent_job"&&v.job?.id){let D=c.enqueue({...v.job,key:v.job.id,lane:tr(v.job),get ws(){return r},parkResult:w});D.accepted&&(a+=1,O(`Queued job ${v.job.id} at position ${D.position}`),t.once&&c.idle().then(()=>B()))}}}),r.on("close",(R,v)=>{sr(S),f.shutdown(),m=!1,y=null;let D=String(v||"");if(O(`Socket closed (${R||"no-code"}${D?`: ${D}`:""})`),s&&(clearInterval(s),s=null),R===1008&&/agent deactivated|authentication failed/i.test(D)){O("Stopping daemon because Agensis rejected this agent connection."),B();return}if(l==="ECONNREFUSED"&&Ns(t.url)){O("Local agent backend is not running on 127.0.0.1:3142."),O("Start it in another terminal with: npm run backend"),O("Then rerun this connect command."),B();return}t.once&&a>0&&c.active()===0&&c.size()===0&&B(),!(n||t.once)&&(o=setTimeout(J,2e3),o.unref&&o.unref())}),r.on("error",R=>{l=R?.code||"",O(`Socket error: ${R?.message||R}`)})},X=async()=>{let I=await ft(t).catch(()=>null);await Jn(t,{busy:c.active()>0,active:c.active(),queueSize:c.size(),connected:r?.readyState===ke.OPEN,agentStatus:I?.status,agentNote:I?.note}).catch(()=>{})};X(),i=setInterval(()=>{X()},t.heartbeatMs),i.unref&&i.unref(),J(),await new Promise(I=>{let R=setInterval(async()=>{t.once&&a>0&&c.active()===0&&c.size()===0&&B(),n&&B()},500);d=()=>{clearInterval(R),I()}}),d=null,C.off("SIGINT",B),C.off("SIGTERM",B)}function xs(e){let t=Cs(e.cursorBuddyBridge),n=e.noCoding===!0||C.env.AGENSIS_NO_CODING==="1",o=!se(e.fullCliContext,se(C.env.AGENSIS_FULL_CLI_CONTEXT,!1))&&se(e.leanCli,!0),s={url:String(e.url||e.baseUrl||C.env.AGENSIS_URL||"").trim(),token:String(e.token||C.env.AGENSIS_TOKEN||"").trim(),workspace:String(e.workspace||e.workspaceId||C.env.AGENSIS_WORKSPACE||C.env.AGENSIS_WORKSPACE_ID||"").trim(),agent:String(e.agent||e.agentId||C.env.AGENSIS_AGENT||C.env.AGENSIS_AGENT_ID||"").trim(),handle:hr(e.handle||C.env.AGENSIS_HANDLE||e.name||C.env.AGENSIS_NAME||"agent"),name:String(e.name||C.env.AGENSIS_NAME||e.handle||C.env.AGENSIS_HANDLE||"agensis Agent").trim(),cwd:String(e.cwd||C.env.AGENSIS_CWD||C.cwd()).trim(),codingCmd:n?"":String(e.codingCmd||C.env.AGENSIS_CODING_CMD||C.env.CODING_CMD||"claude -p").trim(),ampCmd:String(e.ampCmd||C.env.AGENSIS_AMP_CMD||"amp").trim()||"amp",model:wt(e.model||C.env.AGENSIS_MODEL||C.env.CLAUDE_MODEL||""),permissionMode:Ge(e.permissionMode||e.permission_mode||e.permission||C.env.AGENSIS_PERMISSION_MODE||"default"),timeoutMs:Number(e.timeoutMs||C.env.AGENSIS_TIMEOUT_MS||Es),heartbeatMs:Number(e.heartbeatMs||C.env.AGENSIS_HEARTBEAT_MS||ks),maxConcurrency:Math.max(1,Number(e.maxConcurrency||C.env.AGENSIS_MAX_CONCURRENCY||er)||er),once:!!(e.once||C.env.AGENSIS_ONCE==="1"),exitOnOnce:!!e.exitOnOnce,onRegistered:typeof e.onRegistered=="function"?e.onRegistered:null,primaryDaemon:!!(e.primaryDaemon||C.env.AGENSIS_PRIMARY_DAEMON==="1"),cursorBuddyRuntime:!!(e.cursorBuddyRuntime||C.env.AGENSIS_CURSORBUDDY_RUNTIME==="1"),cursorBuddyBridge:t,cursorBuddyPort:Number(e.cursorBuddyPort||C.env.AGENSIS_CURSORBUDDY_PORT||8787),cursorBuddyBridgeSecret:String(e.cursorBuddyBridgeSecret||C.env.AGENSIS_CURSORBUDDY_BRIDGE_SECRET||"").trim(),cursorBuddyModel:String(e.cursorBuddyModel||C.env.AGENSIS_CURSORBUDDY_MODEL||"haiku-4.5").trim(),lanListener:!!(e.lanListener||e.lan||C.env.AGENSIS_LAN==="1"),share:!!(e.share||C.env.AGENSIS_SHARE==="1"),sharedModelsFile:String(e.sharedModelsFile||C.env.AGENSIS_SHARED_MODELS_FILE||"").trim(),noCoding:n,leanCli:o,fastConnection:se(e.fastConnection,se(C.env.AGENSIS_FAST_CONNECTION,!0)),syncMemory:se(e.syncMemory,C.env.AGENSIS_SYNC_MEMORY==="1"),syncSkills:se(e.syncSkills,se(C.env.AGENSIS_SYNC_SKILLS,!0)),hostFolders:ur(e.hostFolders??e.host_folders??C.env.AGENSIS_HOST_FOLDERS)};s.sharedModelsFile&&!me.isAbsolute(s.sharedModelsFile)&&(s.sharedModelsFile=me.resolve(s.cwd,s.sharedModelsFile));let i=[];if(s.url||i.push("--url"),s.token||i.push("--token"),s.workspace||i.push("--workspace"),s.agent||i.push("--agent"),s.share&&!s.sharedModelsFile&&i.push("--shared-models-file"),i.length)throw new Error(`Missing required option(s): ${i.join(", ")}`);return s}function se(e,t){return e==null||e===""?t:typeof e=="boolean"?e:!/^(0|false|off|no)$/i.test(String(e).trim())}function Cs(e){let t=C.env.AGENSIS_CURSORBUDDY_BRIDGE;return t!==void 0&&t!==""?!/^(0|false|off|no)$/i.test(String(t).trim()):e==null||e===""?!1:typeof e=="boolean"?e:!/^(0|false|off|no)$/i.test(String(e).trim())}function Ts(e,t,n={}){let r=St(e);return r.protocol=r.protocol==="https:"?"wss:":"ws:",r.pathname="/backend/ws",r.search="",n.workspace&&r.searchParams.set("workspaceId",n.workspace),n.agent&&r.searchParams.set("agentId",n.agent),r.toString()}function St(e){let t=new URL(e);return Ms(t)&&(t.protocol="http:",t.hostname="127.0.0.1",t.port="3142"),t}function Ms(e){if(!(e.hostname==="localhost"||e.hostname==="127.0.0.1"||e.hostname==="0.0.0.0")||e.port==="3142")return!1;if(e.port==="5173"||e.port==="8888")return!0;let t=Number(e.port||0);return t>=49152&&t<=65535}function Ns(e){try{let t=St(e);return(t.hostname==="localhost"||t.hostname==="127.0.0.1"||t.hostname==="0.0.0.0")&&t.port==="3142"}catch{return!1}}function tr(e){let t=String(e?.sessionId||""),n=String(e?.threadParentId||"");return`${t}::${n}`}var Os=/\b(cursorbuddy|cursor buddy|avatar|buddy|pet|character|him|guy)\b/i,$s=[/\b(?:make|have|tell)\s+(?:the\s+)?(?:cursorbuddy|cursor buddy|avatar|buddy|pet|character|him|guy)\s+(?:say|speak)\s+(.+)$/i];function Ds(e){return String(e||"").trim().replace(/^[`"'“”‘’]+|[`"'“”‘’?.!]+$/g,"").trim().slice(0,1200)}function Rs(e){for(let t of $s){let n=String(e||"").match(t),r=Ds(n?.[1]||"");if(r)return r}return""}function Bs(e){let t=String(e||"").replace(/\s+/g," ").trim();if(!t)return"";let n=/latest user message\s*:\s*/gi,r=null,o=null;for(;r=n.exec(t);)o=r;if(!o)return"";let s=t.slice(o.index+o[0].length).trim(),i=s.search(/\b(Return a useful response|Conversation context follows|Previous user|Previous assistant|Diagnostic notes|System prompt|Developer message)\b/i);return(i>=0?s.slice(0,i):s).trim().replace(/^["'“”‘’]+|["'“”‘’]+$/g,"").trim()}function Ps(e){let t=String(e||"").replace(/\s+/g," ").trim(),r=Bs(t)||t;if(!r)return"";if(r.length<=500)return r;let o=[/\b(?:can you\s+)?(?:make|have|tell)\s+(?:the\s+)?(?:cursorbuddy|cursor buddy|avatar|buddy|pet|character|him|guy)\s+(?:wave|waves|waving|say|speak)\b.{0,160}/i,/\b(?:cursorbuddy|cursor buddy|avatar|buddy|pet|character|him|guy)\b.{0,120}\b(?:wave|waves|waving|say|speak|open|show|hide|hush|close|dismiss|clear)\b.{0,160}/i,/\b(?:wave|open|show|hide|hush|close|dismiss|clear)\b.{0,120}\b(?:cursorbuddy|cursor buddy|avatar|buddy|pet|character|him|guy|bubble|prompt|dialog|panel|options|menu)\b/i,/\b(?:say|speak)\s+[`"'“”‘’]?.{1,180}/i];for(let s of o){let i=r.match(s);if(i?.[0])return i[0].trim()}return""}function Ls(e){let t=Ps(e);if(!t)return null;let n=/^(open|show|hide|hush|close|dismiss)\b/i.test(t),r=Os.test(t);if(!n&&!r)return null;let o="agensis-native-control";if(/\b(hide|hush|close|dismiss|clear)\b.*\b(bubble|prompt|dialog|panel|options|menu)\b/i.test(t)||/^hush\b/i.test(t))return{action:"hush",source:o};if(/\b(open|show|bring up|get back|display)\b.*\b(prompt|bubble|dialog|panel|options|menu)\b/i.test(t)||/^open\b/i.test(t))return{action:"open",source:o};let s=Rs(t);return s&&r?{action:"say",text:s,source:o}:r&&/\b(wave|waves|waving)\b/i.test(t)?{action:"wave",text:s,source:o}:null}async function Us(e,t){let r=`http://127.0.0.1:${Number(e.cursorBuddyPort||8787)}/cursorbuddy/control`,o=String(e.cursorBuddyBridgeSecret||C.env.AGENSIS_CURSORBUDDY_BRIDGE_SECRET||"").trim(),s={"content-type":"application/json"};o&&(s.authorization=`Bearer ${o}`,s["x-agensis-bridge-secret"]=o);let i=await fetch(r,{method:"POST",headers:s,body:JSON.stringify(t)}),a=null;try{a=await i.json()}catch{a=null}if(!i.ok||a?.ok===!1)throw new Error(a?.error||`CursorBuddy control failed with HTTP ${i.status}`);return a}function js(e){return e.action==="wave"?"Sent CursorBuddy a wave command.":e.action==="say"?`Sent CursorBuddy speech: ${e.text||""}`.trim():e.action==="open"?"Opened CursorBuddy's prompt.":e.action==="hush"?"Dismissed CursorBuddy's bubble.":e.action==="choose"?"Sent CursorBuddy options.":"Sent CursorBuddy control command."}function ir(e={}){return e.cursorBuddyBridge===!1?!1:!!(e.cursorBuddyRuntime||e.primaryDaemon)}async function Fs(e,t,n,r){let o="cursorbuddy-control",s="native",i=[],a=(l="")=>{P(t.ws,{action:"agent_job_delta",jobId:t.id,content:l,elapsedMs:Date.now()-r,model:o,permissionMode:s,permissionFlags:i})};a("");let d="",c="";try{await Us(e,n),d=js(n),a(d)}catch(l){c=String(l?.message||l),d=`CursorBuddy control failed: ${c}`,a(d)}_t(t,{action:"agent_job_result",jobId:t.id,response:d,error:c,elapsedMs:Date.now()-r,model:o,permissionMode:s,permissionFlags:i}),O(`Finished native CursorBuddy ${n.action} job ${t.id} in ${Math.round((Date.now()-r)/1e3)}s`)}async function Gs(e,t,{signal:n,requestPermission:r=null}){let o=Date.now();if(O(`Starting job ${t.id}`),an(t)){await Hs(e,t,{signal:n,started:o}),e.once&&(O("One-shot Amp job complete; exiting."),setTimeout(()=>C.exit(0),150));return}let s=Ls(t.prompt);if(s&&ir(e)){await Fs(e,t,s,o),e.once&&(O("One-shot CursorBuddy control job complete; exiting."),setTimeout(()=>C.exit(0),150));return}let i=zs(e,t),a=await qs(e,t),d="",c="",l=0,g=(h="")=>{P(t.ws,{action:"agent_job_delta",jobId:t.id,content:h,elapsedMs:Date.now()-o,model:i.model,permissionMode:i.permissionMode,permissionFlags:i.permissionFlags})},m=h=>{P(t.ws,{action:"agent_job_step",jobId:t.id,kind:h.kind,name:h.name,detail:h.detail,elapsedMs:Date.now()-o})},y=h=>{P(t.ws,{action:"agent_job_segment",jobId:t.id,text:h.text,elapsedMs:Date.now()-o})};g("");let S=i.streamJson?ar({onStep:m,onSegment:y}):null,f=setInterval(()=>g(d),1e3);f.unref&&f.unref();let b=!/[\\/]/.test(i.cmd),w=e.fastConnection&&b?fr(i.cmd)?"claude":pr(i.cmd)?"codex":null:null,_=await on(t,{family:w}).run({cmd:i.cmd,args:[...i.args,a],env:i.env,cwd:t.cwd||e.cwd,timeoutMs:e.timeoutMs,heartbeatMs:e.heartbeatMs,label:"agent job",signal:n,job:t,prompt:a,model:i.model,permissionMode:i.permissionMode,hostFolders:dr(e,t),leanCli:e.leanCli,mcp:e.leanCli?yt(e):null,sessionKey:`${t.workspaceId||e.workspace||""}:${e.agent||e.handle||""}`,clientVersion:ae,requestPermission:r,onData:h=>{S?(S.feed(h),d=S.live):(d+=String(h||""),c=ni(`${c}
|
|
47
|
+
${h}`));let T=Date.now();T-l>150&&(l=T,g(d))}});clearInterval(f),S&&(S.end(),d=S.live,g(d));let k=String(_.stdout||"").trim(),N=String(_.stderr||"").trim(),M=_.error?_.error.message:_.status===0?"":N||`Command exited with status ${_.status}`,u=S?S.result||(M?"":N):k||(M?"":N)||c||"";_t(t,{action:"agent_job_result",jobId:t.id,response:u,error:M,elapsedMs:Date.now()-o,model:i.model,permissionMode:i.permissionMode,permissionFlags:i.permissionFlags}),O(`Finished job ${t.id} in ${Math.round((Date.now()-o)/1e3)}s`),e.once&&(O("One-shot job complete; exiting."),setTimeout(()=>C.exit(0),150))}async function Hs(e,t,{signal:n,started:r=Date.now()}={}){let o="amp-orb",s="amp-managed",i=[],a=(u="")=>P(t.ws,{action:"agent_job_delta",jobId:t.id,content:u,elapsedMs:Date.now()-r,model:o,permissionMode:s,permissionFlags:i}),d=u=>P(t.ws,{action:"agent_job_step",jobId:t.id,kind:u.kind,name:u.name,detail:u.detail,elapsedMs:Date.now()-r}),c=u=>P(t.ws,{action:"agent_job_segment",jobId:t.id,text:u.text,elapsedMs:Date.now()-r}),l=({response:u="",error:h="",errorCode:T="",threadId:p=""}={})=>{let A=he(p);_t(t,{action:"agent_job_result",jobId:t.id,response:u,error:h,errorCode:T||void 0,elapsedMs:Date.now()-r,model:o,permissionMode:s,permissionFlags:i,metadata:{runtime:"amp",...A?{ampThreadId:A,ampThreadUrl:`https://ampcode.com/threads/${A}`}:{},...T?{ampErrorCode:T}:{}}})};a("");let g=me.resolve(String(t.cwd||e.cwd)),m=[e.cwd,...e.hostFolders||[]];try{await un({cwd:g,allowedRoots:m});let u=await Ze({cwd:g,executable:e.ampCmd,signal:n});if(!u.available)throw ee(u.reason||"amp_cli_crashed")}catch(u){let h=n?.aborted?"amp_turn_cancelled":String(u?.code||"amp_cli_crashed");l({error:u?.message||ee(h).message,errorCode:h}),O(`Amp job ${t.id} refused: ${h}`);return}let y=String(t?.runtime?.threadId||t?.ampThreadId||t?.metadata?.ampThreadId||"").trim(),S=he(y);if(t?.runtime?.continuationRequired===!0&&!S||y&&!S){let u=ee("amp_thread_not_found");l({error:u.message,errorCode:u.code}),O(`Amp job ${t.id} refused: ${u.code}`);return}let f=cn({executable:e.ampCmd,prompt:String(t.prompt||""),threadId:S}),b=ar({onStep:d,onSegment:c}),w=ln(),E="",_=0,k=setInterval(()=>a(E),1e3);k.unref&&k.unref();let N=await Z({cmd:f.cmd,args:f.args,cwd:g,timeoutMs:e.timeoutMs,heartbeatMs:e.heartbeatMs,label:"Amp orb turn",signal:n,onData:u=>{b.feed(u),w.feed(u),E=b.live;let h=Date.now();h-_>150&&(_=h,a(E))}});clearInterval(k),b.end(),w.end(),E=b.live,a(E);let M=w.threadId||S;if(N.status!==0||N.error){let u=dn(N);l({error:u.message,errorCode:u.code,threadId:M}),O(`Amp job ${t.id} failed: ${u.code}`);return}if(!M){let u=ee("amp_stream_invalid");l({error:u.message,errorCode:u.code}),O(`Amp job ${t.id} failed: ${u.code}`);return}l({response:b.result||"",threadId:M}),O(`Finished Amp job ${t.id} in ${Math.round((Date.now()-r)/1e3)}s (${M})`)}async function qs(e,t){let n=t.agent||{},r=Array.isArray(n.skills)?n.skills.join(", "):String(n.skills||""),o=Array.isArray(n.tools)?n.tools.join(", "):String(n.tools||""),s=cr(e,t),i=lr(e,t),a=await Zn(e).catch(()=>null),d=a?`Heartbeat (recurring instructions \u2014 edit at ${qn(e)}):
|
|
48
48
|
${a}`:"",l=["You are running as a local agensis workspace agent daemon.",`Workspace: ${t.workspaceId||e.workspace}`,`Channel session: ${t.sessionId||""}`,`Agent: ${n.name||e.name} (@${n.handle||e.handle})`,`Requested model: ${s}`,`Permission mode: ${i}`,n.description?`Description:
|
|
49
49
|
${n.description}`:"",n.soul?`Soul:
|
|
50
50
|
${n.soul}`:"",n.system_prompt?`System instructions:
|
|
51
51
|
${n.system_prompt}`:"",n.instructions?`Additional instructions:
|
|
52
52
|
${n.instructions}`:"",o?`Enabled tools:
|
|
53
53
|
${o}`:"",r?`Enabled skills:
|
|
54
|
-
${r}`:"",'Thread widgets: this chat has a right-side widget rail the human watches. When you work a multi-step task here, surface it: call create_thread_item (kind "todo", "plan", or "blocker") with the Channel session id above to post your plan steps and to-dos, mark them done with update_thread_item as you finish, and raise a "blocker" when you need the human to answer something (read their reply from the item response via list_thread_items). Keep it to a few real items, not every micro-step; skip it for quick one-off replies.',`Status file: you can report your own working status by overwriting the JSON file at ${
|
|
54
|
+
${r}`:"",'Thread widgets: this chat has a right-side widget rail the human watches. When you work a multi-step task here, surface it: call create_thread_item (kind "todo", "plan", or "blocker") with the Channel session id above to post your plan steps and to-dos, mark them done with update_thread_item as you finish, and raise a "blocker" when you need the human to answer something (read their reply from the item response via list_thread_items). Keep it to a few real items, not every micro-step; skip it for quick one-off replies.',`Status file: you can report your own working status by overwriting the JSON file at ${Hn(e)} with e.g. {"status":"working","note":"short summary of what you're doing"}. Your daemon reads it on its next heartbeat (~${Math.round((e.heartbeatMs||15e3)/1e3)}s) and surfaces it on your agent card. Optional and best-effort \u2014 overwrite the whole file, keep note under ~200 chars, and there's no need to clear it.`,`Identity file: you can declare how you appear \u2014 avatar, description, soul, and voice ({"cartesia_voice_id","speed","emotion"}) \u2014 by writing JSON to ${pt(e)}, e.g. {"avatar":"FX","description":"...","voice":{"emotion":"calm"}}. Your daemon sends it the next time it connects; anything a human has set in the app always wins, and "name" only applies to brand-new agents.`,d,"User message:",String(t.prompt||""),"Identity boundary: answer as the workspace agent named above. Do not adopt the identity of any browser, desktop, avatar, pet, widget, or UI surface.","Respond with a clear channel-ready result. Use markdown for structure \u2014 bullets, headers, and code blocks where appropriate. If you changed files, summarize the files and verification. If you cannot complete it, say exactly why."].filter(Boolean).join(`
|
|
55
55
|
|
|
56
|
-
`);return e.leanCli?
|
|
56
|
+
`);return e.leanCli?Js(l,As):l}function Js(e,t){let n=String(e||"");if(Buffer.byteLength(n,"utf8")<=t)return n;let r=`[... older or optional Agensis context omitted ...]
|
|
57
57
|
|
|
58
|
-
`,o=Math.max(0,t-Buffer.byteLength(r,"utf8")),s=[...n],i=0,a=s.length;for(;i<a;){let d=Math.ceil((i+a)/2),c=s.slice(s.length-d).join("");Buffer.byteLength(c,"utf8")<=o?i=d:a=d-1}return r+s.slice(s.length-i).join("")}function
|
|
59
|
-
`))>=0;)S(n.slice(0,b)),n=n.slice(b+1)},end(){n&&(S(n),n="")},get live(){return o?r:s},get result(){return a??i+(o?r:s)}}}function
|
|
60
|
-
${
|
|
61
|
-
`)}function
|
|
62
|
-
`,{mode:384}),await
|
|
63
|
-
`)}import
|
|
64
|
-
`,{mode:384}),await
|
|
65
|
-
`),
|
|
58
|
+
`,o=Math.max(0,t-Buffer.byteLength(r,"utf8")),s=[...n],i=0,a=s.length;for(;i<a;){let d=Math.ceil((i+a)/2),c=s.slice(s.length-d).join("");Buffer.byteLength(c,"utf8")<=o?i=d:a=d-1}return r+s.slice(s.length-i).join("")}function zs(e,t){let{cmd:n,args:r}=ti(e.codingCmd),o=cr(e,t),s=lr(e,t),i=ei(r),a=bt(s),d=dr(e,t);if(fr(n)){let c=[...i];o&&c.push("--model",o);let l;if(e.leanCli){let S=yt(e);c.push("--no-session-persistence","--safe-mode","--mcp-config",JSON.stringify({mcpServers:{agensis:{type:"http",url:S.url,headers:{Authorization:"Bearer ${AGENSIS_MCP_TOKEN}"}}}}),"--strict-mcp-config"),l=S.env}if(s==="accept_edits"&&c.push("--permission-mode","acceptEdits"),s==="yolo"){let S=t&&t.agent&&t.agent.run_mode==="sandbox",f=typeof C.getuid=="function"&&C.getuid()===0,b=S||Ws(),w=C.env.AGENSIS_ALLOW_ROOT_SKIP_PERMISSIONS==="1";b||!f||w?c.push("--dangerously-skip-permissions"):(a=[],O("running as root with no sandbox detected: dropping --dangerously-skip-permissions (Claude rejects it as root). Set AGENSIS_ALLOW_ROOT_SKIP_PERMISSIONS=1 if this host really is sandboxed."))}let g=i.some(S=>S==="--output-format"||String(S).startsWith("--output-format=")),m=i.includes("-p")||i.includes("--print"),y=!1;!g&&m?(c.push("--output-format","stream-json","--include-partial-messages"),i.includes("--verbose")||c.push("--verbose"),y=!0):g&&(y=i.some(S=>/stream-json/.test(String(S))));for(let S of d)c.push("--add-dir",S);return{cmd:n,args:c,model:o,permissionMode:s,permissionFlags:a,streamJson:y,env:l}}if(pr(n)){let c=[...i];o&&c.push("--model",o);let l;if(e.leanCli&&i.includes("exec")){let g=yt(e);c.push("--ephemeral","--ignore-user-config","--ignore-rules","--disable","plugins","--disable","memories","--disable","hooks","--disable","skill_search","-c","project_doc_max_bytes=0","-c",`mcp_servers.agensis.url=${JSON.stringify(g.url)}`,"-c",'mcp_servers.agensis.bearer_token_env_var="AGENSIS_MCP_TOKEN"'),l=g.env}return s==="yolo"&&c.push("--sandbox","danger-full-access","--ask-for-approval","never"),{cmd:n,args:c,model:o,permissionMode:s,permissionFlags:a,env:l}}return{cmd:n,args:r,model:o,permissionMode:s,permissionFlags:a}}function yt(e){let t=St(e.url);return t.pathname="/backend/mcp",t.search="",t.hash="",{url:t.toString(),env:{AGENSIS_MCP_TOKEN:e.token}}}function ar({onStep:e,onSegment:t}={}){let n="",r="",o=!1,s="",i="",a=null,d=!1,c=!1,l=new Set,g=f=>{if(!(typeof e!="function"||!f.name))try{e(f)}catch{}},m=f=>{if(typeof t=="function"){i+=o?r:s,r="",s="";try{t(f)}catch{}}},y=f=>{if(!f||typeof f!="object")return;if(f.type==="agensis_step"){let w=f.step;w&&typeof w=="object"&&(d=!0,g({kind:w.kind||"tool",name:String(w.name||""),detail:String(w.detail||"")}));return}if(f.type==="agensis_segment"){let w=f.segment;w&&typeof w=="object"&&(c=!0,m({text:String(w.text||"")}));return}let b=f.event&&f.event.delta||f.delta;if(b&&b.type==="text_delta"&&typeof b.text=="string"){o=!0,r+=b.text;return}if(f.type==="result"&&typeof f.result=="string"){a=f.result;return}if(f.type==="assistant"&&f.message&&Array.isArray(f.message.content)){let w=f.message.content.filter(E=>E&&E.type==="text"&&typeof E.text=="string").map(E=>E.text).join("");if(w&&(s+=w),w&&!c&&m({text:w}),!d)for(let E of f.message.content){if(!E||E.type!=="tool_use")continue;let _=typeof E.id=="string"?E.id:"";if(_){if(l.has(_))continue;l.add(_)}g({kind:"tool",name:String(E.name||""),detail:Ne(E.input)})}}},S=f=>{let b=String(f).trim();if(b)try{y(JSON.parse(b))}catch{}};return{feed(f){n+=String(f||"");let b;for(;(b=n.indexOf(`
|
|
59
|
+
`))>=0;)S(n.slice(0,b)),n=n.slice(b+1)},end(){n&&(S(n),n="")},get live(){return o?r:s},get result(){return a??i+(o?r:s)}}}function cr(e,t){return wt(t?.agent?.model||t?.model||e.model)}function wt(e){let t=String(e||"").trim();return!t||t==="auto"||t==="claude-fable-5"?Is:t}function lr(e,t){return Ge(t?.agent?.permissionMode||t?.agent?.permission_mode||t?.permissionMode||t?.permission_mode||e.permissionMode)}function Ge(e){let t=String(e||"").trim().toLowerCase().replace(/[-\s]+/g,"_");return["yolo","no_sandbox","danger","danger_full_access","dangerously_skip_permissions"].includes(t)?"yolo":["accept_edits","acceptedits","auto_approve","auto_approve_edits"].includes(t)?"accept_edits":"default"}function bt(e){return Ge(e)==="yolo"?["--no-sandbox","--yolo"]:[]}function ur(e){let t=Array.isArray(e)?e:String(e||"").split(/[,\n]/),n=new Set,r=[];for(let o of t){let s=String(o||"").trim();!s||n.has(s)||(n.add(s),r.push(s))}return r}function Ks(e,t){let n=t?.agent?.metadata?.host_folders??t?.agent?.hostFolders??t?.hostFolders??t?.host_folders,r=ur(n);return r.length>0?r:e.hostFolders||[]}function dr(e,t){let n=Ks(e,t),r=K({workspace:e.workspace,agent:e.agent});return r&&!n.includes(r)?[...n,r]:n}var de;function Ws(){if(de!==void 0)return de;let e=C.env;if(e.AGENSIS_ALLOW_ROOT_SKIP_PERMISSIONS==="1"||e.AGENSIS_SANDBOX_HOST==="1"||e.IS_SANDBOX==="1")return de=!0;if(e.AGENSIS_NO_SANDBOX_AUTODETECT==="1")return de=!1;try{if(Ae.existsSync("/.dockerenv")||Ae.existsSync("/run/.containerenv"))return de=!0}catch{}try{let t=Ae.readFileSync("/proc/1/cgroup","utf8");if(/docker|kubepods|containerd|lxc|podman/i.test(t))return de=!0}catch{}return de=!1}function ht(e,t,n,r=null,o=null){let s={busy:t.active()>0,queueSize:t.size(),cwd:e.cwd,model:e.model,permissionMode:e.permissionMode,permissionFlags:bt(e.permissionMode),daemon:{runtime:"agensis-cli",version:ae,pid:C.pid,node:C.version,platform:C.platform,arch:C.arch,host:Ie.hostname(),cwd:e.cwd}};if(o instanceof Map){let i={};for(let a of o.values()){let d=String(a?.model||"");d&&(i[d]=(i[d]||0)+1)}s.activeInferenceByModel=i}return r&&typeof r=="object"&&(s.cursorBuddy=Ys(r)),n?.status&&(s.agentStatus=n.status),n?.note&&(s.agentNote=n.note),(n?.status||n?.note)&&(s.agentStatusAt=new Date().toISOString()),s}function Ys(e={}){let t=e.client&&typeof e.client=="object"?e.client:{},n=e.page&&typeof e.page=="object"?e.page:{},r=e.runtime&&typeof e.runtime=="object"?e.runtime:{},o=e.manifest&&typeof e.manifest=="object"?e.manifest:{},s=e.project&&typeof e.project=="object"?e.project:{};return{surface:String(e.surface||"").slice(0,80),instanceId:String(e.instanceId||"").slice(0,140),url:String(e.url||"").slice(0,2048),title:String(e.title||"").slice(0,300),origin:String(n.origin||"").slice(0,300),hostname:String(n.hostname||"").slice(0,200),pathname:String(n.pathname||"").slice(0,500),visibilityState:String(n.visibilityState||"").slice(0,40),focused:n.focused===!0,userAgent:String(t.userAgent||"").slice(0,500),platform:String(t.platform||"").slice(0,120),language:String(t.language||"").slice(0,80),viewport:t.viewport&&typeof t.viewport=="object"?{width:Number(t.viewport.width)||0,height:Number(t.viewport.height)||0,devicePixelRatio:Number(t.viewport.devicePixelRatio)||0}:null,runtimeMarker:String(r.marker||"").slice(0,120),extensionMarker:String(r.extensionMarker||"").slice(0,120),manifest:{name:String(o.name||"").slice(0,120),version:String(o.version||"").slice(0,80),source:String(o.source||"").slice(0,500)},project:{name:String(s.name||"").slice(0,120),root:String(s.root||"").slice(0,500),agent:String(s.agent||"").slice(0,80)},updatedAt:String(e.updatedAt||"").slice(0,80)}}function nr(e,t){if(!t||typeof t!="object")return;t.name&&(e.name=String(t.name).trim()||e.name),(t.handle||t.name)&&(e.handle=hr(t.handle||t.name||e.handle)),t.model&&(e.model=wt(t.model));let n=t.permissionMode||t.permission_mode;n&&(e.permissionMode=Ge(n)),(t.memory_dir!==void 0||t.memoryDir!==void 0)&&(e.memoryDir=String(t.memory_dir??t.memoryDir??"").trim())}function Vs(){let e=["amp","claude","codex","gh","node","npm","python3","git","fly","vercel"],t=(C.env.PATH||"").split(me.delimiter).filter(Boolean);return e.filter(n=>t.some(r=>{try{return Ae.existsSync(me.join(r,n))}catch{return!1}}))}function Xs(){try{let e=Ae.readFileSync(me.join(Ie.homedir(),".claude.json"),"utf8"),n=JSON.parse(e)?.mcpServers;if(n&&typeof n=="object")return Object.keys(n).sort()}catch{}return[]}function je(e){return vs.createHash("sha1").update(String(e)).digest("hex").slice(0,16)}async function mr(e,t=null){let n=Tn({cwd:e.cwd}),r=Cn({cwd:e.cwd}),o=Vs(),s=Xs(),i=e.syncMemory&&nt({cwd:e.cwd,memoryDir:e.memoryDir})||null,a=Bn(e.sharedModels),c={amp:await Qs(e)},l=je(JSON.stringify({skills:n,commands:r,clis:o,mcpServers:s,memoryRoot:i,sharedModels:a,runtimes:c,codingRoute:!!e.codingCmd,shared:e.share,reach:t||null})),g=je(await An(i)),m=e.syncSkills?je(await lt({cwd:e.cwd})):null;return{skills:n,commands:r,clis:o,mcpServers:s,memoryRoot:i,sharedModels:a,runtimes:c,codingRoute:!!e.codingCmd,shared:e.share,reach:t||null,capabilitiesHash:l,memoryHash:g,skillsHash:m}}var ie=null;async function Qs(e){let t=`${e.ampCmd}
|
|
60
|
+
${me.resolve(e.cwd)}`;if(ie?.key===t&&Date.now()-ie.at<6e4)return ie.value??ie.pending;let n=Ze({cwd:e.cwd,executable:e.ampCmd});ie={key:t,at:Date.now(),pending:n};try{let r=await n;return ie={key:t,at:Date.now(),value:r},r}catch(r){throw ie?.pending===n&&(ie=null),r}}async function Ee(e,t,n=null){try{let r=await mr(t,n);P(e,{action:"agent_capabilities_sync",workspaceId:t.workspace,agentId:t.agent,skills:r.skills,commands:r.commands,clis:r.clis,mcpServers:r.mcpServers,sharedModels:r.sharedModels,runtimes:r.runtimes,codingRoute:r.codingRoute,shared:r.shared,memoryRoot:r.memoryRoot,reach:r.reach||void 0,hash:r.capabilitiesHash,memoryHash:r.memoryHash,skillsHash:r.skillsHash}),O(`Capabilities synced \u2014 skills:${r.skills.length} commands:${r.commands.length} clis:${r.clis.length} mcp:${r.mcpServers.length}`)}catch(r){O(`Capabilities sync skipped: ${r?.message||r}`)}}function Zs(e){let t=Ie.networkInterfaces(),n=[];for(let r of Object.values(t))for(let o of r||[])o.family==="IPv4"&&!o.internal&&n.push({host:o.address,port:e,scope:"lan"});return n.slice(0,4)}async function rr(e,t){try{if(!t.syncMemory)return;let n=nt({cwd:t.cwd,memoryDir:t.memoryDir});if(!n)return;let r=await In(n);P(e,{action:"agent_memory_sync",workspaceId:t.workspace,agentId:t.agent,root:n,files:r}),O(`Synced ${r.length} memory file${r.length===1?"":"s"} from ${n}`)}catch(n){O(`Memory sync skipped: ${n?.message||n}`)}}async function or(e,t){try{if(!t.syncSkills)return;let n=je(await lt({cwd:t.cwd})),r=await $n({cwd:t.cwd});P(e,{action:"agent_skill_sync",workspaceId:t.workspace,agentId:t.agent,hash:n,skills:r});let o=r.filter(s=>s.truncated).length;O(`Synced ${r.length} skill document${r.length===1?"":"s"}${o?` (${o} truncated)`:""}`)}catch(n){O(`Skill sync skipped: ${n?.message||n}`)}}function ei(e){let t=new Set(["--model","-m","--permission-mode","--sandbox","--ask-for-approval","--approval-policy"]),n=new Set(["--dangerously-skip-permissions","--no-sandbox","--yolo","--accept-edits"]),r=[];for(let o=0;o<e.length;o+=1){let s=e[o],[i]=String(s).split("=",1);if(!n.has(s)){if(t.has(i)){String(s).includes("=")||(o+=1);continue}r.push(s)}}return r}function fr(e){return/(^|\/)claude(?:$|\.)/.test(String(e||""))}function pr(e){return/(^|\/)codex(?:$|\.)/.test(String(e||""))}function ti(e){let t=[],n="",r="",o=!1;for(let s of e){if(o){n+=s,o=!1;continue}if(s==="\\"){o=!0;continue}if(r){s===r?r="":n+=s;continue}if(s==='"'||s==="'"){r=s;continue}if(/\s/.test(s)){n&&(t.push(n),n="");continue}n+=s}if(n&&t.push(n),!t.length)throw new Error("coding command is empty");return{cmd:t[0],args:t.slice(1)}}function gt(e){try{return JSON.parse(String(e))}catch{return null}}function P(e,t){return!e||e.readyState!==ke.OPEN?!1:(e.send(JSON.stringify(t)),!0)}function _t(e,t){return P(e.ws,t)?!0:(e.parkResult?.(t),!1)}function ni(e){return String(e||"").split(/\r?\n/).map(t=>t.trim()).filter(Boolean).slice(-1)[0]||""}function hr(e){return String(e||"").trim().toLowerCase().replace(/^@+/,"").replace(/[^a-z0-9_.-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,64)}function ri(e){return e?.code==="EADDRINUSE"||/\bEADDRINUSE\b/.test(String(e?.message||e))}async function oi(e){let t=new AbortController,n=setTimeout(()=>t.abort(),700);try{let r=await fetch(`http://127.0.0.1:${Number(e||8787)}/cursorbuddy/health`,{cache:"no-store",signal:t.signal}),o=await r.json().catch(()=>({}));return!r.ok||!o?.ok?null:o}catch{return null}finally{clearTimeout(n)}}function O(e){C.stderr.write(`[agensis] ${e}
|
|
61
|
+
`)}function sr(e){if(e instanceof Map)for(let t of e.values())try{t?.abort?.()}catch{}}import si from"node:crypto";import xe from"node:fs/promises";import ii from"node:os";import gr from"node:path";var fe="default",yr=2,ai=/^[a-zA-Z0-9_.-]{1,64}$/,ci=["url","token","workspace","agent","handle","name","cwd","codingCmd","ampCmd","model","permissionMode","timeoutMs","heartbeatMs","maxConcurrency","share","sharedModelsFile","noCoding","leanCli","fullCliContext","syncMemory","syncSkills","lanListener","primaryDaemon","cursorBuddyBridge","cursorBuddyPort","hostFolders"];function Q(e=fe){let t=String(e||fe).trim();if(!ai.test(t))throw new Error("Daemon profile names may only contain letters, numbers, dot, dash, and underscore.");return t}function Sr(e=fe,t={}){let n=t.homedir||ii.homedir();return gr.join(n,".agensis","daemon-profiles",`${Q(e)}.json`)}function vt(e={}){let t={};for(let n of ci){let r=e[n];r!=null&&r!==""&&(t[n]=r)}return t}function ce(e,t,n=[]){for(let r of t)if(String(e?.[r]||"").trim())return!0;for(let r of n)if(String(process.env[r]||"").trim())return!0;return!1}function wr(e={}){return!!(ce(e,["url","baseUrl"],["AGENSIS_URL"])||ce(e,["token"],["AGENSIS_TOKEN"])||ce(e,["workspace","workspaceId"],["AGENSIS_WORKSPACE","AGENSIS_WORKSPACE_ID"])||ce(e,["agent","agentId"],["AGENSIS_AGENT","AGENSIS_AGENT_ID"]))}function Et(e={}){return!!(ce(e,["url","baseUrl"],["AGENSIS_URL"])&&ce(e,["token"],["AGENSIS_TOKEN"])&&ce(e,["workspace","workspaceId"],["AGENSIS_WORKSPACE","AGENSIS_WORKSPACE_ID"])&&ce(e,["agent","agentId"],["AGENSIS_AGENT","AGENSIS_AGENT_ID"]))}async function kt(e=fe,t={}){let n=Sr(e,t),r;try{r=await xe.readFile(n,"utf8")}catch(a){if(a?.code==="ENOENT")return null;throw a}let o;try{o=JSON.parse(r)}catch(a){throw new Error(`Daemon profile "${Q(e)}" is unreadable: ${a?.message||a}`)}let s=o?.config;if(!s?.url||!s?.token||!s?.workspace||!s?.agent)return null;let i=vt(s);return Number(o.version||1)<yr&&Number(i.maxConcurrency)===8&&(i.maxConcurrency=2),i}async function He(e=fe,t={},n={}){let r=vt(t);if(!r.url||!r.token||!r.workspace||!r.agent)return null;let o=Sr(e,n),s=gr.dirname(o);await xe.mkdir(s,{recursive:!0,mode:448});let i=`${o}.${process.pid}.${Date.now()}.tmp`,a={version:yr,savedAt:new Date().toISOString(),profile:Q(e),tokenHash:si.createHash("sha256").update(r.token).digest("hex"),config:r};return await xe.writeFile(i,`${JSON.stringify(a,null,2)}
|
|
62
|
+
`,{mode:384}),await xe.rename(i,o),await xe.chmod(o,384).catch(()=>{}),o}function br(e,t={}){let n={...e,...vt(t),command:"connect"};return t.fullCliContext===!0&&(n.leanCli=!1),t.codingCmd!==void 0&&t.noCoding===void 0&&(n.noCoding=!1),t.cursorBuddyBridge===void 0&&!n.primaryDaemon&&(n.cursorBuddyBridge=!1),t.once!==void 0&&(n.once=t.once),t.exitOnOnce!==void 0&&(n.exitOnOnce=t.exitOnOnce),n}function At(e=fe){let t=Q(e);return[`No saved Agensis daemon profile found for "${t}".`,"","To connect the main agent once:","1. Run: agensis setup","2. Sign in or create an account in the browser.","3. Approve this machine as your primary local agent.","","Manual fallback: open Agensis > AI Agents, copy a connection command,","and run that full agensis connect command from the repo folder.","","After the daemon registers successfully, this CLI saves the profile locally.",`Then restart it with: agensis connect${t===fe?"":` --profile ${t}`}`].join(`
|
|
63
|
+
`)}import li from"node:crypto";import Ce from"node:fs/promises";import _r from"node:os";import It from"node:path";import xt from"node:process";var ui=/^cbk_[a-z0-9_]+_[A-Z2-9]{18}$/;function di(e={}){return String(e.url||e.baseUrl||xt.env.AGENSIS_URL||"https://agensis.io").trim().replace(/\/+$/,"")}function vr(e,t={}){let n=t.homedir||_r.homedir(),r=li.createHash("sha256").update(String(e)).digest("hex");return It.join(n,".agensis","cursorbuddy","connection-keys",`${r}.json`)}function mi(){return new Error("Missing or invalid --key. Create a CursorBuddy connection key in Agensis first.")}function Ct(e){let t=String(e||"").trim();if(!ui.test(t))throw mi();return t}function fi(e,t,n,r){let o=t?.token,s=t?.workspaceId||t?.workspace_id||t?.agent?.workspace_id,i=t?.agentId||t?.agent?.id;if(!o||!s||!i)throw new Error("CursorBuddy key claim did not return a complete daemon connection payload");let{key:a,subcommand:d,...c}=e;return{...c,command:"connect",url:t.baseUrl||n,token:o,workspace:s,agent:i,handle:t.handle||e.handle,name:t.agent?.name||e.name||"CursorBuddy runtime",model:t.model||e.model,permissionMode:t.permissionMode||t.permission_mode||e.permissionMode,cwd:e.cwd||r,cursorBuddyRuntime:!0}}async function pi(e,t={}){Ct(e);let n=vr(e,t),r;try{r=await Ce.readFile(n,"utf8")}catch(i){if(i?.code==="ENOENT")return null;throw i}let o;try{o=JSON.parse(r)}catch(i){throw new Error(`Cached CursorBuddy daemon config is unreadable: ${i?.message||i}`)}let s=o?.daemonArgs;return!s?.token||!s?.workspace||!s?.agent||!s?.url?null:s}async function hi(e,t,n={}){if(Ct(e),!t?.token||!t?.workspace||!t?.agent||!t?.url)return;let r=vr(e,n),o=It.dirname(r);await Ce.mkdir(o,{recursive:!0,mode:448});let s=`${r}.${xt.pid}.${Date.now()}.tmp`,i={version:1,savedAt:new Date().toISOString(),keyHash:It.basename(r,".json"),daemonArgs:t};await Ce.writeFile(s,`${JSON.stringify(i,null,2)}
|
|
64
|
+
`,{mode:384}),await Ce.rename(s,r),await Ce.chmod(r,384).catch(()=>{})}function gi(e,t,n){let r={...e,command:"connect"};for(let o of["cwd","codingCmd","model","permissionMode","timeoutMs","heartbeatMs","maxConcurrency","share","sharedModelsFile","noCoding","leanCli","lanListener","once"])t[o]!==void 0&&(r[o]=t[o]);return t.codingCmd!==void 0&&t.noCoding===void 0&&(r.noCoding=!1),r.cwd||(r.cwd=n),r.cursorBuddyRuntime=!0,r}function yi(e,t){return t?.error?.message||t?.message||`CursorBuddy key claim failed with HTTP ${e.status}`}async function Si(e){return e.json().catch(()=>({}))}async function Er(e,t={}){let n=Ct(e?.key),r=di(e),o=t.fetchImpl||globalThis.fetch;if(typeof o!="function")throw new Error("This Node.js runtime does not provide fetch; use a current Node.js release.");let s=t.cwd||xt.cwd(),i=t.hostname||_r.hostname(),a=t.version||ae,d={homedir:t.homedir},c=await o(`${r}/backend/cursorbuddy/connection-keys/claim`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({key:n,baseUrl:r,host:i,cwd:e.cwd||s,name:e.name,surface:e.surface||"local_cli",scope:e.scope||"machine",runtimeKind:"agensis-cli",version:a,permissionMode:e.permissionMode,model:e.model})}),l=await Si(c);if(!c.ok){let m=yi(c,l);if(c.status===409||/already been claimed/i.test(m)){let y=await pi(n,d);if(y)return gi(y,e,s);throw new Error(`${m}. No cached daemon config was found on this machine; create a new CursorBuddy key in Agensis or run the full copied agensis connect command.`)}throw new Error(m)}let g=fi(e,l?.data||l,r,s);return await hi(n,g,d),g}import wi from"node:crypto";import bi from"node:http";import _i from"node:os";import te from"node:process";import{spawn as vi}from"node:child_process";var Ei="https://agensis.io",ki=10*60*1e3;function qe(e,t,n){e.writeHead(t,{"content-type":"application/json","access-control-allow-origin":"*","access-control-allow-methods":"POST, OPTIONS","access-control-allow-headers":"content-type"}),e.end(JSON.stringify(n))}function Ai(e){return new Promise((t,n)=>{let r="";e.on("data",o=>{r+=o,r.length>128*1024&&(n(new Error("setup callback body is too large")),e.destroy())}),e.on("error",n),e.on("end",()=>t(r))})}function Ii(e){let t=String(e||te.env.AGENSIS_URL||Ei).trim(),n=new URL(t);if(n.protocol!=="http:"&&n.protocol!=="https:")throw new Error("Agensis setup URL must be http or https.");return n.search="",n.hash="",n.toString().replace(/\/+$/,"")}function xi(e){let t=te.platform==="darwin"?"open":te.platform==="win32"?"cmd":"xdg-open",n=te.platform==="win32"?["/c","start","",e]:[e],r=vi(t,n,{detached:!0,stdio:"ignore"});r.on("error",()=>{}),r.unref()}function Ci(e){let t=e?.daemonArgs||e?.data?.daemonArgs||e?.data||{},r=["url","token","workspace","agent"].filter(o=>!String(t[o]||"").trim());if(r.length)throw new Error(`Setup callback did not include ${r.join(", ")}`);return{...t,command:"connect"}}function Ti(e,t,n){let r=new URL(Ii(e.url||e.baseUrl));return r.searchParams.set("source","agensis-cli"),r.searchParams.set("referrer","agensis-cli"),r.searchParams.set("intent","setup"),r.searchParams.set("callback",t),r.searchParams.set("state",n),r.searchParams.set("profile",Q(e.profile||"default")),r.searchParams.set("host",_i.hostname()),r.searchParams.set("cwd",String(e.cwd||te.cwd())),e.handle&&r.searchParams.set("handle",String(e.handle)),e.name&&r.searchParams.set("name",String(e.name)),r.toString()}async function kr(e={}){let t=Q(e.profile||"default"),n=wi.randomBytes(24).toString("base64url"),r=Number(e.setupTimeoutMs||te.env.AGENSIS_SETUP_TIMEOUT_MS||ki),o,s=new Promise((c,l)=>{let g=setTimeout(()=>l(new Error("Agensis setup timed out waiting for browser login.")),r);g.unref&&g.unref(),o=bi.createServer(async(m,y)=>{if(y.setHeader("access-control-allow-origin","*"),y.setHeader("access-control-allow-methods","POST, OPTIONS"),y.setHeader("access-control-allow-headers","content-type"),m.method==="OPTIONS"){y.writeHead(204),y.end();return}if(m.method!=="POST"||m.url!=="/agensis/setup-callback"){qe(y,404,{ok:!1,error:"Unknown Agensis setup callback route"});return}try{let S=JSON.parse(await Ai(m)||"{}");if(S?.state!==n){qe(y,403,{ok:!1,error:"Setup state did not match"});return}let f={...Ci(S),primaryDaemon:!0,cursorBuddyBridge:e.cursorBuddyBridge!==!1};await He(t,f),clearTimeout(g),qe(y,200,{ok:!0,profile:t}),c(f)}catch(S){qe(y,400,{ok:!1,error:String(S?.message||S)})}}),o.once("error",l)});await new Promise((c,l)=>{o.listen(0,"127.0.0.1",g=>g?l(g):c())});let{port:i}=o.address(),a=`http://127.0.0.1:${i}/agensis/setup-callback`,d=Ti(e,a,n);te.stdout.write(`[agensis] Opening Agensis to sign in and connect this machine.
|
|
65
|
+
`),te.stdout.write(`[agensis] If the browser did not open, visit:
|
|
66
66
|
${d}
|
|
67
|
-
`),
|
|
68
|
-
`),c}finally{await new Promise(c=>o.close(()=>c())).catch(()=>{})}}function
|
|
67
|
+
`),xi(d);try{let c=await s;return te.stdout.write(`[agensis] Saved daemon profile "${t}". Starting primary agent daemon.
|
|
68
|
+
`),c}finally{await new Promise(c=>o.close(()=>c())).catch(()=>{})}}function Hi(e){let t={command:"connect"},n=[...e],r=n[0];if(r&&!r.startsWith("-")&&(t.command=n.shift(),t.command==="buddy")){let o=n[0];o&&!o.startsWith("-")?t.subcommand=n.shift():t.subcommand="connect"}for(let o=0;o<n.length;o+=1){let s=n[o];if(!s.startsWith("--"))throw new Error(`Unexpected argument: ${s}`);let[i,a]=s.slice(2).split(/=(.*)/s,2),d=i.replace(/-([a-z])/g,(l,g)=>g.toUpperCase());if(d==="help"){t.help=!0;continue}if(d==="version"){t.version=!0;continue}if(d==="once"){t.once=!0;continue}if(d==="lan"){t.lanListener=!0;continue}if(d==="share"){t.share=!0;continue}if(d==="noCoding"){t.noCoding=!0;continue}if(d==="fullCliContext"){t.fullCliContext=!0;continue}if(d==="syncMemory"){t.syncMemory=!0;continue}if(d==="noSyncSkills"){t.syncSkills=!1;continue}if(d==="cursorbuddyBridge"){t.cursorBuddyBridge=!0;continue}if(d==="noCursorbuddyBridge"){t.cursorBuddyBridge=!1;continue}if(d==="yolo"||d==="noSandbox"){t.permissionMode="yolo";continue}if(d==="acceptEdits"){t.permissionMode="accept_edits";continue}if(d==="hostFolder"||d==="hostFolders"||d==="addDir"){let l=a!==void 0?a:n[++o];if(l==null||l.startsWith("--"))throw new Error(`Missing value for --${i}`);t.hostFolders=[...t.hostFolders||[],l];continue}let c=a!==void 0?a:n[++o];if(c==null||c.startsWith("--"))throw new Error(`Missing value for --${i}`);t[d]=c}return t}function qi(){return`agensis agent daemon
|
|
69
69
|
|
|
70
70
|
Usage:
|
|
71
71
|
agensis --url <workspace-url> --token <token> --workspace <id> --agent <id> [options]
|
|
@@ -124,7 +124,7 @@ agensis supervise [--profile <name>] [--poll-ms <ms>]
|
|
|
124
124
|
"agensis connect" once first). Recommended under a process manager with its
|
|
125
125
|
own restart policy (systemd Restart=always, launchd KeepAlive, pm2) so the
|
|
126
126
|
supervisor itself is recovered if it's ever killed.
|
|
127
|
-
`}async function
|
|
128
|
-
`)}}:e}async function
|
|
129
|
-
`);return}if(e.command==="buddy"){if(e.subcommand!=="connect")throw new Error(`Unknown buddy command "${e.subcommand||""}". Use "agensis buddy connect --key <cbk_...>".`);let n=await
|
|
130
|
-
`),
|
|
127
|
+
`}async function Ji(e){let t=e.profile!==void 0,n=e.handle||e.name,r=Q(e.profile||(Et(e)&&n?n:"default"));if(!wr(e)){let o=await kt(r);if(!o)throw new Error(At(r));return br(o,e)}return Et(e)?{...e,cursorBuddyBridge:e.cursorBuddyBridge===!0,onRegistered:async o=>{await He(r,o);let s=t||r!=="default"?`agensis connect --profile ${r}`:"agensis connect";ne.stdout.write(`[agensis] Saved daemon profile "${r}". Restart with: ${s}
|
|
128
|
+
`)}}:e}async function zi(){let e=Hi(ne.argv.slice(2));if(e.help){ne.stdout.write(qi());return}if(e.version){ne.stdout.write(`${ae}
|
|
129
|
+
`);return}if(e.command==="buddy"){if(e.subcommand!=="connect")throw new Error(`Unknown buddy command "${e.subcommand||""}". Use "agensis buddy connect --key <cbk_...>".`);let n=await Er(e);n.cursorBuddyBridge=e.cursorBuddyBridge!==!1,n.cursorBuddyRuntime=!0,n.exitOnOnce=!0,await Fe(n),n.once&&ne.exit(0);return}if(e.command==="supervise"){let n=Q(e.profile||"default"),r=await kt(n);if(!r)throw new Error(At(n));let{runSupervisor:o}=await Promise.resolve().then(()=>(Nr(),Mr)),s=e.pollMs?Number(e.pollMs):void 0;await o({config:r,runningVersion:ae,profileName:n,pollIntervalMs:s});return}if(e.command==="setup"){let n=await kr(e);n.exitOnOnce=!0,await Fe({...e,...n}),n.once&&ne.exit(0);return}if(e.command!=="connect")throw new Error(`Unknown command "${e.command}". Use "agensis setup", "agensis connect --url ...", "agensis supervise", or "agensis buddy connect --key ...".`);let t=await Ji(e);t.exitOnOnce=!0,await Fe(t),t.once&&ne.exit(0)}zi().catch(e=>{ne.stderr.write(`${e?.message||e}
|
|
130
|
+
`),ne.exitCode=1});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agensis/agensis-agent",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.36",
|
|
4
4
|
"description": "Run a local agensis workspace agent daemon. Connects to a workspace, receives @mention jobs, runs a configured coding CLI in the local folder, and posts results back to agensis. Ships as a single minified bundle.",
|
|
5
5
|
"homepage": "https://agensis.io",
|
|
6
6
|
"repository": {
|