@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.
@@ -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}${W}
3
- `),Array.isArray(m)&&m.length>0){let c=this._resolveCodexHome(s);process.env.CODEX_HOME=c;try{j(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(r,{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 U=this._resolveCodexBin(),q=new w({...U?{codexPathOverride:U}:{},...Object.keys(L).length>0&&{config:L}}),y=t;try{y&&j(y,{recursive:!0})}catch{}(!y||!re(y))&&(y=process.cwd());let Z=q.startThread({workingDirectory:y,skipGitRepoCheck:!0,approvalPolicy:"never",sandboxMode:"danger-full-access",networkAccessEnabled:!0}),J=l&&typeof l.parse=="function",D={};if(l)try{let c=J?F(l,{target:"openAi"}):l;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(Y?.aborted){let c=new Error("Aborted via signal");throw c.name="AbortError",c}try{let{events:c}=await Z.runStreamed(e,D),x=0,d="";for await(let g of c){if(Y?.aborted){let u=new Error("Aborted via signal");throw u.name="AbortError",u}let _=g.type;if(_==="item.completed"){let u=g.item,h=u?.type;if(h==="mcp_tool_call"){x++;let T=`${u.server}/${u.tool}`;if(R.stepTool(`Tool: ${T}`),u.arguments){let N=JSON.stringify(u.arguments),Q=N.length>100?`${N.substring(0,100)}...`:N;console.log(` Input: ${Q}`)}}else if(h==="tool_call"||h==="function_call"||h==="command_execution"){x++;let T=u.name||u.tool||u.command||"unknown";R.stepTool(`Tool: ${T}`)}else h==="agent_message"&&(d=u.text||"",d.length<500?console.log(d):console.log(`${d.substring(0,200)}... (${d.length} chars)`))}else _==="turn.completed"?a.debug(`[Codex] Turn completed. Usage: ${JSON.stringify(g.usage||{})}`):a.debug(`[Codex] Event: ${_} ${JSON.stringify(g).slice(0,300)}`)}if(a.debug(`[Codex] Last agent message (${d.length} chars): ${d.slice(0,500)}`),l){if(!d)throw new Error("Codex agent returned no response");let g=JSON.parse(d),_=J?l.parse(g):g;return a.debug("\u2705 [Codex] Structured output validated"),{raw:d,structured:_}}return d||""}catch(c){let x=c.message||String(c);throw a.error(`\u274C [Codex] SDK call failed: ${x}`),x.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 z)w.dispose()}}_resolveSkillsToMcp(e,n={}){if(!Array.isArray(e)||e.length===0)return{};let i={};for(let t of e){let l=te(t);if(!l){a.warn(`[Codex] Unknown skill "${t}" \u2014 skipping`);continue}if(typeof l.resolve!="function")continue;let r=l.resolve(n);if(!r)continue;let m=l.serverName||t,s={command:r.command};r.args?.length&&(s.args=r.args),s.env={...process.env,...r.env||{}},i[m]=s,a.debug(`[Codex] MCP: ${m} \u2192 ${r.command} ${(r.args||[]).join(" ")}`)}return i}_resolveCodexHome(e){return process.env.CODEX_HOME?process.env.CODEX_HOME:e&&!this._isTempPath(e)?E(e,".codex-home"):E(se(),".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 l=typeof t=="string"?t:t?.name,r=t&&typeof t=="object"?t.marketplacePath:null;if(!l||!r){a.warn(`[Codex][plugins] skipping malformed plugin declaration: ${JSON.stringify(t)} (need { name, marketplacePath })`);continue}let m=this._readMarketplaceName(r),s=`${l}@${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(r,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(O){let $=O.stderr&&O.stderr.toString()||O.message||String(O);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 j(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(ae(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(`
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};