@fifthrevision/axle-cli 0.30.1 → 0.30.2

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{a as e,i as t,n,r,t as i}from"./tools-DTZhd_3g.js";import{Command as a}from"@commander-js/extra-typings";import{Agent as o,Instruct as s,MCP as c,SimpleWriter as l,Tracer as u,addStats as d,anthropic as f,chatCompletions as p,createAgentConfig as m,createStats as h,gemini as g,loadFileContent as _,openai as v}from"@fifthrevision/axle";import{Models as y}from"@fifthrevision/axle/models";import{z as b}from"zod";import{appendFile as ee,mkdir as x,readFile as S}from"node:fs/promises";import{basename as te,dirname as ne,extname as C}from"node:path";import{config as w}from"dotenv";import T from"yaml";import{glob as re}from"glob";import{createInterface as ie}from"node:readline";import{createHash as ae}from"node:crypto";var oe=`0.30.1`;async function se(e,t){let n=[];for(let r of e){let e=new c(r);await e.connect({span:t}),n.push(e)}return n}async function ce(e,t){for(let n of e)try{await n.close({span:t})}catch{}}function le(a,o){switch(a){case`calculator`:return e;case`exec`:{let e=o?.exec;return e&&t.configure(e),t}case`patch-file`:return r;case`read-file`:return n;case`write-file`:return i;default:throw Error(`Unknown tool: ${a}`)}}function ue(e,t){return e.map(e=>le(e,t))}const E={anthropic:y.Anthropic.CLAUDE_HAIKU_4_5,gemini:y.Google.GEMINI_3_5_FLASH,openai:y.OpenAI.GPT_5_4_MINI};function de(e,t){let n=e.config??{};switch(e.type){case`openai`:{let e={...t.openai,...n},r=D(e);if(!r)throw Error(`The provider openai is not configured. Please check your configuration.`);return{provider:v(r,{maxRetries:e.maxRetries,timeoutMs:e.timeoutMs}),model:O(e,E.openai)}}case`anthropic`:{let e={...t.anthropic,...n},r=D(e);if(!r)throw Error(`The provider anthropic is not configured. Please check your configuration.`);return{provider:f(r,{maxRetries:e.maxRetries,timeoutMs:e.timeoutMs}),model:O(e,E.anthropic)}}case`gemini`:{let e={...t.gemini,...n},r=D(e);if(!r)throw Error(`The provider gemini is not configured. Please check your configuration.`);return{provider:g(r,{maxRetries:e.maxRetries,timeoutMs:e.timeoutMs}),model:O(e,E.gemini)}}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:p(r,{apiKey:D(e),maxRetries:e.maxRetries,timeoutMs:e.timeoutMs,vendor:e.vendor}),model:i}}default:throw Error(`Unknown provider type: ${e.type}`)}}function D(e){let t=e.apiKeyEnv??e[`api-key-env`];return typeof t==`string`&&t.length>0?process.env[t]:e[`api-key`]}function O(e,t){return typeof e.model==`string`&&e.model.length>0?e.model:t}function fe(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 pe(e,t,n){let r=fe(e),i=r.mcps?.length?await se(r.mcps,n):[];return{agentConfig:await m(r,e=>{let n=de(e.provider,t);return{provider:n.provider,model:n.model,tools:e.tools?.length?ue(e.tools.map(e=>e.name)):void 0,mcps:i.length>0?i:void 0}}),mcps:i}}b.object({value:b.string()}),b.object({timeout:b.number().optional(),maxBuffer:b.number().optional(),cwd:b.string().optional()});const k={"api-key":b.string().optional(),apiKeyEnv:b.string().optional(),"api-key-env":b.string().optional()},A={maxRetries:b.number().int().nonnegative().optional(),timeoutMs:b.number().int().positive().optional()},j=b.strictObject({type:b.literal(`chatcompletions`),"base-url":b.string().optional(),model:b.string().optional(),vendor:b.enum([`openrouter`,`together`]).optional(),...k,...A}),M=b.strictObject({type:b.literal(`anthropic`),model:b.string().optional(),...k,...A}),N=b.strictObject({type:b.literal(`openai`),model:b.string().optional(),...k,...A}),P=b.strictObject({type:b.literal(`gemini`),model:b.string().optional(),...k,...A}),F=b.discriminatedUnion(`type`,[j,M,N,P]),I=b.object({transport:b.literal(`stdio`),name:b.string().optional(),command:b.string(),args:b.array(b.string()).optional(),env:b.record(b.string(),b.string()).optional()}),L=b.object({transport:b.literal(`http`),name:b.string().optional(),url:b.string(),headers:b.record(b.string(),b.string()).optional()}),R=b.discriminatedUnion(`transport`,[I,L]),z=b.object({files:b.string(),resume:b.boolean().default(!1),concurrency:b.number().int().positive().default(3)}),B=b.object({name:b.string().optional(),provider:F,task:b.string(),tools:b.array(b.string()).optional(),provider_tools:b.array(b.string()).optional(),files:b.array(b.string()).optional(),mcps:b.array(R).optional(),batch:z.optional()});async function me(e,t){let{span:n}=t,r=C(e).slice(1);if(r!==`yaml`&&r!==`yml`)throw Error(`Invalid job file format. Expected .yaml or .yml`);let i;try{i=await S(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=B.safeParse(a);if(!o.success)throw Error(`The job file is not valid:\n${ye(o.error)}`);return o.data.name||(o.data.name=te(e,C(e))),o.data}async function he(e){let{span:t}=e;w({quiet:!0});let n=ge();return t?.debug(`Service config: `+JSON.stringify(V(n),null,2)),n}function ge(){return _e({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 _e(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,ve(e)&&t?`[redacted]`:V(t)]))}function ve(e){return e===`api-key`||e.toLowerCase().includes(`secret`)}function ye(e){return e.issues.map(e=>` - ${e.path.join(`.`)||`root`}: ${e.message}`).join(`
2
+ import{a as e,i as t,n,r,t as i}from"./tools-DTZhd_3g.js";import{Command as a}from"@commander-js/extra-typings";import{Agent as o,Instruct as s,MCP as c,SimpleWriter as l,Tracer as u,addStats as d,anthropic as f,chatCompletions as p,createAgentConfig as m,createStats as h,gemini as g,loadFileContent as _,openai as v}from"@fifthrevision/axle";import{Models as y}from"@fifthrevision/axle/models";import{z as b}from"zod";import{appendFile as ee,mkdir as x,readFile as S}from"node:fs/promises";import{basename as te,dirname as ne,extname as C}from"node:path";import{config as w}from"dotenv";import T from"yaml";import{glob as re}from"glob";import{createInterface as ie}from"node:readline";import{createHash as ae}from"node:crypto";var oe=`0.30.2`;async function se(e,t){let n=[];for(let r of e){let e=new c(r);await e.connect({span:t}),n.push(e)}return n}async function ce(e,t){for(let n of e)try{await n.close({span:t})}catch{}}function le(a,o){switch(a){case`calculator`:return e;case`exec`:{let e=o?.exec;return e&&t.configure(e),t}case`patch-file`:return r;case`read-file`:return n;case`write-file`:return i;default:throw Error(`Unknown tool: ${a}`)}}function ue(e,t){return e.map(e=>le(e,t))}const E={anthropic:y.Anthropic.CLAUDE_HAIKU_4_5,gemini:y.Google.GEMINI_3_5_FLASH,openai:y.OpenAI.GPT_5_4_MINI};function de(e,t){let n=e.config??{};switch(e.type){case`openai`:{let e={...t.openai,...n},r=D(e);if(!r)throw Error(`The provider openai is not configured. Please check your configuration.`);return{provider:v(r,{maxRetries:e.maxRetries,timeoutMs:e.timeoutMs}),model:O(e,E.openai)}}case`anthropic`:{let e={...t.anthropic,...n},r=D(e);if(!r)throw Error(`The provider anthropic is not configured. Please check your configuration.`);return{provider:f(r,{maxRetries:e.maxRetries,timeoutMs:e.timeoutMs}),model:O(e,E.anthropic)}}case`gemini`:{let e={...t.gemini,...n},r=D(e);if(!r)throw Error(`The provider gemini is not configured. Please check your configuration.`);return{provider:g(r,{maxRetries:e.maxRetries,timeoutMs:e.timeoutMs}),model:O(e,E.gemini)}}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:p(r,{apiKey:D(e),maxRetries:e.maxRetries,timeoutMs:e.timeoutMs,vendor:e.vendor}),model:i}}default:throw Error(`Unknown provider type: ${e.type}`)}}function D(e){let t=e.apiKeyEnv??e[`api-key-env`];return typeof t==`string`&&t.length>0?process.env[t]:e[`api-key`]}function O(e,t){return typeof e.model==`string`&&e.model.length>0?e.model:t}function fe(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 pe(e,t,n){let r=fe(e),i=r.mcps?.length?await se(r.mcps,n):[];return{agentConfig:await m(r,e=>{let n=de(e.provider,t);return{provider:n.provider,model:n.model,tools:e.tools?.length?ue(e.tools.map(e=>e.name)):void 0,mcps:i.length>0?i:void 0}}),mcps:i}}b.object({value:b.string()}),b.object({timeout:b.number().optional(),maxBuffer:b.number().optional(),cwd:b.string().optional()});const k={"api-key":b.string().optional(),apiKeyEnv:b.string().optional(),"api-key-env":b.string().optional()},A={maxRetries:b.number().int().nonnegative().optional(),timeoutMs:b.number().int().positive().optional()},j=b.strictObject({type:b.literal(`chatcompletions`),"base-url":b.string().optional(),model:b.string().optional(),vendor:b.enum([`openrouter`,`together`]).optional(),...k,...A}),M=b.strictObject({type:b.literal(`anthropic`),model:b.string().optional(),...k,...A}),N=b.strictObject({type:b.literal(`openai`),model:b.string().optional(),...k,...A}),P=b.strictObject({type:b.literal(`gemini`),model:b.string().optional(),...k,...A}),F=b.discriminatedUnion(`type`,[j,M,N,P]),I=b.object({transport:b.literal(`stdio`),name:b.string().optional(),command:b.string(),args:b.array(b.string()).optional(),env:b.record(b.string(),b.string()).optional()}),L=b.object({transport:b.literal(`http`),name:b.string().optional(),url:b.string(),headers:b.record(b.string(),b.string()).optional()}),R=b.discriminatedUnion(`transport`,[I,L]),z=b.object({files:b.string(),resume:b.boolean().default(!1),concurrency:b.number().int().positive().default(3)}),B=b.object({name:b.string().optional(),provider:F,task:b.string(),tools:b.array(b.string()).optional(),provider_tools:b.array(b.string()).optional(),files:b.array(b.string()).optional(),mcps:b.array(R).optional(),batch:z.optional()});async function me(e,t){let{span:n}=t,r=C(e).slice(1);if(r!==`yaml`&&r!==`yml`)throw Error(`Invalid job file format. Expected .yaml or .yml`);let i;try{i=await S(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=B.safeParse(a);if(!o.success)throw Error(`The job file is not valid:\n${ye(o.error)}`);return o.data.name||(o.data.name=te(e,C(e))),o.data}async function he(e){let{span:t}=e;w({quiet:!0});let n=ge();return t?.debug(`Service config: `+JSON.stringify(V(n),null,2)),n}function ge(){return _e({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 _e(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,ve(e)&&t?`[redacted]`:V(t)]))}function ve(e){return e===`api-key`||e.toLowerCase().includes(`secret`)}function ye(e){return e.issues.map(e=>` - ${e.path.join(`.`)||`root`}: ${e.message}`).join(`
3
3
  `)}const H=`.axle/batch.jsonl`;function be(e,t){let n=ae(`sha256`);return n.update(e),n.update(`\0`),n.update(t),n.digest(`hex`)}async function xe(e=H){let t=new Map,n;try{n=await S(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 Se(e,t=H){await x(ne(t),{recursive:!0}),await ee(t,JSON.stringify(e)+`
5
5
  `,`utf-8`)}async function Ce(e,t,n,r,i,a){let c=new s({prompt:e.task});if(e.files)for(let t of e.files)c.addFile(await _(t));let l=a.startSpan(`job`,{type:`workflow`}),u=new o({...t,observability:{trace:l}});try{let e=await u.send(c.withInputs(n)).final;if(d(i,e.usage),e.response){let t=e.response;a.info(t,{markdown:!0})}r.interactive&&await we(u,i,a),l.end()}catch(e){let t=e instanceof Error?e.message:String(e);throw l.error(t),l.end(`error`),e}}async function we(e,t,n){let r=ie({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.30.1",
3
+ "version": "0.30.2",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/johncch/axle.git"
@@ -32,7 +32,7 @@
32
32
  "glob": "^13.0.6",
33
33
  "yaml": "^2.9.0",
34
34
  "zod": "^4.4.3",
35
- "@fifthrevision/axle": "0.30.1"
35
+ "@fifthrevision/axle": "0.30.2"
36
36
  },
37
37
  "devDependencies": {
38
38
  "@arethetypeswrong/core": "^0.18.2",