@zibby/core 0.5.48 → 0.5.49

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zibby/core",
3
- "version": "0.5.48",
3
+ "version": "0.5.49",
4
4
  "description": "Core test automation engine with multi-agent and multi-MCP support",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,20 +1,20 @@
1
- var Et=Object.defineProperty;var Ot=(r,e,t)=>()=>{if(t)throw t[0];try{return r&&(e=r(r=0)),e}catch(o){throw t=[o],o}};var At=(r,e)=>{for(var t in e)Et(r,t,{get:e[t],enumerable:!0})};var tt={};At(tt,{zodToJson:()=>te});import{z as et}from"zod";import{zodToJsonSchema as Tt}from"zod-to-json-schema";function xt(r){if(!r||typeof r!="object")return r;if(Array.isArray(r.type))return r.type.includes("null")||(r.type=[...r.type,"null"]),r;if(typeof r.type=="string")return r.type=[r.type,"null"],r;for(let e of["anyOf","oneOf"])if(Array.isArray(r[e]))return r[e].some(t=>t&&t.type==="null")||(r[e]=[...r[e],{type:"null"}]),r;return{anyOf:[r,{type:"null"}]}}function se(r){if(!r||typeof r!="object")return r;for(let e of["$defs","definitions"])if(r[e]&&typeof r[e]=="object")for(let t of Object.keys(r[e]))r[e][t]=se(r[e][t]);for(let e of["anyOf","oneOf","allOf"])Array.isArray(r[e])&&(r[e]=r[e].map(se));if(r.properties&&typeof r.properties=="object"){r.additionalProperties=!1;let e=Object.keys(r.properties),t=new Set(Array.isArray(r.required)?r.required:[]);for(let o of e){let n=se(r.properties[o]);t.has(o)||(n=xt(n)),r.properties[o]=n}r.required=e}return r.items&&(Array.isArray(r.items)?r.items=r.items.map(se):r.items=se(r.items)),r}function te(r,e={target:"openApi3"}){if(!r)return null;let t=e?.target==="openAi",o=null;if(typeof et?.toJSONSchema=="function")try{o=et.toJSONSchema(r)}catch{}if(!o)try{o=Tt(r,e)}catch{return null}if(t&&o)try{return se(o)}catch{return o}return o}var pe=Ot(()=>{});import{registerStrategy as Be}from"@zibby/agent-workflow";import{AgentStrategy as vt,getSkill as st,NO_INTEGRATION_TOGGLEABLE_SKILL_IDS as kt}from"@zibby/agent-workflow";import{query as wt}from"@anthropic-ai/claude-agent-sdk";import bt from"node:process";var Xe=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 re(r=bt.env){let e={},t=new Set(Xe);for(let[o,n]of Object.entries(r))t.has(o)||n!==void 0&&(e[o]=n);return e}function qe(r){return!!r&&(r.transport==="http"||typeof r.url=="string"&&!r.command)}function Q(r,e,{processEnv:t}={}){if(!e)return null;if(qe(e)){let n=String(e.url||"").trim();if(!n)return null;let s=e.headers&&typeof e.headers=="object"?e.headers:void 0;switch(r){case"claude":return{type:"http",url:n,...s&&{headers:s}};case"codex":return{url:n,...s&&{http_headers:s}};case"gemini":return{url:n,type:"http",...s&&{headers:s}};case"cursor":return{url:n,...s&&{headers:s}};default:return{type:"http",url:n,...s&&{headers:s}}}}let o={command:e.command};return e.args?.length&&(o.args=e.args),e.cwd&&(o.cwd=e.cwd),t?o.env={...t,...e.env||{}}:e.env&&Object.keys(e.env).length&&(o.env=e.env),o}function Qe(r){return qe(r)?`http \u2192 ${String(r.url||"").replace(/\?.*$/,"")}`:`${r?.command||"?"} ${(r?.args||[]).join(" ")}`.trim()}pe();import{writeFileSync as Ge,mkdirSync as je,existsSync as le,readFileSync as at}from"fs";import{homedir as lt}from"os";import{join as W}from"path";import me from"chalk";var q={debug:0,info:1,warn:2,error:3,silent:4},Ke=class{constructor(){this._level=this._getLogLevel()}_getLogLevel(){if(process.env.ZIBBY_DEBUG==="true")return q.debug;if(process.env.ZIBBY_VERBOSE==="true")return q.info;let e=process.env.LOG_LEVEL?.toLowerCase();return e&&e in q?q[e]:q.info}_shouldLog(e){return q[e]>=this._level}_formatMessage(e,t,o={}){let n=new Date().toISOString(),i=`${this._getPrefix(e)} ${t}`;return Object.keys(o).length>0&&(i+=me.dim(` ${JSON.stringify(o)}`)),i}_getPrefix(e){return{debug:me.gray("[DEBUG]"),info:me.cyan("[INFO]"),warn:me.yellow("[WARN]"),error:me.red("\u274C [ERROR]")}[e]||""}debug(e,t){this._shouldLog("debug")&&console.log(this._formatMessage("debug",e,t))}info(e,t){this._shouldLog("info")&&console.log(this._formatMessage("info",e,t))}warn(e,t){this._shouldLog("warn")&&console.warn(this._formatMessage("warn",e,t))}error(e,t){this._shouldLog("error")&&console.error(this._formatMessage("error",e,t))}setLevel(e){e in q&&(this._level=q[e])}getLevel(){return Object.keys(q).find(e=>q[e]===this._level)}},c=new Ke;import{timeline as ie,Timeline as Tn,WORKFLOW_GRAPH_LOG_MARKER_PREFIX as xn}from"@zibby/agent-workflow";var nt=[{alias:"auto",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4",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:"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,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-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:"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:"gpt-5.6-luna",vendor:"codex",family:"gpt-5",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"},{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:"auto",canonicalId:"gemini-3-pro",vendor:"gemini",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 Oe(r){let e={};for(let t of nt)t.vendor===r&&(e[t.alias]=t.canonicalId);return e}function ae(r,e){let t=typeof e=="string"?e.trim():"";if(t&&t!=="auto")return t;if(t==="auto"&&nt.some(o=>o.vendor===r&&o.isDefault))return"auto";throw new Error(`[${r}] 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={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 Je=Oe("claude"),Ue=Oe("codex"),rt=Oe("gemini"),wn={CURSOR_AGENT_DEFAULT:1200*1e3,OPENAI_REQUEST:18e4};function Z(r){let e=`${r}_POOL`,t=process.env[e];if(!t||typeof t!="string")return{picked:null,count:0,dispose:()=>{}};let o=t.split(/[,\n]+/).map(i=>i.trim()).filter(Boolean);if(o.length===0)return{picked:null,count:0,dispose:()=>{}};let n=o[Math.floor(Math.random()*o.length)],s=process.env[r];return process.env[r]=n,c.debug(`[auth-pool] ${r}: picked 1 of ${o.length} from pool (***${n.slice(-4)})`),{picked:n,count:o.length,dispose(){s===void 0?delete process.env[r]:process.env[r]=s}}}function Ae(r){if(!r||typeof r!="object")return null;let e=(...n)=>{for(let s of n){if(s==null||s==="")continue;let i=Number(s);if(Number.isFinite(i))return i}return null},t=e(r.input_tokens,r.inputTokens,r.prompt_tokens,r.promptTokens),o=e(r.output_tokens,r.outputTokens,r.completion_tokens,r.completionTokens);return t==null&&o==null?null:{input:t||0,output:o||0}}import{createRequire as It}from"module";import R from"process";var it=It(import.meta.url);function Ct(){try{if(R.env.CLAUDE_CODE_EXECUTABLE&&le(R.env.CLAUDE_CODE_EXECUTABLE))return R.env.CLAUDE_CODE_EXECUTABLE;let r=R.platform,e=R.arch,t=`@anthropic-ai/claude-agent-sdk-${r}-${e}`,o=r==="win32"?"claude.exe":"claude";try{let n=it.resolve(`${t}/package.json`),s=W(n,"..",o);if(le(s))return s}catch{}try{let n=it.resolve("@anthropic-ai/claude-agent-sdk/package.json"),s=W(n,"..");for(let a of[o,W("vendor",o),W("bin",o)]){let l=W(s,a);if(le(l))return l}let i=W(s,"..",`claude-agent-sdk-${r}-${e}`,o);if(le(i))return i}catch{}}catch{}return null}var be=Ct();be&&c.debug(`Claude native CLI resolved to baked binary: ${be}`);var Te=class extends vt{constructor(){super("claude","Claude (Anthropic API)",50)}canHandle(e){let t=!!R.env.ANTHROPIC_API_KEY||!!R.env.ANTHROPIC_API_KEY_POOL,o=!!R.env.CLAUDE_CODE_OAUTH_TOKEN||!!R.env.CLAUDE_CODE_OAUTH_TOKEN_POOL,n=!!R.env.ANTHROPIC_AUTH_TOKEN||!!R.env.ANTHROPIC_AUTH_TOKEN_POOL,s=t||o||n;return s||c.debug("ClaudeAgentStrategy: no credentials. Set one of ANTHROPIC_API_KEY / CLAUDE_CODE_OAUTH_TOKEN / ANTHROPIC_AUTH_TOKEN (or a *_POOL variant for multi-token rotation)."),s}async invoke(e,t={}){let{model:o,workspace:n=R.cwd(),schema:s=null,images:i=[],skills:a=null,sessionPath:l=null,nodeName:d=null,timeout:p,config:m={},activityLog:b=!1,signal:A=null,sessionId:I,resume:D,forkSession:M,sessionStore:x}=t,C=ae("claude",o),w=Je[C]||C;Je[C]&&C!==w&&c.debug(`Mapped model: ${C} \u2192 ${w}`);let y=[Z("ANTHROPIC_API_KEY"),Z("CLAUDE_CODE_OAUTH_TOKEN"),Z("ANTHROPIC_AUTH_TOKEN")];try{c.debug(`Invoking Claude Agent SDK with model: ${w}, skills: ${JSON.stringify(a)}`);let O=(f,_)=>{let S=String(f??"");return S.length>_?`${S.slice(0,_)}\u2026`:S},k=(f,_)=>{try{console.log(JSON.stringify({mode:f,..._}))}catch{}},L=/secret|token|password|passwd|credential|authorization|bearer|api[-_]?key|private[-_]?key|access[-_]?key/i,U=(f,_=0)=>{if(f==null||_>6||typeof f!="object")return f;let S=Array.isArray(f)?[]:{};for(let[Y,h]of Object.entries(f)){let $=L.test(Y)||Y==="value"&&typeof f.key=="string";S[Y]=$&&typeof h=="string"&&h?"[redacted]":U(h,_+1)}return S},N=f=>{try{if(f==null)return"";let _=U(f),S=typeof _=="string"?_:JSON.stringify(_);return O(String(S).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""}},j=R.env.CLAUDE_CODE_OAUTH_TOKEN,B=R.env.ANTHROPIC_API_KEY,z=R.env.ANTHROPIC_AUTH_TOKEN;R.env.CLAUDE_CODE_CREDENTIALS_JSON?Pt(R.env.CLAUDE_CODE_CREDENTIALS_JSON):j&&Nt(j,R.env.__ZIBBY_CLAUDE_PLAN);let V=R.env.__ZIBBY_CLAUDE_PLAN,g=V?V.charAt(0).toUpperCase()+V.slice(1):null,K;if(j?K=g?`Claude ${g} plan \xB7 ***${j.slice(-4)}`:`Subscription \xB7 ***${j.slice(-4)}`:B?K=`API key \xB7 ***${B.slice(-4)}`:z?K=`Bearer \xB7 ***${z.slice(-4)}`:K="NONE \u2014 request will fail",!b){let f=(await import("chalk")).default;console.log(""),console.log(` ${f.cyan("\u25C6")} ${f.bold(w)}`),console.log(` ${f.dim("Auth: ")}${K}`),console.log(` ${f.dim("Workdir: ")}${n}`),console.log(""),console.log(f.bold("Prompt sent to LLM:")),console.log(f.dim("\u2500".repeat(60))),console.log(f.dim(e)),console.log(f.dim("\u2500".repeat(60)))}let{allowedTools:P,mcpServers:F}=this._resolveSkills(a,{sessionPath:l,workspace:n,nodeName:d});for(let f of t.extraMcpServers||[])if(f&&f.serverName&&f.def){if(Object.prototype.hasOwnProperty.call(F,f.serverName)){console.warn(`[custom-mcp] skip "${f.serverName}" \u2014 a built-in skill already owns that MCP name (no shadowing)`);continue}let _=Q("claude",f.def);_&&(F[f.serverName]=_,P.push(`mcp__${f.serverName}__*`))}try{let f={cwd:n,allowedTools:P,...Array.isArray(t.disallowedTools)&&t.disallowedTools.length?{disallowedTools:t.disallowedTools}:{},settings:{permissions:{allow:["Bash(*)","Read(*)","Write(*)","Edit(*)","MultiEdit(*)","NotebookEdit(*)","Grep(*)","Glob(*)","WebFetch(*)","WebSearch(*)","Task(*)","TodoWrite(*)","Skill(*)"]}},model:w,env:re(R.env),...be&&{pathToClaudeCodeExecutable:be},...Object.keys(F).length>0&&{mcpServers:F},...I&&{sessionId:I},...D&&{resume:D},...M&&{forkSession:!0},...x&&{sessionStore:x}};if(s){let G=typeof s.parse=="function"?te(s):s;f.outputFormat={type:"json_schema",schema:G},c.debug("Structured output enforced via SDK outputFormat")}c.debug(`Agent SDK options: ${JSON.stringify({cwd:f.cwd,toolCount:P.length,permissionMode:f.permissionMode,model:f.model,hasOutputFormat:!!f.outputFormat})}`);let _="",S=0,Y=[];c.debug("Starting Claude Agent SDK query stream");let h=e,$=Array.isArray(i)?i.filter(u=>u&&typeof u.path=="string"&&u.path.startsWith("/")):[];if($.length){let u=$.map((G,T)=>` ${T+1}. ${G.path}${G.name?` (${G.name})`:""}`).join(`
1
+ var Et=Object.defineProperty;var Ot=(r,e,t)=>()=>{if(t)throw t[0];try{return r&&(e=r(r=0)),e}catch(o){throw t=[o],o}};var At=(r,e)=>{for(var t in e)Et(r,t,{get:e[t],enumerable:!0})};var tt={};At(tt,{zodToJson:()=>te});import{z as et}from"zod";import{zodToJsonSchema as vt}from"zod-to-json-schema";function wt(r){if(!r||typeof r!="object")return r;if(Array.isArray(r.type))return r.type.includes("null")||(r.type=[...r.type,"null"]),r;if(typeof r.type=="string")return r.type=[r.type,"null"],r;for(let e of["anyOf","oneOf"])if(Array.isArray(r[e]))return r[e].some(t=>t&&t.type==="null")||(r[e]=[...r[e],{type:"null"}]),r;return{anyOf:[r,{type:"null"}]}}function se(r){if(!r||typeof r!="object")return r;for(let e of["$defs","definitions"])if(r[e]&&typeof r[e]=="object")for(let t of Object.keys(r[e]))r[e][t]=se(r[e][t]);for(let e of["anyOf","oneOf","allOf"])Array.isArray(r[e])&&(r[e]=r[e].map(se));if(r.properties&&typeof r.properties=="object"){r.additionalProperties=!1;let e=Object.keys(r.properties),t=new Set(Array.isArray(r.required)?r.required:[]);for(let o of e){let n=se(r.properties[o]);t.has(o)||(n=wt(n)),r.properties[o]=n}r.required=e}return r.items&&(Array.isArray(r.items)?r.items=r.items.map(se):r.items=se(r.items)),r}function te(r,e={target:"openApi3"}){if(!r)return null;let t=e?.target==="openAi",o=null;if(typeof et?.toJSONSchema=="function")try{o=et.toJSONSchema(r)}catch{}if(!o)try{o=vt(r,e)}catch{return null}if(t&&o)try{return se(o)}catch{return o}return o}var pe=Ot(()=>{});import{registerStrategy as Be}from"@zibby/agent-workflow";import{AgentStrategy as It,getSkill as st,NO_INTEGRATION_TOGGLEABLE_SKILL_IDS as Ct}from"@zibby/agent-workflow";import{query as $t}from"@anthropic-ai/claude-agent-sdk";import bt from"node:process";var Xe=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 re(r=bt.env){let e={},t=new Set(Xe);for(let[o,n]of Object.entries(r))t.has(o)||n!==void 0&&(e[o]=n);return e}function qe(r){return!!r&&(r.transport==="http"||typeof r.url=="string"&&!r.command)}var Tt=new Set(["claude"]);function xt(){let r=String(process.env.MCP_ALWAYS_LOAD??"").trim().toLowerCase();return!(r==="0"||r==="false"||r==="off")}function kt(r,e){return Tt.has(r)?xt()?typeof e.alwaysLoad=="boolean"?{alwaysLoad:e.alwaysLoad}:{}:{}:{}}function Q(r,e,{processEnv:t}={}){if(!e)return null;let o=kt(r,e);if(qe(e)){let s=String(e.url||"").trim();if(!s)return null;let i=e.headers&&typeof e.headers=="object"?e.headers:void 0;switch(r){case"claude":return{type:"http",url:s,...i&&{headers:i},...o};case"codex":return{url:s,...i&&{http_headers:i}};case"gemini":return{url:s,type:"http",...i&&{headers:i}};case"cursor":return{url:s,...i&&{headers:i}};default:return{type:"http",url:s,...i&&{headers:i},...o}}}let n={command:e.command};return e.args?.length&&(n.args=e.args),e.cwd&&(n.cwd=e.cwd),t?n.env={...t,...e.env||{}}:e.env&&Object.keys(e.env).length&&(n.env=e.env),{...n,...o}}function Qe(r){return qe(r)?`http \u2192 ${String(r.url||"").replace(/\?.*$/,"")}`:`${r?.command||"?"} ${(r?.args||[]).join(" ")}`.trim()}pe();import{writeFileSync as Ge,mkdirSync as je,existsSync as le,readFileSync as at}from"fs";import{homedir as lt}from"os";import{join as W}from"path";import me from"chalk";var q={debug:0,info:1,warn:2,error:3,silent:4},Ke=class{constructor(){this._level=this._getLogLevel()}_getLogLevel(){if(process.env.ZIBBY_DEBUG==="true")return q.debug;if(process.env.ZIBBY_VERBOSE==="true")return q.info;let e=process.env.LOG_LEVEL?.toLowerCase();return e&&e in q?q[e]:q.info}_shouldLog(e){return q[e]>=this._level}_formatMessage(e,t,o={}){let n=new Date().toISOString(),i=`${this._getPrefix(e)} ${t}`;return Object.keys(o).length>0&&(i+=me.dim(` ${JSON.stringify(o)}`)),i}_getPrefix(e){return{debug:me.gray("[DEBUG]"),info:me.cyan("[INFO]"),warn:me.yellow("[WARN]"),error:me.red("\u274C [ERROR]")}[e]||""}debug(e,t){this._shouldLog("debug")&&console.log(this._formatMessage("debug",e,t))}info(e,t){this._shouldLog("info")&&console.log(this._formatMessage("info",e,t))}warn(e,t){this._shouldLog("warn")&&console.warn(this._formatMessage("warn",e,t))}error(e,t){this._shouldLog("error")&&console.error(this._formatMessage("error",e,t))}setLevel(e){e in q&&(this._level=q[e])}getLevel(){return Object.keys(q).find(e=>q[e]===this._level)}},c=new Ke;import{timeline as ie,Timeline as vn,WORKFLOW_GRAPH_LOG_MARKER_PREFIX as wn}from"@zibby/agent-workflow";var nt=[{alias:"auto",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4",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:"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,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-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:"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:"gpt-5.6-luna",vendor:"codex",family:"gpt-5",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"},{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:"auto",canonicalId:"gemini-3-pro",vendor:"gemini",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 Oe(r){let e={};for(let t of nt)t.vendor===r&&(e[t.alias]=t.canonicalId);return e}function ae(r,e){let t=typeof e=="string"?e.trim():"";if(t&&t!=="auto")return t;if(t==="auto"&&nt.some(o=>o.vendor===r&&o.isDefault))return"auto";throw new Error(`[${r}] 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={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 Je=Oe("claude"),Ue=Oe("codex"),rt=Oe("gemini"),$n={CURSOR_AGENT_DEFAULT:1200*1e3,OPENAI_REQUEST:18e4};function Z(r){let e=`${r}_POOL`,t=process.env[e];if(!t||typeof t!="string")return{picked:null,count:0,dispose:()=>{}};let o=t.split(/[,\n]+/).map(i=>i.trim()).filter(Boolean);if(o.length===0)return{picked:null,count:0,dispose:()=>{}};let n=o[Math.floor(Math.random()*o.length)],s=process.env[r];return process.env[r]=n,c.debug(`[auth-pool] ${r}: picked 1 of ${o.length} from pool (***${n.slice(-4)})`),{picked:n,count:o.length,dispose(){s===void 0?delete process.env[r]:process.env[r]=s}}}function Ae(r){if(!r||typeof r!="object")return null;let e=(...n)=>{for(let s of n){if(s==null||s==="")continue;let i=Number(s);if(Number.isFinite(i))return i}return null},t=e(r.input_tokens,r.inputTokens,r.prompt_tokens,r.promptTokens),o=e(r.output_tokens,r.outputTokens,r.completion_tokens,r.completionTokens);return t==null&&o==null?null:{input:t||0,output:o||0}}import{createRequire as Nt}from"module";import R from"process";var it=Nt(import.meta.url);function Pt(){try{if(R.env.CLAUDE_CODE_EXECUTABLE&&le(R.env.CLAUDE_CODE_EXECUTABLE))return R.env.CLAUDE_CODE_EXECUTABLE;let r=R.platform,e=R.arch,t=`@anthropic-ai/claude-agent-sdk-${r}-${e}`,o=r==="win32"?"claude.exe":"claude";try{let n=it.resolve(`${t}/package.json`),s=W(n,"..",o);if(le(s))return s}catch{}try{let n=it.resolve("@anthropic-ai/claude-agent-sdk/package.json"),s=W(n,"..");for(let a of[o,W("vendor",o),W("bin",o)]){let l=W(s,a);if(le(l))return l}let i=W(s,"..",`claude-agent-sdk-${r}-${e}`,o);if(le(i))return i}catch{}}catch{}return null}var be=Pt();be&&c.debug(`Claude native CLI resolved to baked binary: ${be}`);var Te=class extends It{constructor(){super("claude","Claude (Anthropic API)",50)}canHandle(e){let t=!!R.env.ANTHROPIC_API_KEY||!!R.env.ANTHROPIC_API_KEY_POOL,o=!!R.env.CLAUDE_CODE_OAUTH_TOKEN||!!R.env.CLAUDE_CODE_OAUTH_TOKEN_POOL,n=!!R.env.ANTHROPIC_AUTH_TOKEN||!!R.env.ANTHROPIC_AUTH_TOKEN_POOL,s=t||o||n;return s||c.debug("ClaudeAgentStrategy: no credentials. Set one of ANTHROPIC_API_KEY / CLAUDE_CODE_OAUTH_TOKEN / ANTHROPIC_AUTH_TOKEN (or a *_POOL variant for multi-token rotation)."),s}async invoke(e,t={}){let{model:o,workspace:n=R.cwd(),schema:s=null,images:i=[],skills:a=null,sessionPath:l=null,nodeName:f=null,timeout:p,config:m={},activityLog:b=!1,signal:A=null,sessionId:I,resume:D,forkSession:L,sessionStore:x}=t,C=ae("claude",o),w=Je[C]||C;Je[C]&&C!==w&&c.debug(`Mapped model: ${C} \u2192 ${w}`);let y=[Z("ANTHROPIC_API_KEY"),Z("CLAUDE_CODE_OAUTH_TOKEN"),Z("ANTHROPIC_AUTH_TOKEN")];try{c.debug(`Invoking Claude Agent SDK with model: ${w}, skills: ${JSON.stringify(a)}`);let O=(d,_)=>{let S=String(d??"");return S.length>_?`${S.slice(0,_)}\u2026`:S},v=(d,_)=>{try{console.log(JSON.stringify({mode:d,..._}))}catch{}},M=/secret|token|password|passwd|credential|authorization|bearer|api[-_]?key|private[-_]?key|access[-_]?key/i,U=(d,_=0)=>{if(d==null||_>6||typeof d!="object")return d;let S=Array.isArray(d)?[]:{};for(let[Y,h]of Object.entries(d)){let $=M.test(Y)||Y==="value"&&typeof d.key=="string";S[Y]=$&&typeof h=="string"&&h?"[redacted]":U(h,_+1)}return S},N=d=>{try{if(d==null)return"";let _=U(d),S=typeof _=="string"?_:JSON.stringify(_);return O(String(S).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""}},j=R.env.CLAUDE_CODE_OAUTH_TOKEN,B=R.env.ANTHROPIC_API_KEY,z=R.env.ANTHROPIC_AUTH_TOKEN;R.env.CLAUDE_CODE_CREDENTIALS_JSON?Rt(R.env.CLAUDE_CODE_CREDENTIALS_JSON):j&&Mt(j,R.env.__ZIBBY_CLAUDE_PLAN);let V=R.env.__ZIBBY_CLAUDE_PLAN,g=V?V.charAt(0).toUpperCase()+V.slice(1):null,K;if(j?K=g?`Claude ${g} plan \xB7 ***${j.slice(-4)}`:`Subscription \xB7 ***${j.slice(-4)}`:B?K=`API key \xB7 ***${B.slice(-4)}`:z?K=`Bearer \xB7 ***${z.slice(-4)}`:K="NONE \u2014 request will fail",!b){let d=(await import("chalk")).default;console.log(""),console.log(` ${d.cyan("\u25C6")} ${d.bold(w)}`),console.log(` ${d.dim("Auth: ")}${K}`),console.log(` ${d.dim("Workdir: ")}${n}`),console.log(""),console.log(d.bold("Prompt sent to LLM:")),console.log(d.dim("\u2500".repeat(60))),console.log(d.dim(e)),console.log(d.dim("\u2500".repeat(60)))}let{allowedTools:P,mcpServers:F}=this._resolveSkills(a,{sessionPath:l,workspace:n,nodeName:f});for(let d of t.extraMcpServers||[])if(d&&d.serverName&&d.def){if(Object.prototype.hasOwnProperty.call(F,d.serverName)){console.warn(`[custom-mcp] skip "${d.serverName}" \u2014 a built-in skill already owns that MCP name (no shadowing)`);continue}let _=Q("claude",d.def);_&&(F[d.serverName]=_,P.push(`mcp__${d.serverName}__*`))}try{let d={cwd:n,allowedTools:P,...Array.isArray(t.disallowedTools)&&t.disallowedTools.length?{disallowedTools:t.disallowedTools}:{},settings:{permissions:{allow:["Bash(*)","Read(*)","Write(*)","Edit(*)","MultiEdit(*)","NotebookEdit(*)","Grep(*)","Glob(*)","WebFetch(*)","WebSearch(*)","Task(*)","TodoWrite(*)","Skill(*)"]}},model:w,env:re(R.env),...be&&{pathToClaudeCodeExecutable:be},...Object.keys(F).length>0&&{mcpServers:F},...I&&{sessionId:I},...D&&{resume:D},...L&&{forkSession:!0},...x&&{sessionStore:x}};if(s){let G=typeof s.parse=="function"?te(s):s;d.outputFormat={type:"json_schema",schema:G},c.debug("Structured output enforced via SDK outputFormat")}c.debug(`Agent SDK options: ${JSON.stringify({cwd:d.cwd,toolCount:P.length,permissionMode:d.permissionMode,model:d.model,hasOutputFormat:!!d.outputFormat})}`);let _="",S=0,Y=[];c.debug("Starting Claude Agent SDK query stream");let h=e,$=Array.isArray(i)?i.filter(u=>u&&typeof u.path=="string"&&u.path.startsWith("/")):[];if($.length){let u=$.map((G,T)=>` ${T+1}. ${G.path}${G.name?` (${G.name})`:""}`).join(`
2
2
  `);h=`${e}
3
3
 
4
4
  # Attached image files \u2014 VIEW THESE
5
5
  The user attached ${$.length} image(s), saved locally. Use the Read tool on each path to SEE the image, then use what it shows to answer:
6
- ${u}`}let H;try{H=wt({prompt:h,options:f})}catch(u){throw c.error(`Failed to initialize Claude Agent SDK: ${u.message}`),u}let X=null,ee=0,Ee=3;if(A?.aborted){let u=new Error("Aborted via signal");throw u.name="AbortError",u}try{for await(let u of H){if(A?.aborted){let T=new Error("Aborted via signal");throw T.name="AbortError",T}if(Y.push(u),u.type==="system"&&u.subtype==="init"){let T=u.mcp_servers||[];if(T.length>0){let E=T.map(v=>`${v.name}=${v.status}${v.error?` (${String(v.error).slice(0,120)})`:""}`).join(", ");c.info(`[mcp] SDK init \u2014 ${T.length} server(s): ${E}`);for(let v of T)v.status!=="connected"&&c.warn(`[mcp] server '${v.name}' did not connect: status=${v.status}`,{name:v.name,status:v.status,error:v.error})}else Object.keys(F||{}).length>0&&c.warn(`[mcp] SDK init returned no mcp_servers despite passing ${Object.keys(F).length} server(s) \u2014 SDK version may not expose this field, or config was dropped`);if(Array.isArray(u.tools)){let E=u.tools.filter(v=>v.startsWith("mcp__"));E.length>0?c.info(`[mcp] tools visible to model: ${E.join(", ")}`):Object.keys(F||{}).length>0&&c.warn("[mcp] no mcp__* tools in model's tool list \u2014 MCP servers configured but tools didn't reach the prompt")}}if(u.type==="system"&&u.subtype==="api_retry"){let T=Number(u.attempt)||0,E=Number(u.max_retries)||0,v=u.error_status!=null?String(u.error_status):"?",J=typeof u.error=="string"?u.error:"error",oe=Number.isFinite(u.retry_delay_ms)?Math.round(u.retry_delay_ms):null,We=`upstream ${v} (${J}) \u2014 SDK retry ${T}/${E}`+(oe!=null?` in ${oe}ms`:"");b&&k("turn:retry",{status:v,kind:J,attempt:T,maxRetries:E,delayMs:oe,detail:We}),c.warn(`[claude] transient ${We}`);continue}if(u.type==="error"||u.error){let T=u.error?.message||u.error||u.message||"Unknown API error";try{c.error("SDK error event raw payload",{fullMessage:JSON.stringify(u,null,2)})}catch{}throw new Error(typeof T=="string"?T:JSON.stringify(T))}let G=JSON.stringify(u.message?.content||u.text||"").slice(0,200);if(G===X){if(ee++,ee>=Ee){let T=(u.message?.content?.[0]?.text||u.text||"unknown").slice(0,100);throw new Error(`API stuck in loop (${ee}x repeated): ${T}`)}}else X=G,ee=1;if(u.type==="assistant"||u.constructor?.name==="AssistantMessage"){let T=u.message?.content||u.content||[];for(let E of T)if(E.type==="thinking"&&E.thinking)b?k("turn:thinking",{text:O(E.thinking,600)}):console.log(`${E.thinking.substring(0,200)}${E.thinking.length>200?"...":""}`);else if(E.type==="text"&&E.text)_+=E.text,b||(E.text.length<500?console.log(`${E.text}`):console.log(`${E.text.substring(0,200)}... (${E.text.length} chars)`));else if(E.type==="tool_use")if(S++,E.name.includes("memory")?ie.stepMemory(`Tool: ${E.name}`):ie.stepTool(`Tool: ${E.name}`),b){let J=N(E.input);k("turn:tool",{name:E.name,...J?{input:J}:{}})}else{let J=JSON.stringify(E.input).substring(0,100);console.log(` Input: ${J}${JSON.stringify(E.input).length>100?"...":""}`)}}else if(!(u.type==="user"&&u.tool_use_result)){if(u.type==="result"||u.constructor?.name==="ResultMessage"){let T=u.result||u.text||u.content||_;try{$t({message:u,sessionPath:l,nodeName:d,model:C,toolCallCount:S})}catch(v){c.debug(`usage.json write failed: ${v.message}`)}let E=Ae(u?.usage||u?.message?.usage);if(s){if(u.structured_output){c.debug("Using SDK native structured_output");let J=typeof s.parse=="function"?s.parse(u.structured_output):u.structured_output;return{raw:T,structured:J,...E?{usage:E}:{},toolUseCount:S}}if(T){let v=this._extractJson(T,s);if(v)return{raw:T,structured:v,...E?{usage:E}:{},toolUseCount:S}}c.warn(`Could not extract structured output \u2014 returning raw text (${(T||"").length} chars)`)}return T||""}}}if(c.warn(`Agent SDK ended without result. Collected ${Y.length} messages`),_.length>0)return c.debug("Returning accumulated text from messages"),_;throw new Error("Claude Agent SDK query ended without result")}catch(u){let G={message:u?.message,name:u?.name,code:u?.code,cause:u?.cause?.message||u?.cause,stack:u?.stack?.split(`
6
+ ${u}`}let H;try{H=$t({prompt:h,options:d})}catch(u){throw c.error(`Failed to initialize Claude Agent SDK: ${u.message}`),u}let X=null,ee=0,Ee=3;if(A?.aborted){let u=new Error("Aborted via signal");throw u.name="AbortError",u}try{for await(let u of H){if(A?.aborted){let T=new Error("Aborted via signal");throw T.name="AbortError",T}if(Y.push(u),u.type==="system"&&u.subtype==="init"){let T=u.mcp_servers||[];if(T.length>0){let E=T.map(k=>`${k.name}=${k.status}${k.error?` (${String(k.error).slice(0,120)})`:""}`).join(", ");c.info(`[mcp] SDK init \u2014 ${T.length} server(s): ${E}`);for(let k of T)k.status!=="connected"&&c.warn(`[mcp] server '${k.name}' did not connect: status=${k.status}`,{name:k.name,status:k.status,error:k.error})}else Object.keys(F||{}).length>0&&c.warn(`[mcp] SDK init returned no mcp_servers despite passing ${Object.keys(F).length} server(s) \u2014 SDK version may not expose this field, or config was dropped`);if(Array.isArray(u.tools)){let E=u.tools.filter(k=>k.startsWith("mcp__"));E.length>0?c.info(`[mcp] tools visible to model: ${E.join(", ")}`):Object.keys(F||{}).length>0&&c.warn("[mcp] no mcp__* tools in model's tool list \u2014 MCP servers configured but tools didn't reach the prompt")}}if(u.type==="system"&&u.subtype==="api_retry"){let T=Number(u.attempt)||0,E=Number(u.max_retries)||0,k=u.error_status!=null?String(u.error_status):"?",J=typeof u.error=="string"?u.error:"error",oe=Number.isFinite(u.retry_delay_ms)?Math.round(u.retry_delay_ms):null,We=`upstream ${k} (${J}) \u2014 SDK retry ${T}/${E}`+(oe!=null?` in ${oe}ms`:"");b&&v("turn:retry",{status:k,kind:J,attempt:T,maxRetries:E,delayMs:oe,detail:We}),c.warn(`[claude] transient ${We}`);continue}if(u.type==="error"||u.error){let T=u.error?.message||u.error||u.message||"Unknown API error";try{c.error("SDK error event raw payload",{fullMessage:JSON.stringify(u,null,2)})}catch{}throw new Error(typeof T=="string"?T:JSON.stringify(T))}let G=JSON.stringify(u.message?.content||u.text||"").slice(0,200);if(G===X){if(ee++,ee>=Ee){let T=(u.message?.content?.[0]?.text||u.text||"unknown").slice(0,100);throw new Error(`API stuck in loop (${ee}x repeated): ${T}`)}}else X=G,ee=1;if(u.type==="assistant"||u.constructor?.name==="AssistantMessage"){let T=u.message?.content||u.content||[];for(let E of T)if(E.type==="thinking"&&E.thinking)b?v("turn:thinking",{text:O(E.thinking,600)}):console.log(`${E.thinking.substring(0,200)}${E.thinking.length>200?"...":""}`);else if(E.type==="text"&&E.text)_+=E.text,b||(E.text.length<500?console.log(`${E.text}`):console.log(`${E.text.substring(0,200)}... (${E.text.length} chars)`));else if(E.type==="tool_use")if(S++,E.name.includes("memory")?ie.stepMemory(`Tool: ${E.name}`):ie.stepTool(`Tool: ${E.name}`),b){let J=N(E.input);v("turn:tool",{name:E.name,...J?{input:J}:{}})}else{let J=JSON.stringify(E.input).substring(0,100);console.log(` Input: ${J}${JSON.stringify(E.input).length>100?"...":""}`)}}else if(!(u.type==="user"&&u.tool_use_result)){if(u.type==="result"||u.constructor?.name==="ResultMessage"){let T=u.result||u.text||u.content||_;try{Lt({message:u,sessionPath:l,nodeName:f,model:C,toolCallCount:S})}catch(k){c.debug(`usage.json write failed: ${k.message}`)}let E=Ae(u?.usage||u?.message?.usage);if(s){if(u.structured_output){c.debug("Using SDK native structured_output");let J=typeof s.parse=="function"?s.parse(u.structured_output):u.structured_output;return{raw:T,structured:J,...E?{usage:E}:{},toolUseCount:S}}if(T){let k=this._extractJson(T,s);if(k)return{raw:T,structured:k,...E?{usage:E}:{},toolUseCount:S}}c.warn(`Could not extract structured output \u2014 returning raw text (${(T||"").length} chars)`)}return T||""}}}if(c.warn(`Agent SDK ended without result. Collected ${Y.length} messages`),_.length>0)return c.debug("Returning accumulated text from messages"),_;throw new Error("Claude Agent SDK query ended without result")}catch(u){let G={message:u?.message,name:u?.name,code:u?.code,cause:u?.cause?.message||u?.cause,stack:u?.stack?.split(`
7
7
  `).slice(0,5).join(`
8
- `),stringified:(()=>{try{return JSON.stringify(u,Object.getOwnPropertyNames(Object(u)))}catch{return String(u)}})()};throw c.error(`Error during query stream: ${u?.message||u}`,G),u}}catch(f){throw c.error("Claude Agent SDK call failed",{message:f?.message,name:f?.name,code:f?.code,cause:f?.cause?.message||f?.cause}),f}}finally{for(let O of y)O.dispose()}}_resolveSkills(e,t){let o=["Read","Write","Edit","Bash","Grep","Glob"];if(e===null)return c.debug("No skills \u2014 pure LLM mode"),{allowedTools:[],mcpServers:{}};if(!Array.isArray(e)||e.length===0)return c.debug("Default IDE skills for code generation"),{allowedTools:[...o],mcpServers:{}};let n=[...o],s={},i=R.env.WORKFLOW_ENABLED_INTEGRATIONS,a=typeof i=="string"&&i.trim()!==""?new Set(i.split(",").map(p=>p.trim()).filter(Boolean)):null,l=p=>{let m=st(p);return m?.meta?.toggleable===!0?!0:m?.meta?.toggleable===void 0&&kt.includes(p)},d=p=>a!==null&&a.size>0&&l(p)&&!a.has(p);for(let p of e){if(d(p)){c.debug(`Skill "${p}" disabled by enabledIntegrations allowlist \u2014 skipping`);continue}let m=st(p);if(!m){c.warn(`Unknown skill "${p}" \u2014 skipping`);continue}if(m.allowedTools&&n.push(...m.allowedTools),typeof m.resolve=="function"){let b=m.resolve(t),A=Q("claude",b);A&&(s[m.serverName]=A,c.debug(`MCP: ${m.serverName} \u2192 ${Qe(b)}`))}}return{allowedTools:n,mcpServers:s}}_extractJson(e,t){let o=[()=>{if(e.includes("===JSON_START===")){let n=e.indexOf("===JSON_START===")+16,s=e.indexOf("===JSON_END===");return e.substring(n,s).trim()}},()=>e.match(/```json\s*\n([\s\S]*?)\n```/)?.[1]?.trim(),()=>{if(!e.startsWith("{"))return e.match(/```\s*\n([\s\S]*?)\n```/)?.[1]?.trim()},()=>e.trim(),()=>{let n=e.indexOf("{"),s=e.lastIndexOf("}");if(n!==-1&&s>n)return e.substring(n,s+1)}];for(let n of o)try{let s=n();if(!s)continue;let i=JSON.parse(s);if(typeof i!="object"||i===null)continue;return typeof t.parse=="function"?t.parse(i):i}catch{}return null}};function $t({message:r,sessionPath:e,nodeName:t,model:o,toolCallCount:n}){if(!e||!t)return;let s=r?.usage||r?.message?.usage||{},i=ge(s.input_tokens,s.inputTokens),a=ge(s.output_tokens,s.outputTokens),l=ge(s.cache_read_input_tokens,s.cacheReadInputTokens),d=ge(s.cache_creation_input_tokens,s.cacheCreationInputTokens),p=ge(r?.duration_ms,r?.durationMs),m={model:o||null,input_tokens:i,output_tokens:a,cache_read_tokens:l,cache_creation_tokens:d,tool_call_count:typeof n=="number"?n:null,duration_ms:p,captured_at:new Date().toISOString()},b=W(e,t);try{je(b,{recursive:!0})}catch{}Ge(W(b,"usage.json"),JSON.stringify(m,null,2),"utf-8")}function ge(...r){for(let e of r){if(typeof e=="number"&&Number.isFinite(e))return e;if(typeof e=="string"&&e.trim()!==""&&!isNaN(Number(e)))return Number(e)}return null}function Nt(r,e){let t=W(lt(),".claude"),o=W(t,".credentials.json"),n={claudeAiOauth:{accessToken:r,refreshToken:"",expiresAt:Date.now()+365*24*60*60*1e3,scopes:["user:inference","user:profile"],...e?{subscriptionType:String(e).toLowerCase()}:{}}};try{if(le(o)&&JSON.parse(at(o,"utf-8"))?.claudeAiOauth?.accessToken===r)return;je(t,{recursive:!0}),Ge(o,JSON.stringify(n,null,2),"utf-8"),c.debug(`Wrote Claude Code OAuth credentials to ${o}`)}catch(s){c.warn(`Could not write ${o}: ${s.message} \u2014 Claude SDK may fail to authenticate.`)}}function Pt(r){let e=W(lt(),".claude"),t=W(e,".credentials.json"),o;try{o=JSON.parse(r)}catch(n){c.warn(`CLAUDE_CODE_CREDENTIALS_JSON not valid JSON: ${n.message}`);return}if(!o?.claudeAiOauth?.accessToken){c.warn("CLAUDE_CODE_CREDENTIALS_JSON missing claudeAiOauth.accessToken \u2014 skipping write.");return}try{if(le(t)){let n=JSON.parse(at(t,"utf-8"));if(n?.claudeAiOauth?.accessToken===o.claudeAiOauth.accessToken&&n?.claudeAiOauth?.expiresAt===o.claudeAiOauth.expiresAt)return}je(e,{recursive:!0}),Ge(t,JSON.stringify(o,null,2),"utf-8"),c.debug(`Wrote full Claude Code credentials blob to ${t}`)}catch(n){c.warn(`Could not write ${t}: ${n.message} \u2014 Claude SDK may fail to authenticate.`)}}import{AgentStrategy as Mt,getSkill as Lt}from"@zibby/agent-workflow";pe();import{execSync as he}from"node:child_process";import{readFileSync as Rt,mkdirSync as Ye,cpSync as Dt,existsSync as Bt}from"node:fs";import{join as ye}from"node:path";import{homedir as Kt}from"node:os";function ze(r){if(Array.isArray(r))return r.map(ze);if(r&&typeof r=="object"){let e={};for(let[t,o]of Object.entries(r))o!==null&&(e[t]=ze(o));return e}return r}var xe=class extends Mt{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 c.debug("CodexAgentStrategy: OPENAI_API_KEY or CODEX_API_KEY not set"),!1;try{return he("codex --version",{encoding:"utf-8",timeout:5e3,stdio:"pipe"}),!0}catch{return c.warn("[Codex] codex CLI not found. Install: npm install -g @openai/codex"),!1}}async invoke(e,t={}){let{model:o,workspace:n=process.cwd(),schema:s=null,images:i=[],skills:a=null,plugins:l=null,sessionPath:d=null,nodeName:p=null,timeout:m,config:b={},signal:A=null}=t,I=[Z("OPENAI_API_KEY"),Z("CODEX_API_KEY")];try{let{Codex:D}=await import("@openai/codex-sdk"),M=ae("codex",o),x=Ue[M]||M;Ue[M]&&M!==x&&c.debug(`Mapped model: ${M} \u2192 ${x}`),c.debug(`Invoking Codex SDK with model: ${x}, skills: ${JSON.stringify(a)}`);let C=process.env.CODEX_API_KEY||process.env.OPENAI_API_KEY;C&&!process.env.CODEX_API_KEY&&(process.env.CODEX_API_KEY=C);let w=C?` | key: ***${C.slice(-4)}`:" | key: not set";if(console.log(`
8
+ `),stringified:(()=>{try{return JSON.stringify(u,Object.getOwnPropertyNames(Object(u)))}catch{return String(u)}})()};throw c.error(`Error during query stream: ${u?.message||u}`,G),u}}catch(d){throw c.error("Claude Agent SDK call failed",{message:d?.message,name:d?.name,code:d?.code,cause:d?.cause?.message||d?.cause}),d}}finally{for(let O of y)O.dispose()}}_resolveSkills(e,t){let o=["Read","Write","Edit","Bash","Grep","Glob"];if(e===null)return c.debug("No skills \u2014 pure LLM mode"),{allowedTools:[],mcpServers:{}};if(!Array.isArray(e)||e.length===0)return c.debug("Default IDE skills for code generation"),{allowedTools:[...o],mcpServers:{}};let n=[...o],s={},i=R.env.WORKFLOW_ENABLED_INTEGRATIONS,a=typeof i=="string"&&i.trim()!==""?new Set(i.split(",").map(p=>p.trim()).filter(Boolean)):null,l=p=>{let m=st(p);return m?.meta?.toggleable===!0?!0:m?.meta?.toggleable===void 0&&Ct.includes(p)},f=p=>a!==null&&a.size>0&&l(p)&&!a.has(p);for(let p of e){if(f(p)){c.debug(`Skill "${p}" disabled by enabledIntegrations allowlist \u2014 skipping`);continue}let m=st(p);if(!m){c.warn(`Unknown skill "${p}" \u2014 skipping`);continue}if(m.allowedTools&&n.push(...m.allowedTools),typeof m.resolve=="function"){let b=m.resolve(t),A=Q("claude",b);A&&(s[m.serverName]=A,c.debug(`MCP: ${m.serverName} \u2192 ${Qe(b)}`))}}return{allowedTools:n,mcpServers:s}}_extractJson(e,t){let o=[()=>{if(e.includes("===JSON_START===")){let n=e.indexOf("===JSON_START===")+16,s=e.indexOf("===JSON_END===");return e.substring(n,s).trim()}},()=>e.match(/```json\s*\n([\s\S]*?)\n```/)?.[1]?.trim(),()=>{if(!e.startsWith("{"))return e.match(/```\s*\n([\s\S]*?)\n```/)?.[1]?.trim()},()=>e.trim(),()=>{let n=e.indexOf("{"),s=e.lastIndexOf("}");if(n!==-1&&s>n)return e.substring(n,s+1)}];for(let n of o)try{let s=n();if(!s)continue;let i=JSON.parse(s);if(typeof i!="object"||i===null)continue;return typeof t.parse=="function"?t.parse(i):i}catch{}return null}};function Lt({message:r,sessionPath:e,nodeName:t,model:o,toolCallCount:n}){if(!e||!t)return;let s=r?.usage||r?.message?.usage||{},i=ge(s.input_tokens,s.inputTokens),a=ge(s.output_tokens,s.outputTokens),l=ge(s.cache_read_input_tokens,s.cacheReadInputTokens),f=ge(s.cache_creation_input_tokens,s.cacheCreationInputTokens),p=ge(r?.duration_ms,r?.durationMs),m={model:o||null,input_tokens:i,output_tokens:a,cache_read_tokens:l,cache_creation_tokens:f,tool_call_count:typeof n=="number"?n:null,duration_ms:p,captured_at:new Date().toISOString()},b=W(e,t);try{je(b,{recursive:!0})}catch{}Ge(W(b,"usage.json"),JSON.stringify(m,null,2),"utf-8")}function ge(...r){for(let e of r){if(typeof e=="number"&&Number.isFinite(e))return e;if(typeof e=="string"&&e.trim()!==""&&!isNaN(Number(e)))return Number(e)}return null}function Mt(r,e){let t=W(lt(),".claude"),o=W(t,".credentials.json"),n={claudeAiOauth:{accessToken:r,refreshToken:"",expiresAt:Date.now()+365*24*60*60*1e3,scopes:["user:inference","user:profile"],...e?{subscriptionType:String(e).toLowerCase()}:{}}};try{if(le(o)&&JSON.parse(at(o,"utf-8"))?.claudeAiOauth?.accessToken===r)return;je(t,{recursive:!0}),Ge(o,JSON.stringify(n,null,2),"utf-8"),c.debug(`Wrote Claude Code OAuth credentials to ${o}`)}catch(s){c.warn(`Could not write ${o}: ${s.message} \u2014 Claude SDK may fail to authenticate.`)}}function Rt(r){let e=W(lt(),".claude"),t=W(e,".credentials.json"),o;try{o=JSON.parse(r)}catch(n){c.warn(`CLAUDE_CODE_CREDENTIALS_JSON not valid JSON: ${n.message}`);return}if(!o?.claudeAiOauth?.accessToken){c.warn("CLAUDE_CODE_CREDENTIALS_JSON missing claudeAiOauth.accessToken \u2014 skipping write.");return}try{if(le(t)){let n=JSON.parse(at(t,"utf-8"));if(n?.claudeAiOauth?.accessToken===o.claudeAiOauth.accessToken&&n?.claudeAiOauth?.expiresAt===o.claudeAiOauth.expiresAt)return}je(e,{recursive:!0}),Ge(t,JSON.stringify(o,null,2),"utf-8"),c.debug(`Wrote full Claude Code credentials blob to ${t}`)}catch(n){c.warn(`Could not write ${t}: ${n.message} \u2014 Claude SDK may fail to authenticate.`)}}import{AgentStrategy as Dt,getSkill as Bt}from"@zibby/agent-workflow";pe();import{execSync as he}from"node:child_process";import{readFileSync as Kt,mkdirSync as Ye,cpSync as Jt,existsSync as Ut}from"node:fs";import{join as ye}from"node:path";import{homedir as Gt}from"node:os";function ze(r){if(Array.isArray(r))return r.map(ze);if(r&&typeof r=="object"){let e={};for(let[t,o]of Object.entries(r))o!==null&&(e[t]=ze(o));return e}return r}var xe=class extends Dt{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 c.debug("CodexAgentStrategy: OPENAI_API_KEY or CODEX_API_KEY not set"),!1;try{return he("codex --version",{encoding:"utf-8",timeout:5e3,stdio:"pipe"}),!0}catch{return c.warn("[Codex] codex CLI not found. Install: npm install -g @openai/codex"),!1}}async invoke(e,t={}){let{model:o,workspace:n=process.cwd(),schema:s=null,images:i=[],skills:a=null,plugins:l=null,sessionPath:f=null,nodeName:p=null,timeout:m,config:b={},signal:A=null}=t,I=[Z("OPENAI_API_KEY"),Z("CODEX_API_KEY")];try{let{Codex:D}=await import("@openai/codex-sdk"),L=ae("codex",o),x=Ue[L]||L;Ue[L]&&L!==x&&c.debug(`Mapped model: ${L} \u2192 ${x}`),c.debug(`Invoking Codex SDK with model: ${x}, skills: ${JSON.stringify(a)}`);let C=process.env.CODEX_API_KEY||process.env.OPENAI_API_KEY;C&&!process.env.CODEX_API_KEY&&(process.env.CODEX_API_KEY=C);let w=C?` | key: ***${C.slice(-4)}`:" | key: not set";if(console.log(`
9
9
  \u25C6 Model: ${x}${w}
10
- `),Array.isArray(l)&&l.length>0){let g=this._resolveCodexHome(d);process.env.CODEX_HOME=g;try{Ye(g,{recursive:!0})}catch{}this._ensurePlugins(l,g)}let y=(await import("chalk")).default;console.log(`
11
- ${y.bold("Prompt sent to LLM:")}`),console.log(y.dim("\u2500".repeat(60))),console.log(y.dim(e)),console.log(y.dim("\u2500".repeat(60)));let O=this._resolveSkillsToMcp(a,{sessionPath:d,workspace:n,nodeName:p});for(let g of t.extraMcpServers||[])if(g&&g.serverName&&g.def){if(Object.prototype.hasOwnProperty.call(O,g.serverName)){console.warn(`[custom-mcp] skip "${g.serverName}" \u2014 a built-in skill already owns that MCP name (no shadowing)`);continue}let K=Q("codex",g.def);K&&(O[g.serverName]=K)}let k={};Object.keys(O).length>0&&(k.mcp_servers=O,Object.values(O).some(g=>g&&typeof g.url=="string")&&(k.experimental_use_rmcp_client=!0),c.debug(`[Codex] MCP servers: ${Object.keys(O).join(", ")}`));let L=this._resolveCodexBin(),U=new D({...L?{codexPathOverride:L}:{},...Object.keys(k).length>0&&{config:k},env:re(process.env)}),N=n;try{N&&Ye(N,{recursive:!0})}catch{}(!N||!Bt(N))&&(N=process.cwd());let j=U.startThread({workingDirectory:N,skipGitRepoCheck:!0,approvalPolicy:"never",sandboxMode:"danger-full-access",networkAccessEnabled:!0}),B=s&&typeof s.parse=="function",z={};if(s)try{let g=B?te(s,{target:"openAi"}):s;z.outputSchema=g,c.debug("Structured output via SDK outputSchema")}catch(g){c.warn(`[Codex] Schema conversion failed, will extract from text: ${g.message}`)}let V=Array.isArray(i)?i.filter(g=>g&&typeof g.path=="string"&&g.path.startsWith("/")):[];if(V.length&&(e=`${e}
10
+ `),Array.isArray(l)&&l.length>0){let g=this._resolveCodexHome(f);process.env.CODEX_HOME=g;try{Ye(g,{recursive:!0})}catch{}this._ensurePlugins(l,g)}let y=(await import("chalk")).default;console.log(`
11
+ ${y.bold("Prompt sent to LLM:")}`),console.log(y.dim("\u2500".repeat(60))),console.log(y.dim(e)),console.log(y.dim("\u2500".repeat(60)));let O=this._resolveSkillsToMcp(a,{sessionPath:f,workspace:n,nodeName:p});for(let g of t.extraMcpServers||[])if(g&&g.serverName&&g.def){if(Object.prototype.hasOwnProperty.call(O,g.serverName)){console.warn(`[custom-mcp] skip "${g.serverName}" \u2014 a built-in skill already owns that MCP name (no shadowing)`);continue}let K=Q("codex",g.def);K&&(O[g.serverName]=K)}let v={};Object.keys(O).length>0&&(v.mcp_servers=O,Object.values(O).some(g=>g&&typeof g.url=="string")&&(v.experimental_use_rmcp_client=!0),c.debug(`[Codex] MCP servers: ${Object.keys(O).join(", ")}`));let M=this._resolveCodexBin(),U=new D({...M?{codexPathOverride:M}:{},...Object.keys(v).length>0&&{config:v},env:re(process.env)}),N=n;try{N&&Ye(N,{recursive:!0})}catch{}(!N||!Ut(N))&&(N=process.cwd());let j=U.startThread({workingDirectory:N,skipGitRepoCheck:!0,approvalPolicy:"never",sandboxMode:"danger-full-access",networkAccessEnabled:!0}),B=s&&typeof s.parse=="function",z={};if(s)try{let g=B?te(s,{target:"openAi"}):s;z.outputSchema=g,c.debug("Structured output via SDK outputSchema")}catch(g){c.warn(`[Codex] Schema conversion failed, will extract from text: ${g.message}`)}let V=Array.isArray(i)?i.filter(g=>g&&typeof g.path=="string"&&g.path.startsWith("/")):[];if(V.length&&(e=`${e}
12
12
 
13
13
  # Attached image files \u2014 VIEW THESE
14
14
  The user attached ${V.length} image(s), saved locally. Read each path to SEE the image, then use what it shows to answer:
15
15
  ${V.map((g,K)=>` ${K+1}. ${g.path}${g.name?` (${g.name})`:""}`).join(`
16
- `)}`),A?.aborted){let g=new Error("Aborted via signal");throw g.name="AbortError",g}try{let{events:g}=await j.runStreamed(e,z),K=0,P="",F=null;for await(let f of g){if(A?.aborted){let S=new Error("Aborted via signal");throw S.name="AbortError",S}let _=f.type;if(_==="item.completed"){let S=f.item,Y=S?.type;if(Y==="mcp_tool_call"){K++;let h=`${S.server}/${S.tool}`;if(ie.stepTool(`Tool: ${h}`),S.arguments){let $=JSON.stringify(S.arguments),H=$.length>100?`${$.substring(0,100)}...`:$;console.log(` Input: ${H}`)}}else if(Y==="tool_call"||Y==="function_call"||Y==="command_execution"){K++;let h=S.name||S.tool||S.command||"unknown";ie.stepTool(`Tool: ${h}`)}else Y==="agent_message"&&(P=S.text||"",P.length<500?console.log(P):console.log(`${P.substring(0,200)}... (${P.length} chars)`))}else _==="turn.completed"?(c.debug(`[Codex] Turn completed. Usage: ${JSON.stringify(f.usage||{})}`),f.usage&&(F=f.usage)):c.debug(`[Codex] Event: ${_} ${JSON.stringify(f).slice(0,300)}`)}if(c.debug(`[Codex] Last agent message (${P.length} chars): ${P.slice(0,500)}`),s){if(!P)throw new Error("Codex agent returned no response");let f=JSON.parse(P),_=f;if(B)try{_=s.parse(f)}catch{_=s.parse(ze(f))}c.debug("\u2705 [Codex] Structured output validated");let S=Ae(F);return{raw:P,structured:_,...S?{usage:S}:{}}}return P||""}catch(g){let K=g.message||String(g);throw c.error(`\u274C [Codex] SDK call failed: ${K}`),K.includes("exited with code")&&(z.outputSchema&&c.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."),c.error("\u{1F4A1} [Codex] Verify: codex --version && echo $OPENAI_API_KEY"),c.error("\u{1F4A1} [Codex] If codex is missing: npm install -g @openai/codex")),g}}finally{for(let D of I)D.dispose()}}_resolveSkillsToMcp(e,t={}){if(!Array.isArray(e)||e.length===0)return{};let o={};for(let n of e){let s=Lt(n);if(!s){c.warn(`[Codex] Unknown skill "${n}" \u2014 skipping`);continue}if(typeof s.resolve!="function")continue;let i=s.resolve(t);if(!i)continue;let a=s.serverName||n,l=Q("codex",i,{processEnv:process.env});l&&(o[a]=l,c.debug(`[Codex] MCP: ${a} \u2192 ${i.command} ${(i.args||[]).join(" ")}`))}return o}_resolveCodexHome(e){return process.env.CODEX_HOME?process.env.CODEX_HOME:e&&!this._isTempPath(e)?ye(e,".codex-home"):ye(Kt(),".codex")}_isTempPath(e){let t=String(process.env.TMPDIR||"/tmp").replace(/\/+$/,""),o=String(e||"");return o==="/tmp"||o.startsWith("/tmp/")||o===t||o.startsWith(t+"/")}_resolveCodexBin(){if(process.env.CODEX_BIN)return process.env.CODEX_BIN;try{return he("command -v codex",{encoding:"utf-8",timeout:5e3,stdio:["ignore","pipe","ignore"]}).trim()||void 0}catch{return}}_ensurePlugins(e,t){let o={...process.env,CODEX_HOME:t};for(let n of e){let s=typeof n=="string"?n:n?.name,i=n&&typeof n=="object"?n.marketplacePath:null;if(!s||!i){c.warn(`[Codex][plugins] skipping malformed plugin declaration: ${JSON.stringify(n)} (need { name, marketplacePath })`);continue}let a=this._readMarketplaceName(i),l=`${s}@${a}`;if(this._isPluginInstalled(l,o)){c.info(`[Codex][plugins] ${l} already installed \u2014 skipping (idempotent)`),console.log(`\u25C6 [Codex] plugin ${l} already installed \u2014 skip`);continue}let d=this._safeMarketplacePath(i,t);c.info(`[Codex][plugins] installing ${l} from local marketplace ${d}`),console.log(`\u25C6 [Codex] installing plugin ${l} (local, no network)`);try{he(`codex plugin marketplace add ${JSON.stringify(d)}`,{env:o,stdio:"pipe",timeout:6e4,encoding:"utf-8"}),he(`codex plugin add ${JSON.stringify(l)}`,{env:o,stdio:"pipe",timeout:6e4,encoding:"utf-8"}),console.log(`\u25C6 [Codex] plugin ${l} installed`)}catch(p){let m=p.stderr&&p.stderr.toString()||p.message||String(p);throw c.error(`[Codex][plugins] failed to install ${l}: ${m}`),new Error(`Codex plugin install failed for ${l}: ${m}`)}}}_safeMarketplacePath(e,t){if(!String(e).includes("@"))return e;let o=ye(t,".zibby-mkt",String(e).replace(/[^a-zA-Z0-9]+/g,"_"));try{return Ye(ye(t,".zibby-mkt"),{recursive:!0}),Dt(e,o,{recursive:!0}),o}catch(n){return c.warn(`[Codex][plugins] could not copy @-containing marketplace to a safe path: ${n.message}`),e}}_readMarketplaceName(e){let t=ye(e,".agents","plugins","marketplace.json"),o;try{o=JSON.parse(Rt(t,"utf-8"))}catch(n){throw new Error(`Codex plugin marketplace manifest missing/unreadable at ${t}: ${n.message}`)}if(!o?.name||typeof o.name!="string")throw new Error(`Codex plugin marketplace manifest at ${t} has no string "name"`);return o.name}_isPluginInstalled(e,t){try{return he("codex plugin list",{env:t,stdio:"pipe",timeout:15e3,encoding:"utf-8"}).split(`
17
- `).some(n=>n.includes(e)&&/installed/.test(n))}catch{return!1}}};import{AgentStrategy as Gt,getSkill as jt}from"@zibby/agent-workflow";pe();import{execSync as Yt,spawn as zt}from"node:child_process";import{existsSync as ut,mkdirSync as dt,readFileSync as ft,rmSync as Ft,writeFileSync as pt}from"node:fs";import{join as ne}from"node:path";import{z as ct}from"zod";import{zodToJsonSchema as Jt}from"zod-to-json-schema";function Ut(r){if(!r)return null;if(typeof ct?.toJSONSchema=="function")try{return ct.toJSONSchema(r)}catch{}try{return Jt(r,{target:"openApi3"})}catch{return null}}var ve=class{static generateFileOutputInstructions(e,t){let o;typeof e?.parse=="function"?o=Ut(e):o=e;let n=this._buildExample(o);return`
16
+ `)}`),A?.aborted){let g=new Error("Aborted via signal");throw g.name="AbortError",g}try{let{events:g}=await j.runStreamed(e,z),K=0,P="",F=null;for await(let d of g){if(A?.aborted){let S=new Error("Aborted via signal");throw S.name="AbortError",S}let _=d.type;if(_==="item.completed"){let S=d.item,Y=S?.type;if(Y==="mcp_tool_call"){K++;let h=`${S.server}/${S.tool}`;if(ie.stepTool(`Tool: ${h}`),S.arguments){let $=JSON.stringify(S.arguments),H=$.length>100?`${$.substring(0,100)}...`:$;console.log(` Input: ${H}`)}}else if(Y==="tool_call"||Y==="function_call"||Y==="command_execution"){K++;let h=S.name||S.tool||S.command||"unknown";ie.stepTool(`Tool: ${h}`)}else Y==="agent_message"&&(P=S.text||"",P.length<500?console.log(P):console.log(`${P.substring(0,200)}... (${P.length} chars)`))}else _==="turn.completed"?(c.debug(`[Codex] Turn completed. Usage: ${JSON.stringify(d.usage||{})}`),d.usage&&(F=d.usage)):c.debug(`[Codex] Event: ${_} ${JSON.stringify(d).slice(0,300)}`)}if(c.debug(`[Codex] Last agent message (${P.length} chars): ${P.slice(0,500)}`),s){if(!P)throw new Error("Codex agent returned no response");let d=JSON.parse(P),_=d;if(B)try{_=s.parse(d)}catch{_=s.parse(ze(d))}c.debug("\u2705 [Codex] Structured output validated");let S=Ae(F);return{raw:P,structured:_,...S?{usage:S}:{}}}return P||""}catch(g){let K=g.message||String(g);throw c.error(`\u274C [Codex] SDK call failed: ${K}`),K.includes("exited with code")&&(z.outputSchema&&c.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."),c.error("\u{1F4A1} [Codex] Verify: codex --version && echo $OPENAI_API_KEY"),c.error("\u{1F4A1} [Codex] If codex is missing: npm install -g @openai/codex")),g}}finally{for(let D of I)D.dispose()}}_resolveSkillsToMcp(e,t={}){if(!Array.isArray(e)||e.length===0)return{};let o={};for(let n of e){let s=Bt(n);if(!s){c.warn(`[Codex] Unknown skill "${n}" \u2014 skipping`);continue}if(typeof s.resolve!="function")continue;let i=s.resolve(t);if(!i)continue;let a=s.serverName||n,l=Q("codex",i,{processEnv:process.env});l&&(o[a]=l,c.debug(`[Codex] MCP: ${a} \u2192 ${i.command} ${(i.args||[]).join(" ")}`))}return o}_resolveCodexHome(e){return process.env.CODEX_HOME?process.env.CODEX_HOME:e&&!this._isTempPath(e)?ye(e,".codex-home"):ye(Gt(),".codex")}_isTempPath(e){let t=String(process.env.TMPDIR||"/tmp").replace(/\/+$/,""),o=String(e||"");return o==="/tmp"||o.startsWith("/tmp/")||o===t||o.startsWith(t+"/")}_resolveCodexBin(){if(process.env.CODEX_BIN)return process.env.CODEX_BIN;try{return he("command -v codex",{encoding:"utf-8",timeout:5e3,stdio:["ignore","pipe","ignore"]}).trim()||void 0}catch{return}}_ensurePlugins(e,t){let o={...process.env,CODEX_HOME:t};for(let n of e){let s=typeof n=="string"?n:n?.name,i=n&&typeof n=="object"?n.marketplacePath:null;if(!s||!i){c.warn(`[Codex][plugins] skipping malformed plugin declaration: ${JSON.stringify(n)} (need { name, marketplacePath })`);continue}let a=this._readMarketplaceName(i),l=`${s}@${a}`;if(this._isPluginInstalled(l,o)){c.info(`[Codex][plugins] ${l} already installed \u2014 skipping (idempotent)`),console.log(`\u25C6 [Codex] plugin ${l} already installed \u2014 skip`);continue}let f=this._safeMarketplacePath(i,t);c.info(`[Codex][plugins] installing ${l} from local marketplace ${f}`),console.log(`\u25C6 [Codex] installing plugin ${l} (local, no network)`);try{he(`codex plugin marketplace add ${JSON.stringify(f)}`,{env:o,stdio:"pipe",timeout:6e4,encoding:"utf-8"}),he(`codex plugin add ${JSON.stringify(l)}`,{env:o,stdio:"pipe",timeout:6e4,encoding:"utf-8"}),console.log(`\u25C6 [Codex] plugin ${l} installed`)}catch(p){let m=p.stderr&&p.stderr.toString()||p.message||String(p);throw c.error(`[Codex][plugins] failed to install ${l}: ${m}`),new Error(`Codex plugin install failed for ${l}: ${m}`)}}}_safeMarketplacePath(e,t){if(!String(e).includes("@"))return e;let o=ye(t,".zibby-mkt",String(e).replace(/[^a-zA-Z0-9]+/g,"_"));try{return Ye(ye(t,".zibby-mkt"),{recursive:!0}),Jt(e,o,{recursive:!0}),o}catch(n){return c.warn(`[Codex][plugins] could not copy @-containing marketplace to a safe path: ${n.message}`),e}}_readMarketplaceName(e){let t=ye(e,".agents","plugins","marketplace.json"),o;try{o=JSON.parse(Kt(t,"utf-8"))}catch(n){throw new Error(`Codex plugin marketplace manifest missing/unreadable at ${t}: ${n.message}`)}if(!o?.name||typeof o.name!="string")throw new Error(`Codex plugin marketplace manifest at ${t} has no string "name"`);return o.name}_isPluginInstalled(e,t){try{return he("codex plugin list",{env:t,stdio:"pipe",timeout:15e3,encoding:"utf-8"}).split(`
17
+ `).some(n=>n.includes(e)&&/installed/.test(n))}catch{return!1}}};import{AgentStrategy as zt,getSkill as Ft}from"@zibby/agent-workflow";pe();import{execSync as Ht,spawn as Vt}from"node:child_process";import{existsSync as ut,mkdirSync as ft,readFileSync as dt,rmSync as Zt,writeFileSync as pt}from"node:fs";import{join as ne}from"node:path";import{z as ct}from"zod";import{zodToJsonSchema as jt}from"zod-to-json-schema";function Yt(r){if(!r)return null;if(typeof ct?.toJSONSchema=="function")try{return ct.toJSONSchema(r)}catch{}try{return jt(r,{target:"openApi3"})}catch{return null}}var ke=class{static generateFileOutputInstructions(e,t){let o;typeof e?.parse=="function"?o=Yt(e):o=e;let n=this._buildExample(o);return`
18
18
  \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
19
19
  \u{1F6A8} MANDATORY: WRITE RESULT TO FILE \u{1F6A8}
20
20
  \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
@@ -34,9 +34,9 @@ JSON types (strict \u2014 validators reject wrong types):
34
34
  - Use true/false without quotes for booleans.
35
35
  - Use unquoted null where a field may be null.
36
36
 
37
- Rules: valid JSON only, no markdown wrapping, no extra text in the file.`}static _buildExample(e){if(!e)return{};let t=e.type;if(t==="object"&&e.properties){let o={};for(let[n,s]of Object.entries(e.properties))o[n]=this._buildExample(s);return o}if(t==="array"&&e.items)return[this._buildExample(e.items)];if(e.enum&&Array.isArray(e.enum)&&e.enum.length>0)return`<${e.enum.join("|")}>`;if(t==="string")return"<string>";if(t==="number"||t==="integer")return 0;if(t==="boolean")return!1;if(e.description)return`<${e.description}>`;if(e.nullable||e.oneOf||e.anyOf){let o=e.oneOf?.find(n=>n.type!=="null")||e.anyOf?.find(n=>n.type!=="null");return o?this._buildExample(o):null}return"<value>"}};var ke=class r{constructor(e=""){this.userPrompt=e,this.systemInstructions=[],this.metadata={}}setUserPrompt(e){return this.userPrompt=e,this}appendUserPrompt(e){return this.userPrompt?this.userPrompt+=`
37
+ Rules: valid JSON only, no markdown wrapping, no extra text in the file.`}static _buildExample(e){if(!e)return{};let t=e.type;if(t==="object"&&e.properties){let o={};for(let[n,s]of Object.entries(e.properties))o[n]=this._buildExample(s);return o}if(t==="array"&&e.items)return[this._buildExample(e.items)];if(e.enum&&Array.isArray(e.enum)&&e.enum.length>0)return`<${e.enum.join("|")}>`;if(t==="string")return"<string>";if(t==="number"||t==="integer")return 0;if(t==="boolean")return!1;if(e.description)return`<${e.description}>`;if(e.nullable||e.oneOf||e.anyOf){let o=e.oneOf?.find(n=>n.type!=="null")||e.anyOf?.find(n=>n.type!=="null");return o?this._buildExample(o):null}return"<value>"}};var ve=class r{constructor(e=""){this.userPrompt=e,this.systemInstructions=[],this.metadata={}}setUserPrompt(e){return this.userPrompt=e,this}appendUserPrompt(e){return this.userPrompt?this.userPrompt+=`
38
38
 
39
- ${e}`:this.userPrompt=e,this}addSkillHints(e){return e&&this.systemInstructions.push({type:"skill_hints",content:e,position:"prepend"}),this}addStructuredOutput(e,t){if(e&&t){let o=ve.generateFileOutputInstructions(e,t);this.systemInstructions.push({type:"structured_output",content:o,position:"append"}),this.metadata.structuredOutputPath=t}return this}addExtraInstructions(e){if(e?.trim()){let t=`\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501
39
+ ${e}`:this.userPrompt=e,this}addSkillHints(e){return e&&this.systemInstructions.push({type:"skill_hints",content:e,position:"prepend"}),this}addStructuredOutput(e,t){if(e&&t){let o=ke.generateFileOutputInstructions(e,t);this.systemInstructions.push({type:"structured_output",content:o,position:"append"}),this.metadata.structuredOutputPath=t}return this}addExtraInstructions(e){if(e?.trim()){let t=`\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501
40
40
  \u26A0\uFE0F PRIORITY OVERRIDE \u2014 THE FOLLOWING INSTRUCTIONS TAKE PRECEDENCE OVER ALL PREVIOUS CONTENT
41
41
  \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501
42
42
 
@@ -47,28 +47,28 @@ ${e.trim()}`;this.systemInstructions.push({type:"extra_instructions",content:t,p
47
47
  `)}getStats(){let e=this.userPrompt.length,t=this.build().length;return{userPromptLength:e,fullPromptLength:t,systemInstructionsLength:t-e,instructionCount:this.systemInstructions.length,instructionTypes:this.systemInstructions.map(o=>o.type)}}clone(){let e=new r(this.userPrompt);return e.systemInstructions=[...this.systemInstructions],e.metadata={...this.metadata},e}};var we=class r{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 t=this.buffer.split(`
48
48
  `);this.buffer=t.pop()||"";let o="";for(let n of t)if(n.trim())try{let s=JSON.parse(n);this._emitToolCalls(s);let i=this.extractText(s);if(i){if(this.rawText&&i.startsWith(this.rawText)){let a=i.substring(this.rawText.length);this.rawText=i,o+=a}else(!this.rawText.includes(i)||i.length<20)&&(this.rawText+=i,o+=i);this.tryExtractResult(this.rawText)}else this.isValidResult(s)&&(this.rawText+=`${n}
49
49
  `,o+=`${n}
50
- `,this.extractedResult=s)}catch{if(n.includes('"text"')||n.includes('"content"')){let i=n.match(/"text"\s*:\s*"([^"]*)/),a=n.match(/"content"\s*:\s*"([^"]*)/),l=i?i[1]:a?a[1]:null;l&&!this.rawText.includes(l)&&(o+=l,this.rawText+=l)}}return o||null}flush(){if(!this.buffer.trim())return null;let e="";try{let t=JSON.parse(this.buffer);this._emitToolCalls(t);let o=this.extractText(t);o&&(this.rawText+=o,e+=o,this.tryExtractResult(o))}catch{this.rawText+=this.buffer,e+=this.buffer,this.tryExtractResult(this.buffer)}return this.buffer="",e||null}_emitToolCalls(e){if(!this.onToolCall)return;let t=(i,a)=>{if(!i)return;let l=`${i}:${JSON.stringify(a??{})}`;this._lastToolEmit!==l&&(this._lastToolEmit=l,this.onToolCall(i,a??void 0))},o=i=>{if(i!=null){if(typeof i=="object"&&!Array.isArray(i))return i;if(typeof i=="string")try{return JSON.parse(i)}catch{return}}};if(e.type==="tool_use"||e.type==="tool_call"){if(e.name){t(e.name,o(e.input??e.arguments));return}let i=e.tool_call;if(i&&typeof i=="object"&&!Array.isArray(i)){let a=Object.keys(i);if(a.length===1){let l=a[0],d=i[l],p=d&&typeof d=="object"?d.args??d.input??d:void 0;t(l,o(p))}return}return}if(Array.isArray(e.tool_calls)){for(let i of e.tool_calls)t(i.name,o(i.input??i.arguments));return}let n=e.message??e;if(Array.isArray(n?.tool_calls)){for(let i of n.tool_calls)t(i.name,o(i.input??i.arguments));return}let s=n?.content??e.content;if(Array.isArray(s))for(let i of s)(i.type==="tool_use"||i.type==="tool_call")&&i.name&&t(i.name,o(i.input??i.arguments))}extractText(e){if(e.type==="assistant"&&e.message?.content){let t=e.message.content;if(Array.isArray(t))return t.filter(o=>o.type==="text"&&o.text).map(o=>o.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 t=[],o=/```json\s*\n?([\s\S]*?)\n?```/g,n;for(;(n=o.exec(e))!==null;){let m=n[1].trim();try{JSON.parse(m),t.push({text:m,source:"markdown"})}catch{}}let s=0,i=0;for(;s<e.length&&(s=e.indexOf("{",s),s!==-1);){let m=0,b=s;for(let A=s;A<e.length;A++)if(e[A]==="{")m++;else if(e[A]==="}"&&(m--,m===0)){b=A,t.push({text:e.substring(s,b+1),source:"brace"}),i++;break}s=b+1}let a=this.extractedResult,l=a?JSON.stringify(a).length:0,d=0,p=-1;for(let m=0;m<t.length;m++){let b=t[m];try{let A=b.text.replace(/,(\s*[}\]])/g,"$1"),I=JSON.parse(A);this.isValidResult(I)&&(d++,l=JSON.stringify(I).length,a=I,p=m)}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,t=null){let o=new r;o.zodSchema=t,o.processChunk(e),o.flush();let n=o.getResult();return!n&&process.env.LOG_LEVEL==="debug"&&console.error("[StreamingParser] No result extracted from",e?.length||0,"chars"),n}};function Ht(r){if(!r)return null;let e=String(r),t=e.match(/```(?:json)?\s*([\s\S]*?)```/i);if(t?.[1])try{return JSON.parse(t[1].trim())}catch{}let o=e.indexOf("{");if(o<0)return null;let n=0,s=!1,i=!1,a=-1;for(let l=o;l<e.length;l++){let d=e[l];if(s){i?i=!1:d==="\\"?i=!0:d==='"'&&(s=!1);continue}if(d==='"'){s=!0;continue}if(d==="{"){n===0&&(a=l),n+=1;continue}if(d==="}"){if(n===0)continue;if(n-=1,n===0&&a>=0){let p=e.slice(a,l+1);try{return JSON.parse(p)}catch{a=-1}}}}return null}function Vt(r){let e=String(r||"").trim();if(!e)return null;try{return JSON.parse(e)}catch{return Ht(e)}}function Zt(r){try{let e=JSON.parse(r);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 t=e.candidates[0];if(typeof t?.content=="string")return t.content;if(Array.isArray(t?.content?.parts)){let o=t.content.parts.map(n=>typeof n?.text=="string"?n.text:"").join("");if(o.trim())return o}}}catch{}return r}var Ie=class extends Gt{constructor(){super("gemini","Gemini (Google)",70)}canHandle(e){if(!!!(process.env.GEMINI_API_KEY||process.env.GEMINI_API_KEY_POOL||process.env.GOOGLE_API_KEY||process.env.GOOGLE_API_KEY_POOL))return c.debug("GeminiAgentStrategy: GEMINI_API_KEY or GOOGLE_API_KEY not set"),!1;try{return Yt("gemini --version",{encoding:"utf-8",timeout:5e3,stdio:"pipe"}),!0}catch{return c.warn("[Gemini] gemini CLI not found. Install: npm install -g @google/gemini-cli"),!1}}async invoke(e,t={}){let{model:o,workspace:n=process.cwd(),schema:s=null,images:i=[],skills:a=null,sessionPath:l=null,nodeName:d=null,timeout:p=600*1e3,signal:m=null}=t,b=[Z("GEMINI_API_KEY"),Z("GOOGLE_API_KEY")];try{let A=ae("gemini",o),I=rt[A]||A,D=String(process.env.GEMINI_API_KEY||"").trim(),M=String(process.env.GOOGLE_API_KEY||"").trim(),x=this._resolveSkillsToMcp(a,{sessionPath:l,workspace:n,nodeName:d});for(let h of t.extraMcpServers||[])if(h&&h.serverName&&h.def){if(Object.prototype.hasOwnProperty.call(x,h.serverName)){console.warn(`[custom-mcp] skip "${h.serverName}" \u2014 a built-in skill already owns that MCP name (no shadowing)`);continue}let $=Q("gemini",h.def);$&&(x[h.serverName]=$)}let C=Object.keys(x).length>0,w=new ke(e),y=s&&typeof s.parse=="function",O=null;if(s){let h;try{let $=y?te(s,{target:"openAi"}):s;h=JSON.stringify($,null,2)}catch{h="{}"}if(C){w.addSystemInstruction(`Write valid JSON that matches this schema:
51
- ${h}`,"schema_instruction","append");let $=`zibby-result-${Date.now()}.json`,H=ne(n,".zibby","tmp");O=ne(H,$),dt(H,{recursive:!0}),w.addStructuredOutput(s,O)}else w.addSystemInstruction(`Return ONLY valid JSON (no markdown, no commentary) that matches this schema:
52
- ${h}`,"json_instruction","append")}let k=w.build(),L=Array.isArray(i)?i.filter(h=>h&&typeof h.path=="string"&&h.path.startsWith("/")):[];L.length&&(k+=`
50
+ `,this.extractedResult=s)}catch{if(n.includes('"text"')||n.includes('"content"')){let i=n.match(/"text"\s*:\s*"([^"]*)/),a=n.match(/"content"\s*:\s*"([^"]*)/),l=i?i[1]:a?a[1]:null;l&&!this.rawText.includes(l)&&(o+=l,this.rawText+=l)}}return o||null}flush(){if(!this.buffer.trim())return null;let e="";try{let t=JSON.parse(this.buffer);this._emitToolCalls(t);let o=this.extractText(t);o&&(this.rawText+=o,e+=o,this.tryExtractResult(o))}catch{this.rawText+=this.buffer,e+=this.buffer,this.tryExtractResult(this.buffer)}return this.buffer="",e||null}_emitToolCalls(e){if(!this.onToolCall)return;let t=(i,a)=>{if(!i)return;let l=`${i}:${JSON.stringify(a??{})}`;this._lastToolEmit!==l&&(this._lastToolEmit=l,this.onToolCall(i,a??void 0))},o=i=>{if(i!=null){if(typeof i=="object"&&!Array.isArray(i))return i;if(typeof i=="string")try{return JSON.parse(i)}catch{return}}};if(e.type==="tool_use"||e.type==="tool_call"){if(e.name){t(e.name,o(e.input??e.arguments));return}let i=e.tool_call;if(i&&typeof i=="object"&&!Array.isArray(i)){let a=Object.keys(i);if(a.length===1){let l=a[0],f=i[l],p=f&&typeof f=="object"?f.args??f.input??f:void 0;t(l,o(p))}return}return}if(Array.isArray(e.tool_calls)){for(let i of e.tool_calls)t(i.name,o(i.input??i.arguments));return}let n=e.message??e;if(Array.isArray(n?.tool_calls)){for(let i of n.tool_calls)t(i.name,o(i.input??i.arguments));return}let s=n?.content??e.content;if(Array.isArray(s))for(let i of s)(i.type==="tool_use"||i.type==="tool_call")&&i.name&&t(i.name,o(i.input??i.arguments))}extractText(e){if(e.type==="assistant"&&e.message?.content){let t=e.message.content;if(Array.isArray(t))return t.filter(o=>o.type==="text"&&o.text).map(o=>o.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 t=[],o=/```json\s*\n?([\s\S]*?)\n?```/g,n;for(;(n=o.exec(e))!==null;){let m=n[1].trim();try{JSON.parse(m),t.push({text:m,source:"markdown"})}catch{}}let s=0,i=0;for(;s<e.length&&(s=e.indexOf("{",s),s!==-1);){let m=0,b=s;for(let A=s;A<e.length;A++)if(e[A]==="{")m++;else if(e[A]==="}"&&(m--,m===0)){b=A,t.push({text:e.substring(s,b+1),source:"brace"}),i++;break}s=b+1}let a=this.extractedResult,l=a?JSON.stringify(a).length:0,f=0,p=-1;for(let m=0;m<t.length;m++){let b=t[m];try{let A=b.text.replace(/,(\s*[}\]])/g,"$1"),I=JSON.parse(A);this.isValidResult(I)&&(f++,l=JSON.stringify(I).length,a=I,p=m)}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,t=null){let o=new r;o.zodSchema=t,o.processChunk(e),o.flush();let n=o.getResult();return!n&&process.env.LOG_LEVEL==="debug"&&console.error("[StreamingParser] No result extracted from",e?.length||0,"chars"),n}};function Wt(r){if(!r)return null;let e=String(r),t=e.match(/```(?:json)?\s*([\s\S]*?)```/i);if(t?.[1])try{return JSON.parse(t[1].trim())}catch{}let o=e.indexOf("{");if(o<0)return null;let n=0,s=!1,i=!1,a=-1;for(let l=o;l<e.length;l++){let f=e[l];if(s){i?i=!1:f==="\\"?i=!0:f==='"'&&(s=!1);continue}if(f==='"'){s=!0;continue}if(f==="{"){n===0&&(a=l),n+=1;continue}if(f==="}"){if(n===0)continue;if(n-=1,n===0&&a>=0){let p=e.slice(a,l+1);try{return JSON.parse(p)}catch{a=-1}}}}return null}function Xt(r){let e=String(r||"").trim();if(!e)return null;try{return JSON.parse(e)}catch{return Wt(e)}}function qt(r){try{let e=JSON.parse(r);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 t=e.candidates[0];if(typeof t?.content=="string")return t.content;if(Array.isArray(t?.content?.parts)){let o=t.content.parts.map(n=>typeof n?.text=="string"?n.text:"").join("");if(o.trim())return o}}}catch{}return r}var Ie=class extends zt{constructor(){super("gemini","Gemini (Google)",70)}canHandle(e){if(!!!(process.env.GEMINI_API_KEY||process.env.GEMINI_API_KEY_POOL||process.env.GOOGLE_API_KEY||process.env.GOOGLE_API_KEY_POOL))return c.debug("GeminiAgentStrategy: GEMINI_API_KEY or GOOGLE_API_KEY not set"),!1;try{return Ht("gemini --version",{encoding:"utf-8",timeout:5e3,stdio:"pipe"}),!0}catch{return c.warn("[Gemini] gemini CLI not found. Install: npm install -g @google/gemini-cli"),!1}}async invoke(e,t={}){let{model:o,workspace:n=process.cwd(),schema:s=null,images:i=[],skills:a=null,sessionPath:l=null,nodeName:f=null,timeout:p=600*1e3,signal:m=null}=t,b=[Z("GEMINI_API_KEY"),Z("GOOGLE_API_KEY")];try{let A=ae("gemini",o),I=rt[A]||A,D=String(process.env.GEMINI_API_KEY||"").trim(),L=String(process.env.GOOGLE_API_KEY||"").trim(),x=this._resolveSkillsToMcp(a,{sessionPath:l,workspace:n,nodeName:f});for(let h of t.extraMcpServers||[])if(h&&h.serverName&&h.def){if(Object.prototype.hasOwnProperty.call(x,h.serverName)){console.warn(`[custom-mcp] skip "${h.serverName}" \u2014 a built-in skill already owns that MCP name (no shadowing)`);continue}let $=Q("gemini",h.def);$&&(x[h.serverName]=$)}let C=Object.keys(x).length>0,w=new ve(e),y=s&&typeof s.parse=="function",O=null;if(s){let h;try{let $=y?te(s,{target:"openAi"}):s;h=JSON.stringify($,null,2)}catch{h="{}"}if(C){w.addSystemInstruction(`Write valid JSON that matches this schema:
51
+ ${h}`,"schema_instruction","append");let $=`zibby-result-${Date.now()}.json`,H=ne(n,".zibby","tmp");O=ne(H,$),ft(H,{recursive:!0}),w.addStructuredOutput(s,O)}else w.addSystemInstruction(`Return ONLY valid JSON (no markdown, no commentary) that matches this schema:
52
+ ${h}`,"json_instruction","append")}let v=w.build(),M=Array.isArray(i)?i.filter(h=>h&&typeof h.path=="string"&&h.path.startsWith("/")):[];M.length&&(v+=`
53
53
 
54
54
  # Attached image files \u2014 VIEW THESE
55
- The user attached ${L.length} image(s), saved locally. Read each path to SEE the image, then use what it shows to answer:
56
- ${L.map((h,$)=>` ${$+1}. ${h.path}${h.name?` (${h.name})`:""}`).join(`
55
+ The user attached ${M.length} image(s), saved locally. Read each path to SEE the image, then use what it shows to answer:
56
+ ${M.map((h,$)=>` ${$+1}. ${h.path}${h.name?` (${h.name})`:""}`).join(`
57
57
  `)}`);let U=w.getUserPrompt(),N=w.getStats(),j=String(process.env.GEMINI_API_KEY||process.env.GOOGLE_API_KEY||"").trim(),B=j?` | key: ***${j.slice(-4)}`:" | key: not set";console.log(`
58
58
  \u25C6 Model: ${I||"auto"}${B}
59
59
  `);let z=(await import("chalk")).default;console.log(`
60
- ${z.bold("Prompt sent to LLM:")}`),console.log(z.dim("\u2500".repeat(60))),console.log(z.dim(U)),console.log(z.dim("\u2500".repeat(60)));let V=this._createGeminiConfigDir(n,x),g=["--output-format","json"];I&&I!=="auto"&&g.push("--model",I);let K=Object.keys(x);if(K.length>0){g.push("--approval-mode","yolo");for(let h of K)g.push("--allowed-mcp-server-names",h);c.info(`[Gemini] Enabling MCP servers: ${K.join(", ")}`)}else a&&a.length>0&&c.warn(`[Gemini] Skills requested but no MCP servers configured: ${a.join(", ")}`);g.push("-p",k);let P={...re(process.env),GEMINI_CLI_HOME:V};D?(P.GEMINI_API_KEY=D,delete P.GOOGLE_API_KEY):M&&(P.GOOGLE_API_KEY=M,delete P.GEMINI_API_KEY),c.debug(`[Gemini] Command: gemini ${g.slice(0,8).join(" ")}... (${g.length} total args)`),c.debug(`[Gemini] User prompt: ${N.userPromptLength} chars, System instructions: ${N.systemInstructionsLength} chars (${N.instructionCount} blocks), Full: ${N.fullPromptLength} chars`),c.debug(`[Gemini] Config home: ${V}`),c.debug(`[Gemini] GEMINI_CLI_HOME env: ${P.GEMINI_CLI_HOME}`);let F="",f=null;try{F=await new Promise(($,H)=>{let X=zt("gemini",g,{cwd:n,env:P,stdio:["ignore","pipe","pipe"],...m&&{signal:m}}),ee="",Ee="",u=!1,G=null,T=!1,E=setTimeout(()=>{try{X.kill("SIGTERM")}catch{}},p),v=()=>{T||u||(T=!0,G=setTimeout(()=>{if(!u)try{X.kill("SIGKILL")}catch{}},5e3))};m&&(m.aborted?v():m.addEventListener("abort",v,{once:!0})),X.stdout.on("data",J=>{ee+=J.toString()}),X.stderr.on("data",J=>{Ee+=J.toString()}),X.on("error",J=>{if(clearTimeout(E),G&&clearTimeout(G),m&&!m.aborted)try{m.removeEventListener("abort",v)}catch{}H(J)}),X.on("close",J=>{if(u=!0,clearTimeout(E),G&&clearTimeout(G),m&&!m.aborted)try{m.removeEventListener("abort",v)}catch{}if(T){let oe=new Error("Aborted via signal");return oe.name="AbortError",H(oe)}if(J===0)return $(ee.trim());H(new Error(`gemini failed with code ${J}: ${(Ee||ee).trim()}`))})})}catch(h){f=h}finally{try{Ft(V,{recursive:!0,force:!0})}catch{}}let _=Zt(F).trim();if(!s){if(f)throw f;return _}if(O){let h=ut(O);if(c.info(`[Gemini] Result file: ${h?"present":"missing"} at ${O}`),h)try{let $=ft(O,"utf-8").trim(),H=JSON.parse($),X=y?s.parse(H):H;return c.info("[Gemini] Structured output recovered from result file"),{raw:_,structured:X}}catch($){c.warn(`[Gemini] Result file parse/validation failed: ${$.message}`)}else f||c.warn("[Gemini] Result file missing; falling back to stream-parsed JSON")}let S=null;if(s){let h=new we;h.zodSchema=s,h.processChunk(_),h.flush(),S=h.getResult()}if(c.info(`[Gemini] Raw stdout length: ${F.length} chars`),c.info(`[Gemini] Extracted text length: ${_.length} chars`),c.info(`[Gemini] StreamParser result: ${S?"extracted":"null"}`),S||(_.length<2e3?c.info(`[Gemini] Raw text preview:
60
+ ${z.bold("Prompt sent to LLM:")}`),console.log(z.dim("\u2500".repeat(60))),console.log(z.dim(U)),console.log(z.dim("\u2500".repeat(60)));let V=this._createGeminiConfigDir(n,x),g=["--output-format","json"];I&&I!=="auto"&&g.push("--model",I);let K=Object.keys(x);if(K.length>0){g.push("--approval-mode","yolo");for(let h of K)g.push("--allowed-mcp-server-names",h);c.info(`[Gemini] Enabling MCP servers: ${K.join(", ")}`)}else a&&a.length>0&&c.warn(`[Gemini] Skills requested but no MCP servers configured: ${a.join(", ")}`);g.push("-p",v);let P={...re(process.env),GEMINI_CLI_HOME:V};D?(P.GEMINI_API_KEY=D,delete P.GOOGLE_API_KEY):L&&(P.GOOGLE_API_KEY=L,delete P.GEMINI_API_KEY),c.debug(`[Gemini] Command: gemini ${g.slice(0,8).join(" ")}... (${g.length} total args)`),c.debug(`[Gemini] User prompt: ${N.userPromptLength} chars, System instructions: ${N.systemInstructionsLength} chars (${N.instructionCount} blocks), Full: ${N.fullPromptLength} chars`),c.debug(`[Gemini] Config home: ${V}`),c.debug(`[Gemini] GEMINI_CLI_HOME env: ${P.GEMINI_CLI_HOME}`);let F="",d=null;try{F=await new Promise(($,H)=>{let X=Vt("gemini",g,{cwd:n,env:P,stdio:["ignore","pipe","pipe"],...m&&{signal:m}}),ee="",Ee="",u=!1,G=null,T=!1,E=setTimeout(()=>{try{X.kill("SIGTERM")}catch{}},p),k=()=>{T||u||(T=!0,G=setTimeout(()=>{if(!u)try{X.kill("SIGKILL")}catch{}},5e3))};m&&(m.aborted?k():m.addEventListener("abort",k,{once:!0})),X.stdout.on("data",J=>{ee+=J.toString()}),X.stderr.on("data",J=>{Ee+=J.toString()}),X.on("error",J=>{if(clearTimeout(E),G&&clearTimeout(G),m&&!m.aborted)try{m.removeEventListener("abort",k)}catch{}H(J)}),X.on("close",J=>{if(u=!0,clearTimeout(E),G&&clearTimeout(G),m&&!m.aborted)try{m.removeEventListener("abort",k)}catch{}if(T){let oe=new Error("Aborted via signal");return oe.name="AbortError",H(oe)}if(J===0)return $(ee.trim());H(new Error(`gemini failed with code ${J}: ${(Ee||ee).trim()}`))})})}catch(h){d=h}finally{try{Zt(V,{recursive:!0,force:!0})}catch{}}let _=qt(F).trim();if(!s){if(d)throw d;return _}if(O){let h=ut(O);if(c.info(`[Gemini] Result file: ${h?"present":"missing"} at ${O}`),h)try{let $=dt(O,"utf-8").trim(),H=JSON.parse($),X=y?s.parse(H):H;return c.info("[Gemini] Structured output recovered from result file"),{raw:_,structured:X}}catch($){c.warn(`[Gemini] Result file parse/validation failed: ${$.message}`)}else d||c.warn("[Gemini] Result file missing; falling back to stream-parsed JSON")}let S=null;if(s){let h=new we;h.zodSchema=s,h.processChunk(_),h.flush(),S=h.getResult()}if(c.info(`[Gemini] Raw stdout length: ${F.length} chars`),c.info(`[Gemini] Extracted text length: ${_.length} chars`),c.info(`[Gemini] StreamParser result: ${S?"extracted":"null"}`),S||(_.length<2e3?c.info(`[Gemini] Raw text preview:
61
61
  ${_}`):c.info(`[Gemini] Raw text preview (first 1000 chars):
62
- ${_.slice(0,1e3)}`),S=Vt(_)),!S)throw f||(c.error("[Gemini] Failed to extract valid JSON from output"),c.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 Y=y?s.parse(S):S;return{raw:_,structured:Y}}finally{for(let A of b)A.dispose()}}_resolveSkillsToMcp(e,t={}){if(!Array.isArray(e)||e.length===0)return{};let o={};for(let n of e){let s=jt(n);if(!s||typeof s.resolve!="function")continue;let i=s.resolve(t);if(!i)continue;let a=s.cursorKey||s.serverName||n,l=Q("gemini",i);l&&(o[a]=l)}return o}_createGeminiConfigDir(e,t){let o=`${Date.now()}-${Math.random().toString(16).slice(2,10)}`,n=ne(e||process.cwd(),".zibby","tmp",`gemini-home-${o}`),s=ne(n,".gemini");dt(s,{recursive:!0});let i=ne(s,"settings.json"),a={},l=ne(process.env.HOME||"",".gemini","settings.json");if(ut(l))try{a=JSON.parse(ft(l,"utf-8"))}catch{a={}}let d={...a,mcpServers:{...a.mcpServers&&typeof a.mcpServers=="object"?a.mcpServers:{},...t||{}}};pt(i,`${JSON.stringify(d,null,2)}
63
- `,"utf-8");let p=ne(e||process.cwd(),".zibby","tmp","gemini-settings-debug.json");try{pt(p,`${JSON.stringify(d,null,2)}
64
- `,"utf-8")}catch{}return c.debug(`[Gemini] Created isolated config with ${Object.keys(d.mcpServers||{}).length} MCP servers`),c.debug(`[Gemini] MCP servers: ${JSON.stringify(Object.keys(d.mcpServers||{}),null,2)}`),n}};import{AgentStrategy as cn,getSkill as Le}from"@zibby/agent-workflow";var _e=class{formatTools(e){throw new Error("formatTools() must be implemented")}hasToolCalls(e){throw new Error("hasToolCalls() must be implemented")}parseToolCalls(e){throw new Error("parseToolCalls() must be implemented")}getTextContent(e){throw new Error("getTextContent() must be implemented")}buildAssistantMessage(e){throw new Error("buildAssistantMessage() must be implemented")}buildToolResultMessage(e,t){throw new Error("buildToolResultMessage() must be implemented")}injectToolsIntoBody(e,t){throw new Error("injectToolsIntoBody() must be implemented")}};var ce=class extends _e{formatTools(e){return e.map(t=>({type:"function",function:{name:t.name,description:t.description,parameters:t.parameters||t.input_schema||{type:"object",properties:{}}}}))}hasToolCalls(e){let t=e.choices?.[0]?.message;return!!(t?.tool_calls&&t.tool_calls.length>0)}parseToolCalls(e){return(e.choices?.[0]?.message?.tool_calls||[]).map(o=>({id:o.id,name:o.function.name,args:JSON.parse(o.function.arguments||"{}")}))}getTextContent(e){return e.choices?.[0]?.message?.content||""}buildAssistantMessage(e){return e.choices?.[0]?.message}buildToolResultMessage(e,t){return{role:"tool",tool_call_id:e,content:typeof t=="string"?t:JSON.stringify(t)}}injectToolsIntoBody(e,t){return t.length>0&&(e.tools=t),e}};var Se=class{async fetchCompletion(e,t,o={}){throw new Error("fetchCompletion() must be implemented")}async fetchStreamingCompletion(e,t,o={}){throw new Error("fetchStreamingCompletion() must be implemented")}};function Ce(r){return Buffer.byteLength(JSON.stringify(r),"utf8")}function $e(r,e){let t=String(r||"");if(t.length<=e)return t;let o=Math.max(0,e-28);return`${t.slice(0,o)}
62
+ ${_.slice(0,1e3)}`),S=Xt(_)),!S)throw d||(c.error("[Gemini] Failed to extract valid JSON from output"),c.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 Y=y?s.parse(S):S;return{raw:_,structured:Y}}finally{for(let A of b)A.dispose()}}_resolveSkillsToMcp(e,t={}){if(!Array.isArray(e)||e.length===0)return{};let o={};for(let n of e){let s=Ft(n);if(!s||typeof s.resolve!="function")continue;let i=s.resolve(t);if(!i)continue;let a=s.cursorKey||s.serverName||n,l=Q("gemini",i);l&&(o[a]=l)}return o}_createGeminiConfigDir(e,t){let o=`${Date.now()}-${Math.random().toString(16).slice(2,10)}`,n=ne(e||process.cwd(),".zibby","tmp",`gemini-home-${o}`),s=ne(n,".gemini");ft(s,{recursive:!0});let i=ne(s,"settings.json"),a={},l=ne(process.env.HOME||"",".gemini","settings.json");if(ut(l))try{a=JSON.parse(dt(l,"utf-8"))}catch{a={}}let f={...a,mcpServers:{...a.mcpServers&&typeof a.mcpServers=="object"?a.mcpServers:{},...t||{}}};pt(i,`${JSON.stringify(f,null,2)}
63
+ `,"utf-8");let p=ne(e||process.cwd(),".zibby","tmp","gemini-settings-debug.json");try{pt(p,`${JSON.stringify(f,null,2)}
64
+ `,"utf-8")}catch{}return c.debug(`[Gemini] Created isolated config with ${Object.keys(f.mcpServers||{}).length} MCP servers`),c.debug(`[Gemini] MCP servers: ${JSON.stringify(Object.keys(f.mcpServers||{}),null,2)}`),n}};import{AgentStrategy as dn,getSkill as Me}from"@zibby/agent-workflow";var _e=class{formatTools(e){throw new Error("formatTools() must be implemented")}hasToolCalls(e){throw new Error("hasToolCalls() must be implemented")}parseToolCalls(e){throw new Error("parseToolCalls() must be implemented")}getTextContent(e){throw new Error("getTextContent() must be implemented")}buildAssistantMessage(e){throw new Error("buildAssistantMessage() must be implemented")}buildToolResultMessage(e,t){throw new Error("buildToolResultMessage() must be implemented")}injectToolsIntoBody(e,t){throw new Error("injectToolsIntoBody() must be implemented")}};var ce=class extends _e{formatTools(e){return e.map(t=>({type:"function",function:{name:t.name,description:t.description,parameters:t.parameters||t.input_schema||{type:"object",properties:{}}}}))}hasToolCalls(e){let t=e.choices?.[0]?.message;return!!(t?.tool_calls&&t.tool_calls.length>0)}parseToolCalls(e){return(e.choices?.[0]?.message?.tool_calls||[]).map(o=>({id:o.id,name:o.function.name,args:JSON.parse(o.function.arguments||"{}")}))}getTextContent(e){return e.choices?.[0]?.message?.content||""}buildAssistantMessage(e){return e.choices?.[0]?.message}buildToolResultMessage(e,t){return{role:"tool",tool_call_id:e,content:typeof t=="string"?t:JSON.stringify(t)}}injectToolsIntoBody(e,t){return t.length>0&&(e.tools=t),e}};var Se=class{async fetchCompletion(e,t,o={}){throw new Error("fetchCompletion() must be implemented")}async fetchStreamingCompletion(e,t,o={}){throw new Error("fetchStreamingCompletion() must be implemented")}};function Ce(r){return Buffer.byteLength(JSON.stringify(r),"utf8")}function $e(r,e){let t=String(r||"");if(t.length<=e)return t;let o=Math.max(0,e-28);return`${t.slice(0,o)}
65
65
 
66
- [truncated for size budget]`}function Fe(r,e=0){if(!r||typeof r!="object"||e>8)return r;if(Array.isArray(r))return r.map(o=>Fe(o,e+1));let t={};for(let[o,n]of Object.entries(r))o==="description"||o==="title"||o==="examples"||o==="default"||(t[o]=Fe(n,e+1));return t}function Wt(r=[]){return r.map(e=>({...e,function:{...e.function,description:$e(e.function?.description||"",180),parameters:Fe(e.function?.parameters||{type:"object",properties:{}})}}))}function mt(r){let e=new Set;for(let n of r)if(n.role==="assistant"&&Array.isArray(n.tool_calls))for(let s of n.tool_calls)e.add(s.id);let t=r.filter(n=>n.role==="tool"?e.has(n.tool_call_id):!0),o=new Set;for(let n of t)n.role==="tool"&&o.add(n.tool_call_id);return t.map(n=>{if(n.role!=="assistant"||!Array.isArray(n.tool_calls)||n.tool_calls.every(l=>o.has(l.id)))return n;let{tool_calls:i,...a}=n;return{...a,content:a.content||""}})}function He(r,e={}){let t=e.maxBytes||49e3,o=e.systemMaxChars||12e3,n={...r,messages:Array.isArray(r.messages)?[...r.messages]:[],tools:Array.isArray(r.tools)?Wt(r.tools):r.tools};n.messages.length>0&&n.messages[0]?.role==="system"&&(n.messages[0]={...n.messages[0],content:$e(n.messages[0].content,o)});let s=!1;for(;Ce(n)>t&&n.messages.length>2;)n.messages.splice(1,1),s=!0;if(s&&(n.messages=mt(n.messages)),Ce(n)>t&&n.messages.length>0&&(n.messages[0]={...n.messages[0],content:$e(n.messages[0].content,6e3)},s=!0),Ce(n)>t){let i=n.messages.find(l=>l.role==="system")||n.messages[0],a=n.messages.slice(-2);n.messages=mt([i,...a].filter(Boolean).map((l,d)=>({...l,content:$e(l.content,d===0?4e3:8e3)}))),s=!0}return{body:n,meta:{bytes:Ce(n),trimmed:s,maxBytes:t,messageCount:n.messages.length}}}var gt=r=>Buffer.byteLength(JSON.stringify(r),"utf8"),ue=class extends Se{async fetchCompletion(e,t,o={}){let n=gt(e),{body:s,meta:i}=He(e,o.payloadCompaction);o.onBudget?.({streaming:!1,beforeBytes:n,meta:i});let a=this.#e(o),l=`${t.baseUrl}${o.chatCompletionsPath||"/v1/chat/completions"}`,d=await fetch(l,{method:"POST",headers:t.headers,body:JSON.stringify(s),signal:a});if(!d.ok){let p=await d.text();throw d.status===401||d.status===403?new Error("Session expired. Run `zibby login` to re-authenticate."):new Error(`Proxy error ${d.status}: ${p}`)}return d.json()}async fetchStreamingCompletion(e,t,o={}){let n={...e,stream:!0},s=gt(n),{body:i,meta:a}=He(n,o.payloadCompaction);o.onBudget?.({streaming:!0,beforeBytes:s,meta:a});let l=this.#e(o),d=`${t.baseUrl}${o.chatCompletionsPath||"/v1/chat/completions"}`,p=await fetch(d,{method:"POST",headers:t.headers,body:JSON.stringify(i),signal:l});if(!p.ok){let M=await p.text();throw p.status===401||p.status===403?new Error("Session expired. Run `zibby login` to re-authenticate."):new Error(`Proxy error ${p.status}: ${M}`)}let m=p.body.getReader(),b=new TextDecoder,A="",I="",D=new Map;for(;;){let{done:M,value:x}=await m.read();if(M)break;A+=b.decode(x,{stream:!0});let C=A.split(`
67
- `);A=C.pop();for(let w of C){if(!w.startsWith("data: "))continue;let y=w.slice(6).trim();if(y==="[DONE]")continue;let O;try{O=JSON.parse(y)}catch{continue}let k=O.choices?.[0]?.delta;if(k&&(k.content&&(I+=k.content,o.onToken&&o.onToken(k.content)),k.tool_calls))for(let L of k.tool_calls){let U=L.index??0;D.has(U)||D.set(U,{id:"",name:"",args:""});let N=D.get(U);L.id&&(N.id=L.id),L.function?.name&&(N.name=L.function.name),L.function?.arguments!=null&&(N.args+=L.function.arguments)}}}if(D.size>0){let M=[...D.entries()].sort(([x],[C])=>x-C).map(([,x])=>({id:x.id,type:"function",function:{name:x.name,arguments:x.args}}));return{choices:[{message:{role:"assistant",content:I||null,tool_calls:M}}]}}return{choices:[{message:{role:"assistant",content:I}}]}}#e(e={}){let t=[e.signal,e.timeout?AbortSignal.timeout(e.timeout):null].filter(Boolean);return t.length>1?AbortSignal.any(t):t[0]||void 0}};import{Client as Xt}from"@modelcontextprotocol/sdk/client/index.js";import{StdioClientTransport as qt}from"@modelcontextprotocol/sdk/client/stdio.js";var Ne=class{#e=new Map;async ensureServer(e,t){if(this.#e.has(e))return this.#e.get(e);let{command:o,args:n=[],env:s={}}=t;c.debug(`[MCP] Starting ${e}: ${o} ${n.join(" ")}`);let i=new qt({command:o,args:n,env:{...process.env,...s}}),a=new Xt({name:`zibby-chat-${e}`,version:"1.0.0"},{capabilities:{}});await a.connect(i);let l={client:a,transport:i,serverConfig:t};return this.#e.set(e,l),l}async callTool(e,t,o={}){let n=this.#e.get(e);if(!n)throw new Error(`MCP server "${e}" not running`);c.debug(`[MCP] ${e}.${t}(${JSON.stringify(o).slice(0,200)})`);let s=await n.client.callTool({name:t,arguments:o});return{text:s.content?.filter(a=>a.type==="text").map(a=>a.text).join(`
68
- `)||"",isError:s.isError||!1}}isRunning(e){return this.#e.has(e)}async stopServer(e){let t=this.#e.get(e);if(t){try{await t.client.close()}catch(o){c.debug(`[MCP] Error closing ${e}: ${o.message}`)}this.#e.delete(e)}}async stopAll(){let e=[...this.#e.keys()];await Promise.allSettled(e.map(t=>this.stopServer(t)))}};import{existsSync as Qt,readFileSync as en}from"node:fs";import{join as tn}from"node:path";import{homedir as nn}from"node:os";function on(){try{let r=tn(nn(),".zibby","config.json");return Qt(r)?JSON.parse(en(r,"utf-8")):{}}catch{return{}}}function Pe(r){return String(r||"").replace(/\/v1\/?$/,"")}function rn(r,e){let t=process.env.OPENAI_PROXY_URL;if(t)return Pe(t);if(r==="session")return e.proxyUrl?Pe(e.proxyUrl):`${(process.env.ZIBBY_API_URL||"https://api-prod.zibby.app").replace(/\/$/,"")}/openai-proxy`;if(r==="byok"){let o=process.env.OPENAI_BASE_URL;return Pe(o||"https://api.openai.com")}return Pe(t||"")}function Ve(){let r=on(),e=process.env.ZIBBY_USER_TOKEN||r.sessionToken||null,t=process.env.OPENAI_API_KEY||null,o=(process.env.ASSISTANT_AUTH_MODE||"").trim().toLowerCase(),n=process.env.OPENAI_PROXY_NO_AUTH==="true",s=process.env.OPENAI_PROXY_URL,i="session";o==="byok"||o==="local"||o==="session"?i=o:e?i="session":t?i="byok":s&&n&&(i="local");let a=rn(i,r),l={"Content-Type":"application/json"};if(i==="session"){if(!e)return{ok:!1,mode:i,reason:"missing_session_token"};l.Authorization=`Bearer ${e}`}else if(i==="byok"){if(!t)return{ok:!1,mode:i,reason:"missing_openai_api_key"};l.Authorization=`Bearer ${t}`}else if(i==="local"){if(!a)return{ok:!1,mode:i,reason:"missing_openai_proxy_url"};!n&&t&&(l.Authorization=`Bearer ${t}`)}return a?{ok:!0,mode:i,baseUrl:a,headers:l,tokenPreview:l.Authorization?`***${l.Authorization.slice(-4)}`:"none"}:{ok:!1,mode:i,reason:"missing_base_url"}}function Me(r,e){let t=String(r??"");return t.length<=e?t:`${t.slice(0,Math.max(0,e-30))}
66
+ [truncated for size budget]`}function Fe(r,e=0){if(!r||typeof r!="object"||e>8)return r;if(Array.isArray(r))return r.map(o=>Fe(o,e+1));let t={};for(let[o,n]of Object.entries(r))o==="description"||o==="title"||o==="examples"||o==="default"||(t[o]=Fe(n,e+1));return t}function Qt(r=[]){return r.map(e=>({...e,function:{...e.function,description:$e(e.function?.description||"",180),parameters:Fe(e.function?.parameters||{type:"object",properties:{}})}}))}function mt(r){let e=new Set;for(let n of r)if(n.role==="assistant"&&Array.isArray(n.tool_calls))for(let s of n.tool_calls)e.add(s.id);let t=r.filter(n=>n.role==="tool"?e.has(n.tool_call_id):!0),o=new Set;for(let n of t)n.role==="tool"&&o.add(n.tool_call_id);return t.map(n=>{if(n.role!=="assistant"||!Array.isArray(n.tool_calls)||n.tool_calls.every(l=>o.has(l.id)))return n;let{tool_calls:i,...a}=n;return{...a,content:a.content||""}})}function He(r,e={}){let t=e.maxBytes||49e3,o=e.systemMaxChars||12e3,n={...r,messages:Array.isArray(r.messages)?[...r.messages]:[],tools:Array.isArray(r.tools)?Qt(r.tools):r.tools};n.messages.length>0&&n.messages[0]?.role==="system"&&(n.messages[0]={...n.messages[0],content:$e(n.messages[0].content,o)});let s=!1;for(;Ce(n)>t&&n.messages.length>2;)n.messages.splice(1,1),s=!0;if(s&&(n.messages=mt(n.messages)),Ce(n)>t&&n.messages.length>0&&(n.messages[0]={...n.messages[0],content:$e(n.messages[0].content,6e3)},s=!0),Ce(n)>t){let i=n.messages.find(l=>l.role==="system")||n.messages[0],a=n.messages.slice(-2);n.messages=mt([i,...a].filter(Boolean).map((l,f)=>({...l,content:$e(l.content,f===0?4e3:8e3)}))),s=!0}return{body:n,meta:{bytes:Ce(n),trimmed:s,maxBytes:t,messageCount:n.messages.length}}}var gt=r=>Buffer.byteLength(JSON.stringify(r),"utf8"),ue=class extends Se{async fetchCompletion(e,t,o={}){let n=gt(e),{body:s,meta:i}=He(e,o.payloadCompaction);o.onBudget?.({streaming:!1,beforeBytes:n,meta:i});let a=this.#e(o),l=`${t.baseUrl}${o.chatCompletionsPath||"/v1/chat/completions"}`,f=await fetch(l,{method:"POST",headers:t.headers,body:JSON.stringify(s),signal:a});if(!f.ok){let p=await f.text();throw f.status===401||f.status===403?new Error("Session expired. Run `zibby login` to re-authenticate."):new Error(`Proxy error ${f.status}: ${p}`)}return f.json()}async fetchStreamingCompletion(e,t,o={}){let n={...e,stream:!0},s=gt(n),{body:i,meta:a}=He(n,o.payloadCompaction);o.onBudget?.({streaming:!0,beforeBytes:s,meta:a});let l=this.#e(o),f=`${t.baseUrl}${o.chatCompletionsPath||"/v1/chat/completions"}`,p=await fetch(f,{method:"POST",headers:t.headers,body:JSON.stringify(i),signal:l});if(!p.ok){let L=await p.text();throw p.status===401||p.status===403?new Error("Session expired. Run `zibby login` to re-authenticate."):new Error(`Proxy error ${p.status}: ${L}`)}let m=p.body.getReader(),b=new TextDecoder,A="",I="",D=new Map;for(;;){let{done:L,value:x}=await m.read();if(L)break;A+=b.decode(x,{stream:!0});let C=A.split(`
67
+ `);A=C.pop();for(let w of C){if(!w.startsWith("data: "))continue;let y=w.slice(6).trim();if(y==="[DONE]")continue;let O;try{O=JSON.parse(y)}catch{continue}let v=O.choices?.[0]?.delta;if(v&&(v.content&&(I+=v.content,o.onToken&&o.onToken(v.content)),v.tool_calls))for(let M of v.tool_calls){let U=M.index??0;D.has(U)||D.set(U,{id:"",name:"",args:""});let N=D.get(U);M.id&&(N.id=M.id),M.function?.name&&(N.name=M.function.name),M.function?.arguments!=null&&(N.args+=M.function.arguments)}}}if(D.size>0){let L=[...D.entries()].sort(([x],[C])=>x-C).map(([,x])=>({id:x.id,type:"function",function:{name:x.name,arguments:x.args}}));return{choices:[{message:{role:"assistant",content:I||null,tool_calls:L}}]}}return{choices:[{message:{role:"assistant",content:I}}]}}#e(e={}){let t=[e.signal,e.timeout?AbortSignal.timeout(e.timeout):null].filter(Boolean);return t.length>1?AbortSignal.any(t):t[0]||void 0}};import{Client as en}from"@modelcontextprotocol/sdk/client/index.js";import{StdioClientTransport as tn}from"@modelcontextprotocol/sdk/client/stdio.js";var Ne=class{#e=new Map;async ensureServer(e,t){if(this.#e.has(e))return this.#e.get(e);let{command:o,args:n=[],env:s={}}=t;c.debug(`[MCP] Starting ${e}: ${o} ${n.join(" ")}`);let i=new tn({command:o,args:n,env:{...process.env,...s}}),a=new en({name:`zibby-chat-${e}`,version:"1.0.0"},{capabilities:{}});await a.connect(i);let l={client:a,transport:i,serverConfig:t};return this.#e.set(e,l),l}async callTool(e,t,o={}){let n=this.#e.get(e);if(!n)throw new Error(`MCP server "${e}" not running`);c.debug(`[MCP] ${e}.${t}(${JSON.stringify(o).slice(0,200)})`);let s=await n.client.callTool({name:t,arguments:o});return{text:s.content?.filter(a=>a.type==="text").map(a=>a.text).join(`
68
+ `)||"",isError:s.isError||!1}}isRunning(e){return this.#e.has(e)}async stopServer(e){let t=this.#e.get(e);if(t){try{await t.client.close()}catch(o){c.debug(`[MCP] Error closing ${e}: ${o.message}`)}this.#e.delete(e)}}async stopAll(){let e=[...this.#e.keys()];await Promise.allSettled(e.map(t=>this.stopServer(t)))}};import{existsSync as nn,readFileSync as on}from"node:fs";import{join as rn}from"node:path";import{homedir as sn}from"node:os";function an(){try{let r=rn(sn(),".zibby","config.json");return nn(r)?JSON.parse(on(r,"utf-8")):{}}catch{return{}}}function Pe(r){return String(r||"").replace(/\/v1\/?$/,"")}function ln(r,e){let t=process.env.OPENAI_PROXY_URL;if(t)return Pe(t);if(r==="session")return e.proxyUrl?Pe(e.proxyUrl):`${(process.env.ZIBBY_API_URL||"https://api-prod.zibby.app").replace(/\/$/,"")}/openai-proxy`;if(r==="byok"){let o=process.env.OPENAI_BASE_URL;return Pe(o||"https://api.openai.com")}return Pe(t||"")}function Ve(){let r=an(),e=process.env.ZIBBY_USER_TOKEN||r.sessionToken||null,t=process.env.OPENAI_API_KEY||null,o=(process.env.ASSISTANT_AUTH_MODE||"").trim().toLowerCase(),n=process.env.OPENAI_PROXY_NO_AUTH==="true",s=process.env.OPENAI_PROXY_URL,i="session";o==="byok"||o==="local"||o==="session"?i=o:e?i="session":t?i="byok":s&&n&&(i="local");let a=ln(i,r),l={"Content-Type":"application/json"};if(i==="session"){if(!e)return{ok:!1,mode:i,reason:"missing_session_token"};l.Authorization=`Bearer ${e}`}else if(i==="byok"){if(!t)return{ok:!1,mode:i,reason:"missing_openai_api_key"};l.Authorization=`Bearer ${t}`}else if(i==="local"){if(!a)return{ok:!1,mode:i,reason:"missing_openai_proxy_url"};!n&&t&&(l.Authorization=`Bearer ${t}`)}return a?{ok:!0,mode:i,baseUrl:a,headers:l,tokenPreview:l.Authorization?`***${l.Authorization.slice(-4)}`:"none"}:{ok:!1,mode:i,reason:"missing_base_url"}}function Le(r,e){let t=String(r??"");return t.length<=e?t:`${t.slice(0,Math.max(0,e-30))}
69
69
 
70
- [tool result truncated for size]`}function sn(r,e){if(typeof r=="string")return Me(r,e);try{return Me(JSON.stringify(r),e)}catch{return Me(String(r),e)}}function ht(r){let e=new Set;for(let n of r)if(n.role==="assistant"&&Array.isArray(n.tool_calls))for(let s of n.tool_calls)e.add(s.id);let t=r.filter(n=>n.role==="tool"?e.has(n.tool_call_id):!0),o=new Set;for(let n of t)n.role==="tool"&&o.add(n.tool_call_id);return t.map(n=>{if(n.role!=="assistant"||!Array.isArray(n.tool_calls)||n.tool_calls.every(l=>o.has(l.id)))return n;let{tool_calls:i,...a}=n;return{...a,content:a.content||""}})}function an(r){let e=Array.isArray(r?.messages)?r.messages:[],t=e.find(s=>s.role==="system"),o=e.slice(-4).map(s=>({...s,content:Me(s.content,s.role==="tool"?1200:2500)}));o=ht(o);let n={...r,messages:[t,...o].filter(Boolean)};return delete n.tools,n}async function ln({body:r,streaming:e,auth:t,options:o,fetchCompletion:n,fetchStreamingCompletion:s,onFallbackLog:i}){try{return e?await s(r,t,o):await n(r,t,o)}catch(a){let l=String(a?.message||a||"");if(!/proxy error 413|payload too large/i.test(l))throw a;let d=an(r);return typeof i=="function"&&i(r,d),{data:e?await s(d,t,o):await n(d,t,o),fallback:d}}}async function yt({body:r,auth:e,options:t,streaming:o,toolContext:n,activeSkills:s,round:i,verbose:a,dependencies:l,config:d={}}){let p=d.maxToolResultChars||3e3,{fetchCompletion:m,fetchStreamingCompletion:b,onFallbackLog:A,hasToolCalls:I,getTextContent:D,parseToolCalls:M,buildAssistantMessage:x,buildToolResultMessage:C,executeTool:w,onToolCallLog:y,injectTools:O}=l;Array.isArray(r?.messages)&&(r.messages=ht(r.messages));let k=await ln({body:r,streaming:o,auth:e,options:t,fetchCompletion:m,fetchStreamingCompletion:b,onFallbackLog:A}),L=k?.data||k;if(!I(L))return{done:!0,text:D(L),body:k?.fallback||r};let U=M(L),N=k?.fallback||r;N.messages.push(x(L)),a&&typeof y=="function"&&y(U);let j=await Promise.all(U.map((B,z)=>(typeof t.onToolCall=="function"&&t.onToolCall(B.name,B.args,{round:i,index:z,total:U.length}),w(B,n))));for(let B=0;B<U.length;B++){let V=U[B].name==="get_skill_context"?typeof j[B]=="string"?j[B]:JSON.stringify(j[B]):sn(j[B],p);N.messages.push(C(U[B].id,V))}return typeof t.onToolCall=="function"&&t.onToolCall(null),O(N,s),{done:!1,body:N}}var un=ot.ASSISTANT,dn=15,Ze="get_skill_context";function fe(r){!r||typeof r!="object"||(r.type==="object"&&r.properties&&(r.required=Object.keys(r.properties),r.additionalProperties=!1,Object.values(r.properties).forEach(fe)),r.type==="array"&&r.items&&fe(r.items),r.anyOf&&r.anyOf.forEach(fe),r.oneOf&&r.oneOf.forEach(fe),r.allOf&&r.allOf.forEach(fe))}var _t={maxBytes:49e3,systemMaxChars:12e3},de=()=>process.env.ZIBBY_VERBOSE==="true"||process.env.ZIBBY_DEBUG==="true",fn=r=>Buffer.byteLength(JSON.stringify(r),"utf8");function Re(r){return Array.isArray(r)?new Set(r.map(e=>String(e||"").trim()).filter(Boolean)):new Set}function pn(r){return Array.isArray(r)?r.map(e=>String(e||"").trim()).filter(Boolean):[]}var De=class extends cn{#e;#t;#n=new Ne;constructor(e=null){super("assistant","Zibby Assistant",200),e&&typeof e=="object"&&(e.toolProvider||e.completionProvider)?(this.#e=e.toolProvider||new ce,this.#t=e.completionProvider||new ue):(this.#e=e||new ce,this.#t=new ue)}canHandle(e){return Ve().ok}async invoke(e,t={}){let o=Z("OPENAI_API_KEY");try{let n=t.model&&t.model!=="auto"?t.model:un,s=Ve();if(!s.ok)throw s.reason==="missing_session_token"?new Error("Login required. Run `zibby login` to authenticate."):s.reason==="missing_openai_api_key"?new Error("Missing OPENAI_API_KEY for BYOK mode."):s.reason==="missing_openai_proxy_url"?new Error("Missing OPENAI_PROXY_URL for local mode."):new Error(`Assistant auth unavailable (${s.reason}).`);let i=t.messages||[{role:"user",content:e}],a=s.baseUrl,l=de();if(l?await this.#m(i,n,a,s.tokenPreview||"none"):c.debug(`[Assistant] ${a} | model: ${n} | messages: ${i.length}`),t.schema)return this.#c(n,i,s,t);let d=t.activeSkills||[],p=this.#d(t),m=this.#f(d,p),b=this.#p(m),A=this.#u(t),I={...t,payloadCompaction:A},D={activeSkills:m,options:I,executionRegistry:b,capabilityPolicy:p},M=!!t.stream,x={model:n,messages:[...i],stream:!1};this.#r(x,m,p);for(let C=0;C<dn;C++){if(t.signal?.aborted){let y=new Error("Aborted via signal");throw y.name="AbortError",y}let w=await yt({body:x,auth:s,options:I,streaming:M,toolContext:D,activeSkills:m,round:C,verbose:l,dependencies:{fetchCompletion:this.#s.bind(this),fetchStreamingCompletion:this.#l.bind(this),onFallbackLog:(y,O)=>{de()&&console.log(`413 fallback: messages ${y.messages.length} -> ${O.messages.length}, bytes=${fn(O)}`)},hasToolCalls:y=>this.#e.hasToolCalls(y),getTextContent:y=>this.#e.getTextContent(y),parseToolCalls:y=>this.#e.parseToolCalls(y),buildAssistantMessage:y=>this.#e.buildAssistantMessage(y),buildToolResultMessage:(y,O)=>this.#e.buildToolResultMessage(y,O),executeTool:(y,O)=>this.#a(y,O),onToolCallLog:async y=>{let O=(await import("chalk")).default;console.log(O.dim(` ${y.map(k=>`${k.name}(${JSON.stringify(k.args).slice(0,80)})`).join(", ")}`))},injectTools:(y,O)=>this.#r(y,O,p)},config:{maxToolResultChars:t.maxToolResultChars||3e3}});if(w.done)return w.text;x.messages=w.body.messages,w.body.tools?x.tools=w.body.tools:delete x.tools}return"I hit my tool-calling limit for this turn. Please try again."}finally{o.dispose()}}async cleanup(){await this.#n.stopAll()}#r(e,t,o=null){let n=this.#i(t,o),s=this.#e.formatTools(n);this.#e.injectToolsIntoBody(e,s)}#i(e,t=null){let o=[],n=new Set;for(let s of e){let i=Le(s);if(i?.tools?.length)for(let a of i.tools)this.#o(a.name,t)&&(n.has(a.name)||(n.add(a.name),o.push({name:a.name,description:a.description,parameters:a.parameters||a.input_schema||{type:"object",properties:{}}})))}return!t?.disableSkillContextTool&&this.#o(Ze,t)&&o.push({name:Ze,description:"Fetch full prompt guidance/instructions for one installed skill on demand. Use this before making complex tool decisions if guidance is needed.",parameters:{type:"object",properties:{skillId:{type:"string",description:"Installed skill id to inspect (e.g. jira, github, runner, chat-memory)"}},required:["skillId"]}}),o}async#a(e,t){let{activeSkills:o,options:n,executionRegistry:s,capabilityPolicy:i}=t;if(!this.#o(e.name,i))return`Tool "${e.name}" blocked by policy`;if(e.name===Ze){let d=String(e.args?.skillId||"").trim();if(!d)return JSON.stringify({error:"skillId is required"});if(!o.includes(d))return JSON.stringify({error:`Skill "${d}" is not active`,activeSkills:o});let p=Le(d);if(!p)return JSON.stringify({error:`Skill "${d}" not found`});let m=typeof p.promptFragment=="function"?p.promptFragment():p.promptFragment||"",b=(p.tools||[]).map(I=>I.name),A=JSON.stringify({skillId:d,description:p.description||"",toolNames:b,promptFragment:m||""});return de()&&(console.log(`
71
- \u{1F4D6} get_skill_context("${d}") \u2192 ${A.length} chars (fragment: ${m.length} chars)`),console.log(` tools: [${b.join(", ")}]`),console.log(` fragment preview: ${m.slice(0,200).replace(/\n/g,"\\n")}\u2026
72
- `)),A}let a=s?.get(e.name)||null;if(!a)return`Unknown tool: ${e.name}`;let l=Le(a.skillId);if(!l)return`Skill "${a.skillId}" not found for tool "${e.name}"`;if(a.mode==="handler")try{return l.handleToolCall(e.name,e.args,t)}catch(d){return`Error in ${e.name}: ${d.message}`}if(a.mode==="mcp")try{if(!this.#n.isRunning(l.serverName)){let p=l.resolve(n);if(!p)return`Skill "${a.skillId}" is not available (cannot start server)`;await this.#n.ensureServer(l.serverName,p)}let d=await this.#n.callTool(l.serverName,e.name,e.args);return d.text||(d.isError?"Tool call failed":"Done")}catch(d){return`MCP error (${l.serverName}): ${d.message}`}return`Skill "${a.skillId}" owns tool "${e.name}" but has no execution mode`}async#l(e,t,o){return this.#t.fetchStreamingCompletion(e,t,{...o,onBudget:({beforeBytes:n,meta:s})=>{de()&&console.log(`payload bytes (stream) before=${n} after=${s.bytes} trimmed=${s.trimmed} messages=${s.messageCount}`)}})}async#s(e,t,o){return this.#t.fetchCompletion(e,t,{...o,onBudget:({beforeBytes:n,meta:s})=>{de()&&console.log(`payload bytes before=${n} after=${s.bytes} trimmed=${s.trimmed} messages=${s.messageCount}`)}})}async#c(e,t,o,n){let{zodToJson:s}=await Promise.resolve().then(()=>(pe(),tt)),i=typeof n.schema?.parse=="function",a=i?s(n.schema,{}):n.schema;delete a.$schema,fe(a);let l={model:e,messages:t,stream:!1,response_format:{type:"json_schema",json_schema:{name:"extract",schema:a,strict:!0}}},d=await this.#s(l,o,n),p=this.#e.getTextContent(d),m=JSON.parse(p),b=i?n.schema.parse(m):m;return{raw:p,structured:b}}#u(e={}){let t=e?.config?.agent?.assistant?.payloadCompaction||{};return{maxBytes:Number(t.maxBytes||e.maxPayloadBytes||_t.maxBytes),systemMaxChars:Number(t.systemMaxChars||_t.systemMaxChars)}}#d(e={}){let t=e?.config?.agent?.assistant?.toolPolicy||{};return{allowTools:Re(t.allowTools||e.allowTools),denyTools:Re(t.denyTools||e.denyTools),denyPrefixes:pn(t.denyPrefixes||e.denyToolPrefixes),includeSkills:Re(t.includeSkills||e.includeSkills),excludeSkills:Re(t.excludeSkills||e.excludeSkills),disableSkillContextTool:!!(t.disableSkillContextTool||e.disableSkillContextTool)}}#f(e,t){let o=t?.includeSkills||new Set,n=t?.excludeSkills||new Set;return o.size===0&&n.size===0?e:e.filter(s=>!(o.size>0&&!o.has(s)||n.has(s)))}#o(e,t){let o=String(e||"").trim();if(!o)return!1;let n=t?.allowTools;if(n&&n.size>0&&!n.has(o))return!1;let s=t?.denyTools;return!(s&&s.has(o)||(t?.denyPrefixes||[]).some(a=>o.startsWith(a)))}#p(e){let t=new Map,o=[];for(let n of e){let s=Le(n);if(!s?.tools?.length)continue;let i=typeof s.handleToolCall=="function"?"handler":s.serverName&&typeof s.resolve=="function"?"mcp":null;if(i)for(let a of s.tools){let l=String(a?.name||"").trim();if(l){if(t.has(l)){o.push({tool:l,winner:t.get(l).skillId,skipped:n});continue}t.set(l,{skillId:n,mode:i})}}}if(o.length>0&&de()){let n=o.slice(0,5).map(s=>`${s.tool}:${s.winner}>${s.skipped}`).join(", ");console.log(`tool registry collisions: ${n}${o.length>5?" ...":""}`)}return t}async#m(e,t,o,n){console.log(`
70
+ [tool result truncated for size]`}function cn(r,e){if(typeof r=="string")return Le(r,e);try{return Le(JSON.stringify(r),e)}catch{return Le(String(r),e)}}function ht(r){let e=new Set;for(let n of r)if(n.role==="assistant"&&Array.isArray(n.tool_calls))for(let s of n.tool_calls)e.add(s.id);let t=r.filter(n=>n.role==="tool"?e.has(n.tool_call_id):!0),o=new Set;for(let n of t)n.role==="tool"&&o.add(n.tool_call_id);return t.map(n=>{if(n.role!=="assistant"||!Array.isArray(n.tool_calls)||n.tool_calls.every(l=>o.has(l.id)))return n;let{tool_calls:i,...a}=n;return{...a,content:a.content||""}})}function un(r){let e=Array.isArray(r?.messages)?r.messages:[],t=e.find(s=>s.role==="system"),o=e.slice(-4).map(s=>({...s,content:Le(s.content,s.role==="tool"?1200:2500)}));o=ht(o);let n={...r,messages:[t,...o].filter(Boolean)};return delete n.tools,n}async function fn({body:r,streaming:e,auth:t,options:o,fetchCompletion:n,fetchStreamingCompletion:s,onFallbackLog:i}){try{return e?await s(r,t,o):await n(r,t,o)}catch(a){let l=String(a?.message||a||"");if(!/proxy error 413|payload too large/i.test(l))throw a;let f=un(r);return typeof i=="function"&&i(r,f),{data:e?await s(f,t,o):await n(f,t,o),fallback:f}}}async function yt({body:r,auth:e,options:t,streaming:o,toolContext:n,activeSkills:s,round:i,verbose:a,dependencies:l,config:f={}}){let p=f.maxToolResultChars||3e3,{fetchCompletion:m,fetchStreamingCompletion:b,onFallbackLog:A,hasToolCalls:I,getTextContent:D,parseToolCalls:L,buildAssistantMessage:x,buildToolResultMessage:C,executeTool:w,onToolCallLog:y,injectTools:O}=l;Array.isArray(r?.messages)&&(r.messages=ht(r.messages));let v=await fn({body:r,streaming:o,auth:e,options:t,fetchCompletion:m,fetchStreamingCompletion:b,onFallbackLog:A}),M=v?.data||v;if(!I(M))return{done:!0,text:D(M),body:v?.fallback||r};let U=L(M),N=v?.fallback||r;N.messages.push(x(M)),a&&typeof y=="function"&&y(U);let j=await Promise.all(U.map((B,z)=>(typeof t.onToolCall=="function"&&t.onToolCall(B.name,B.args,{round:i,index:z,total:U.length}),w(B,n))));for(let B=0;B<U.length;B++){let V=U[B].name==="get_skill_context"?typeof j[B]=="string"?j[B]:JSON.stringify(j[B]):cn(j[B],p);N.messages.push(C(U[B].id,V))}return typeof t.onToolCall=="function"&&t.onToolCall(null),O(N,s),{done:!1,body:N}}var pn=ot.ASSISTANT,mn=15,Ze="get_skill_context";function de(r){!r||typeof r!="object"||(r.type==="object"&&r.properties&&(r.required=Object.keys(r.properties),r.additionalProperties=!1,Object.values(r.properties).forEach(de)),r.type==="array"&&r.items&&de(r.items),r.anyOf&&r.anyOf.forEach(de),r.oneOf&&r.oneOf.forEach(de),r.allOf&&r.allOf.forEach(de))}var _t={maxBytes:49e3,systemMaxChars:12e3},fe=()=>process.env.ZIBBY_VERBOSE==="true"||process.env.ZIBBY_DEBUG==="true",gn=r=>Buffer.byteLength(JSON.stringify(r),"utf8");function Re(r){return Array.isArray(r)?new Set(r.map(e=>String(e||"").trim()).filter(Boolean)):new Set}function hn(r){return Array.isArray(r)?r.map(e=>String(e||"").trim()).filter(Boolean):[]}var De=class extends dn{#e;#t;#n=new Ne;constructor(e=null){super("assistant","Zibby Assistant",200),e&&typeof e=="object"&&(e.toolProvider||e.completionProvider)?(this.#e=e.toolProvider||new ce,this.#t=e.completionProvider||new ue):(this.#e=e||new ce,this.#t=new ue)}canHandle(e){return Ve().ok}async invoke(e,t={}){let o=Z("OPENAI_API_KEY");try{let n=t.model&&t.model!=="auto"?t.model:pn,s=Ve();if(!s.ok)throw s.reason==="missing_session_token"?new Error("Login required. Run `zibby login` to authenticate."):s.reason==="missing_openai_api_key"?new Error("Missing OPENAI_API_KEY for BYOK mode."):s.reason==="missing_openai_proxy_url"?new Error("Missing OPENAI_PROXY_URL for local mode."):new Error(`Assistant auth unavailable (${s.reason}).`);let i=t.messages||[{role:"user",content:e}],a=s.baseUrl,l=fe();if(l?await this.#m(i,n,a,s.tokenPreview||"none"):c.debug(`[Assistant] ${a} | model: ${n} | messages: ${i.length}`),t.schema)return this.#c(n,i,s,t);let f=t.activeSkills||[],p=this.#f(t),m=this.#d(f,p),b=this.#p(m),A=this.#u(t),I={...t,payloadCompaction:A},D={activeSkills:m,options:I,executionRegistry:b,capabilityPolicy:p},L=!!t.stream,x={model:n,messages:[...i],stream:!1};this.#r(x,m,p);for(let C=0;C<mn;C++){if(t.signal?.aborted){let y=new Error("Aborted via signal");throw y.name="AbortError",y}let w=await yt({body:x,auth:s,options:I,streaming:L,toolContext:D,activeSkills:m,round:C,verbose:l,dependencies:{fetchCompletion:this.#s.bind(this),fetchStreamingCompletion:this.#l.bind(this),onFallbackLog:(y,O)=>{fe()&&console.log(`413 fallback: messages ${y.messages.length} -> ${O.messages.length}, bytes=${gn(O)}`)},hasToolCalls:y=>this.#e.hasToolCalls(y),getTextContent:y=>this.#e.getTextContent(y),parseToolCalls:y=>this.#e.parseToolCalls(y),buildAssistantMessage:y=>this.#e.buildAssistantMessage(y),buildToolResultMessage:(y,O)=>this.#e.buildToolResultMessage(y,O),executeTool:(y,O)=>this.#a(y,O),onToolCallLog:async y=>{let O=(await import("chalk")).default;console.log(O.dim(` ${y.map(v=>`${v.name}(${JSON.stringify(v.args).slice(0,80)})`).join(", ")}`))},injectTools:(y,O)=>this.#r(y,O,p)},config:{maxToolResultChars:t.maxToolResultChars||3e3}});if(w.done)return w.text;x.messages=w.body.messages,w.body.tools?x.tools=w.body.tools:delete x.tools}return"I hit my tool-calling limit for this turn. Please try again."}finally{o.dispose()}}async cleanup(){await this.#n.stopAll()}#r(e,t,o=null){let n=this.#i(t,o),s=this.#e.formatTools(n);this.#e.injectToolsIntoBody(e,s)}#i(e,t=null){let o=[],n=new Set;for(let s of e){let i=Me(s);if(i?.tools?.length)for(let a of i.tools)this.#o(a.name,t)&&(n.has(a.name)||(n.add(a.name),o.push({name:a.name,description:a.description,parameters:a.parameters||a.input_schema||{type:"object",properties:{}}})))}return!t?.disableSkillContextTool&&this.#o(Ze,t)&&o.push({name:Ze,description:"Fetch full prompt guidance/instructions for one installed skill on demand. Use this before making complex tool decisions if guidance is needed.",parameters:{type:"object",properties:{skillId:{type:"string",description:"Installed skill id to inspect (e.g. jira, github, runner, chat-memory)"}},required:["skillId"]}}),o}async#a(e,t){let{activeSkills:o,options:n,executionRegistry:s,capabilityPolicy:i}=t;if(!this.#o(e.name,i))return`Tool "${e.name}" blocked by policy`;if(e.name===Ze){let f=String(e.args?.skillId||"").trim();if(!f)return JSON.stringify({error:"skillId is required"});if(!o.includes(f))return JSON.stringify({error:`Skill "${f}" is not active`,activeSkills:o});let p=Me(f);if(!p)return JSON.stringify({error:`Skill "${f}" not found`});let m=typeof p.promptFragment=="function"?p.promptFragment():p.promptFragment||"",b=(p.tools||[]).map(I=>I.name),A=JSON.stringify({skillId:f,description:p.description||"",toolNames:b,promptFragment:m||""});return fe()&&(console.log(`
71
+ \u{1F4D6} get_skill_context("${f}") \u2192 ${A.length} chars (fragment: ${m.length} chars)`),console.log(` tools: [${b.join(", ")}]`),console.log(` fragment preview: ${m.slice(0,200).replace(/\n/g,"\\n")}\u2026
72
+ `)),A}let a=s?.get(e.name)||null;if(!a)return`Unknown tool: ${e.name}`;let l=Me(a.skillId);if(!l)return`Skill "${a.skillId}" not found for tool "${e.name}"`;if(a.mode==="handler")try{return l.handleToolCall(e.name,e.args,t)}catch(f){return`Error in ${e.name}: ${f.message}`}if(a.mode==="mcp")try{if(!this.#n.isRunning(l.serverName)){let p=l.resolve(n);if(!p)return`Skill "${a.skillId}" is not available (cannot start server)`;await this.#n.ensureServer(l.serverName,p)}let f=await this.#n.callTool(l.serverName,e.name,e.args);return f.text||(f.isError?"Tool call failed":"Done")}catch(f){return`MCP error (${l.serverName}): ${f.message}`}return`Skill "${a.skillId}" owns tool "${e.name}" but has no execution mode`}async#l(e,t,o){return this.#t.fetchStreamingCompletion(e,t,{...o,onBudget:({beforeBytes:n,meta:s})=>{fe()&&console.log(`payload bytes (stream) before=${n} after=${s.bytes} trimmed=${s.trimmed} messages=${s.messageCount}`)}})}async#s(e,t,o){return this.#t.fetchCompletion(e,t,{...o,onBudget:({beforeBytes:n,meta:s})=>{fe()&&console.log(`payload bytes before=${n} after=${s.bytes} trimmed=${s.trimmed} messages=${s.messageCount}`)}})}async#c(e,t,o,n){let{zodToJson:s}=await Promise.resolve().then(()=>(pe(),tt)),i=typeof n.schema?.parse=="function",a=i?s(n.schema,{}):n.schema;delete a.$schema,de(a);let l={model:e,messages:t,stream:!1,response_format:{type:"json_schema",json_schema:{name:"extract",schema:a,strict:!0}}},f=await this.#s(l,o,n),p=this.#e.getTextContent(f),m=JSON.parse(p),b=i?n.schema.parse(m):m;return{raw:p,structured:b}}#u(e={}){let t=e?.config?.agent?.assistant?.payloadCompaction||{};return{maxBytes:Number(t.maxBytes||e.maxPayloadBytes||_t.maxBytes),systemMaxChars:Number(t.systemMaxChars||_t.systemMaxChars)}}#f(e={}){let t=e?.config?.agent?.assistant?.toolPolicy||{};return{allowTools:Re(t.allowTools||e.allowTools),denyTools:Re(t.denyTools||e.denyTools),denyPrefixes:hn(t.denyPrefixes||e.denyToolPrefixes),includeSkills:Re(t.includeSkills||e.includeSkills),excludeSkills:Re(t.excludeSkills||e.excludeSkills),disableSkillContextTool:!!(t.disableSkillContextTool||e.disableSkillContextTool)}}#d(e,t){let o=t?.includeSkills||new Set,n=t?.excludeSkills||new Set;return o.size===0&&n.size===0?e:e.filter(s=>!(o.size>0&&!o.has(s)||n.has(s)))}#o(e,t){let o=String(e||"").trim();if(!o)return!1;let n=t?.allowTools;if(n&&n.size>0&&!n.has(o))return!1;let s=t?.denyTools;return!(s&&s.has(o)||(t?.denyPrefixes||[]).some(a=>o.startsWith(a)))}#p(e){let t=new Map,o=[];for(let n of e){let s=Me(n);if(!s?.tools?.length)continue;let i=typeof s.handleToolCall=="function"?"handler":s.serverName&&typeof s.resolve=="function"?"mcp":null;if(i)for(let a of s.tools){let l=String(a?.name||"").trim();if(l){if(t.has(l)){o.push({tool:l,winner:t.get(l).skillId,skipped:n});continue}t.set(l,{skillId:n,mode:i})}}}if(o.length>0&&fe()){let n=o.slice(0,5).map(s=>`${s.tool}:${s.winner}>${s.skipped}`).join(", ");console.log(`tool registry collisions: ${n}${o.length>5?" ...":""}`)}return t}async#m(e,t,o,n){console.log(`
73
73
  \u25C6 Model: ${t} | proxy: ${o} | token: ${n||"none"}
74
- `);let s=(await import("chalk")).default;console.log(s.bold("Prompt sent to LLM:")),console.log(s.dim("\u2500".repeat(60)));let i=!1;for(let a of e)if(a.role==="system")console.log(s.dim(`[System] ${a.content||""}`));else{i||(console.log(s.dim("\u2500\u2500\u2500 chat history \u2500\u2500\u2500")),i=!0);let l=a.role==="user"?"Human":"AI",d=a.content?.length>200?`${a.content.slice(0,200)}...`:a.content||"";console.log(s.dim(`[${l}] ${d}`))}console.log(s.dim("\u2500".repeat(60)))}};var St=!1;function yr(){St||(Be(new De),Be(new Te),Be(new xe),Be(new Ie),St=!0)}export{yr as registerBuiltInStrategies};
74
+ `);let s=(await import("chalk")).default;console.log(s.bold("Prompt sent to LLM:")),console.log(s.dim("\u2500".repeat(60)));let i=!1;for(let a of e)if(a.role==="system")console.log(s.dim(`[System] ${a.content||""}`));else{i||(console.log(s.dim("\u2500\u2500\u2500 chat history \u2500\u2500\u2500")),i=!0);let l=a.role==="user"?"Human":"AI",f=a.content?.length>200?`${a.content.slice(0,200)}...`:a.content||"";console.log(s.dim(`[${l}] ${f}`))}console.log(s.dim("\u2500".repeat(60)))}};var St=!1;function Er(){St||(Be(new De),Be(new Te),Be(new xe),Be(new Ie),St=!0)}export{Er as registerBuiltInStrategies};