@fifthrevision/axle-cli 0.19.0 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/cli.js +1 -1
  2. package/package.json +2 -2
package/dist/cli.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{t as e}from"./memory-BmDsikXS.js";import{t}from"./store-BFxiiKeG.js";import{a as n,i as r,n as i,r as a,t as o}from"./tools-Cp5kiYmz.js";import{Command as s}from"@commander-js/extra-typings";import{Agent as c,Anthropic as l,Gemini as u,Instruct as d,MCP as f,OpenAI as p,SimpleWriter as m,Tracer as h,addStats as g,anthropic as _,chatCompletions as v,createAgentConfig as y,createStats as ee,gemini as te,loadFileContent as b,openai as x}from"@fifthrevision/axle";import{createHash as ne}from"node:crypto";import{z as S}from"zod";import{appendFile as re,mkdir as ie,readFile as C}from"node:fs/promises";import{basename as ae,dirname as oe,extname as w}from"node:path";import{config as se}from"dotenv";import T from"yaml";import{glob as ce}from"glob";import{createInterface as le}from"node:readline";var ue=`0.19.0`;async function de(e,t){let n=[];for(let r of e){let e=new f(r);await e.connect({tracer:t}),n.push(e)}return n}async function fe(e,t){for(let n of e)try{await n.close({tracer:t})}catch{}}function pe(e,t){switch(e){case`calculator`:return n;case`exec`:{let e=t?.exec;return e&&r.configure(e),r}case`patch-file`:return a;case`read-file`:return i;case`write-file`:return o;default:throw Error(`Unknown tool: ${e}`)}}function E(e,t){return e.map(e=>pe(e,t))}function D(e,t){let n=e.config??{};switch(e.type){case`openai`:{let e={...t.openai,...n},r=O(e);if(!r)throw Error(`The provider openai is not configured. Please check your configuration.`);return{provider:x(r),model:e.model||p.DefaultModel}}case`anthropic`:{let e={...t.anthropic,...n},r=O(e);if(!r)throw Error(`The provider anthropic is not configured. Please check your configuration.`);return{provider:_(r),model:e.model||l.DefaultModel}}case`gemini`:{let e={...t.gemini,...n},r=O(e);if(!r)throw Error(`The provider gemini is not configured. Please check your configuration.`);return{provider:te(r),model:e.model||u.DefaultModel}}case`chatcompletions`:{let e={...t.chatcompletions,...n},r=e[`base-url`],i=e.model;if(!r||!i)throw Error(`The provider chatcompletions is not configured. Please check your configuration.`);return{provider:v(r,O(e)),model:i}}default:throw Error(`Unknown provider type: ${e.type}`)}}function O(e){let t=e.apiKeyEnv??e[`api-key-env`];return typeof t==`string`&&t.length>0?process.env[t]:e[`api-key`]}function k(e){let{type:t,...n}=e.provider,r=Object.keys(n).length>0?{type:t,config:n}:{type:t};return{version:1,name:e.name,provider:r,tools:e.tools?.map(e=>({name:e})),providerTools:e.provider_tools?.map(e=>({name:e})),mcps:e.mcps}}async function A(n,r,i){let a=k(n),o=a.mcps?.length?await de(a.mcps,i):[],s=await y(a,e=>{let t=D(e.provider,r);return{provider:t.provider,model:t.model,tools:e.tools?.length?E(e.tools.map(e=>e.name)):void 0,mcps:o.length>0?o:void 0}});return{agentConfig:{...s,memory:new e({provider:s.provider,model:s.model,store:new t(`.axle`)})},mcps:o}}S.object({value:S.string()}),S.object({timeout:S.number().optional(),maxBuffer:S.number().optional(),cwd:S.string().optional()});const j={"api-key":S.string().optional(),apiKeyEnv:S.string().optional(),"api-key-env":S.string().optional()},M=S.strictObject({type:S.literal(`chatcompletions`),"base-url":S.string().optional(),model:S.string().optional(),...j}),N=S.strictObject({type:S.literal(`anthropic`),model:S.string().optional(),...j}),P=S.strictObject({type:S.literal(`openai`),model:S.string().optional(),...j}),F=S.strictObject({type:S.literal(`gemini`),model:S.string().optional(),...j}),I=S.discriminatedUnion(`type`,[M,N,P,F]),L=S.object({transport:S.literal(`stdio`),name:S.string().optional(),command:S.string(),args:S.array(S.string()).optional(),env:S.record(S.string(),S.string()).optional()}),R=S.object({transport:S.literal(`http`),name:S.string().optional(),url:S.string(),headers:S.record(S.string(),S.string()).optional()}),z=S.discriminatedUnion(`transport`,[L,R]),B=S.object({files:S.string(),resume:S.boolean().default(!1),concurrency:S.number().int().positive().default(3)}),me=S.object({name:S.string().optional(),provider:I,task:S.string(),tools:S.array(S.string()).optional(),provider_tools:S.array(S.string()).optional(),files:S.array(S.string()).optional(),mcps:S.array(z).optional(),batch:B.optional()});async function he(e,t){let{tracer:n}=t,r=w(e).slice(1);if(r!==`yaml`&&r!==`yml`)throw Error(`Invalid job file format. Expected .yaml or .yml`);let i;try{i=await C(e,{encoding:`utf-8`})}catch{throw Error(`Job File not found, see --help for details`)}let a=T.parse(i);n?.debug(`Job config: `+JSON.stringify(a,null,2));let o=me.safeParse(a);if(!o.success)throw Error(`The job file is not valid:\n${be(o.error)}`);return o.data.name||(o.data.name=ae(e,w(e))),o.data}async function ge(e){let{tracer:t}=e;se({quiet:!0});let n=_e();return t?.debug(`Service config: `+JSON.stringify(V(n),null,2)),n}function _e(){return ve({openai:process.env.OPENAI_API_KEY?{"api-key":process.env.OPENAI_API_KEY,model:process.env.OPENAI_MODEL}:void 0,anthropic:process.env.ANTHROPIC_API_KEY?{"api-key":process.env.ANTHROPIC_API_KEY,model:process.env.ANTHROPIC_MODEL}:void 0,gemini:process.env.GEMINI_API_KEY?{"api-key":process.env.GEMINI_API_KEY,model:process.env.GEMINI_MODEL}:void 0,chatcompletions:process.env.CHATCOMPLETIONS_BASE_URL&&process.env.CHATCOMPLETIONS_MODEL?{"base-url":process.env.CHATCOMPLETIONS_BASE_URL,model:process.env.CHATCOMPLETIONS_MODEL,"api-key":process.env.CHATCOMPLETIONS_API_KEY}:void 0})}function ve(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e&&Object.keys(e).length>0))}function V(e){return Array.isArray(e)?e.map(e=>V(e)):!e||typeof e!=`object`?e:Object.fromEntries(Object.entries(e).map(([e,t])=>[e,ye(e)&&t?`[redacted]`:V(t)]))}function ye(e){return e===`api-key`||e.toLowerCase().includes(`secret`)}function be(e){return e.issues.map(e=>` - ${e.path.join(`.`)||`root`}: ${e.message}`).join(`
2
+ import{t as e}from"./memory-BmDsikXS.js";import{t}from"./store-BFxiiKeG.js";import{a as n,i as r,n as i,r as a,t as o}from"./tools-Cp5kiYmz.js";import{Command as s}from"@commander-js/extra-typings";import{Agent as c,Anthropic as l,Gemini as u,Instruct as d,MCP as f,OpenAI as p,SimpleWriter as m,Tracer as h,addStats as g,anthropic as _,chatCompletions as v,createAgentConfig as y,createStats as ee,gemini as te,loadFileContent as b,openai as x}from"@fifthrevision/axle";import{createHash as ne}from"node:crypto";import{z as S}from"zod";import{appendFile as re,mkdir as ie,readFile as C}from"node:fs/promises";import{basename as ae,dirname as oe,extname as w}from"node:path";import{config as se}from"dotenv";import T from"yaml";import{glob as ce}from"glob";import{createInterface as le}from"node:readline";var ue=`0.20.0`;async function de(e,t){let n=[];for(let r of e){let e=new f(r);await e.connect({tracer:t}),n.push(e)}return n}async function fe(e,t){for(let n of e)try{await n.close({tracer:t})}catch{}}function pe(e,t){switch(e){case`calculator`:return n;case`exec`:{let e=t?.exec;return e&&r.configure(e),r}case`patch-file`:return a;case`read-file`:return i;case`write-file`:return o;default:throw Error(`Unknown tool: ${e}`)}}function E(e,t){return e.map(e=>pe(e,t))}function D(e,t){let n=e.config??{};switch(e.type){case`openai`:{let e={...t.openai,...n},r=O(e);if(!r)throw Error(`The provider openai is not configured. Please check your configuration.`);return{provider:x(r),model:e.model||p.DefaultModel}}case`anthropic`:{let e={...t.anthropic,...n},r=O(e);if(!r)throw Error(`The provider anthropic is not configured. Please check your configuration.`);return{provider:_(r),model:e.model||l.DefaultModel}}case`gemini`:{let e={...t.gemini,...n},r=O(e);if(!r)throw Error(`The provider gemini is not configured. Please check your configuration.`);return{provider:te(r),model:e.model||u.DefaultModel}}case`chatcompletions`:{let e={...t.chatcompletions,...n},r=e[`base-url`],i=e.model;if(!r||!i)throw Error(`The provider chatcompletions is not configured. Please check your configuration.`);return{provider:v(r,O(e)),model:i}}default:throw Error(`Unknown provider type: ${e.type}`)}}function O(e){let t=e.apiKeyEnv??e[`api-key-env`];return typeof t==`string`&&t.length>0?process.env[t]:e[`api-key`]}function k(e){let{type:t,...n}=e.provider,r=Object.keys(n).length>0?{type:t,config:n}:{type:t};return{version:1,name:e.name,provider:r,tools:e.tools?.map(e=>({name:e})),providerTools:e.provider_tools?.map(e=>({name:e})),mcps:e.mcps}}async function A(n,r,i){let a=k(n),o=a.mcps?.length?await de(a.mcps,i):[],s=await y(a,e=>{let t=D(e.provider,r);return{provider:t.provider,model:t.model,tools:e.tools?.length?E(e.tools.map(e=>e.name)):void 0,mcps:o.length>0?o:void 0}});return{agentConfig:{...s,memory:new e({provider:s.provider,model:s.model,store:new t(`.axle`)})},mcps:o}}S.object({value:S.string()}),S.object({timeout:S.number().optional(),maxBuffer:S.number().optional(),cwd:S.string().optional()});const j={"api-key":S.string().optional(),apiKeyEnv:S.string().optional(),"api-key-env":S.string().optional()},M=S.strictObject({type:S.literal(`chatcompletions`),"base-url":S.string().optional(),model:S.string().optional(),...j}),N=S.strictObject({type:S.literal(`anthropic`),model:S.string().optional(),...j}),P=S.strictObject({type:S.literal(`openai`),model:S.string().optional(),...j}),F=S.strictObject({type:S.literal(`gemini`),model:S.string().optional(),...j}),I=S.discriminatedUnion(`type`,[M,N,P,F]),L=S.object({transport:S.literal(`stdio`),name:S.string().optional(),command:S.string(),args:S.array(S.string()).optional(),env:S.record(S.string(),S.string()).optional()}),R=S.object({transport:S.literal(`http`),name:S.string().optional(),url:S.string(),headers:S.record(S.string(),S.string()).optional()}),z=S.discriminatedUnion(`transport`,[L,R]),B=S.object({files:S.string(),resume:S.boolean().default(!1),concurrency:S.number().int().positive().default(3)}),me=S.object({name:S.string().optional(),provider:I,task:S.string(),tools:S.array(S.string()).optional(),provider_tools:S.array(S.string()).optional(),files:S.array(S.string()).optional(),mcps:S.array(z).optional(),batch:B.optional()});async function he(e,t){let{tracer:n}=t,r=w(e).slice(1);if(r!==`yaml`&&r!==`yml`)throw Error(`Invalid job file format. Expected .yaml or .yml`);let i;try{i=await C(e,{encoding:`utf-8`})}catch{throw Error(`Job File not found, see --help for details`)}let a=T.parse(i);n?.debug(`Job config: `+JSON.stringify(a,null,2));let o=me.safeParse(a);if(!o.success)throw Error(`The job file is not valid:\n${be(o.error)}`);return o.data.name||(o.data.name=ae(e,w(e))),o.data}async function ge(e){let{tracer:t}=e;se({quiet:!0});let n=_e();return t?.debug(`Service config: `+JSON.stringify(V(n),null,2)),n}function _e(){return ve({openai:process.env.OPENAI_API_KEY?{"api-key":process.env.OPENAI_API_KEY,model:process.env.OPENAI_MODEL}:void 0,anthropic:process.env.ANTHROPIC_API_KEY?{"api-key":process.env.ANTHROPIC_API_KEY,model:process.env.ANTHROPIC_MODEL}:void 0,gemini:process.env.GEMINI_API_KEY?{"api-key":process.env.GEMINI_API_KEY,model:process.env.GEMINI_MODEL}:void 0,chatcompletions:process.env.CHATCOMPLETIONS_BASE_URL&&process.env.CHATCOMPLETIONS_MODEL?{"base-url":process.env.CHATCOMPLETIONS_BASE_URL,model:process.env.CHATCOMPLETIONS_MODEL,"api-key":process.env.CHATCOMPLETIONS_API_KEY}:void 0})}function ve(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e&&Object.keys(e).length>0))}function V(e){return Array.isArray(e)?e.map(e=>V(e)):!e||typeof e!=`object`?e:Object.fromEntries(Object.entries(e).map(([e,t])=>[e,ye(e)&&t?`[redacted]`:V(t)]))}function ye(e){return e===`api-key`||e.toLowerCase().includes(`secret`)}function be(e){return e.issues.map(e=>` - ${e.path.join(`.`)||`root`}: ${e.message}`).join(`
3
3
  `)}const H=`.axle/batch.jsonl`;function xe(e,t){let n=ne(`sha256`);return n.update(e),n.update(`\0`),n.update(t),n.digest(`hex`)}async function Se(e=H){let t=new Map,n;try{n=await C(e,`utf-8`)}catch{return t}for(let e of n.split(`
4
4
  `)){let n=e.trim();if(n)try{let e=JSON.parse(n);e.file&&e.hash&&t.set(e.file,e)}catch{}}return t}async function Ce(e,t=H){await ie(oe(t),{recursive:!0}),await re(t,JSON.stringify(e)+`
5
5
  `,`utf-8`)}async function we(e,t,n,r,i,a){let o=new d({prompt:e.task});if(e.files)for(let t of e.files)o.addFile(await b(t));let s=a.startSpan(`job`,{type:`workflow`}),l=new c({...t,tracer:s});try{let e=await l.send(o.withInputs(n)).final;if(g(i,e.usage),e.response){let t=e.response;a.info(t,{markdown:!0})}r.interactive&&await Te(l,i,a),s.end()}catch(e){let t=e instanceof Error?e.message:String(e);throw s.error(t),s.end(`error`),e}}async function Te(e,t,n){let r=le({input:process.stdin,output:process.stdout});r.on(`SIGINT`,()=>{r.close()});let i=e=>new Promise(t=>{r.question(e,t),r.once(`close`,()=>t(null))});try{for(;;){let r=await i(`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fifthrevision/axle-cli",
3
- "version": "0.19.0",
3
+ "version": "0.20.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/johncch/axle.git"
@@ -36,7 +36,7 @@
36
36
  "glob": "^13.0.6",
37
37
  "yaml": "^2.9.0",
38
38
  "zod": "^4.4.3",
39
- "@fifthrevision/axle": "0.19.0"
39
+ "@fifthrevision/axle": "0.20.0"
40
40
  },
41
41
  "devDependencies": {
42
42
  "@arethetypeswrong/core": "^0.18.2",