@zibby/core 2.0.13 → 2.0.14
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 +115 -115
- package/dist/mcp/tool-broker-server.js +6 -3
- package/dist/package.json +5 -4
- package/dist/register-built-in-strategies.js +39 -39
- package/dist/strategies/codex-strategy.js +9 -9
- package/dist/strategies/gemini-strategy.js +10 -10
- package/dist/strategies/index.js +75 -75
- package/dist/strategies/tool-broker.js +1 -1
- package/package.json +5 -4
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import{AgentStrategy as it,getSkill as st}from"@zibby/agent-workflow";import Re from"node:process";var me=Object.freeze(["PROJECT_API_TOKEN","ZIBBY_USER_TOKEN","GITHUB_TOKEN","GITLAB_TOKEN","GITLAB_OAUTH_TOKEN","GITLAB_INSTANCES","ATLASSIAN_ACCESS_TOKEN","JIRA_API_TOKEN","JIRA_EMAIL","SENTRY_AUTH_TOKEN","SLACK_BOT_TOKEN","DISCORD_BOT_TOKEN","ZIBBY_CHAT_SLACK_TOKEN","ZIBBY_CHAT_LARK_APP_SECRET","ZIBBY_CHAT_DISCORD_INTERACTION_TOKEN","LINEAR_API_KEY","LINEAR_OAUTH_TOKEN","PLANE_API_KEY","PLANE_OAUTH_TOKEN","ZIBBY_INJECTED_GOOGLE_TOKEN","ZIBBY_INJECTED_LINKEDIN_TOKEN","ZIBBY_MEMORY_AWS_ACCESS_KEY_ID","ZIBBY_MEMORY_AWS_SECRET_ACCESS_KEY","ZIBBY_MEMORY_AWS_SESSION_TOKEN"]);function X(t=Re.env){let e={},n=new Set(me);for(let[o,r]of Object.entries(t))n.has(o)||r!==void 0&&(e[o]=r);return e}function Ke(t){return!!t&&(t.transport==="http"||typeof t.url=="string"&&!t.command)}var ge=Object.freeze({claude:"native",codex:"broker",gemini:"broker",cursor:"eager"});function ye(t){return ge[t]||"eager"}var je=new Set(Object.entries(ge).filter(([,t])=>t==="native").map(([t])=>t)),q=Symbol("zibby.mcp.alwaysLoad");function Ue(){let t=String(process.env.MCP_ALWAYS_LOAD??"").trim().toLowerCase();return!(t==="0"||t==="false"||t==="off")}function Be(t,e){return je.has(t)?Ue()?typeof e.alwaysLoad=="boolean"?{alwaysLoad:e.alwaysLoad}:{}:{}:{}}function K(t,e,{processEnv:n}={}){if(!e)return null;let o=Be(t,e),r=l=>(e.alwaysLoad===!0&&Object.defineProperty(l,q,{value:!0,enumerable:!1}),l);if(Ke(e)){let l=String(e.url||"").trim();if(!l)return null;let p=e.headers&&typeof e.headers=="object"?e.headers:void 0;switch(t){case"claude":return r({type:"http",url:l,...p&&{headers:p},...o});case"codex":return r({url:l,...p&&{http_headers:p}});case"gemini":return r({url:l,type:"http",...p&&{headers:p}});case"cursor":return r({url:l,...p&&{headers:p}});default:return r({type:"http",url:l,...p&&{headers:p},...o})}}let s={command:e.command};return e.args?.length&&(s.args=e.args),e.cwd&&(s.cwd=e.cwd),n?s.env={...n,...e.env||{}}:e.env&&Object.keys(e.env).length&&(s.env=e.env),r({...s,...o})}import{mkdtempSync as Je,writeFileSync as Ge,mkdirSync as ze,existsSync as Ye}from"fs";import{join as N,dirname as _e}from"path";import{tmpdir as Fe}from"os";import{fileURLToPath as He}from"url";var he="toolbox";function Ze(){let t=_e(He(import.meta.url));for(let e=t,n=0;n<4;n++,e=_e(e)){let o=N(e,"mcp","tool-broker-server.js");if(Ye(o))return o}throw new Error(`[tool-broker] cannot find mcp/tool-broker-server.js from ${t} \u2014 the package layout changed, or the build did not emit it.`)}function Ve(){let t=String(process.env.MCP_TOOL_BROKER??"").trim().toLowerCase();return!(t==="0"||t==="false"||t==="off")}function We(t){if(t){let e=N(t,".mcp-broker");return ze(e,{recursive:!0}),N(e,"spec.json")}return N(Je(N(Fe(),"mcp-broker-")),"spec.json")}function Ee(t,e,{sessionPath:n}={}){let o=e&&typeof e=="object"?e:{},r=Object.keys(o);if(!r.length||ye(t)!=="broker"||!Ve()||r.length===1)return o;let s=r.filter(c=>o[c]&&o[c][q]===!0),l=We(n);Ge(l,JSON.stringify({servers:o,pinned:s},null,2),{mode:384}),console.error(`[tool-broker] ${t}: ${r.length} server(s) behind "${he}"${s.length?` (pinned: ${s.join(", ")})`:""} \u2014 spec ${l}`);let p={command:process.execPath,args:[Ze(),"--spec",l]};return{[he]:p}}import{execSync as G}from"node:child_process";import{execSync as Xe}from"node:child_process";function Oe(t){if(!/^[A-Za-z0-9._-]+$/.test(t))return!1;try{return Xe(`command -v ${t}`,{encoding:"utf-8",timeout:1e4,stdio:["ignore","pipe","ignore"]}).trim().length>0}catch{return!1}}import{readFileSync as at,mkdirSync as ie,cpSync as lt,existsSync as ct}from"node:fs";import{join as P}from"node:path";import{homedir as ut}from"node:os";import{z as Ae}from"zod";import{zodToJsonSchema as qe}from"zod-to-json-schema";function Qe(t){if(!t||typeof t!="object")return t;if(Array.isArray(t.type))return t.type.includes("null")||(t.type=[...t.type,"null"]),t;if(typeof t.type=="string")return t.type=[t.type,"null"],t;for(let e of["anyOf","oneOf"])if(Array.isArray(t[e]))return t[e].some(n=>n&&n.type==="null")||(t[e]=[...t[e],{type:"null"}]),t;return{anyOf:[t,{type:"null"}]}}function v(t){if(!t||typeof t!="object")return t;for(let e of["$defs","definitions"])if(t[e]&&typeof t[e]=="object")for(let n of Object.keys(t[e]))t[e][n]=v(t[e][n]);for(let e of["anyOf","oneOf","allOf"])Array.isArray(t[e])&&(t[e]=t[e].map(v));if(t.properties&&typeof t.properties=="object"){t.additionalProperties=!1;let e=Object.keys(t.properties),n=new Set(Array.isArray(t.required)?t.required:[]);for(let o of e){let r=v(t.properties[o]);n.has(o)||(r=Qe(r)),t.properties[o]=r}t.required=e}return t.items&&(Array.isArray(t.items)?t.items=t.items.map(v):t.items=v(t.items)),t}function Q(t,e={target:"openApi3"}){if(!t)return null;let n=e?.target==="openAi",o=null;if(typeof Ae?.toJSONSchema=="function")try{o=Ae.toJSONSchema(t)}catch{}if(!o)try{o=qe(t,e)}catch{return null}if(n&&o)try{return v(o)}catch{return o}return o}function ee(t){if(!t||typeof t!="object")return null;let e=(...r)=>{for(let s of r){if(s==null||s==="")continue;let l=Number(s);if(Number.isFinite(l))return l}return null},n=e(t.input_tokens,t.inputTokens,t.prompt_tokens,t.promptTokens),o=e(t.output_tokens,t.outputTokens,t.completion_tokens,t.completionTokens);return n==null&&o==null?null:{input:n||0,output:o||0}}import w from"chalk";var y={debug:0,info:1,warn:2,error:3,silent:4},te=class{constructor(){this._level=this._getLogLevel()}_getLogLevel(){if(process.env.ZIBBY_DEBUG==="true")return y.debug;if(process.env.ZIBBY_VERBOSE==="true")return y.info;let e=process.env.LOG_LEVEL?.toLowerCase();return e&&e in y?y[e]:y.info}_shouldLog(e){return y[e]>=this._level}_formatMessage(e,n,o={}){let r=new Date().toISOString(),l=`${this._getPrefix(e)} ${n}`;return Object.keys(o).length>0&&(l+=w.dim(` ${JSON.stringify(o)}`)),l}_getPrefix(e){return{debug:w.gray("[DEBUG]"),info:w.cyan("[INFO]"),warn:w.yellow("[WARN]"),error:w.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 y&&(this._level=y[e])}getLevel(){return Object.keys(y).find(e=>y[e]===this._level)}},u=new te;import{timeline as j,Timeline as Nt,WORKFLOW_GRAPH_LOG_MARKER_PREFIX as wt}from"@zibby/agent-workflow";var be=[{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:"opus-5",canonicalId:"claude-opus-5",vendor:"claude",label:"Claude \xB7 Opus 5",family:"claude-opus-5",pickerVisible:!0},{alias:"claude-opus-5",canonicalId:"claude-opus-5",vendor:"claude",family:"claude-opus-5",aliasOf:"opus-5"},{alias:"sonnet-5",canonicalId:"claude-sonnet-5",vendor:"claude",label:"Claude \xB7 Sonnet 5",family:"claude-sonnet-5",pickerVisible:!0},{alias:"claude-sonnet-5",canonicalId:"claude-sonnet-5",vendor:"claude",family:"claude-sonnet-5",aliasOf:"sonnet-5"},{alias:"fable-5",canonicalId:"claude-fable-5",vendor:"claude",label:"Claude \xB7 Fable 5",family:"claude-fable-5",pickerVisible:!0},{alias:"claude-fable-5",canonicalId:"claude-fable-5",vendor:"claude",family:"claude-fable-5",aliasOf:"fable-5"},{alias:"sonnet-4.8",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4"},{alias:"sonnet-4-8",canonicalId:"claude-sonnet-4-6",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-6",vendor:"claude",family:"claude-sonnet-4"},{alias:"sonnet-4-7",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.7"},{alias:"sonnet-4.6",canonicalId:"claude-sonnet-4-6",vendor:"claude",label:"Claude \xB7 Sonnet 4.6",family:"claude-sonnet-4",pickerVisible:!0},{alias:"sonnet-4-6",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.6"},{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",pickerVisible:!0},{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-6",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-6",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:"sonnet-4.6"},{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:"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.6-luna",vendor:"codex",label:"Codex \xB7 GPT-5.2",family:"gpt-5",retiredCanonicalId:"gpt-5.2-codex",unavailable:"2026-08-26 API-key probe: 404 Model not found"},{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.5",vendor:"codex",label:"Codex \xB7 GPT-5.3",family:"gpt-5",retiredCanonicalId:"gpt-5.3",unavailable:"2026-08-26 API-key probe: model_not_found"},{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"},{alias:"gpt-5.5",canonicalId:"gpt-5.5",vendor:"codex",label:"Codex \xB7 GPT-5.5",family:"gpt-5",pickerVisible:!0},{alias:"gpt-5.6-luna",canonicalId:"gpt-5.6-luna",vendor:"codex",label:"Codex \xB7 GPT-5.6 Luna",family:"gpt-5",pickerVisible:!0},{alias:"gpt-5.6-terra",canonicalId:"gpt-5.6-terra",vendor:"codex",label:"Codex \xB7 GPT-5.6 Terra",family:"gpt-5",pickerVisible:!0},{alias:"gpt-5.6-sol",canonicalId:"gpt-5.6-sol",vendor:"codex",label:"Codex \xB7 GPT-5.6 Sol",family:"gpt-5",pickerVisible:!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 U(t){let e={};for(let n of be)n.vendor===t&&(e[n.alias]=n.canonicalId);return e}function et(){let t={};for(let e of be)!e.retiredCanonicalId||e.retiredCanonicalId===e.canonicalId||(t[e.alias]={alias:e.alias,vendor:e.vendor,requested:e.retiredCanonicalId,actual:e.canonicalId,evidence:e.unavailable||"retired by the vendor"});return t}function ve(t,e){let n=et()[e];return!n||n.vendor!==t?null:`MODEL REPOINTED: this run pinned "${n.alias}" (${n.requested}), but that model is RETIRED at the vendor (${n.evidence}) \u2014 running on "${n.actual}" instead. Output did NOT come from ${n.requested}. Redeploy the agent with a current model to make the pin match reality.`}function ne(t,e){let n=typeof e=="string"?e.trim():"";if(n)return n;throw new Error(`[${t}] No model reached this LLM call: the node passed none, no config sets one, and the run carries none (MODEL env unset). Refusing to silently substitute a vendor default \u2014 pick a model on the agent (deploy modal / MODEL cell) or pass options.model explicitly.`)}var tt=U("claude"),oe=U("codex"),Dt=U("gemini"),Mt={CURSOR_AGENT_DEFAULT:1200*1e3,OPENAI_REQUEST:18e4};function B(t){let e=`${t}_POOL`,n=process.env[e];if(!n||typeof n!="string")return{picked:null,count:0,dispose:()=>{}};let o=n.split(/[,\n]+/).map(l=>l.trim()).filter(Boolean);if(o.length===0)return{picked:null,count:0,dispose:()=>{}};let r=o[Math.floor(Math.random()*o.length)],s=process.env[t];return process.env[t]=r,u.debug(`[auth-pool] ${t}: picked 1 of ${o.length} from pool (***${r.slice(-4)})`),{picked:r,count:o.length,dispose(){s===void 0?delete process.env[t]:process.env[t]=s}}}import{AgentStrategy as Jt,getSkill as Gt,NO_INTEGRATION_TOGGLEABLE_SKILL_IDS as zt,formatProviderError as Yt}from"@zibby/agent-workflow";import{query as Ht}from"@anthropic-ai/claude-agent-sdk";import{writeFileSync as qt,mkdirSync as Qt,existsSync as J,readFileSync as en}from"fs";import{homedir as nn}from"os";import{join as S}from"path";import{createRequire as nt}from"module";import L from"process";var Se=nt(import.meta.url);function xe(t){let e=String(t??"").trim().slice(0,400);return!e||e.startsWith("```")||e.startsWith("{")||e.startsWith("[")?!0:/"reply"\s*:/.test(e)}var re=(t,e)=>{let n=String(t??"");return n.length>e?`${n.slice(0,e)}\u2026`:n},ot=/secret|token|password|passwd|credential|authorization|bearer|api[-_]?key|private[-_]?key|access[-_]?key/i,Ce=(t,e=0)=>{if(t==null||e>6||typeof t!="object")return t;let n=Array.isArray(t)?[]:{};for(let[o,r]of Object.entries(t)){let s=ot.test(o)||o==="value"&&typeof t.key=="string";n[o]=s&&typeof r=="string"&&r?"[redacted]":Ce(r,e+1)}return n},k=t=>{try{if(t==null)return"";let e=Ce(t),n=typeof e=="string"?e:JSON.stringify(e);return re(String(n).slice(0,4e3).replace(/(bearer\s+)[A-Za-z0-9._~+/=-]{8,}/gi,"$1[redacted]").replace(/(https?:\/\/[^/\s:@"']+):[^@/\s"']+@/gi,"$1:[redacted]@").replace(/([?&](?:token|api[-_]?key|apikey|secret|access[-_]?token|auth|key)=)[^&"'\s]+/gi,"$1[redacted]").replace(/sk-[A-Za-z0-9_-]{8,}/g,"sk-[redacted]").replace(/xox[bpoas]-[A-Za-z0-9-]{6,}/g,"xoxb-[redacted]").replace(/zby_[A-Za-z0-9_-]{12,}/g,"zby_[redacted]").replace(/gh[pousr]_[A-Za-z0-9]{20,}/g,"gh_[redacted]").replace(/glpat-[A-Za-z0-9_-]{16,}/g,"glpat-[redacted]").replace(/\bmcp_(?!_)[A-Za-z0-9-]{12,}/g,"mcp_[redacted]").replace(/ntn_[A-Za-z0-9]{10,}/g,"ntn_[redacted]").replace(/figd_[A-Za-z0-9_-]{10,}/g,"figd_[redacted]").replace(/sntrys_[A-Za-z0-9+/=._-]{10,}/g,"sntrys_[redacted]").replace(/ya29\.[A-Za-z0-9_-]{10,}/g,"ya29.[redacted]").replace(/AKIA[0-9A-Z]{16}/g,"AKIA[redacted]").replace(/-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*/g,"[redacted-private-key]").replace(/eyJ[A-Za-z0-9_-]{6,}\.[A-Za-z0-9_-]{6,}\.[A-Za-z0-9_-]{6,}/g,"eyJ[redacted-jwt]"),300)}catch{return""}};function Te(t){let e=t&&typeof t=="object"?t.content:void 0,n=new Set,o=0;if(typeof e=="string")o=e.length,e&&n.add("text");else if(Array.isArray(e))for(let c of e){if(typeof c=="string"){n.add("text"),o+=c.length;continue}!c||typeof c!="object"||(n.add(typeof c.type=="string"&&c.type?c.type:"unknown"),typeof c.text=="string"&&(o+=c.text.length))}else if(e!=null){n.add("json");try{o=JSON.stringify(e).length}catch{o=0}}let r=!(t&&t.is_error===!0),s={ok:r,chars:o};if(n.size&&(s.kind=[...n].join("+")),r)return s;let l=e;Array.isArray(e)&&(l=e.map(c=>typeof c=="string"?c:c&&typeof c.text=="string"?c.text:"").filter(Boolean).join(`
|
|
2
|
-
`));let
|
|
3
|
-
\u25C6 Model: ${
|
|
4
|
-
`),Array.isArray(c)&&c.length>0){let a=this._resolveCodexHome(h);process.env.CODEX_HOME=a;try{
|
|
5
|
-
${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
|
|
1
|
+
import{AgentStrategy as st,getSkill as at}from"@zibby/agent-workflow";import Ke from"node:process";var ge=Object.freeze(["PROJECT_API_TOKEN","ZIBBY_USER_TOKEN","GITHUB_TOKEN","GITLAB_TOKEN","GITLAB_OAUTH_TOKEN","GITLAB_INSTANCES","ATLASSIAN_ACCESS_TOKEN","JIRA_API_TOKEN","JIRA_EMAIL","SENTRY_AUTH_TOKEN","SLACK_BOT_TOKEN","DISCORD_BOT_TOKEN","ZIBBY_CHAT_SLACK_TOKEN","ZIBBY_CHAT_LARK_APP_SECRET","ZIBBY_CHAT_DISCORD_INTERACTION_TOKEN","LINEAR_API_KEY","LINEAR_OAUTH_TOKEN","PLANE_API_KEY","PLANE_OAUTH_TOKEN","ZIBBY_INJECTED_GOOGLE_TOKEN","ZIBBY_INJECTED_LINKEDIN_TOKEN","ZIBBY_MEMORY_AWS_ACCESS_KEY_ID","ZIBBY_MEMORY_AWS_SECRET_ACCESS_KEY","ZIBBY_MEMORY_AWS_SESSION_TOKEN"]);function q(t=Ke.env){let e={},o=new Set(ge);for(let[n,r]of Object.entries(t))o.has(n)||r!==void 0&&(e[n]=r);return e}function je(t){return!!t&&(t.transport==="http"||typeof t.url=="string"&&!t.command)}var ye=Object.freeze({claude:"native",codex:"broker",gemini:"broker",cursor:"eager"});function _e(t){return ye[t]||"eager"}var Ue=new Set(Object.entries(ye).filter(([,t])=>t==="native").map(([t])=>t)),Q=Symbol("zibby.mcp.alwaysLoad");function Be(){let t=String(process.env.MCP_ALWAYS_LOAD??"").trim().toLowerCase();return!(t==="0"||t==="false"||t==="off")}function Je(t,e){return Ue.has(t)?Be()?typeof e.alwaysLoad=="boolean"?{alwaysLoad:e.alwaysLoad}:{}:{}:{}}function U(t,e,{processEnv:o}={}){if(!e)return null;let n=Je(t,e),r=l=>(e.alwaysLoad===!0&&Object.defineProperty(l,Q,{value:!0,enumerable:!1}),l);if(je(e)){let l=String(e.url||"").trim();if(!l)return null;let d=e.headers&&typeof e.headers=="object"?e.headers:void 0;switch(t){case"claude":return r({type:"http",url:l,...d&&{headers:d},...n});case"codex":return r({url:l,...d&&{http_headers:d}});case"gemini":return r({url:l,type:"http",...d&&{headers:d}});case"cursor":return r({url:l,...d&&{headers:d}});default:return r({type:"http",url:l,...d&&{headers:d},...n})}}let s={command:e.command};return e.args?.length&&(s.args=e.args),e.cwd&&(s.cwd=e.cwd),o?s.env={...o,...e.env||{}}:e.env&&Object.keys(e.env).length&&(s.env=e.env),r({...s,...n})}import{mkdtempSync as Ge,writeFileSync as ze,mkdirSync as Ye,existsSync as Fe}from"fs";import{join as w,dirname as he}from"path";import{tmpdir as He}from"os";import{fileURLToPath as Ze}from"url";var Ee="toolbox";function Ve(){let t=he(Ze(import.meta.url));for(let e=t,o=0;o<4;o++,e=he(e)){let n=w(e,"mcp","tool-broker-server.js");if(Fe(n))return n}throw new Error(`[tool-broker] cannot find mcp/tool-broker-server.js from ${t} \u2014 the package layout changed, or the build did not emit it.`)}function We(){let t=String(process.env.MCP_TOOL_BROKER??"").trim().toLowerCase();return!(t==="0"||t==="false"||t==="off")}function Xe(t){if(t){let e=w(t,".mcp-broker");return Ye(e,{recursive:!0}),w(e,"spec.json")}return w(Ge(w(He(),"mcp-broker-")),"spec.json")}function Oe(t,e,{sessionPath:o,toolWorkingSet:n}={}){let r=e&&typeof e=="object"?e:{},s=Object.keys(r);if(!s.length||_e(t)!=="broker"||!We()||s.length===1)return r;let l=s.filter(f=>r[f]&&r[f][Q]===!0),d=Xe(o),c=Array.isArray(n?.warmTools)?n.warmTools.filter(f=>f&&typeof f.server=="string"&&typeof f.tool=="string").map(f=>({server:f.server,tool:f.tool,...Number.isFinite(Number(f.lastUsedAt))?{lastUsedAt:Number(f.lastUsedAt)}:{}})):[],h=typeof n?.usagePath=="string"&&n.usagePath.trim()?n.usagePath.trim():null;ze(d,JSON.stringify({servers:r,pinned:l,...c.length?{warmTools:c}:{},...h?{usagePath:h}:{}},null,2),{mode:384}),console.error(`[tool-broker] ${t}: ${s.length} server(s) behind "${Ee}"${l.length?` (pinned: ${l.join(", ")})`:""} \u2014 spec ${d}`);let E={command:process.execPath,args:[Ve(),"--spec",d]};return{[Ee]:E}}import{execSync as Y}from"node:child_process";import{execSync as qe}from"node:child_process";function Ae(t){if(!/^[A-Za-z0-9._-]+$/.test(t))return!1;try{return qe(`command -v ${t}`,{encoding:"utf-8",timeout:1e4,stdio:["ignore","pipe","ignore"]}).trim().length>0}catch{return!1}}import{readFileSync as lt,mkdirSync as se,cpSync as ct,existsSync as ut}from"node:fs";import{join as D}from"node:path";import{homedir as dt}from"node:os";import{z as be}from"zod";import{zodToJsonSchema as Qe}from"zod-to-json-schema";function et(t){if(!t||typeof t!="object")return t;if(Array.isArray(t.type))return t.type.includes("null")||(t.type=[...t.type,"null"]),t;if(typeof t.type=="string")return t.type=[t.type,"null"],t;for(let e of["anyOf","oneOf"])if(Array.isArray(t[e]))return t[e].some(o=>o&&o.type==="null")||(t[e]=[...t[e],{type:"null"}]),t;return{anyOf:[t,{type:"null"}]}}function T(t){if(!t||typeof t!="object")return t;for(let e of["$defs","definitions"])if(t[e]&&typeof t[e]=="object")for(let o of Object.keys(t[e]))t[e][o]=T(t[e][o]);for(let e of["anyOf","oneOf","allOf"])Array.isArray(t[e])&&(t[e]=t[e].map(T));if(t.properties&&typeof t.properties=="object"){t.additionalProperties=!1;let e=Object.keys(t.properties),o=new Set(Array.isArray(t.required)?t.required:[]);for(let n of e){let r=T(t.properties[n]);o.has(n)||(r=et(r)),t.properties[n]=r}t.required=e}return t.items&&(Array.isArray(t.items)?t.items=t.items.map(T):t.items=T(t.items)),t}function ee(t,e={target:"openApi3"}){if(!t)return null;let o=e?.target==="openAi",n=null;if(typeof be?.toJSONSchema=="function")try{n=be.toJSONSchema(t)}catch{}if(!n)try{n=Qe(t,e)}catch{return null}if(o&&n)try{return T(n)}catch{return n}return n}function te(t){if(!t||typeof t!="object")return null;let e=(...r)=>{for(let s of r){if(s==null||s==="")continue;let l=Number(s);if(Number.isFinite(l))return l}return null},o=e(t.input_tokens,t.inputTokens,t.prompt_tokens,t.promptTokens),n=e(t.output_tokens,t.outputTokens,t.completion_tokens,t.completionTokens);return o==null&&n==null?null:{input:o||0,output:n||0}}import L from"chalk";var _={debug:0,info:1,warn:2,error:3,silent:4},oe=class{constructor(){this._level=this._getLogLevel()}_getLogLevel(){if(process.env.ZIBBY_DEBUG==="true")return _.debug;if(process.env.ZIBBY_VERBOSE==="true")return _.info;let e=process.env.LOG_LEVEL?.toLowerCase();return e&&e in _?_[e]:_.info}_shouldLog(e){return _[e]>=this._level}_formatMessage(e,o,n={}){let r=new Date().toISOString(),l=`${this._getPrefix(e)} ${o}`;return Object.keys(n).length>0&&(l+=L.dim(` ${JSON.stringify(n)}`)),l}_getPrefix(e){return{debug:L.gray("[DEBUG]"),info:L.cyan("[INFO]"),warn:L.yellow("[WARN]"),error:L.red("\u274C [ERROR]")}[e]||""}debug(e,o){this._shouldLog("debug")&&console.log(this._formatMessage("debug",e,o))}info(e,o){this._shouldLog("info")&&console.log(this._formatMessage("info",e,o))}warn(e,o){this._shouldLog("warn")&&console.warn(this._formatMessage("warn",e,o))}error(e,o){this._shouldLog("error")&&console.error(this._formatMessage("error",e,o))}setLevel(e){e in _&&(this._level=_[e])}getLevel(){return Object.keys(_).find(e=>_[e]===this._level)}},u=new oe;import{timeline as B,Timeline as wt,WORKFLOW_GRAPH_LOG_MARKER_PREFIX as Lt}from"@zibby/agent-workflow";var ve=[{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:"opus-5",canonicalId:"claude-opus-5",vendor:"claude",label:"Claude \xB7 Opus 5",family:"claude-opus-5",pickerVisible:!0},{alias:"claude-opus-5",canonicalId:"claude-opus-5",vendor:"claude",family:"claude-opus-5",aliasOf:"opus-5"},{alias:"sonnet-5",canonicalId:"claude-sonnet-5",vendor:"claude",label:"Claude \xB7 Sonnet 5",family:"claude-sonnet-5",pickerVisible:!0},{alias:"claude-sonnet-5",canonicalId:"claude-sonnet-5",vendor:"claude",family:"claude-sonnet-5",aliasOf:"sonnet-5"},{alias:"fable-5",canonicalId:"claude-fable-5",vendor:"claude",label:"Claude \xB7 Fable 5",family:"claude-fable-5",pickerVisible:!0},{alias:"claude-fable-5",canonicalId:"claude-fable-5",vendor:"claude",family:"claude-fable-5",aliasOf:"fable-5"},{alias:"sonnet-4.8",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4"},{alias:"sonnet-4-8",canonicalId:"claude-sonnet-4-6",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-6",vendor:"claude",family:"claude-sonnet-4"},{alias:"sonnet-4-7",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.7"},{alias:"sonnet-4.6",canonicalId:"claude-sonnet-4-6",vendor:"claude",label:"Claude \xB7 Sonnet 4.6",family:"claude-sonnet-4",pickerVisible:!0},{alias:"sonnet-4-6",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.6"},{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",pickerVisible:!0},{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-6",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-6",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:"sonnet-4.6"},{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:"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.6-luna",vendor:"codex",label:"Codex \xB7 GPT-5.2",family:"gpt-5",retiredCanonicalId:"gpt-5.2-codex",unavailable:"2026-08-26 API-key probe: 404 Model not found"},{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.5",vendor:"codex",label:"Codex \xB7 GPT-5.3",family:"gpt-5",retiredCanonicalId:"gpt-5.3",unavailable:"2026-08-26 API-key probe: model_not_found"},{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"},{alias:"gpt-5.5",canonicalId:"gpt-5.5",vendor:"codex",label:"Codex \xB7 GPT-5.5",family:"gpt-5",pickerVisible:!0},{alias:"gpt-5.6-luna",canonicalId:"gpt-5.6-luna",vendor:"codex",label:"Codex \xB7 GPT-5.6 Luna",family:"gpt-5",pickerVisible:!0},{alias:"gpt-5.6-terra",canonicalId:"gpt-5.6-terra",vendor:"codex",label:"Codex \xB7 GPT-5.6 Terra",family:"gpt-5",pickerVisible:!0},{alias:"gpt-5.6-sol",canonicalId:"gpt-5.6-sol",vendor:"codex",label:"Codex \xB7 GPT-5.6 Sol",family:"gpt-5",pickerVisible:!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 J(t){let e={};for(let o of ve)o.vendor===t&&(e[o.alias]=o.canonicalId);return e}function tt(){let t={};for(let e of ve)!e.retiredCanonicalId||e.retiredCanonicalId===e.canonicalId||(t[e.alias]={alias:e.alias,vendor:e.vendor,requested:e.retiredCanonicalId,actual:e.canonicalId,evidence:e.unavailable||"retired by the vendor"});return t}function Se(t,e){let o=tt()[e];return!o||o.vendor!==t?null:`MODEL REPOINTED: this run pinned "${o.alias}" (${o.requested}), but that model is RETIRED at the vendor (${o.evidence}) \u2014 running on "${o.actual}" instead. Output did NOT come from ${o.requested}. Redeploy the agent with a current model to make the pin match reality.`}function ne(t,e){let o=typeof e=="string"?e.trim():"";if(o)return o;throw new Error(`[${t}] No model reached this LLM call: the node passed none, no config sets one, and the run carries none (MODEL env unset). Refusing to silently substitute a vendor default \u2014 pick a model on the agent (deploy modal / MODEL cell) or pass options.model explicitly.`)}var ot=J("claude"),re=J("codex"),Mt=J("gemini"),Rt={CURSOR_AGENT_DEFAULT:1200*1e3,OPENAI_REQUEST:18e4};function G(t){let e=`${t}_POOL`,o=process.env[e];if(!o||typeof o!="string")return{picked:null,count:0,dispose:()=>{}};let n=o.split(/[,\n]+/).map(l=>l.trim()).filter(Boolean);if(n.length===0)return{picked:null,count:0,dispose:()=>{}};let r=n[Math.floor(Math.random()*n.length)],s=process.env[t];return process.env[t]=r,u.debug(`[auth-pool] ${t}: picked 1 of ${n.length} from pool (***${r.slice(-4)})`),{picked:r,count:n.length,dispose(){s===void 0?delete process.env[t]:process.env[t]=s}}}import{AgentStrategy as Gt,getSkill as zt,NO_INTEGRATION_TOGGLEABLE_SKILL_IDS as Yt,formatProviderError as Ft}from"@zibby/agent-workflow";import{query as Zt}from"@anthropic-ai/claude-agent-sdk";import{writeFileSync as Qt,mkdirSync as eo,existsSync as z,readFileSync as to}from"fs";import{homedir as no}from"os";import{join as C}from"path";import{createRequire as nt}from"module";import P from"process";var xe=nt(import.meta.url);function Te(t){let e=String(t??"").trim().slice(0,400);return!e||e.startsWith("```")||e.startsWith("{")||e.startsWith("[")?!0:/"reply"\s*:/.test(e)}var ie=(t,e)=>{let o=String(t??"");return o.length>e?`${o.slice(0,e)}\u2026`:o},rt=/secret|token|password|passwd|credential|authorization|bearer|api[-_]?key|private[-_]?key|access[-_]?key/i,Ce=(t,e=0)=>{if(t==null||e>6||typeof t!="object")return t;let o=Array.isArray(t)?[]:{};for(let[n,r]of Object.entries(t)){let s=rt.test(n)||n==="value"&&typeof t.key=="string";o[n]=s&&typeof r=="string"&&r?"[redacted]":Ce(r,e+1)}return o},I=t=>{try{if(t==null)return"";let e=Ce(t),o=typeof e=="string"?e:JSON.stringify(e);return ie(String(o).slice(0,4e3).replace(/(bearer\s+)[A-Za-z0-9._~+/=-]{8,}/gi,"$1[redacted]").replace(/(https?:\/\/[^/\s:@"']+):[^@/\s"']+@/gi,"$1:[redacted]@").replace(/([?&](?:token|api[-_]?key|apikey|secret|access[-_]?token|auth|key)=)[^&"'\s]+/gi,"$1[redacted]").replace(/sk-[A-Za-z0-9_-]{8,}/g,"sk-[redacted]").replace(/xox[bpoas]-[A-Za-z0-9-]{6,}/g,"xoxb-[redacted]").replace(/zby_[A-Za-z0-9_-]{12,}/g,"zby_[redacted]").replace(/gh[pousr]_[A-Za-z0-9]{20,}/g,"gh_[redacted]").replace(/glpat-[A-Za-z0-9_-]{16,}/g,"glpat-[redacted]").replace(/\bmcp_(?!_)[A-Za-z0-9-]{12,}/g,"mcp_[redacted]").replace(/ntn_[A-Za-z0-9]{10,}/g,"ntn_[redacted]").replace(/figd_[A-Za-z0-9_-]{10,}/g,"figd_[redacted]").replace(/sntrys_[A-Za-z0-9+/=._-]{10,}/g,"sntrys_[redacted]").replace(/ya29\.[A-Za-z0-9_-]{10,}/g,"ya29.[redacted]").replace(/AKIA[0-9A-Z]{16}/g,"AKIA[redacted]").replace(/-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*/g,"[redacted-private-key]").replace(/eyJ[A-Za-z0-9_-]{6,}\.[A-Za-z0-9_-]{6,}\.[A-Za-z0-9_-]{6,}/g,"eyJ[redacted-jwt]"),300)}catch{return""}};function Ie(t){let e=t&&typeof t=="object"?t.content:void 0,o=new Set,n=0;if(typeof e=="string")n=e.length,e&&o.add("text");else if(Array.isArray(e))for(let c of e){if(typeof c=="string"){o.add("text"),n+=c.length;continue}!c||typeof c!="object"||(o.add(typeof c.type=="string"&&c.type?c.type:"unknown"),typeof c.text=="string"&&(n+=c.text.length))}else if(e!=null){o.add("json");try{n=JSON.stringify(e).length}catch{n=0}}let r=!(t&&t.is_error===!0),s={ok:r,chars:n};if(o.size&&(s.kind=[...o].join("+")),r)return s;let l=e;Array.isArray(e)&&(l=e.map(c=>typeof c=="string"?c:c&&typeof c.text=="string"?c.text:"").filter(Boolean).join(`
|
|
2
|
+
`));let d=I(l);return d&&(s.error=d),s}function it(){try{if(P.env.CLAUDE_CODE_EXECUTABLE&&z(P.env.CLAUDE_CODE_EXECUTABLE))return P.env.CLAUDE_CODE_EXECUTABLE;let t=P.platform,e=P.arch,o=`@anthropic-ai/claude-agent-sdk-${t}-${e}`,n=t==="win32"?"claude.exe":"claude";try{let r=xe.resolve(`${o}/package.json`),s=C(r,"..",n);if(z(s))return s}catch{}try{let r=xe.resolve("@anthropic-ai/claude-agent-sdk/package.json"),s=C(r,"..");for(let d of[n,C("vendor",n),C("bin",n)]){let c=C(s,d);if(z(c))return c}let l=C(s,"..",`claude-agent-sdk-${t}-${e}`,n);if(z(l))return l}catch{}}catch{}return null}var ke=it();ke&&u.debug(`Claude native CLI resolved to baked binary: ${ke}`);function ae(t){if(Array.isArray(t))return t.map(ae);if(t&&typeof t=="object"){let e={};for(let[o,n]of Object.entries(t))n!==null&&(e[o]=ae(n));return e}return t}var $e=class extends st{constructor(){super("codex","Codex (OpenAI)",75)}canHandle(e){return!(process.env.OPENAI_API_KEY||process.env.OPENAI_API_KEY_POOL||process.env.CODEX_API_KEY||process.env.CODEX_API_KEY_POOL)?(u.debug("CodexAgentStrategy: OPENAI_API_KEY or CODEX_API_KEY not set"),!1):Ae("codex")?!0:(u.warn("[Codex] codex CLI not on PATH. Install: npm install -g @openai/codex"),!1)}async invoke(e,o={}){let{model:n,workspace:r=process.cwd(),schema:s=null,images:l=[],skills:d=null,plugins:c=null,sessionPath:h=null,nodeName:E=null,timeout:f,config:pt={},activityLog:$=!1,signal:M=null}=o,Ne=[G("OPENAI_API_KEY"),G("CODEX_API_KEY")];try{let{Codex:F}=await import("@openai/codex-sdk"),A=ne("codex",n),R=re[A]||A;re[A]&&A!==R&&u.debug(`Mapped model: ${A} \u2192 ${R}`);let le=Se("codex",A);le&&u.warn(le),u.debug(`Invoking Codex SDK with model: ${R}, skills: ${JSON.stringify(d)}`);let K=process.env.CODEX_API_KEY||process.env.OPENAI_API_KEY;K&&!process.env.CODEX_API_KEY&&(process.env.CODEX_API_KEY=K);let j=typeof o.serviceTier=="string"?o.serviceTier.trim().toLowerCase():"",we=K?` | key: ***${K.slice(-4)}`:" | key: not set";if(console.log(`
|
|
3
|
+
\u25C6 Model: ${R}${j==="fast"?" | speed: fast":""}${we}
|
|
4
|
+
`),Array.isArray(c)&&c.length>0){let a=this._resolveCodexHome(h);process.env.CODEX_HOME=a;try{se(a,{recursive:!0})}catch{}this._ensurePlugins(c,a)}let H=(a,y)=>{try{console.log(JSON.stringify({mode:a,...y}))}catch{}},b=this._resolveSkillsToMcp(d,{sessionPath:h,workspace:r,nodeName:E});for(let a of o.extraMcpServers||[])if(a&&a.serverName&&a.def){if(Object.prototype.hasOwnProperty.call(b,a.serverName)){console.warn(`[custom-mcp] skip "${a.serverName}" \u2014 a built-in skill already owns that MCP name (no shadowing)`);continue}let y=U("codex",a.def);y&&(b[a.serverName]=y)}let v=Oe("codex",b,{sessionPath:h,toolWorkingSet:o.toolWorkingSet});if(v!==b&&(e+="\n\n# Toolbox access\nIntegration tools named in this prompt are behind the `toolbox` MCP. Call `toolbox/list_tools`, then `toolbox/call_tool`; use `toolbox/describe_tool` only for unclear or nested arguments. `list_mcp_resources` and `list_mcp_resource_templates` do not discover tools."),!$){let a=(await import("chalk")).default;console.log(`
|
|
5
|
+
${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 O={};o.effort&&(O.model_reasoning_effort=o.effort),j==="fast"?(O.service_tier="fast",O.features={fast_mode:!0}):j&&u.warn(`[Codex] ignoring unknown serviceTier "${j}" \u2014 expected "fast" or unset`),Object.keys(v).length>0&&(O.mcp_servers=v,Object.values(v).some(a=>a&&typeof a.url=="string")&&(O.experimental_use_rmcp_client=!0),u.debug(`[Codex] MCP servers: ${Object.keys(v).join(", ")}`+(v===b?"":` (broker over ${Object.keys(b).join(", ")})`)));let ce=this._resolveCodexBin(),Le=new F({...ce?{codexPathOverride:ce}:{},...Object.keys(O).length>0&&{config:O},env:q(process.env)}),S=r;try{S&&se(S,{recursive:!0})}catch{}(!S||!ut(S))&&(S=process.cwd());let Pe=Le.startThread({workingDirectory:S,skipGitRepoCheck:!0,approvalPolicy:"never",sandboxMode:"danger-full-access",networkAccessEnabled:!0}),ue=s&&typeof s.parse=="function",Z=M?{signal:M}:{};if(s)try{let a=ue?ee(s,{target:"openAi"}):s;Z.outputSchema=a,u.debug("Structured output via SDK outputSchema")}catch(a){u.warn(`[Codex] Schema conversion failed, will extract from text: ${a.message}`)}let V=Array.isArray(l)?l.filter(a=>a&&typeof a.path=="string"&&a.path.startsWith("/")):[];if(V.length&&(e=`${e}
|
|
6
6
|
|
|
7
7
|
# Attached image files \u2014 VIEW THESE
|
|
8
|
-
The user attached ${
|
|
9
|
-
${
|
|
10
|
-
`)}`),
|
|
11
|
-
`).some(r=>r.includes(e)&&/installed/.test(r))}catch{return!1}}};export{
|
|
8
|
+
The user attached ${V.length} image(s), saved locally. Read each path to SEE the image, then use what it shows to answer:
|
|
9
|
+
${V.map((a,y)=>` ${y+1}. ${a.path}${a.name?` (${a.name})`:""}`).join(`
|
|
10
|
+
`)}`),M?.aborted){let a=new Error("Aborted via signal");throw a.name="AbortError",a}try{let{events:a}=await Pe.runStreamed(e,Z),y=0,g="",de=null,x=new Set,De=500,pe=i=>i.type==="mcp_tool_call"?`mcp__${i.server}__${i.tool}`:i.type==="command_execution"?"Bash":i.type==="web_search"?"WebSearch":i.name||i.tool||"unknown",Me=i=>i.type==="mcp_tool_call"?I(i.arguments):i.type==="command_execution"?I({command:i.command}):i.type==="web_search"?I({query:i.query}):I(i.arguments||i.input),fe=i=>i==="mcp_tool_call"||i==="command_execution"||i==="web_search"||i==="tool_call"||i==="function_call",W=i=>{let m=i.id||`${i.type}:${x.size}`;if(x.has(m))return;x.add(m),x.size>De&&x.delete(x.values().next().value);let p=Me(i);H("turn:tool",{name:pe(i),...p?{input:p}:{}})},me=i=>{let m=i.status==="failed"||!!(i.error&&i.error.message),p;i.type==="mcp_tool_call"?p=m?i.error&&i.error.message||i.result&&i.result.content||"":i.result&&i.result.content||"":i.type==="command_execution"&&(p=i.aggregated_output||""),H("turn:tool-result",{name:pe(i),...Ie({content:p,is_error:m})})};for await(let i of a){if(M?.aborted){let p=new Error("Aborted via signal");throw p.name="AbortError",p}let m=i.type;if($&&m==="item.started"&&i.item&&fe(i.item.type))W(i.item);else if(m==="item.completed"){let p=i.item,N=p?.type;if(N==="mcp_tool_call"){y++;let k=`${p.server}/${p.tool}`;if(B.stepTool(`Tool: ${k}`),$)W(p),me(p);else if(p.arguments){let X=JSON.stringify(p.arguments),Re=X.length>100?`${X.substring(0,100)}...`:X;console.log(` Input: ${Re}`)}}else if(fe(N)){y++;let k=p.name||p.tool||p.command||p.query||"unknown";B.stepTool(`Tool: ${k}`),$&&(W(p),N==="command_execution"&&me(p))}else if(N==="agent_message")if(g=p.text||"",$){if(!Te(g)){let k=ie(g.trim(),200);k&&H("turn:narration",{text:k,withTool:!1})}}else g.length<500?console.log(g):console.log(`${g.substring(0,200)}... (${g.length} chars)`)}else if(m==="turn.completed"){u.debug(`[Codex] Turn completed. Usage: ${JSON.stringify(i.usage||{})}`),i.usage&&(de=i.usage);break}else{if(m==="turn.failed")throw new Error(i.error?.message||"Codex turn failed");u.debug(`[Codex] Event: ${m} ${JSON.stringify(i).slice(0,300)}`)}}if(u.debug(`[Codex] Last agent message (${g.length} chars): ${g.slice(0,500)}`),s){if(!g)throw new Error("Codex agent returned no response");let i=JSON.parse(g),m=i;if(ue)try{m=s.parse(i)}catch{m=s.parse(ae(i))}u.debug("\u2705 [Codex] Structured output validated");let p=te(de);return{raw:g,structured:m,...p?{usage:p}:{}}}return g||""}catch(a){let y=a.message||String(a);throw u.error(`\u274C [Codex] SDK call failed: ${y}`),y.includes("exited with code")&&(Z.outputSchema&&u.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."),u.error("\u{1F4A1} [Codex] Verify: codex --version && echo $OPENAI_API_KEY"),u.error("\u{1F4A1} [Codex] If codex is missing: npm install -g @openai/codex")),a}}finally{for(let F of Ne)F.dispose()}}_resolveSkillsToMcp(e,o={}){if(!Array.isArray(e)||e.length===0)return{};let n={};for(let r of e){let s=at(r);if(!s){u.warn(`[Codex] Unknown skill "${r}" \u2014 skipping`);continue}if(typeof s.resolve!="function")continue;let l=s.resolve(o);if(!l)continue;let d=s.serverName||r,c=U("codex",l,{processEnv:process.env});c&&(n[d]=c,u.debug(`[Codex] MCP: ${d} \u2192 ${l.command} ${(l.args||[]).join(" ")}`))}return n}_resolveCodexHome(e){return process.env.CODEX_HOME?process.env.CODEX_HOME:e&&!this._isTempPath(e)?D(e,".codex-home"):D(dt(),".codex")}_isTempPath(e){let o=String(process.env.TMPDIR||"/tmp").replace(/\/+$/,""),n=String(e||"");return n==="/tmp"||n.startsWith("/tmp/")||n===o||n.startsWith(o+"/")}_resolveCodexBin(){if(process.env.CODEX_BIN)return process.env.CODEX_BIN;try{return Y("command -v codex",{encoding:"utf-8",timeout:5e3,stdio:["ignore","pipe","ignore"]}).trim()||void 0}catch{return}}_ensurePlugins(e,o){let n={...process.env,CODEX_HOME:o};for(let r of e){let s=typeof r=="string"?r:r?.name,l=r&&typeof r=="object"?r.marketplacePath:null;if(!s||!l){u.warn(`[Codex][plugins] skipping malformed plugin declaration: ${JSON.stringify(r)} (need { name, marketplacePath })`);continue}let d=this._readMarketplaceName(l),c=`${s}@${d}`;if(this._isPluginInstalled(c,n)){u.info(`[Codex][plugins] ${c} already installed \u2014 skipping (idempotent)`),console.log(`\u25C6 [Codex] plugin ${c} already installed \u2014 skip`);continue}let h=this._safeMarketplacePath(l,o);u.info(`[Codex][plugins] installing ${c} from local marketplace ${h}`),console.log(`\u25C6 [Codex] installing plugin ${c} (local, no network)`);try{Y(`codex plugin marketplace add ${JSON.stringify(h)}`,{env:n,stdio:"pipe",timeout:6e4,encoding:"utf-8"}),Y(`codex plugin add ${JSON.stringify(c)}`,{env:n,stdio:"pipe",timeout:6e4,encoding:"utf-8"}),console.log(`\u25C6 [Codex] plugin ${c} installed`)}catch(E){let f=E.stderr&&E.stderr.toString()||E.message||String(E);throw u.error(`[Codex][plugins] failed to install ${c}: ${f}`),new Error(`Codex plugin install failed for ${c}: ${f}`,{cause:E})}}}_safeMarketplacePath(e,o){if(!String(e).includes("@"))return e;let n=D(o,".zibby-mkt",String(e).replace(/[^a-zA-Z0-9]+/g,"_"));try{return se(D(o,".zibby-mkt"),{recursive:!0}),ct(e,n,{recursive:!0}),n}catch(r){return u.warn(`[Codex][plugins] could not copy @-containing marketplace to a safe path: ${r.message}`),e}}_readMarketplaceName(e){let o=D(e,".agents","plugins","marketplace.json"),n;try{n=JSON.parse(lt(o,"utf-8"))}catch(r){throw new Error(`Codex plugin marketplace manifest missing/unreadable at ${o}: ${r.message}`,{cause:r})}if(!n?.name||typeof n.name!="string")throw new Error(`Codex plugin marketplace manifest at ${o} has no string "name"`);return n.name}_isPluginInstalled(e,o){try{return Y("codex plugin list",{env:o,stdio:"pipe",timeout:15e3,encoding:"utf-8"}).split(`
|
|
11
|
+
`).some(r=>r.includes(e)&&/installed/.test(r))}catch{return!1}}};export{$e as CodexAgentStrategy};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{AgentStrategy as qe,getSkill as Ze}from"@zibby/agent-workflow";import ke from"node:process";var we=Object.freeze(["PROJECT_API_TOKEN","ZIBBY_USER_TOKEN","GITHUB_TOKEN","GITLAB_TOKEN","GITLAB_OAUTH_TOKEN","GITLAB_INSTANCES","ATLASSIAN_ACCESS_TOKEN","JIRA_API_TOKEN","JIRA_EMAIL","SENTRY_AUTH_TOKEN","SLACK_BOT_TOKEN","DISCORD_BOT_TOKEN","ZIBBY_CHAT_SLACK_TOKEN","ZIBBY_CHAT_LARK_APP_SECRET","ZIBBY_CHAT_DISCORD_INTERACTION_TOKEN","LINEAR_API_KEY","LINEAR_OAUTH_TOKEN","PLANE_API_KEY","PLANE_OAUTH_TOKEN","ZIBBY_INJECTED_GOOGLE_TOKEN","ZIBBY_INJECTED_LINKEDIN_TOKEN","ZIBBY_MEMORY_AWS_ACCESS_KEY_ID","ZIBBY_MEMORY_AWS_SECRET_ACCESS_KEY","ZIBBY_MEMORY_AWS_SESSION_TOKEN"]);function le(t=ke.env){let e={},n=new Set(we);for(let[r,i]of Object.entries(t))n.has(r)||i!==void 0&&(e[r]=i);return e}function Pe(t){return!!t&&(t.transport==="http"||typeof t.url=="string"&&!t.command)}var ce=Object.freeze({claude:"native",codex:"broker",gemini:"broker",cursor:"eager"});function ue(t){return ce[t]||"eager"}var Ce=new Set(Object.entries(ce).filter(([,t])=>t==="native").map(([t])=>t)),Q=Symbol("zibby.mcp.alwaysLoad");function Le(){let t=String(process.env.MCP_ALWAYS_LOAD??"").trim().toLowerCase();return!(t==="0"||t==="false"||t==="off")}function Re(t,e){return Ce.has(t)?Le()?typeof e.alwaysLoad=="boolean"?{alwaysLoad:e.alwaysLoad}:{}:{}:{}}function ee(t,e,{processEnv:n}={}){if(!e)return null;let r=Re(t,e),i=o=>(e.alwaysLoad===!0&&Object.defineProperty(o,Q,{value:!0,enumerable:!1}),o);if(Pe(e)){let o=String(e.url||"").trim();if(!o)return null;let a=e.headers&&typeof e.headers=="object"?e.headers:void 0;switch(t){case"claude":return i({type:"http",url:o,...a&&{headers:a},...r});case"codex":return i({url:o,...a&&{http_headers:a}});case"gemini":return i({url:o,type:"http",...a&&{headers:a}});case"cursor":return i({url:o,...a&&{headers:a}});default:return i({type:"http",url:o,...a&&{headers:a},...r})}}let s={command:e.command};return e.args?.length&&(s.args=e.args),e.cwd&&(s.cwd=e.cwd),n?s.env={...n,...e.env||{}}:e.env&&Object.keys(e.env).length&&(s.env=e.env),i({...s,...r})}import{mkdtempSync as Ge,writeFileSync as Me,mkdirSync as $e,existsSync as De}from"fs";import{join as C,dirname as fe}from"path";import{tmpdir as Ke}from"os";import{fileURLToPath as Je}from"url";var de="toolbox";function Ye(){let t=fe(Je(import.meta.url));for(let e=t,n=0;n<4;n++,e=fe(e)){let r=C(e,"mcp","tool-broker-server.js");if(De(r))return r}throw new Error(`[tool-broker] cannot find mcp/tool-broker-server.js from ${t} \u2014 the package layout changed, or the build did not emit it.`)}function Ve(){let t=String(process.env.MCP_TOOL_BROKER??"").trim().toLowerCase();return!(t==="0"||t==="false"||t==="off")}function Be(t){if(t){let e=C(t,".mcp-broker");return $e(e,{recursive:!0}),C(e,"spec.json")}return C(Ge(C(Ke(),"mcp-broker-")),"spec.json")}function pe(t,e,{sessionPath:n}={}){let r=e&&typeof e=="object"?e:{},i=Object.keys(r);if(!i.length||ue(t)!=="broker"||!Ve()||i.length===1)return r;let s=i.filter(c=>r[c]&&r[c][Q]===!0),o=Be(n);Me(o,JSON.stringify({servers:r,pinned:s},null,2),{mode:384}),console.error(`[tool-broker] ${t}: ${i.length} server(s) behind "${de}"${s.length?` (pinned: ${s.join(", ")})`:""} \u2014 spec ${o}`);let a={command:process.execPath,args:[Ye(),"--spec",o]};return{[de]:a}}import{spawn as Xe}from"node:child_process";import{execSync as Ue}from"node:child_process";function me(t){if(!/^[A-Za-z0-9._-]+$/.test(t))return!1;try{return Ue(`command -v ${t}`,{encoding:"utf-8",timeout:1e4,stdio:["ignore","pipe","ignore"]}).trim().length>0}catch{return!1}}import{z as ge}from"zod";import{zodToJsonSchema as Fe}from"zod-to-json-schema";function ze(t){if(!t||typeof t!="object")return t;if(Array.isArray(t.type))return t.type.includes("null")||(t.type=[...t.type,"null"]),t;if(typeof t.type=="string")return t.type=[t.type,"null"],t;for(let e of["anyOf","oneOf"])if(Array.isArray(t[e]))return t[e].some(n=>n&&n.type==="null")||(t[e]=[...t[e],{type:"null"}]),t;return{anyOf:[t,{type:"null"}]}}function w(t){if(!t||typeof t!="object")return t;for(let e of["$defs","definitions"])if(t[e]&&typeof t[e]=="object")for(let n of Object.keys(t[e]))t[e][n]=w(t[e][n]);for(let e of["anyOf","oneOf","allOf"])Array.isArray(t[e])&&(t[e]=t[e].map(w));if(t.properties&&typeof t.properties=="object"){t.additionalProperties=!1;let e=Object.keys(t.properties),n=new Set(Array.isArray(t.required)?t.required:[]);for(let r of e){let i=w(t.properties[r]);n.has(r)||(i=ze(i)),t.properties[r]=i}t.required=e}return t.items&&(Array.isArray(t.items)?t.items=t.items.map(w):t.items=w(t.items)),t}function he(t,e={target:"openApi3"}){if(!t)return null;let n=e?.target==="openAi",r=null;if(typeof ge?.toJSONSchema=="function")try{r=ge.toJSONSchema(t)}catch{}if(!r)try{r=Fe(t,e)}catch{return null}if(n&&r)try{return w(r)}catch{return r}return r}import{existsSync as Ee,mkdirSync as _e,readFileSync as be,rmSync as Qe,writeFileSync as Se}from"node:fs";import{join as v}from"node:path";import L from"chalk";var g={debug:0,info:1,warn:2,error:3,silent:4},te=class{constructor(){this._level=this._getLogLevel()}_getLogLevel(){if(process.env.ZIBBY_DEBUG==="true")return g.debug;if(process.env.ZIBBY_VERBOSE==="true")return g.info;let e=process.env.LOG_LEVEL?.toLowerCase();return e&&e in g?g[e]:g.info}_shouldLog(e){return g[e]>=this._level}_formatMessage(e,n,r={}){let i=new Date().toISOString(),o=`${this._getPrefix(e)} ${n}`;return Object.keys(r).length>0&&(o+=L.dim(` ${JSON.stringify(r)}`)),o}_getPrefix(e){return{debug:L.gray("[DEBUG]"),info:L.cyan("[INFO]"),warn:L.yellow("[WARN]"),error:L.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 g&&(this._level=g[e])}getLevel(){return Object.keys(g).find(e=>g[e]===this._level)}},u=new te;var je=[{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:"opus-5",canonicalId:"claude-opus-5",vendor:"claude",label:"Claude \xB7 Opus 5",family:"claude-opus-5",pickerVisible:!0},{alias:"claude-opus-5",canonicalId:"claude-opus-5",vendor:"claude",family:"claude-opus-5",aliasOf:"opus-5"},{alias:"sonnet-5",canonicalId:"claude-sonnet-5",vendor:"claude",label:"Claude \xB7 Sonnet 5",family:"claude-sonnet-5",pickerVisible:!0},{alias:"claude-sonnet-5",canonicalId:"claude-sonnet-5",vendor:"claude",family:"claude-sonnet-5",aliasOf:"sonnet-5"},{alias:"fable-5",canonicalId:"claude-fable-5",vendor:"claude",label:"Claude \xB7 Fable 5",family:"claude-fable-5",pickerVisible:!0},{alias:"claude-fable-5",canonicalId:"claude-fable-5",vendor:"claude",family:"claude-fable-5",aliasOf:"fable-5"},{alias:"sonnet-4.8",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4"},{alias:"sonnet-4-8",canonicalId:"claude-sonnet-4-6",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-6",vendor:"claude",family:"claude-sonnet-4"},{alias:"sonnet-4-7",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.7"},{alias:"sonnet-4.6",canonicalId:"claude-sonnet-4-6",vendor:"claude",label:"Claude \xB7 Sonnet 4.6",family:"claude-sonnet-4",pickerVisible:!0},{alias:"sonnet-4-6",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.6"},{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",pickerVisible:!0},{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-6",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-6",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:"sonnet-4.6"},{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:"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.6-luna",vendor:"codex",label:"Codex \xB7 GPT-5.2",family:"gpt-5",retiredCanonicalId:"gpt-5.2-codex",unavailable:"2026-08-26 API-key probe: 404 Model not found"},{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.5",vendor:"codex",label:"Codex \xB7 GPT-5.3",family:"gpt-5",retiredCanonicalId:"gpt-5.3",unavailable:"2026-08-26 API-key probe: model_not_found"},{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"},{alias:"gpt-5.5",canonicalId:"gpt-5.5",vendor:"codex",label:"Codex \xB7 GPT-5.5",family:"gpt-5",pickerVisible:!0},{alias:"gpt-5.6-luna",canonicalId:"gpt-5.6-luna",vendor:"codex",label:"Codex \xB7 GPT-5.6 Luna",family:"gpt-5",pickerVisible:!0},{alias:"gpt-5.6-terra",canonicalId:"gpt-5.6-terra",vendor:"codex",label:"Codex \xB7 GPT-5.6 Terra",family:"gpt-5",pickerVisible:!0},{alias:"gpt-5.6-sol",canonicalId:"gpt-5.6-sol",vendor:"codex",label:"Codex \xB7 GPT-5.6 Sol",family:"gpt-5",pickerVisible:!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 $(t){let e={};for(let n of je)n.vendor===t&&(e[n.alias]=n.canonicalId);return e}function ye(t,e){let n=typeof e=="string"?e.trim():"";if(n)return n;throw new Error(`[${t}] No model reached this LLM call: the node passed none, no config sets one, and the run carries none (MODEL env unset). Refusing to silently substitute a vendor default \u2014 pick a model on the agent (deploy modal / MODEL cell) or pass options.model explicitly.`)}var _t=$("claude"),bt=$("codex"),Oe=$("gemini"),St={CURSOR_AGENT_DEFAULT:1200*1e3,OPENAI_REQUEST:18e4};import{z as Ie}from"zod";import{zodToJsonSchema as We}from"zod-to-json-schema";function He(t){if(!t)return null;if(typeof Ie?.toJSONSchema=="function")try{return Ie.toJSONSchema(t)}catch{}try{return We(t,{target:"openApi3"})}catch{return null}}var D=class{static generateFileOutputInstructions(e,n){let r;typeof e?.parse=="function"?r=He(e):r=e;let i=this._buildExample(r);return`
|
|
1
|
+
import{AgentStrategy as qe,getSkill as Ze}from"@zibby/agent-workflow";import we from"node:process";var ke=Object.freeze(["PROJECT_API_TOKEN","ZIBBY_USER_TOKEN","GITHUB_TOKEN","GITLAB_TOKEN","GITLAB_OAUTH_TOKEN","GITLAB_INSTANCES","ATLASSIAN_ACCESS_TOKEN","JIRA_API_TOKEN","JIRA_EMAIL","SENTRY_AUTH_TOKEN","SLACK_BOT_TOKEN","DISCORD_BOT_TOKEN","ZIBBY_CHAT_SLACK_TOKEN","ZIBBY_CHAT_LARK_APP_SECRET","ZIBBY_CHAT_DISCORD_INTERACTION_TOKEN","LINEAR_API_KEY","LINEAR_OAUTH_TOKEN","PLANE_API_KEY","PLANE_OAUTH_TOKEN","ZIBBY_INJECTED_GOOGLE_TOKEN","ZIBBY_INJECTED_LINKEDIN_TOKEN","ZIBBY_MEMORY_AWS_ACCESS_KEY_ID","ZIBBY_MEMORY_AWS_SECRET_ACCESS_KEY","ZIBBY_MEMORY_AWS_SESSION_TOKEN"]);function le(t=we.env){let e={},n=new Set(ke);for(let[r,i]of Object.entries(t))n.has(r)||i!==void 0&&(e[r]=i);return e}function Pe(t){return!!t&&(t.transport==="http"||typeof t.url=="string"&&!t.command)}var ce=Object.freeze({claude:"native",codex:"broker",gemini:"broker",cursor:"eager"});function ue(t){return ce[t]||"eager"}var Ce=new Set(Object.entries(ce).filter(([,t])=>t==="native").map(([t])=>t)),Q=Symbol("zibby.mcp.alwaysLoad");function Le(){let t=String(process.env.MCP_ALWAYS_LOAD??"").trim().toLowerCase();return!(t==="0"||t==="false"||t==="off")}function Re(t,e){return Ce.has(t)?Le()?typeof e.alwaysLoad=="boolean"?{alwaysLoad:e.alwaysLoad}:{}:{}:{}}function ee(t,e,{processEnv:n}={}){if(!e)return null;let r=Re(t,e),i=o=>(e.alwaysLoad===!0&&Object.defineProperty(o,Q,{value:!0,enumerable:!1}),o);if(Pe(e)){let o=String(e.url||"").trim();if(!o)return null;let a=e.headers&&typeof e.headers=="object"?e.headers:void 0;switch(t){case"claude":return i({type:"http",url:o,...a&&{headers:a},...r});case"codex":return i({url:o,...a&&{http_headers:a}});case"gemini":return i({url:o,type:"http",...a&&{headers:a}});case"cursor":return i({url:o,...a&&{headers:a}});default:return i({type:"http",url:o,...a&&{headers:a},...r})}}let s={command:e.command};return e.args?.length&&(s.args=e.args),e.cwd&&(s.cwd=e.cwd),n?s.env={...n,...e.env||{}}:e.env&&Object.keys(e.env).length&&(s.env=e.env),i({...s,...r})}import{mkdtempSync as Ge,writeFileSync as Me,mkdirSync as $e,existsSync as De}from"fs";import{join as C,dirname as fe}from"path";import{tmpdir as Ke}from"os";import{fileURLToPath as Je}from"url";var de="toolbox";function Ye(){let t=fe(Je(import.meta.url));for(let e=t,n=0;n<4;n++,e=fe(e)){let r=C(e,"mcp","tool-broker-server.js");if(De(r))return r}throw new Error(`[tool-broker] cannot find mcp/tool-broker-server.js from ${t} \u2014 the package layout changed, or the build did not emit it.`)}function Ue(){let t=String(process.env.MCP_TOOL_BROKER??"").trim().toLowerCase();return!(t==="0"||t==="false"||t==="off")}function Ve(t){if(t){let e=C(t,".mcp-broker");return $e(e,{recursive:!0}),C(e,"spec.json")}return C(Ge(C(Ke(),"mcp-broker-")),"spec.json")}function pe(t,e,{sessionPath:n,toolWorkingSet:r}={}){let i=e&&typeof e=="object"?e:{},s=Object.keys(i);if(!s.length||ue(t)!=="broker"||!Ue()||s.length===1)return i;let o=s.filter(l=>i[l]&&i[l][Q]===!0),a=Ve(n),u=Array.isArray(r?.warmTools)?r.warmTools.filter(l=>l&&typeof l.server=="string"&&typeof l.tool=="string").map(l=>({server:l.server,tool:l.tool,...Number.isFinite(Number(l.lastUsedAt))?{lastUsedAt:Number(l.lastUsedAt)}:{}})):[],d=typeof r?.usagePath=="string"&&r.usagePath.trim()?r.usagePath.trim():null;Me(a,JSON.stringify({servers:i,pinned:o,...u.length?{warmTools:u}:{},...d?{usagePath:d}:{}},null,2),{mode:384}),console.error(`[tool-broker] ${t}: ${s.length} server(s) behind "${de}"${o.length?` (pinned: ${o.join(", ")})`:""} \u2014 spec ${a}`);let g={command:process.execPath,args:[Ye(),"--spec",a]};return{[de]:g}}import{spawn as Xe}from"node:child_process";import{execSync as Be}from"node:child_process";function me(t){if(!/^[A-Za-z0-9._-]+$/.test(t))return!1;try{return Be(`command -v ${t}`,{encoding:"utf-8",timeout:1e4,stdio:["ignore","pipe","ignore"]}).trim().length>0}catch{return!1}}import{z as ge}from"zod";import{zodToJsonSchema as Fe}from"zod-to-json-schema";function ze(t){if(!t||typeof t!="object")return t;if(Array.isArray(t.type))return t.type.includes("null")||(t.type=[...t.type,"null"]),t;if(typeof t.type=="string")return t.type=[t.type,"null"],t;for(let e of["anyOf","oneOf"])if(Array.isArray(t[e]))return t[e].some(n=>n&&n.type==="null")||(t[e]=[...t[e],{type:"null"}]),t;return{anyOf:[t,{type:"null"}]}}function k(t){if(!t||typeof t!="object")return t;for(let e of["$defs","definitions"])if(t[e]&&typeof t[e]=="object")for(let n of Object.keys(t[e]))t[e][n]=k(t[e][n]);for(let e of["anyOf","oneOf","allOf"])Array.isArray(t[e])&&(t[e]=t[e].map(k));if(t.properties&&typeof t.properties=="object"){t.additionalProperties=!1;let e=Object.keys(t.properties),n=new Set(Array.isArray(t.required)?t.required:[]);for(let r of e){let i=k(t.properties[r]);n.has(r)||(i=ze(i)),t.properties[r]=i}t.required=e}return t.items&&(Array.isArray(t.items)?t.items=t.items.map(k):t.items=k(t.items)),t}function he(t,e={target:"openApi3"}){if(!t)return null;let n=e?.target==="openAi",r=null;if(typeof ge?.toJSONSchema=="function")try{r=ge.toJSONSchema(t)}catch{}if(!r)try{r=Fe(t,e)}catch{return null}if(n&&r)try{return k(r)}catch{return r}return r}import{existsSync as Ee,mkdirSync as be,readFileSync as _e,rmSync as Qe,writeFileSync as Se}from"node:fs";import{join as v}from"node:path";import L from"chalk";var h={debug:0,info:1,warn:2,error:3,silent:4},te=class{constructor(){this._level=this._getLogLevel()}_getLogLevel(){if(process.env.ZIBBY_DEBUG==="true")return h.debug;if(process.env.ZIBBY_VERBOSE==="true")return h.info;let e=process.env.LOG_LEVEL?.toLowerCase();return e&&e in h?h[e]:h.info}_shouldLog(e){return h[e]>=this._level}_formatMessage(e,n,r={}){let i=new Date().toISOString(),o=`${this._getPrefix(e)} ${n}`;return Object.keys(r).length>0&&(o+=L.dim(` ${JSON.stringify(r)}`)),o}_getPrefix(e){return{debug:L.gray("[DEBUG]"),info:L.cyan("[INFO]"),warn:L.yellow("[WARN]"),error:L.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 h&&(this._level=h[e])}getLevel(){return Object.keys(h).find(e=>h[e]===this._level)}},f=new te;var je=[{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:"opus-5",canonicalId:"claude-opus-5",vendor:"claude",label:"Claude \xB7 Opus 5",family:"claude-opus-5",pickerVisible:!0},{alias:"claude-opus-5",canonicalId:"claude-opus-5",vendor:"claude",family:"claude-opus-5",aliasOf:"opus-5"},{alias:"sonnet-5",canonicalId:"claude-sonnet-5",vendor:"claude",label:"Claude \xB7 Sonnet 5",family:"claude-sonnet-5",pickerVisible:!0},{alias:"claude-sonnet-5",canonicalId:"claude-sonnet-5",vendor:"claude",family:"claude-sonnet-5",aliasOf:"sonnet-5"},{alias:"fable-5",canonicalId:"claude-fable-5",vendor:"claude",label:"Claude \xB7 Fable 5",family:"claude-fable-5",pickerVisible:!0},{alias:"claude-fable-5",canonicalId:"claude-fable-5",vendor:"claude",family:"claude-fable-5",aliasOf:"fable-5"},{alias:"sonnet-4.8",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4"},{alias:"sonnet-4-8",canonicalId:"claude-sonnet-4-6",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-6",vendor:"claude",family:"claude-sonnet-4"},{alias:"sonnet-4-7",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.7"},{alias:"sonnet-4.6",canonicalId:"claude-sonnet-4-6",vendor:"claude",label:"Claude \xB7 Sonnet 4.6",family:"claude-sonnet-4",pickerVisible:!0},{alias:"sonnet-4-6",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.6"},{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",pickerVisible:!0},{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-6",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-6",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:"sonnet-4.6"},{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:"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.6-luna",vendor:"codex",label:"Codex \xB7 GPT-5.2",family:"gpt-5",retiredCanonicalId:"gpt-5.2-codex",unavailable:"2026-08-26 API-key probe: 404 Model not found"},{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.5",vendor:"codex",label:"Codex \xB7 GPT-5.3",family:"gpt-5",retiredCanonicalId:"gpt-5.3",unavailable:"2026-08-26 API-key probe: model_not_found"},{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"},{alias:"gpt-5.5",canonicalId:"gpt-5.5",vendor:"codex",label:"Codex \xB7 GPT-5.5",family:"gpt-5",pickerVisible:!0},{alias:"gpt-5.6-luna",canonicalId:"gpt-5.6-luna",vendor:"codex",label:"Codex \xB7 GPT-5.6 Luna",family:"gpt-5",pickerVisible:!0},{alias:"gpt-5.6-terra",canonicalId:"gpt-5.6-terra",vendor:"codex",label:"Codex \xB7 GPT-5.6 Terra",family:"gpt-5",pickerVisible:!0},{alias:"gpt-5.6-sol",canonicalId:"gpt-5.6-sol",vendor:"codex",label:"Codex \xB7 GPT-5.6 Sol",family:"gpt-5",pickerVisible:!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 $(t){let e={};for(let n of je)n.vendor===t&&(e[n.alias]=n.canonicalId);return e}function ye(t,e){let n=typeof e=="string"?e.trim():"";if(n)return n;throw new Error(`[${t}] No model reached this LLM call: the node passed none, no config sets one, and the run carries none (MODEL env unset). Refusing to silently substitute a vendor default \u2014 pick a model on the agent (deploy modal / MODEL cell) or pass options.model explicitly.`)}var bt=$("claude"),_t=$("codex"),Oe=$("gemini"),St={CURSOR_AGENT_DEFAULT:1200*1e3,OPENAI_REQUEST:18e4};import{z as Ie}from"zod";import{zodToJsonSchema as He}from"zod-to-json-schema";function We(t){if(!t)return null;if(typeof Ie?.toJSONSchema=="function")try{return Ie.toJSONSchema(t)}catch{}try{return He(t,{target:"openApi3"})}catch{return null}}var D=class{static generateFileOutputInstructions(e,n){let r;typeof e?.parse=="function"?r=We(e):r=e;let i=this._buildExample(r);return`
|
|
2
2
|
\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550
|
|
3
3
|
\u{1F6A8} MANDATORY: WRITE RESULT TO FILE \u{1F6A8}
|
|
4
4
|
\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550
|
|
@@ -31,18 +31,18 @@ ${e.trim()}`;this.systemInstructions.push({type:"extra_instructions",content:n,p
|
|
|
31
31
|
`)}getStats(){let e=this.userPrompt.length,n=this.build().length;return{userPromptLength:e,fullPromptLength:n,systemInstructionsLength:n-e,instructionCount:this.systemInstructions.length,instructionTypes:this.systemInstructions.map(r=>r.type)}}clone(){let e=new t(this.userPrompt);return e.systemInstructions=[...this.systemInstructions],e.metadata={...this.metadata},e}};var J=class t{constructor(){this.buffer="",this.extractedResult=null,this.rawText="",this.zodSchema=null,this.lastOutputLength=0,this.onToolCall=null,this._lastToolEmit=null}processChunk(e){if(!e)return null;this.buffer+=e;let n=this.buffer.split(`
|
|
32
32
|
`);this.buffer=n.pop()||"";let r="";for(let i of n)if(i.trim())try{let s=JSON.parse(i);this._emitToolCalls(s);let o=this.extractText(s);if(o){if(this.rawText&&o.startsWith(this.rawText)){let a=o.substring(this.rawText.length);this.rawText=o,r+=a}else(!this.rawText.includes(o)||o.length<20)&&(this.rawText+=o,r+=o);this.tryExtractResult(this.rawText)}else this.isValidResult(s)&&(this.rawText+=`${i}
|
|
33
33
|
`,r+=`${i}
|
|
34
|
-
`,this.extractedResult=s)}catch{if(i.includes('"text"')||i.includes('"content"')){let o=i.match(/"text"\s*:\s*"([^"]*)/),a=i.match(/"content"\s*:\s*"([^"]*)/),
|
|
35
|
-
${
|
|
36
|
-
${
|
|
34
|
+
`,this.extractedResult=s)}catch{if(i.includes('"text"')||i.includes('"content"')){let o=i.match(/"text"\s*:\s*"([^"]*)/),a=i.match(/"content"\s*:\s*"([^"]*)/),u=o?o[1]:a?a[1]:null;u&&!this.rawText.includes(u)&&(r+=u,this.rawText+=u)}}return r||null}flush(){if(!this.buffer.trim())return null;let e="";try{let n=JSON.parse(this.buffer);this._emitToolCalls(n);let r=this.extractText(n);r&&(this.rawText+=r,e+=r,this.tryExtractResult(r))}catch{this.rawText+=this.buffer,e+=this.buffer,this.tryExtractResult(this.buffer)}return this.buffer="",e||null}_emitToolCalls(e){if(!this.onToolCall)return;let n=(o,a)=>{if(!o)return;let u=`${o}:${JSON.stringify(a??{})}`;this._lastToolEmit!==u&&(this._lastToolEmit=u,this.onToolCall(o,a??void 0))},r=o=>{if(o!=null){if(typeof o=="object"&&!Array.isArray(o))return o;if(typeof o=="string")try{return JSON.parse(o)}catch{return}}};if(e.type==="tool_use"||e.type==="tool_call"){if(e.name){n(e.name,r(e.input??e.arguments));return}let o=e.tool_call;if(o&&typeof o=="object"&&!Array.isArray(o)){let a=Object.keys(o);if(a.length===1){let u=a[0],d=o[u],g=d&&typeof d=="object"?d.args??d.input??d:void 0;n(u,r(g))}return}return}if(Array.isArray(e.tool_calls)){for(let o of e.tool_calls)n(o.name,r(o.input??o.arguments));return}let i=e.message??e;if(Array.isArray(i?.tool_calls)){for(let o of i.tool_calls)n(o.name,r(o.input??o.arguments));return}let s=i?.content??e.content;if(Array.isArray(s))for(let o of s)(o.type==="tool_use"||o.type==="tool_call")&&o.name&&n(o.name,r(o.input??o.arguments))}extractText(e){if(e.type==="assistant"&&e.message?.content){let n=e.message.content;if(Array.isArray(n))return n.filter(r=>r.type==="text"&&r.text).map(r=>r.text).join("")}return e.type==="thinking"&&e.text||e.text?e.text:e.content&&typeof e.content=="string"?e.content:e.delta?e.delta:null}tryExtractResult(e){if(!e||typeof e!="string")return;let n=[],r=/```json\s*\n?([\s\S]*?)\n?```/g,i;for(;(i=r.exec(e))!==null;){let l=i[1].trim();try{JSON.parse(l),n.push({text:l,source:"markdown"})}catch{}}let s=0,o=0;for(;s<e.length&&(s=e.indexOf("{",s),s!==-1);){let l=0,I=s;for(let m=s;m<e.length;m++)if(e[m]==="{")l++;else if(e[m]==="}"&&(l--,l===0)){I=m,n.push({text:e.substring(s,I+1),source:"brace"}),o++;break}s=I+1}let a=this.extractedResult,u=a?JSON.stringify(a).length:0,d=0,g=-1;for(let l=0;l<n.length;l++){let I=n[l];try{let m=I.text.replace(/,(\s*[}\]])/g,"$1"),x=JSON.parse(m);this.isValidResult(x)&&(d++,u=JSON.stringify(x).length,a=x,g=l)}catch{}}a&&(this.extractedResult=a)}isValidResult(e){if(!e||typeof e!="object"||Array.isArray(e)||e.session_id||e.timestamp_ms||e.type||e.call_id||e.tool_call||e.result&&typeof e.result=="object"&&(e.result.success&&typeof e.result.success=="object"||e.result.error&&typeof e.result.error=="object")||e.args&&typeof e.args=="object")return!1;if(this.zodSchema)try{return this.zodSchema.parse(e),!0}catch{return!1}return!0}getResult(){return this.extractedResult}getRawText(){return this.rawText}static extractResult(e,n=null){let r=new t;r.zodSchema=n,r.processChunk(e),r.flush();let i=r.getResult();return!i&&process.env.LOG_LEVEL==="debug"&&console.error("[StreamingParser] No result extracted from",e?.length||0,"chars"),i}};function ne(t){let e=`${t}_POOL`,n=process.env[e];if(!n||typeof n!="string")return{picked:null,count:0,dispose:()=>{}};let r=n.split(/[,\n]+/).map(o=>o.trim()).filter(Boolean);if(r.length===0)return{picked:null,count:0,dispose:()=>{}};let i=r[Math.floor(Math.random()*r.length)],s=process.env[t];return process.env[t]=i,f.debug(`[auth-pool] ${t}: picked 1 of ${r.length} from pool (***${i.slice(-4)})`),{picked:i,count:r.length,dispose(){s===void 0?delete process.env[t]:process.env[t]=s}}}function et(t){if(!t)return null;let e=String(t),n=e.match(/```(?:json)?\s*([\s\S]*?)```/i);if(n?.[1])try{return JSON.parse(n[1].trim())}catch{}let r=e.indexOf("{");if(r<0)return null;let i=0,s=!1,o=!1,a=-1;for(let u=r;u<e.length;u++){let d=e[u];if(s){o?o=!1:d==="\\"?o=!0:d==='"'&&(s=!1);continue}if(d==='"'){s=!0;continue}if(d==="{"){i===0&&(a=u),i+=1;continue}if(d==="}"){if(i===0)continue;if(i-=1,i===0&&a>=0){let g=e.slice(a,u+1);try{return JSON.parse(g)}catch{a=-1}}}}return null}function tt(t){let e=String(t||"").trim();if(!e)return null;try{return JSON.parse(e)}catch{return et(e)}}function nt(t){try{let e=JSON.parse(t);if(typeof e=="string")return e;if(typeof e?.response=="string")return e.response;if(typeof e?.text=="string")return e.text;if(typeof e?.output=="string")return e.output;if(Array.isArray(e?.candidates)&&e.candidates.length>0){let n=e.candidates[0];if(typeof n?.content=="string")return n.content;if(Array.isArray(n?.content?.parts)){let r=n.content.parts.map(i=>typeof i?.text=="string"?i.text:"").join("");if(r.trim())return r}}}catch{}return t}var ve=class t extends qe{constructor(){super("gemini","Gemini (Google)",70)}canHandle(e){return!(process.env.GEMINI_API_KEY||process.env.GEMINI_API_KEY_POOL||process.env.GOOGLE_API_KEY||process.env.GOOGLE_API_KEY_POOL)?(f.debug("GeminiAgentStrategy: GEMINI_API_KEY or GOOGLE_API_KEY not set"),!1):me("gemini")?!0:(f.warn("[Gemini] gemini CLI not on PATH. Install: npm install -g @google/gemini-cli"),!1)}async invoke(e,n={}){n.effort&&!t._effortWarned&&(t._effortWarned=!0,f.warn(`[Gemini] effort "${n.effort}" ignored \u2014 the Gemini CLI exposes no reasoning-effort control.`));let{model:r,workspace:i=process.cwd(),schema:s=null,images:o=[],skills:a=null,sessionPath:u=null,nodeName:d=null,timeout:g=600*1e3,signal:l=null}=n,I=[ne("GEMINI_API_KEY"),ne("GOOGLE_API_KEY")];try{let m=ye("gemini",r),x=Oe[m]||m,Y=String(process.env.GEMINI_API_KEY||"").trim(),U=String(process.env.GOOGLE_API_KEY||"").trim(),V=this._resolveSkillsToMcp(a,{sessionPath:u,workspace:i,nodeName:d});for(let c of n.extraMcpServers||[])if(c&&c.serverName&&c.def){if(Object.prototype.hasOwnProperty.call(V,c.serverName)){console.warn(`[custom-mcp] skip "${c.serverName}" \u2014 a built-in skill already owns that MCP name (no shadowing)`);continue}let p=ee("gemini",c.def);p&&(V[c.serverName]=p)}let B=pe("gemini",V,{sessionPath:u,toolWorkingSet:n.toolWorkingSet}),xe=Object.keys(B).length>0,T=new K(e),F=s&&typeof s.parse=="function",A=null;if(s){let c;try{let p=F?he(s,{target:"openAi"}):s;c=JSON.stringify(p,null,2)}catch{c="{}"}if(xe){T.addSystemInstruction(`Write valid JSON that matches this schema:
|
|
35
|
+
${c}`,"schema_instruction","append");let p=`zibby-result-${Date.now()}.json`,O=v(i,".zibby","tmp");A=v(O,p),be(O,{recursive:!0}),T.addStructuredOutput(s,A)}else T.addSystemInstruction(`Return ONLY valid JSON (no markdown, no commentary) that matches this schema:
|
|
36
|
+
${c}`,"json_instruction","append")}let re=T.build(),z=Array.isArray(o)?o.filter(c=>c&&typeof c.path=="string"&&c.path.startsWith("/")):[];z.length&&(re+=`
|
|
37
37
|
|
|
38
38
|
# Attached image files \u2014 VIEW THESE
|
|
39
39
|
The user attached ${z.length} image(s), saved locally. Read each path to SEE the image, then use what it shows to answer:
|
|
40
|
-
${z.map((
|
|
40
|
+
${z.map((c,p)=>` ${p+1}. ${c.path}${c.name?` (${c.name})`:""}`).join(`
|
|
41
41
|
`)}`);let Te=T.getUserPrompt(),R=T.getStats(),ie=String(process.env.GEMINI_API_KEY||process.env.GOOGLE_API_KEY||"").trim(),Ae=ie?` | key: ***${ie.slice(-4)}`:" | key: not set";console.log(`
|
|
42
42
|
\u25C6 Model: ${x}${Ae}
|
|
43
43
|
`);let G=(await import("chalk")).default;console.log(`
|
|
44
|
-
${G.bold("Prompt sent to LLM:")}`),console.log(G.dim("\u2500".repeat(60))),console.log(G.dim(Te)),console.log(G.dim("\u2500".repeat(60)));let j=this._createGeminiConfigDir(i,
|
|
45
|
-
${y}`):
|
|
46
|
-
${y.slice(0,1e3)}`),S=tt(y)),!S)throw
|
|
47
|
-
`,"utf-8");let
|
|
48
|
-
`,"utf-8")}catch{}return
|
|
44
|
+
${G.bold("Prompt sent to LLM:")}`),console.log(G.dim("\u2500".repeat(60))),console.log(G.dim(Te)),console.log(G.dim("\u2500".repeat(60)));let j=this._createGeminiConfigDir(i,B),_=["--output-format","json"];_.push("--model",x);let H=Object.keys(B);if(H.length>0){_.push("--approval-mode","yolo");for(let c of H)_.push("--allowed-mcp-server-names",c);f.info(`[Gemini] Enabling MCP servers: ${H.join(", ")}`)}else a&&a.length>0&&f.warn(`[Gemini] Skills requested but no MCP servers configured: ${a.join(", ")}`);_.push("-p",re);let N={...le(process.env),GEMINI_CLI_HOME:j,GEMINI_CLI_TRUST_WORKSPACE:"true"};Y?(N.GEMINI_API_KEY=Y,delete N.GOOGLE_API_KEY):U&&(N.GOOGLE_API_KEY=U,delete N.GEMINI_API_KEY),f.debug(`[Gemini] Command: gemini ${_.slice(0,8).join(" ")}... (${_.length} total args)`),f.debug(`[Gemini] User prompt: ${R.userPromptLength} chars, System instructions: ${R.systemInstructionsLength} chars (${R.instructionCount} blocks), Full: ${R.fullPromptLength} chars`),f.debug(`[Gemini] Config home: ${j}`),f.debug(`[Gemini] GEMINI_CLI_HOME env: ${N.GEMINI_CLI_HOME}`);let W="",w=null;try{W=await new Promise((p,O)=>{let E=Xe("gemini",_,{cwd:i,env:N,stdio:["ignore","pipe","pipe"],...l&&{signal:l}}),q="",oe="",Z=!1,P=null,X=!1,se=setTimeout(()=>{try{E.kill("SIGTERM")}catch{}},g),M=()=>{X||Z||(X=!0,P=setTimeout(()=>{if(!Z)try{E.kill("SIGKILL")}catch{}},5e3))};l&&(l.aborted?M():l.addEventListener("abort",M,{once:!0})),E.stdout.on("data",b=>{q+=b.toString()}),E.stderr.on("data",b=>{oe+=b.toString()}),E.on("error",b=>{if(clearTimeout(se),P&&clearTimeout(P),l&&!l.aborted)try{l.removeEventListener("abort",M)}catch{}O(b)}),E.on("close",b=>{if(Z=!0,clearTimeout(se),P&&clearTimeout(P),l&&!l.aborted)try{l.removeEventListener("abort",M)}catch{}if(X){let ae=new Error("Aborted via signal");return ae.name="AbortError",O(ae)}if(b===0)return p(q.trim());O(new Error(`gemini failed with code ${b}: ${(oe||q).trim()}`))})})}catch(c){w=c}finally{try{Qe(j,{recursive:!0,force:!0})}catch{}}let y=nt(W).trim();if(!s){if(w)throw w;return y}if(A){let c=Ee(A);if(f.info(`[Gemini] Result file: ${c?"present":"missing"} at ${A}`),c)try{let p=_e(A,"utf-8").trim(),O=JSON.parse(p),E=F?s.parse(O):O;return f.info("[Gemini] Structured output recovered from result file"),{raw:y,structured:E}}catch(p){f.warn(`[Gemini] Result file parse/validation failed: ${p.message}`)}else w||f.warn("[Gemini] Result file missing; falling back to stream-parsed JSON")}let S=null;if(s){let c=new J;c.zodSchema=s,c.processChunk(y),c.flush(),S=c.getResult()}if(f.info(`[Gemini] Raw stdout length: ${W.length} chars`),f.info(`[Gemini] Extracted text length: ${y.length} chars`),f.info(`[Gemini] StreamParser result: ${S?"extracted":"null"}`),S||(y.length<2e3?f.info(`[Gemini] Raw text preview:
|
|
45
|
+
${y}`):f.info(`[Gemini] Raw text preview (first 1000 chars):
|
|
46
|
+
${y.slice(0,1e3)}`),S=tt(y)),!S)throw w||(f.error("[Gemini] Failed to extract valid JSON from output"),f.error("\u{1F4A1} Tip: Set strictMode=true in .zibby.config.js for OpenAI proxy fallback"),new Error("Gemini did not return valid JSON for structured output. Enable strictMode for proxy fallback."));let Ne=F?s.parse(S):S;return{raw:y,structured:Ne}}finally{for(let m of I)m.dispose()}}_resolveSkillsToMcp(e,n={}){if(!Array.isArray(e)||e.length===0)return{};let r={};for(let i of e){let s=Ze(i);if(!s||typeof s.resolve!="function")continue;let o=s.resolve(n);if(!o)continue;let a=s.cursorKey||s.serverName||i,u=ee("gemini",o);u&&(r[a]=u)}return r}_createGeminiConfigDir(e,n){let r=`${Date.now()}-${Math.random().toString(16).slice(2,10)}`,i=v(e||process.cwd(),".zibby","tmp",`gemini-home-${r}`),s=v(i,".gemini");be(s,{recursive:!0});let o=v(s,"settings.json"),a={},u=v(process.env.HOME||"",".gemini","settings.json");if(Ee(u))try{a=JSON.parse(_e(u,"utf-8"))}catch{a={}}let d={...a,mcpServers:{...a.mcpServers&&typeof a.mcpServers=="object"?a.mcpServers:{},...n||{}}};Se(o,`${JSON.stringify(d,null,2)}
|
|
47
|
+
`,"utf-8");let g=v(e||process.cwd(),".zibby","tmp","gemini-settings-debug.json");try{Se(g,`${JSON.stringify(d,null,2)}
|
|
48
|
+
`,"utf-8")}catch{}return f.debug(`[Gemini] Created isolated config with ${Object.keys(d.mcpServers||{}).length} MCP servers`),f.debug(`[Gemini] MCP servers: ${JSON.stringify(Object.keys(d.mcpServers||{}),null,2)}`),i}};export{ve as GeminiAgentStrategy};
|