@fifthrevision/axle-cli 0.27.0 → 0.28.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.
- package/dist/cli.js +1 -1
- 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-BS-U-K_q.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,Instruct as l,MCP as u,SimpleWriter as d,Tracer as f,addStats as p,anthropic as m,chatCompletions as h,createAgentConfig as g,createStats as _,gemini as v,loadFileContent as y,openai as ee}from"@fifthrevision/axle";import{Models as b}from"@fifthrevision/axle/models";import{createHash as te}from"node:crypto";import{z as x}from"zod";import{appendFile as ne,mkdir as S,readFile as C}from"node:fs/promises";import{basename as re,dirname as ie,extname as w}from"node:path";import{config as ae}from"dotenv";import oe from"yaml";import{glob as se}from"glob";import{createInterface as ce}from"node:readline";var le=`0.
|
|
2
|
+
import{t as e}from"./memory-BS-U-K_q.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,Instruct as l,MCP as u,SimpleWriter as d,Tracer as f,addStats as p,anthropic as m,chatCompletions as h,createAgentConfig as g,createStats as _,gemini as v,loadFileContent as y,openai as ee}from"@fifthrevision/axle";import{Models as b}from"@fifthrevision/axle/models";import{createHash as te}from"node:crypto";import{z as x}from"zod";import{appendFile as ne,mkdir as S,readFile as C}from"node:fs/promises";import{basename as re,dirname as ie,extname as w}from"node:path";import{config as ae}from"dotenv";import oe from"yaml";import{glob as se}from"glob";import{createInterface as ce}from"node:readline";var le=`0.28.0`;async function ue(e,t){let n=[];for(let r of e){let e=new u(r);await e.connect({span:t}),n.push(e)}return n}async function de(e,t){for(let n of e)try{await n.close({span:t})}catch{}}function fe(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 T(e,t){return e.map(e=>fe(e,t))}const E={anthropic:b.Anthropic.CLAUDE_HAIKU_4_5,gemini:b.Google.GEMINI_3_5_FLASH,openai:b.OpenAI.GPT_5_4_MINI};function pe(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:ee(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:m(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:v(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:h(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 me(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 k(n,r,i){let a=me(n),o=a.mcps?.length?await ue(a.mcps,i):[],s=await g(a,e=>{let t=pe(e.provider,r);return{provider:t.provider,model:t.model,tools:e.tools?.length?T(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}}x.object({value:x.string()}),x.object({timeout:x.number().optional(),maxBuffer:x.number().optional(),cwd:x.string().optional()});const A={"api-key":x.string().optional(),apiKeyEnv:x.string().optional(),"api-key-env":x.string().optional()},j={maxRetries:x.number().int().nonnegative().optional(),timeoutMs:x.number().int().positive().optional()},M=x.strictObject({type:x.literal(`chatcompletions`),"base-url":x.string().optional(),model:x.string().optional(),vendor:x.enum([`openrouter`,`together`]).optional(),...A,...j}),N=x.strictObject({type:x.literal(`anthropic`),model:x.string().optional(),...A,...j}),P=x.strictObject({type:x.literal(`openai`),model:x.string().optional(),...A,...j}),F=x.strictObject({type:x.literal(`gemini`),model:x.string().optional(),...A,...j}),I=x.discriminatedUnion(`type`,[M,N,P,F]),L=x.object({transport:x.literal(`stdio`),name:x.string().optional(),command:x.string(),args:x.array(x.string()).optional(),env:x.record(x.string(),x.string()).optional()}),R=x.object({transport:x.literal(`http`),name:x.string().optional(),url:x.string(),headers:x.record(x.string(),x.string()).optional()}),z=x.discriminatedUnion(`transport`,[L,R]),he=x.object({files:x.string(),resume:x.boolean().default(!1),concurrency:x.number().int().positive().default(3)}),ge=x.object({name:x.string().optional(),provider:I,task:x.string(),tools:x.array(x.string()).optional(),provider_tools:x.array(x.string()).optional(),files:x.array(x.string()).optional(),mcps:x.array(z).optional(),batch:he.optional()});async function _e(e,t){let{span: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=oe.parse(i);n?.debug(`Job config: `+JSON.stringify(a,null,2));let o=ge.safeParse(a);if(!o.success)throw Error(`The job file is not valid:\n${xe(o.error)}`);return o.data.name||(o.data.name=re(e,w(e))),o.data}async function ve(e){let{span:t}=e;ae({quiet:!0});let n=ye();return t?.debug(`Service config: `+JSON.stringify(V(n),null,2)),n}function ye(){return B({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 B(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,be(e)&&t?`[redacted]`:V(t)]))}function be(e){return e===`api-key`||e.toLowerCase().includes(`secret`)}function xe(e){return e.issues.map(e=>` - ${e.path.join(`.`)||`root`}: ${e.message}`).join(`
|
|
3
3
|
`)}const H=`.axle/batch.jsonl`;function Se(e,t){let n=te(`sha256`);return n.update(e),n.update(`\0`),n.update(t),n.digest(`hex`)}async function Ce(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 we(e,t=H){await S(ie(t),{recursive:!0}),await ne(t,JSON.stringify(e)+`
|
|
5
5
|
`,`utf-8`)}async function Te(e,t,n,r,i,a){let o=new l({prompt:e.task});if(e.files)for(let t of e.files)o.addFile(await y(t));let s=a.startSpan(`job`,{type:`workflow`}),u=new c({...t,observability:{trace:s}});try{let e=await u.send(o.withInputs(n)).final;if(p(i,e.usage),e.response){let t=e.response;a.info(t,{markdown:!0})}r.interactive&&await Ee(u,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 Ee(e,t,n){let r=ce({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.
|
|
3
|
+
"version": "0.28.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.
|
|
39
|
+
"@fifthrevision/axle": "0.28.0"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
42
|
"@arethetypeswrong/core": "^0.18.2",
|