@zibby/core 0.5.21 → 0.5.23
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/index.js +61 -61
- package/dist/package.json +2 -3
- package/dist/register-built-in-strategies.js +35 -35
- package/dist/strategies/codex-strategy.js +4 -4
- package/dist/strategies/index.js +39 -39
- package/package.json +2 -3
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import{AgentStrategy as ie,getSkill as te}from"@zibby/agent-workflow";import{execSync as I}from"node:child_process";import{readFileSync as ae,mkdirSync as j,cpSync as le,existsSync as re}from"node:fs";import{join as E}from"node:path";import{homedir as se}from"node:os";import{z as B}from"zod";import{zodToJsonSchema as ee}from"zod-to-json-schema";function oe(o){if(!o||typeof o!="object")return o;if(Array.isArray(o.type))return o.type.includes("null")||(o.type=[...o.type,"null"]),o;if(typeof o.type=="string")return o.type=[o.type,"null"],o;for(let e of["anyOf","oneOf"])if(Array.isArray(o[e]))return o[e].some(n=>n&&n.type==="null")||(o[e]=[...o[e],{type:"null"}]),o;return{anyOf:[o,{type:"null"}]}}function v(o){if(!o||typeof o!="object")return o;for(let e of["$defs","definitions"])if(o[e]&&typeof o[e]=="object")for(let n of Object.keys(o[e]))o[e][n]=v(o[e][n]);for(let e of["anyOf","oneOf","allOf"])Array.isArray(o[e])&&(o[e]=o[e].map(v));if(o.properties&&typeof o.properties=="object"){o.additionalProperties=!1;let e=Object.keys(o.properties),n=new Set(Array.isArray(o.required)?o.required:[]);for(let i of e){let t=v(o.properties[i]);n.has(i)||(t=oe(t)),o.properties[i]=t}o.required=e}return o.items&&(Array.isArray(o.items)?o.items=o.items.map(v):o.items=v(o.items)),o}function F(o,e={target:"openApi3"}){if(!o)return null;let n=e?.target==="openAi",i=null;if(typeof B?.toJSONSchema=="function")try{i=B.toJSONSchema(o)}catch{}if(!i)try{i=ee(o,e)}catch{return null}if(n&&i)try{return v(i)}catch{return i}return i}import b from"chalk";var p={debug:0,info:1,warn:2,error:3,silent:4},G=class{constructor(){this._level=this._getLogLevel()}_getLogLevel(){if(process.env.ZIBBY_DEBUG==="true")return p.debug;if(process.env.ZIBBY_VERBOSE==="true")return p.info;let e=process.env.LOG_LEVEL?.toLowerCase();return e&&e in p?p[e]:p.info}_shouldLog(e){return p[e]>=this._level}_formatMessage(e,n,i={}){let t=new Date().toISOString(),r=`${this._getPrefix(e)} ${n}`;return Object.keys(i).length>0&&(r+=b.dim(` ${JSON.stringify(i)}`)),r}_getPrefix(e){return{debug:b.gray("[DEBUG]"),info:b.cyan("[INFO]"),warn:b.yellow("[WARN]"),error:b.red("\u274C [ERROR]")}[e]||""}debug(e,n){this._shouldLog("debug")&&console.log(this._formatMessage("debug",e,n))}info(e,n){this._shouldLog("info")&&console.log(this._formatMessage("info",e,n))}warn(e,n){this._shouldLog("warn")&&console.warn(this._formatMessage("warn",e,n))}error(e,n){this._shouldLog("error")&&console.error(this._formatMessage("error",e,n))}setLevel(e){e in p&&(this._level=p[e])}getLevel(){return Object.keys(p).find(e=>p[e]===this._level)}},a=new G;import{timeline as R,Timeline as ye,WORKFLOW_GRAPH_LOG_MARKER_PREFIX as ve}from"@zibby/agent-workflow";var ne=[{alias:"auto",canonicalId:"claude-sonnet-4-6",vendor:"claude",label:"Claude \xB7 Sonnet 4.6",family:"claude-sonnet-4",pickerVisible:!0,isDefault:!0},{alias:"opus-4.8",canonicalId:"claude-opus-4-8",vendor:"claude",label:"Claude \xB7 Opus 4.8",family:"claude-opus-4",pickerVisible:!0},{alias:"opus-4-8",canonicalId:"claude-opus-4-8",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.8"},{alias:"sonnet-4.8",canonicalId:"claude-sonnet-4-8",vendor:"claude",label:"Claude \xB7 Sonnet 4.8",family:"claude-sonnet-4",pickerVisible:!0},{alias:"sonnet-4-8",canonicalId:"claude-sonnet-4-8",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.8"},{alias:"opus-4.7",canonicalId:"claude-opus-4-7",vendor:"claude",label:"Claude \xB7 Opus 4.7",family:"claude-opus-4",pickerVisible:!0},{alias:"opus-4-7",canonicalId:"claude-opus-4-7",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.7"},{alias:"sonnet-4.7",canonicalId:"claude-sonnet-4-7",vendor:"claude",label:"Claude \xB7 Sonnet 4.7",family:"claude-sonnet-4",pickerVisible:!0},{alias:"sonnet-4-7",canonicalId:"claude-sonnet-4-7",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.7"},{alias:"sonnet-4.6",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4",aliasOf:"auto"},{alias:"sonnet-4-6",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4",aliasOf:"auto"},{alias:"opus-4.6",canonicalId:"claude-opus-4-6",vendor:"claude",label:"Claude \xB7 Opus 4.6",family:"claude-opus-4",pickerVisible:!0},{alias:"opus-4-6",canonicalId:"claude-opus-4-6",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.6"},{alias:"sonnet-4.5",canonicalId:"claude-sonnet-4-5-20250929",vendor:"claude",label:"Claude \xB7 Sonnet 4.5",family:"claude-sonnet-4",pickerVisible:!0},{alias:"sonnet-4-5",canonicalId:"claude-sonnet-4-5-20250929",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.5"},{alias:"opus-4.5",canonicalId:"claude-opus-4-5-20251101",vendor:"claude",label:"Claude \xB7 Opus 4.5",family:"claude-opus-4",pickerVisible:!0},{alias:"opus-4-5",canonicalId:"claude-opus-4-5-20251101",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.5"},{alias:"haiku-4.5",canonicalId:"claude-haiku-4-5-20251001",vendor:"claude",label:"Claude \xB7 Haiku 4.5",family:"claude-haiku-4"},{alias:"haiku-4-5",canonicalId:"claude-haiku-4-5-20251001",vendor:"claude",family:"claude-haiku-4",aliasOf:"haiku-4.5"},{alias:"claude-opus-4-8",canonicalId:"claude-opus-4-8",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.8"},{alias:"claude-sonnet-4-8",canonicalId:"claude-sonnet-4-8",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.8"},{alias:"claude-opus-4-7",canonicalId:"claude-opus-4-7",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.7"},{alias:"claude-sonnet-4-7",canonicalId:"claude-sonnet-4-7",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.7"},{alias:"claude-sonnet-4-6",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4",aliasOf:"auto"},{alias:"claude-opus-4-6",canonicalId:"claude-opus-4-6",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.6"},{alias:"claude-sonnet-4-5-20250929",canonicalId:"claude-sonnet-4-5-20250929",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.5"},{alias:"claude-opus-4-5-20251101",canonicalId:"claude-opus-4-5-20251101",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.5"},{alias:"claude-haiku-4-5-20251001",canonicalId:"claude-haiku-4-5-20251001",vendor:"claude",family:"claude-haiku-4",aliasOf:"haiku-4.5"},{alias:"claude-opus-4-20250514",canonicalId:"claude-opus-4-20250514",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.5"},{alias:"auto",canonicalId:"o4-mini",vendor:"codex",label:"Codex \xB7 o4-mini",family:"o4-mini",isDefault:!0},{alias:"o4-mini",canonicalId:"o4-mini",vendor:"codex",label:"Codex \xB7 o4-mini",family:"o4-mini",pickerVisible:!0},{alias:"o3",canonicalId:"o3",vendor:"codex",family:"o3"},{alias:"o3-mini",canonicalId:"o3-mini",vendor:"codex",family:"o3-mini"},{alias:"codex-mini",canonicalId:"codex-mini-latest",vendor:"codex",family:"codex-mini"},{alias:"gpt-4o",canonicalId:"gpt-4o",vendor:"codex",label:"Codex \xB7 GPT-4o",family:"gpt-4o",pickerVisible:!0},{alias:"gpt-4o-mini",canonicalId:"gpt-4o-mini",vendor:"codex",label:"Codex \xB7 GPT-4o mini",family:"gpt-4o-mini",pickerVisible:!0},{alias:"gpt-5.2-codex",canonicalId:"gpt-5.2-codex",vendor:"codex",label:"Codex \xB7 GPT-5.2",family:"gpt-5",pickerVisible:!0},{alias:"gpt-5.2",canonicalId:"gpt-5.2",vendor:"codex",label:"Codex \xB7 GPT-5.2 base",family:"gpt-5",pickerVisible:!0},{alias:"gpt-5.3",canonicalId:"gpt-5.3",vendor:"codex",label:"Codex \xB7 GPT-5.3",family:"gpt-5",pickerVisible:!0},{alias:"gpt-5.3-codex",canonicalId:"gpt-5.3-codex",vendor:"codex",family:"gpt-5"},{alias:"gpt-5.4",canonicalId:"gpt-5.4",vendor:"codex",label:"Codex \xB7 GPT-5.4",family:"gpt-5",pickerVisible:!0},{alias:"gpt-5.5",canonicalId:"gpt-5.5",vendor:"codex",label:"Codex \xB7 GPT-5.5",family:"gpt-5",pickerVisible:!0},{alias:"auto",canonicalId:"gemini-3-pro",vendor:"gemini",label:"Gemini \xB7 3 Pro",family:"gemini-3",isDefault:!0},{alias:"gemini-3-pro",canonicalId:"gemini-3-pro",vendor:"gemini",label:"Gemini \xB7 3 Pro",family:"gemini-3",pickerVisible:!0},{alias:"gemini-3-flash",canonicalId:"gemini-3-flash",vendor:"gemini",label:"Gemini \xB7 3 Flash",family:"gemini-3",pickerVisible:!0},{alias:"gemini-2.5-pro",canonicalId:"gemini-2.5-pro",vendor:"gemini",label:"Gemini \xB7 2.5 Pro",family:"gemini-2.5",pickerVisible:!0},{alias:"gemini-2.5-flash",canonicalId:"gemini-2.5-flash",vendor:"gemini",label:"Gemini \xB7 2.5 Flash",family:"gemini-2.5",pickerVisible:!0}];function P(o){let e={};for(let n of ne)n.vendor===o&&(e[n.alias]=n.canonicalId);return e}var V={ASSISTANT:"gpt-5.4-nano-2026-03-17",CLAUDE:"claude-sonnet-4-6",CURSOR:"auto",CODEX:"o4-mini",GEMINI:"gemini-3-pro",OPENAI_POSTPROCESSING:"gpt-4o-mini"};var _e=P("claude"),K=P("codex"),he=P("gemini"),be={CURSOR_AGENT_DEFAULT:1200*1e3,OPENAI_REQUEST:18e4};function X(o){let e=`${o}_POOL`,n=process.env[e];if(!n||typeof n!="string")return{picked:null,count:0,dispose:()=>{}};let i=n.split(/[,\n]+/).map(r=>r.trim()).filter(Boolean);if(i.length===0)return{picked:null,count:0,dispose:()=>{}};let t=i[Math.floor(Math.random()*i.length)],l=process.env[o];return process.env[o]=t,a.debug(`[auth-pool] ${o}: picked 1 of ${i.length} from pool (***${t.slice(-4)})`),{picked:t,count:i.length,dispose(){l===void 0?delete process.env[o]:process.env[o]=l}}}var H=class extends ie{constructor(){super("codex","Codex (OpenAI)",75)}canHandle(e){if(!!!(process.env.OPENAI_API_KEY||process.env.OPENAI_API_KEY_POOL||process.env.CODEX_API_KEY||process.env.CODEX_API_KEY_POOL))return a.debug("CodexAgentStrategy: OPENAI_API_KEY or CODEX_API_KEY not set"),!1;try{return I("codex --version",{encoding:"utf-8",timeout:5e3,stdio:"pipe"}),!0}catch{return a.warn("[Codex] codex CLI not found. Install: npm install -g @openai/codex"),!1}}async invoke(e,n={}){let{model:i,workspace:t=process.cwd(),schema:l=null,skills:r=null,plugins:m=null,sessionPath:s=null,nodeName:k=null,timeout:O,config:$={},signal:Y=null}=n,z=[X("OPENAI_API_KEY"),X("CODEX_API_KEY")];try{let{Codex:w}=await import("@openai/codex-sdk"),f=i;(!f||f==="auto")&&(a.debug(`Model is '${f||"undefined"}', using default: ${V.CODEX}`),f=V.CODEX);let C=K[f]||f;K[f]&&f!==C&&a.debug(`Mapped model: ${f} \u2192 ${C}`),a.debug(`Invoking Codex SDK with model: ${C}, skills: ${JSON.stringify(r)}`);let S=process.env.CODEX_API_KEY||process.env.OPENAI_API_KEY;S&&!process.env.CODEX_API_KEY&&(process.env.CODEX_API_KEY=S);let W=S?` | key: ***${S.slice(-4)}`:" | key: not set";if(console.log(`
|
|
2
|
-
\u25C6 Model: ${C}${
|
|
3
|
-
`),Array.isArray(m)&&m.length>0){let c=this._resolveCodexHome(s);process.env.CODEX_HOME=c;try{
|
|
4
|
-
${A.bold("Prompt sent to LLM:")}`),console.log(A.dim("\u2500".repeat(60))),console.log(A.dim(e)),console.log(A.dim("\u2500".repeat(60)));let M=this._resolveSkillsToMcp(
|
|
1
|
+
import{AgentStrategy as te,getSkill as ae}from"@zibby/agent-workflow";import{execSync as I}from"node:child_process";import{readFileSync as re,mkdirSync as X,cpSync as le,existsSync as se}from"node:fs";import{join as E}from"node:path";import{homedir as ce}from"node:os";import{z as F}from"zod";import{zodToJsonSchema as oe}from"zod-to-json-schema";function ne(o){if(!o||typeof o!="object")return o;if(Array.isArray(o.type))return o.type.includes("null")||(o.type=[...o.type,"null"]),o;if(typeof o.type=="string")return o.type=[o.type,"null"],o;for(let e of["anyOf","oneOf"])if(Array.isArray(o[e]))return o[e].some(n=>n&&n.type==="null")||(o[e]=[...o[e],{type:"null"}]),o;return{anyOf:[o,{type:"null"}]}}function O(o){if(!o||typeof o!="object")return o;for(let e of["$defs","definitions"])if(o[e]&&typeof o[e]=="object")for(let n of Object.keys(o[e]))o[e][n]=O(o[e][n]);for(let e of["anyOf","oneOf","allOf"])Array.isArray(o[e])&&(o[e]=o[e].map(O));if(o.properties&&typeof o.properties=="object"){o.additionalProperties=!1;let e=Object.keys(o.properties),n=new Set(Array.isArray(o.required)?o.required:[]);for(let i of e){let t=O(o.properties[i]);n.has(i)||(t=ne(t)),o.properties[i]=t}o.required=e}return o.items&&(Array.isArray(o.items)?o.items=o.items.map(O):o.items=O(o.items)),o}function z(o,e={target:"openApi3"}){if(!o)return null;let n=e?.target==="openAi",i=null;if(typeof F?.toJSONSchema=="function")try{i=F.toJSONSchema(o)}catch{}if(!i)try{i=oe(o,e)}catch{return null}if(n&&i)try{return O(i)}catch{return i}return i}import h from"chalk";var p={debug:0,info:1,warn:2,error:3,silent:4},G=class{constructor(){this._level=this._getLogLevel()}_getLogLevel(){if(process.env.ZIBBY_DEBUG==="true")return p.debug;if(process.env.ZIBBY_VERBOSE==="true")return p.info;let e=process.env.LOG_LEVEL?.toLowerCase();return e&&e in p?p[e]:p.info}_shouldLog(e){return p[e]>=this._level}_formatMessage(e,n,i={}){let t=new Date().toISOString(),l=`${this._getPrefix(e)} ${n}`;return Object.keys(i).length>0&&(l+=h.dim(` ${JSON.stringify(i)}`)),l}_getPrefix(e){return{debug:h.gray("[DEBUG]"),info:h.cyan("[INFO]"),warn:h.yellow("[WARN]"),error:h.red("\u274C [ERROR]")}[e]||""}debug(e,n){this._shouldLog("debug")&&console.log(this._formatMessage("debug",e,n))}info(e,n){this._shouldLog("info")&&console.log(this._formatMessage("info",e,n))}warn(e,n){this._shouldLog("warn")&&console.warn(this._formatMessage("warn",e,n))}error(e,n){this._shouldLog("error")&&console.error(this._formatMessage("error",e,n))}setLevel(e){e in p&&(this._level=p[e])}getLevel(){return Object.keys(p).find(e=>p[e]===this._level)}},a=new G;import{timeline as R,Timeline as ve,WORKFLOW_GRAPH_LOG_MARKER_PREFIX as Oe}from"@zibby/agent-workflow";var ie=[{alias:"auto",canonicalId:"claude-sonnet-4-6",vendor:"claude",label:"Claude \xB7 Sonnet 4.6",family:"claude-sonnet-4",pickerVisible:!0,isDefault:!0},{alias:"opus-4.8",canonicalId:"claude-opus-4-8",vendor:"claude",label:"Claude \xB7 Opus 4.8",family:"claude-opus-4",pickerVisible:!0},{alias:"opus-4-8",canonicalId:"claude-opus-4-8",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.8"},{alias:"sonnet-4.8",canonicalId:"claude-sonnet-4-8",vendor:"claude",label:"Claude \xB7 Sonnet 4.8",family:"claude-sonnet-4",pickerVisible:!0},{alias:"sonnet-4-8",canonicalId:"claude-sonnet-4-8",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.8"},{alias:"opus-4.7",canonicalId:"claude-opus-4-7",vendor:"claude",label:"Claude \xB7 Opus 4.7",family:"claude-opus-4",pickerVisible:!0},{alias:"opus-4-7",canonicalId:"claude-opus-4-7",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.7"},{alias:"sonnet-4.7",canonicalId:"claude-sonnet-4-7",vendor:"claude",label:"Claude \xB7 Sonnet 4.7",family:"claude-sonnet-4",pickerVisible:!0},{alias:"sonnet-4-7",canonicalId:"claude-sonnet-4-7",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.7"},{alias:"sonnet-4.6",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4",aliasOf:"auto"},{alias:"sonnet-4-6",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4",aliasOf:"auto"},{alias:"opus-4.6",canonicalId:"claude-opus-4-6",vendor:"claude",label:"Claude \xB7 Opus 4.6",family:"claude-opus-4",pickerVisible:!0},{alias:"opus-4-6",canonicalId:"claude-opus-4-6",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.6"},{alias:"sonnet-4.5",canonicalId:"claude-sonnet-4-5-20250929",vendor:"claude",label:"Claude \xB7 Sonnet 4.5",family:"claude-sonnet-4",pickerVisible:!0},{alias:"sonnet-4-5",canonicalId:"claude-sonnet-4-5-20250929",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.5"},{alias:"opus-4.5",canonicalId:"claude-opus-4-5-20251101",vendor:"claude",label:"Claude \xB7 Opus 4.5",family:"claude-opus-4",pickerVisible:!0},{alias:"opus-4-5",canonicalId:"claude-opus-4-5-20251101",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.5"},{alias:"haiku-4.5",canonicalId:"claude-haiku-4-5-20251001",vendor:"claude",label:"Claude \xB7 Haiku 4.5",family:"claude-haiku-4"},{alias:"haiku-4-5",canonicalId:"claude-haiku-4-5-20251001",vendor:"claude",family:"claude-haiku-4",aliasOf:"haiku-4.5"},{alias:"claude-opus-4-8",canonicalId:"claude-opus-4-8",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.8"},{alias:"claude-sonnet-4-8",canonicalId:"claude-sonnet-4-8",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.8"},{alias:"claude-opus-4-7",canonicalId:"claude-opus-4-7",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.7"},{alias:"claude-sonnet-4-7",canonicalId:"claude-sonnet-4-7",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.7"},{alias:"claude-sonnet-4-6",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4",aliasOf:"auto"},{alias:"claude-opus-4-6",canonicalId:"claude-opus-4-6",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.6"},{alias:"claude-sonnet-4-5-20250929",canonicalId:"claude-sonnet-4-5-20250929",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.5"},{alias:"claude-opus-4-5-20251101",canonicalId:"claude-opus-4-5-20251101",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.5"},{alias:"claude-haiku-4-5-20251001",canonicalId:"claude-haiku-4-5-20251001",vendor:"claude",family:"claude-haiku-4",aliasOf:"haiku-4.5"},{alias:"claude-opus-4-20250514",canonicalId:"claude-opus-4-20250514",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.5"},{alias:"auto",canonicalId:"o4-mini",vendor:"codex",label:"Codex \xB7 o4-mini",family:"o4-mini",isDefault:!0},{alias:"o4-mini",canonicalId:"o4-mini",vendor:"codex",label:"Codex \xB7 o4-mini",family:"o4-mini",pickerVisible:!0},{alias:"o3",canonicalId:"o3",vendor:"codex",family:"o3"},{alias:"o3-mini",canonicalId:"o3-mini",vendor:"codex",family:"o3-mini"},{alias:"codex-mini",canonicalId:"codex-mini-latest",vendor:"codex",family:"codex-mini"},{alias:"gpt-4o",canonicalId:"gpt-4o",vendor:"codex",label:"Codex \xB7 GPT-4o",family:"gpt-4o",pickerVisible:!0},{alias:"gpt-4o-mini",canonicalId:"gpt-4o-mini",vendor:"codex",label:"Codex \xB7 GPT-4o mini",family:"gpt-4o-mini",pickerVisible:!0},{alias:"gpt-5.2-codex",canonicalId:"gpt-5.2-codex",vendor:"codex",label:"Codex \xB7 GPT-5.2",family:"gpt-5",pickerVisible:!0},{alias:"gpt-5.2",canonicalId:"gpt-5.2",vendor:"codex",label:"Codex \xB7 GPT-5.2 base",family:"gpt-5",pickerVisible:!0},{alias:"gpt-5.3",canonicalId:"gpt-5.3",vendor:"codex",label:"Codex \xB7 GPT-5.3",family:"gpt-5",pickerVisible:!0},{alias:"gpt-5.3-codex",canonicalId:"gpt-5.3-codex",vendor:"codex",family:"gpt-5"},{alias:"gpt-5.4",canonicalId:"gpt-5.4",vendor:"codex",label:"Codex \xB7 GPT-5.4",family:"gpt-5",pickerVisible:!0},{alias:"gpt-5.5",canonicalId:"gpt-5.5",vendor:"codex",label:"Codex \xB7 GPT-5.5",family:"gpt-5",pickerVisible:!0},{alias:"auto",canonicalId:"gemini-3-pro",vendor:"gemini",label:"Gemini \xB7 3 Pro",family:"gemini-3",isDefault:!0},{alias:"gemini-3-pro",canonicalId:"gemini-3-pro",vendor:"gemini",label:"Gemini \xB7 3 Pro",family:"gemini-3",pickerVisible:!0},{alias:"gemini-3-flash",canonicalId:"gemini-3-flash",vendor:"gemini",label:"Gemini \xB7 3 Flash",family:"gemini-3",pickerVisible:!0},{alias:"gemini-2.5-pro",canonicalId:"gemini-2.5-pro",vendor:"gemini",label:"Gemini \xB7 2.5 Pro",family:"gemini-2.5",pickerVisible:!0},{alias:"gemini-2.5-flash",canonicalId:"gemini-2.5-flash",vendor:"gemini",label:"Gemini \xB7 2.5 Flash",family:"gemini-2.5",pickerVisible:!0}];function P(o){let e={};for(let n of ie)n.vendor===o&&(e[n.alias]=n.canonicalId);return e}var V={ASSISTANT:"gpt-5.4-nano-2026-03-17",CLAUDE:"claude-sonnet-4-6",CURSOR:"auto",CODEX:"o4-mini",GEMINI:"gemini-3-pro",OPENAI_POSTPROCESSING:"gpt-4o-mini"};var be=P("claude"),K=P("codex"),he=P("gemini"),Ie={CURSOR_AGENT_DEFAULT:1200*1e3,OPENAI_REQUEST:18e4};function j(o){let e=`${o}_POOL`,n=process.env[e];if(!n||typeof n!="string")return{picked:null,count:0,dispose:()=>{}};let i=n.split(/[,\n]+/).map(l=>l.trim()).filter(Boolean);if(i.length===0)return{picked:null,count:0,dispose:()=>{}};let t=i[Math.floor(Math.random()*i.length)],r=process.env[o];return process.env[o]=t,a.debug(`[auth-pool] ${o}: picked 1 of ${i.length} from pool (***${t.slice(-4)})`),{picked:t,count:i.length,dispose(){r===void 0?delete process.env[o]:process.env[o]=r}}}function Y(o){if(Array.isArray(o))return o.map(Y);if(o&&typeof o=="object"){let e={};for(let[n,i]of Object.entries(o))i!==null&&(e[n]=Y(i));return e}return o}var H=class extends te{constructor(){super("codex","Codex (OpenAI)",75)}canHandle(e){if(!!!(process.env.OPENAI_API_KEY||process.env.OPENAI_API_KEY_POOL||process.env.CODEX_API_KEY||process.env.CODEX_API_KEY_POOL))return a.debug("CodexAgentStrategy: OPENAI_API_KEY or CODEX_API_KEY not set"),!1;try{return I("codex --version",{encoding:"utf-8",timeout:5e3,stdio:"pipe"}),!0}catch{return a.warn("[Codex] codex CLI not found. Install: npm install -g @openai/codex"),!1}}async invoke(e,n={}){let{model:i,workspace:t=process.cwd(),schema:r=null,skills:l=null,plugins:m=null,sessionPath:s=null,nodeName:k=null,timeout:x,config:$={},signal:U=null}=n,W=[j("OPENAI_API_KEY"),j("CODEX_API_KEY")];try{let{Codex:w}=await import("@openai/codex-sdk"),f=i;(!f||f==="auto")&&(a.debug(`Model is '${f||"undefined"}', using default: ${V.CODEX}`),f=V.CODEX);let C=K[f]||f;K[f]&&f!==C&&a.debug(`Mapped model: ${f} \u2192 ${C}`),a.debug(`Invoking Codex SDK with model: ${C}, skills: ${JSON.stringify(l)}`);let S=process.env.CODEX_API_KEY||process.env.OPENAI_API_KEY;S&&!process.env.CODEX_API_KEY&&(process.env.CODEX_API_KEY=S);let q=S?` | key: ***${S.slice(-4)}`:" | key: not set";if(console.log(`
|
|
2
|
+
\u25C6 Model: ${C}${q}
|
|
3
|
+
`),Array.isArray(m)&&m.length>0){let c=this._resolveCodexHome(s);process.env.CODEX_HOME=c;try{X(c,{recursive:!0})}catch{}this._ensurePlugins(m,c)}let A=(await import("chalk")).default;console.log(`
|
|
4
|
+
${A.bold("Prompt sent to LLM:")}`),console.log(A.dim("\u2500".repeat(60))),console.log(A.dim(e)),console.log(A.dim("\u2500".repeat(60)));let M=this._resolveSkillsToMcp(l,{sessionPath:s,workspace:t,nodeName:k}),L={};Object.keys(M).length>0&&(L.mcp_servers=M,a.debug(`[Codex] MCP servers: ${Object.keys(M).join(", ")}`));let J=this._resolveCodexBin(),Z=new w({...J?{codexPathOverride:J}:{},...Object.keys(L).length>0&&{config:L}}),v=t;try{v&&X(v,{recursive:!0})}catch{}(!v||!se(v))&&(v=process.cwd());let Q=Z.startThread({workingDirectory:v,skipGitRepoCheck:!0,approvalPolicy:"never",sandboxMode:"danger-full-access",networkAccessEnabled:!0}),B=r&&typeof r.parse=="function",D={};if(r)try{let c=B?z(r,{target:"openAi"}):r;D.outputSchema=c,a.debug("Structured output via SDK outputSchema")}catch(c){a.warn(`[Codex] Schema conversion failed, will extract from text: ${c.message}`)}if(U?.aborted){let c=new Error("Aborted via signal");throw c.name="AbortError",c}try{let{events:c}=await Q.runStreamed(e,D),_=0,d="";for await(let g of c){if(U?.aborted){let u=new Error("Aborted via signal");throw u.name="AbortError",u}let y=g.type;if(y==="item.completed"){let u=g.item,b=u?.type;if(b==="mcp_tool_call"){_++;let T=`${u.server}/${u.tool}`;if(R.stepTool(`Tool: ${T}`),u.arguments){let N=JSON.stringify(u.arguments),ee=N.length>100?`${N.substring(0,100)}...`:N;console.log(` Input: ${ee}`)}}else if(b==="tool_call"||b==="function_call"||b==="command_execution"){_++;let T=u.name||u.tool||u.command||"unknown";R.stepTool(`Tool: ${T}`)}else b==="agent_message"&&(d=u.text||"",d.length<500?console.log(d):console.log(`${d.substring(0,200)}... (${d.length} chars)`))}else y==="turn.completed"?a.debug(`[Codex] Turn completed. Usage: ${JSON.stringify(g.usage||{})}`):a.debug(`[Codex] Event: ${y} ${JSON.stringify(g).slice(0,300)}`)}if(a.debug(`[Codex] Last agent message (${d.length} chars): ${d.slice(0,500)}`),r){if(!d)throw new Error("Codex agent returned no response");let g=JSON.parse(d),y=g;if(B)try{y=r.parse(g)}catch{y=r.parse(Y(g))}return a.debug("\u2705 [Codex] Structured output validated"),{raw:d,structured:y}}return d||""}catch(c){let _=c.message||String(c);throw a.error(`\u274C [Codex] SDK call failed: ${_}`),_.includes("exited with code")&&(D.outputSchema&&a.error("\u{1F4A1} [Codex] An outputSchema was sent \u2014 an OpenAI strict-mode-invalid schema (a property missing from `required`) makes codex exit 1 here."),a.error("\u{1F4A1} [Codex] Verify: codex --version && echo $OPENAI_API_KEY"),a.error("\u{1F4A1} [Codex] If codex is missing: npm install -g @openai/codex")),c}}finally{for(let w of W)w.dispose()}}_resolveSkillsToMcp(e,n={}){if(!Array.isArray(e)||e.length===0)return{};let i={};for(let t of e){let r=ae(t);if(!r){a.warn(`[Codex] Unknown skill "${t}" \u2014 skipping`);continue}if(typeof r.resolve!="function")continue;let l=r.resolve(n);if(!l)continue;let m=r.serverName||t,s={command:l.command};l.args?.length&&(s.args=l.args),s.env={...process.env,...l.env||{}},i[m]=s,a.debug(`[Codex] MCP: ${m} \u2192 ${l.command} ${(l.args||[]).join(" ")}`)}return i}_resolveCodexHome(e){return process.env.CODEX_HOME?process.env.CODEX_HOME:e&&!this._isTempPath(e)?E(e,".codex-home"):E(ce(),".codex")}_isTempPath(e){let n=String(process.env.TMPDIR||"/tmp").replace(/\/+$/,""),i=String(e||"");return i==="/tmp"||i.startsWith("/tmp/")||i===n||i.startsWith(n+"/")}_resolveCodexBin(){if(process.env.CODEX_BIN)return process.env.CODEX_BIN;try{return I("command -v codex",{encoding:"utf-8",timeout:5e3,stdio:["ignore","pipe","ignore"]}).trim()||void 0}catch{return}}_ensurePlugins(e,n){let i={...process.env,CODEX_HOME:n};for(let t of e){let r=typeof t=="string"?t:t?.name,l=t&&typeof t=="object"?t.marketplacePath:null;if(!r||!l){a.warn(`[Codex][plugins] skipping malformed plugin declaration: ${JSON.stringify(t)} (need { name, marketplacePath })`);continue}let m=this._readMarketplaceName(l),s=`${r}@${m}`;if(this._isPluginInstalled(s,i)){a.info(`[Codex][plugins] ${s} already installed \u2014 skipping (idempotent)`),console.log(`\u25C6 [Codex] plugin ${s} already installed \u2014 skip`);continue}let k=this._safeMarketplacePath(l,n);a.info(`[Codex][plugins] installing ${s} from local marketplace ${k}`),console.log(`\u25C6 [Codex] installing plugin ${s} (local, no network)`);try{I(`codex plugin marketplace add ${JSON.stringify(k)}`,{env:i,stdio:"pipe",timeout:6e4,encoding:"utf-8"}),I(`codex plugin add ${JSON.stringify(s)}`,{env:i,stdio:"pipe",timeout:6e4,encoding:"utf-8"}),console.log(`\u25C6 [Codex] plugin ${s} installed`)}catch(x){let $=x.stderr&&x.stderr.toString()||x.message||String(x);throw a.error(`[Codex][plugins] failed to install ${s}: ${$}`),new Error(`Codex plugin install failed for ${s}: ${$}`)}}}_safeMarketplacePath(e,n){if(!String(e).includes("@"))return e;let i=E(n,".zibby-mkt",String(e).replace(/[^a-zA-Z0-9]+/g,"_"));try{return X(E(n,".zibby-mkt"),{recursive:!0}),le(e,i,{recursive:!0}),i}catch(t){return a.warn(`[Codex][plugins] could not copy @-containing marketplace to a safe path: ${t.message}`),e}}_readMarketplaceName(e){let n=E(e,".agents","plugins","marketplace.json"),i;try{i=JSON.parse(re(n,"utf-8"))}catch(t){throw new Error(`Codex plugin marketplace manifest missing/unreadable at ${n}: ${t.message}`)}if(!i?.name||typeof i.name!="string")throw new Error(`Codex plugin marketplace manifest at ${n} has no string "name"`);return i.name}_isPluginInstalled(e,n){try{return I("codex plugin list",{env:n,stdio:"pipe",timeout:15e3,encoding:"utf-8"}).split(`
|
|
5
5
|
`).some(t=>t.includes(e)&&/installed/.test(t))}catch{return!1}}};export{H as CodexAgentStrategy};
|