@arcforge/axon 2.0.7 → 2.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env bun
2
+ // @bun
3
+ import{AsyncLocalStorage as ZJ}from"async_hooks";var f=["log","info","warn","error","debug"];function v(J){let{wire:G}=J,$=new ZJ,z={log:console.log.bind(console),info:console.info.bind(console),warn:console.warn.bind(console),error:console.error.bind(console),debug:console.debug.bind(console)};for(let N of f)console[N]=(...H)=>{let X=$.getStore()??null;G.emit("capsule:console",{level:N,commandId:X,args:H})};return{run(N,H){return $.run(N,H)},write(N,H){let X=$.getStore()??null,Y=typeof H==="string"?H:new TextDecoder().decode(H);return G.emit("capsule:console",{level:N,commandId:X,args:[Y]}),!0},restore(){for(let N of f)console[N]=z[N]}}}import{randomUUID as w}from"crypto";function E(J,G){let z=J.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*\*/g,"\x00").replace(/\*/g,"[^/]*").replace(/\uFFFD/g,".*");return new RegExp(`^${z}$`).test(G)}var $J={"process.spawn":(J)=>J.process.spawn,"process.run":(J)=>J.process.run};function h(J){let G=J.policy,{wire:$}=J,z=new Map;$.onCommand((Y)=>{if(Y.type!=="policy:response")return;let Q=z.get(Y.id);if(!Q)return;z.delete(Y.id),Q(Y.allow)});function N(Y,Q){if(Y===void 0)return"deny";if(Y===!0)return"allow";if(Y===!1)return"deny";if(Y==="escalate")return"escalate";if(Y.deny?.some((F)=>E(F,Q)))return"deny";if(Y.escalate?.some((F)=>E(F,Q)))return"escalate";if(Y.allow?.some((F)=>E(F,Q)))return"allow";return"deny"}function H(Y,Q){let F=$J[Y]?.(G);if(F!==void 0)return F;let V=Q??Y.split(".")[0];if(V==="network")return G.network?.[Y.slice(8)];return G.tools?.[V]}async function X(Y,Q,F,V){let _=V??Y.split(".")[0],K=H(Y,V),T=N(K,Q);if(T==="allow")return!0;if(T==="deny")return $.emit("capsule:policy:denied",{id:w(),module:_,fn:Y,args:F,rule:String(K)}),!1;let B=w();return $.emit("capsule:policy:escalation",{id:B,module:_,fn:Y,args:F,rule:String(K)}),new Promise((D)=>{let P=setTimeout(()=>{z.delete(B),D(!1)},30000);z.set(B,(q)=>{clearTimeout(P),D(q)})})}return{check:X,update(Y){G=Y}}}function y(J){let{scope:G,wire:$,console:z,execution:N,activities:H}=J,X=new Map,Y=globalThis,Q=new Bun.Transpiler({loader:"ts",target:"bun",replMode:!0});function F(K){if(typeof K==="object"&&K!==null&&Object.getPrototypeOf(K)===null&&Object.prototype.hasOwnProperty.call(K,"value"))return K.value;return K}Object.defineProperty(Y,"signal",{configurable:!0,get:()=>N.current?.signal});function V(){for(let[K,T]of Object.entries(G.globals()))Y[K]=T}async function _(K,T){let B=Date.now(),D=new AbortController;X.set(K,D),$.emit("capsule:cmd:start",{id:K}),V();try{let Z=Q.transformSync(T),P=eval,q=await N.run(K,D.signal,()=>z.run(K,async()=>F(await P(Z))));H.settle(K),$.emit("capsule:cmd:complete",{id:K,result:q,durationMs:Date.now()-B})}catch(Z){let P=Z instanceof Error?Z.message:String(Z);if(D.signal.aborted)H.settle(K,"interrupted"),$.emit("capsule:cmd:interrupted",{id:K,durationMs:Date.now()-B});else H.settle(K,P),$.emit("capsule:cmd:failed",{id:K,error:P,durationMs:Date.now()-B})}finally{X.delete(K)}}return $.onCommand((K)=>{if(K.type==="cmd:run")_(K.id,K.code);else if(K.type==="cmd:kill")X.get(K.id)?.abort()}),{}}import{mkdir as zJ,writeFile as GJ}from"fs/promises";import{tmpdir as HJ}from"os";import{join as u}from"path";import{createHash as KJ}from"crypto";async function NJ(J){let G=u(HJ(),"axon-capsule-tools");await zJ(G,{recursive:!0});let $=KJ("sha256").update(J).digest("hex"),z=u(G,`${$}.ts`);return await GJ(z,J),z}function m(J){let{mediator:G,wire:$}=J,z=new Map;function N(X,Y,Q,F){if(typeof X==="function")return async(...V)=>{let _=typeof V[0]==="string"?V[0]:"";if(!await G.check(Y,_,V,Q))throw Error(`CAPSULE_POLICY_DENIED: ${Y} denied by policy`);return Reflect.apply(X,F,V)};if(X!==null&&typeof X==="object")return new Proxy(X,{get(V,_){let K=Reflect.get(V,_,V);return typeof _==="string"?N(K,`${Y}.${_}`,Q,V):K}});return X}async function H(X){try{let Y="path"in X?await import(X.path):await import(await NJ(X.source)),Q=Y.default,F=Object.fromEntries(Object.entries(Y).filter(([K])=>K!=="default")),V=Object.keys(F).length>0?F:Q?.exports??{},_={};for(let[K,T]of Object.entries(V)){let B=X.flat?K:`${X.namespace}.${K}`;_[K]=N(T,B,X.namespace)}z.set(X.namespace,{namespace:X.namespace,flat:X.flat,values:_}),$.emit("capsule:tool:loaded",{namespace:X.namespace,fns:Object.keys(_)})}catch(Y){$.emit("capsule:tool:error",{namespace:X.namespace,error:Y instanceof Error?Y.message:String(Y)})}}return $.onCommand((X)=>{if(X.type==="tool:load")H(X);else if(X.type==="tool:unload")z.delete(X.namespace),$.emit("capsule:tool:unloaded",{namespace:X.namespace})}),{globals(){let X={};for(let Y of z.values())if(Y.flat)Object.assign(X,Y.values);else X[Y.namespace]=Y.values;return X}}}import{randomUUID as a}from"crypto";import{spawn as d}from"child_process";function c(J,G,$,z){let N=z.include??["stdout"],H=z.caseSensitive??!1,X;if(N.includes("stdout")&&N.includes("stderr"))X=[...G,...$];else if(N.includes("stderr"))X=$;else X=G;let Y=[];for(let F of X)for(let V of F.split(/\r?\n/))Y.push(V);let Q=N.includes("stdout")&&N.includes("stderr")?"both":N.includes("stderr")?"stderr":"stdout";return QJ(J,Y,Q,z,H)}function l(J,G,$,z=["stdout"]){let N=[...z.includes("stdout")?J:[],...z.includes("stderr")?G:[]];for(let H of N)for(let X of H.split(/\r?\n/)){let Y=X.match($);if(Y)return Y.slice(1)}return[]}function p(J){return J.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function QJ(J,G,$,z,N){let H=G.length,X=G;if(z.from!==void 0||z.to!==void 0)X=X.slice(z.from??0,z.to);else if(z.head!==void 0)X=X.slice(0,z.head);else if(z.lines!==void 0)X=X.slice(-z.lines);let Y=z.search?new RegExp(p(z.search),N?"":"i"):null,Q=z.not?new RegExp(p(z.not),N?"":"i"):null,F=z.regex??null;if(!(Y!==null||F!==null||Q!==null))return{procId:J,stream:$,lines:X,raw:X.join(`
4
+ `),matches:[],totalLines:H,matchedLines:X.length};function _(Z){if(Q&&Q.test(Z))return!1;if(Y&&!Y.test(Z))return!1;if(F&&!F.test(Z))return!1;return!0}let K=z.context??0,T=[],B=new Set;for(let Z=0;Z<X.length;Z++){let P=X[Z];if(P===void 0||!_(P))continue;B.add(Z),T.push({line:Z,text:P,before:K>0?X.slice(Math.max(0,Z-K),Z):[],after:K>0?X.slice(Z+1,Math.min(X.length,Z+1+K)):[]})}let D=X.filter((Z,P)=>B.has(P));return{procId:J,stream:$,lines:D,raw:D.join(`
5
+ `),matches:T,totalLines:H,matchedLines:D.length}}function i(J){if(J instanceof RegExp)return($)=>J.test($);let G=J.toLowerCase();return($)=>$.toLowerCase().includes(G)}function PJ(J,G){if(!J)return"";let $=[],z=0;for(let N=0;N<J.length;N++)if(J[N]===`
6
+ `)$.push(J.slice(z,N+1)),z=N+1;if(z<J.length)$.push(J.slice(z));return $.slice(-G).join("")}function s(J,G){let $=new Promise((H)=>{if(J.status==="exited"){H({exitCode:J.exitCode??-1,ok:J.exitCode===0,stdout:J.stdout.join("")});return}let X=G.subscribe(J.procId+":exit",()=>{X(),H({exitCode:J.exitCode??-1,ok:J.exitCode===0,stdout:J.stdout.join("")})})});function z(H=["stdout"]){let X=[];if(H.includes("stdout"))X.push(J.stdout.join(""));if(H.includes("stderr"))X.push(J.stderr.join(""));return X.join("")}let N={get procId(){return J.procId},get kind(){return J.kind},get command(){return J.command},get pid(){return J.pid},get cwd(){return J.cwd},get status(){return J.status},get exitCode(){return J.exitCode},get startedAt(){return J.startedAt},get endedAt(){return J.endedAt},kill:()=>G.kill(),stdin:(H)=>G.stdin(H),stdout:(H)=>z(H===void 0?void 0:Array.isArray(H)?H:[H]),tail:(H,X)=>PJ(z(X),H),query:(H={})=>c(J.procId,J.stdout,J.stderr,H),extract:(H,X)=>l(J.stdout,J.stderr,H,X),exited:$,waitFor(H,X){let Y=X?.timeoutMs??30000;return new Promise((Q,F)=>{let V=i(H);for(let B of J.stdout)for(let D of B.split(/\r?\n/))if(D&&V(D)){Q({line:D,stdout:J.stdout.join("")});return}let _=setTimeout(()=>{K(),T(),F(Error(`waitFor() timed out after ${Y}ms for proc ${J.procId}`))},Y),K=G.subscribe(J.procId,(B)=>{if(!V(B))return;clearTimeout(_),K(),T(),Q({line:B,stdout:J.stdout.join("")})}),T=G.subscribe(J.procId+":exit",()=>{clearTimeout(_),K(),T(),F(Error(`waitFor() \u2014 proc ${J.procId} exited before pattern matched`))})})},on(H,X){let Y=i(H);return G.subscribe(J.procId,(Q)=>{if(Y(Q))X(Q)})},async*watch(H){let X=[],Y=null,Q=!1,F=N.on(H??/.?/,(_)=>{X.push(_),Y?.(),Y=null}),V=G.subscribe(J.procId+":exit",()=>{Q=!0,Y?.(),Y=null});try{while(!0)if(X.length>0)yield X.shift();else if(Q)break;else await new Promise((_)=>{Y=_})}finally{F(),V()}}};return N}function o(J){let{mediator:G,wire:$}=J,z=new Map,N=new Map,H=new Map,X=new Map,Y=new Set;function Q(Z,P){let q=X.get(Z);if(!q?.size)return;for(let W of P.split(/\r?\n/))for(let j of[...q])j(W)}function F(Z,P){if(Z.status="exited",P!==void 0)Z.exitCode=P;Z.endedAt=Date.now();let q=X.get(Z.procId+":exit");if(q)for(let W of[...q])W("")}function V(Z){return{kill:()=>B(Z),stdin:(P)=>D(Z,P),subscribe(P,q){let W=X.get(P);if(!W)W=new Set,X.set(P,W);return W.add(q),()=>W.delete(q)}}}function _(Z,P){let q=P?.procId??a(),W={procId:q,kind:"managed",command:Z,status:"running",stdout:[],stderr:[],startedAt:Date.now(),...P?.cwd?{cwd:P.cwd}:{}};return H.set(q,W),K(W,Z,P),s(W,V(q))}async function K(Z,P,q){let W=Z.procId,j=await G.check("process.spawn",P,[P]);if(Y.has(W)){Y.delete(W),$.emit("capsule:proc:denied",{procId:W,command:P,error:"killed before it could spawn"}),F(Z,-1);return}if(!j){$.emit("capsule:proc:denied",{procId:W,command:P,error:"denied by policy"}),F(Z,-1);return}let A=d(P,{shell:!0,cwd:q?.cwd,env:q?.env?{...process.env,...q.env}:process.env,stdio:["pipe","pipe","pipe"]});if(A.pid===void 0){$.emit("capsule:proc:denied",{procId:W,command:P,error:"spawn failed"}),F(Z,-1);return}if(Z.pid=A.pid,Z.cwd=q?.cwd??process.cwd(),$.emit("capsule:proc:spawned",{procId:W,pid:A.pid,command:P,cwd:Z.cwd,kind:"managed"}),Y.has(W))Y.delete(W),A.kill();else z.set(W,A);A.stdout?.on("data",(M)=>{let R=M.toString();Z.stdout.push(R),Q(W,R),$.emit("capsule:proc:stdout",{procId:W,data:R})}),A.stderr?.on("data",(M)=>{let R=M.toString();Z.stderr.push(R),$.emit("capsule:proc:stderr",{procId:W,data:R})}),A.on("exit",(M)=>{z.delete(W),F(Z,M??-1),$.emit("capsule:proc:exit",{procId:W,code:M??-1,durationMs:Date.now()-Z.startedAt})})}async function T(Z,P,q){if(q?.aborted)throw I();let W=await G.check("process.run",Z,[Z]);if(q?.aborted)throw I();if(!W)return{ok:!1,exitCode:-1,stdout:"",stderr:"",err:"denied by policy"};return new Promise((j,A)=>{let M=a(),R=Date.now(),L=d(Z,{shell:!0,cwd:P?.cwd,env:P?.env?{...process.env,...P.env}:process.env,stdio:["pipe","pipe","pipe"],detached:process.platform!=="win32"});if(L.pid===void 0){j({ok:!1,exitCode:-1,stdout:"",stderr:"",err:"spawn failed"});return}N.set(M,L),$.emit("capsule:proc:spawned",{procId:M,pid:L.pid,command:Z,cwd:P?.cwd??process.cwd(),kind:"run"});let S="",O="",b=!1,k=(U)=>{if(b)return;b=!0,q?.removeEventListener("abort",x),U()},x=()=>{g(L),k(()=>A(I()))};if(L.stdout?.on("data",(U)=>{let C=U.toString();S+=C,$.emit("capsule:proc:stdout",{procId:M,data:C})}),L.stderr?.on("data",(U)=>{let C=U.toString();O+=C,$.emit("capsule:proc:stderr",{procId:M,data:C})}),L.on("error",(U)=>{N.delete(M),$.emit("capsule:proc:exit",{procId:M,code:-1,durationMs:Date.now()-R}),k(()=>j({ok:!1,exitCode:-1,stdout:S,stderr:O,err:U.message}))}),L.on("exit",(U)=>{N.delete(M),$.emit("capsule:proc:exit",{procId:M,code:U??-1,durationMs:Date.now()-R}),k(()=>j({ok:U===0,exitCode:U??-1,stdout:S,stderr:O}))}),q?.addEventListener("abort",x,{once:!0}),q?.aborted)x();if(P?.input!==void 0)L.stdin?.write(P.input);L.stdin?.end()})}function B(Z){let P=N.get(Z);if(P){g(P);return}let q=z.get(Z);if(q){q.kill();return}if(H.get(Z)?.status==="running")Y.add(Z)}function D(Z,P){let q=z.get(Z);if(!q?.stdin?.writable){$.emit("capsule:proc:stdin:error",{procId:Z,error:"process not running or stdin closed"});return}q.stdin.write(P)}return $.onCommand((Z)=>{if(Z.type==="proc:spawn")_(Z.command,{cwd:Z.cwd,env:Z.env,procId:Z.procId});else if(Z.type==="proc:kill")B(Z.procId);else if(Z.type==="proc:stdin")D(Z.procId,Z.data)}),{spawn:_,run:T,killAll(){for(let Z of z.values())Z.kill();for(let Z of N.values())g(Z)}}}function I(){let J=Error("process.run aborted");return J.name="AbortError",J}function g(J){try{if(process.platform!=="win32"&&J.pid)process.kill(-J.pid,"SIGKILL");else J.kill()}catch(G){let $=G instanceof Error?G.message:String(G);if(!$.includes("ESRCH")&&!$.includes("process not found"))throw G}}function n(){let J=new Set,G=process.stdout.write.bind(process.stdout),$="";return process.stdin.on("data",(z)=>{$+=z.toString();let N=$.split(/\r?\n/);$=N.pop()??"";for(let H of N){if(!H.trim())continue;let X;try{X=JSON.parse(H)}catch{continue}for(let Y of[...J])Y(X)}}),{emit(z,N){let H={type:z,...N};G(JSON.stringify(H,(X,Y)=>Y===void 0?null:Y)+`
7
+ `)},onCommand(z){return J.add(z),()=>J.delete(z)}}}var r=process.exit.bind(process);function t(J){let G=process;if(G.run||G.spawn)throw Error("CAPSULE_SCOPE_ALREADY_INSTALLED: installScope() must be called exactly once");G.run=J.run,G.spawn=J.spawn,globalThis.axon=J.ambient,G.stdout.write=($)=>J.write("log",$),G.stderr.write=($)=>J.write("error",$),process.exit=()=>{throw Error("CAPSULE_PROCESS_EXIT_BLOCKED: the capsule manages its own subprocess lifecycle \u2014 sandboxed code cannot call process.exit()")}}import{AsyncLocalStorage as FJ}from"async_hooks";function e(){let J=new FJ;return{run(G,$,z){return J.run({id:G,signal:$},z)},get current(){return J.getStore()??null}}}function JJ(J){let{wire:G,execution:$}=J,z=new Map;function N(H,X={}){let Y=$.current?.id??null,Q=crypto.randomUUID(),F=!1;G.emit("capsule:activity",{commandId:Y,id:Q,activity:H,phase:"declared",data:X});function V(_,K,T){if(F)return;if(F=!0,Y)z.get(Y)?.delete(Q);G.emit("capsule:activity",{commandId:Y,id:Q,activity:H,phase:_,data:K,...T!==void 0?{error:T}:{}})}if(Y){let _=z.get(Y);if(!_)_=new Map,z.set(Y,_);_.set(Q,(K)=>V(K===void 0?"done":"failed",{},K))}return{done(_={}){V("done",_)}}}return{ambient:{activity:N},settle(H,X){let Y=z.get(H);if(!Y)return;z.delete(H);for(let Q of Y.values())Q(X)}}}function XJ(J){let G=n(),$=v({wire:G}),z=h({policy:J.policy,wire:G}),N=m({mediator:z,wire:G}),H=o({mediator:z,wire:G}),X=e(),Y=JJ({wire:G,execution:X});return y({scope:N,wire:G,console:$,execution:X,activities:Y}),t({run:(Q,F)=>H.run(Q,F,X.current?.signal),spawn:(Q,F)=>H.spawn(Q,F),write:(Q,F)=>$.write(Q,F),ambient:Y.ambient}),G.onCommand((Q)=>{if(Q.type==="policy:update")z.update(Q.policy);if(Q.type==="shutdown")H.killAll(),r(0)}),{ready(){G.emit("capsule:boot:complete",{durationMs:process.uptime()*1000})}}}var YJ=process.env.AXON_CAPSULE_POLICY;if(!YJ)console.error("CAPSULE_POLICY_MISSING: AXON_CAPSULE_POLICY env var not set"),process.exit(1);var _J=JSON.parse(YJ),qJ=XJ({policy:_J});qJ.ready();