@zibby/core 0.5.52 → 0.5.53

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- import{existsSync as w,readFileSync as I}from"node:fs";import{homedir as T}from"node:os";import{join as b}from"node:path";var f=new Map,d={github:"GITHUB_TOKEN",gitlab:"GITLAB_TOKEN",sentry:"SENTRY_AUTH_TOKEN",slack:"SLACK_BOT_TOKEN"};function h(){let e=process.env.ZIBBY_SELF_HOST;return e!=null&&e!==""&&e!=="0"&&e.toLowerCase()!=="false"}function _(){if(process.env.PROJECT_API_TOKEN)return process.env.PROJECT_API_TOKEN;if(process.env.ZIBBY_USER_TOKEN)return process.env.ZIBBY_USER_TOKEN;try{let e=b(T(),".zibby","config.json");return w(e)&&JSON.parse(I(e,"utf-8")).sessionToken||null}catch{return null}}function E(){return process.env.ZIBBY_ACCOUNT_API_URL?process.env.ZIBBY_ACCOUNT_API_URL.replace(/\/$/,""):(process.env.ZIBBY_ENV||"prod")==="local"?"http://localhost:3001":process.env.ZIBBY_PROD_ACCOUNT_API_URL||"https://api-prod.zibby.app"}async function O(e){if(h()){let a=d[e];if(a&&process.env[a])return{token:process.env[a]}}let i=Date.now(),o=f.get(e);if(o&&o.expiresAt>i)return o.data;let s=_();if(!s)throw new Error("Missing session credential: neither PROJECT_API_TOKEN nor ZIBBY_USER_TOKEN is set in this process env (and no ~/.zibby/config.json session). If this is an MCP skill child, the spawning skill must forward them \u2014 check the skill's envKeys / resolve() env (see @zibby/skills backend-session-env-contract). Interactive CLI: run `zibby login`.");let r=`${E()}/integrations/token/${e}`,n=await fetch(r,{method:"GET",headers:{Authorization:`Bearer ${s}`}});if(!n.ok){let a=await n.text().catch(()=>"");if(n.status===404){let p="";try{p=String(JSON.parse(a)?.error||"").trim()}catch{}throw new Error(p||`${e} is not connected. Connect it at https://studio.zibby.dev/integrations`)}throw n.status===401||n.status===403?new Error("Session expired. Run `zibby login` to re-authenticate."):new Error(`Failed to resolve ${e} token (${n.status}): ${a}`)}let t=await n.json();if(!t||typeof t!="object")throw new Error(`Invalid response from ${e} token endpoint: expected object, got ${typeof t}`);if(e==="jira"){if(!t.token||typeof t.token!="string")throw new Error(`Invalid jira token response: token is ${typeof t.token}, expected string`);if(!t.cloudId)throw new Error("Invalid jira token response: missing cloudId")}else if(e==="github"&&(!t.token||typeof t.token!="string"))throw new Error(`Invalid github token response: token is ${typeof t.token}, expected string`);let c=((t.expiresInSec||3e3)-120)*1e3;return f.set(e,{data:t,expiresAt:i+c}),t}function v(e){e?f.delete(e):f.clear()}var l=null;function u(e){let i=process.env.WORKFLOW_ENABLED_INTEGRATIONS;if(typeof i!="string"||i.trim()==="")return e;let o=new Set(i.split(",").map(r=>r.trim()).filter(Boolean));if(o.size===0)return e;let s={};for(let[r,n]of Object.entries(e))o.has(r)&&(s[r]=n);return s}async function A(){let e=Date.now();if(l&&l.expiresAt>e)return l.data;if(h()){let o={};for(let[r,n]of Object.entries(d))o[r]=!!process.env[n];let s=u(o);return l={data:s,expiresAt:e+6e4},s}let i=_();if(!i)return{};try{let o=await fetch(`${E()}/integrations/status`,{method:"GET",headers:{Authorization:`Bearer ${i}`}});if(!o.ok)return{};let s=await o.json(),r={};if(s&&typeof s=="object")for(let[t,c]of Object.entries(s))c&&typeof c=="object"&&"connected"in c&&(r[t]=!!c.connected);let n=u(r);return l={data:n,expiresAt:e+6e4},n}catch{return{}}}function B(){l=null}export{B as clearConnectedCache,v as clearTokenCache,A as getConnectedIntegrations,O as resolveIntegrationToken};
1
+ import{existsSync as w,readFileSync as I}from"node:fs";import{homedir as b}from"node:os";import{join as T}from"node:path";var f=new Map,h={github:"GITHUB_TOKEN",gitlab:"GITLAB_TOKEN",sentry:"SENTRY_AUTH_TOKEN",slack:"SLACK_BOT_TOKEN"};function d(){let e=process.env.ZIBBY_SELF_HOST;return e!=null&&e!==""&&e!=="0"&&e.toLowerCase()!=="false"}function _(){if(process.env.PROJECT_API_TOKEN)return process.env.PROJECT_API_TOKEN;if(process.env.ZIBBY_USER_TOKEN)return process.env.ZIBBY_USER_TOKEN;try{let e=T(b(),".zibby","config.json");return w(e)&&JSON.parse(I(e,"utf-8")).sessionToken||null}catch{return null}}function E(){return process.env.ZIBBY_ACCOUNT_API_URL?process.env.ZIBBY_ACCOUNT_API_URL.replace(/\/$/,""):(process.env.ZIBBY_ENV||"prod")==="local"?"http://localhost:3001":process.env.ZIBBY_PROD_ACCOUNT_API_URL||"https://api-prod.zibby.app"}async function g(e){if(d()){let a=h[e];if(a&&process.env[a])return{token:process.env[a]}}let i=Date.now(),o=f.get(e);if(o&&o.expiresAt>i)return o.data;let r=_();if(!r)throw new Error("Missing session credential: neither PROJECT_API_TOKEN nor ZIBBY_USER_TOKEN is set in this process env (and no ~/.zibby/config.json session). If this is an MCP skill child, the spawning skill must forward them \u2014 check the skill's envKeys / resolve() env (see @zibby/skills backend-session-env-contract). Interactive CLI: run `zibby login`.");let s=`${E()}/integrations/token/${e}`,n=await fetch(s,{method:"GET",headers:{Authorization:`Bearer ${r}`}});if(!n.ok){let a=await n.text().catch(()=>"");if(n.status===404){let p="";try{p=String(JSON.parse(a)?.error||"").trim()}catch{}throw new Error(p||`${e} is not connected. Connect it at https://studio.zibby.dev/integrations`)}throw n.status===401||n.status===403?new Error("Session expired. Run `zibby login` to re-authenticate."):new Error(`Failed to resolve ${e} token (${n.status}): ${a}`)}let t=await n.json();if(!t||typeof t!="object")throw new Error(`Invalid response from ${e} token endpoint: expected object, got ${typeof t}`);if(e==="jira"){if(!t.token||typeof t.token!="string")throw new Error(`Invalid jira token response: token is ${typeof t.token}, expected string`);if(!t.cloudId&&!t.instanceUrl&&!t.baseUrl)throw new Error("Invalid jira token response: carries neither cloudId (OAuth connection) nor instanceUrl (API-token connection) \u2014 reconnect Jira.")}else if(e==="github"&&(!t.token||typeof t.token!="string"))throw new Error(`Invalid github token response: token is ${typeof t.token}, expected string`);let c=((t.expiresInSec||3e3)-120)*1e3;return f.set(e,{data:t,expiresAt:i+c}),t}function v(e){e?f.delete(e):f.clear()}var l=null;function u(e){let i=process.env.WORKFLOW_ENABLED_INTEGRATIONS;if(typeof i!="string"||i.trim()==="")return e;let o=new Set(i.split(",").map(s=>s.trim()).filter(Boolean));if(o.size===0)return e;let r={};for(let[s,n]of Object.entries(e))o.has(s)&&(r[s]=n);return r}async function A(){let e=Date.now();if(l&&l.expiresAt>e)return l.data;if(d()){let o={};for(let[s,n]of Object.entries(h))o[s]=!!process.env[n];let r=u(o);return l={data:r,expiresAt:e+6e4},r}let i=_();if(!i)return{};try{let o=await fetch(`${E()}/integrations/status`,{method:"GET",headers:{Authorization:`Bearer ${i}`}});if(!o.ok)return{};let r=await o.json(),s={};if(r&&typeof r=="object")for(let[t,c]of Object.entries(r))c&&typeof c=="object"&&"connected"in c&&(s[t]=!!c.connected);let n=u(s);return l={data:n,expiresAt:e+6e4},n}catch{return{}}}function B(){l=null}export{B as clearConnectedCache,v as clearTokenCache,A as getConnectedIntegrations,g as resolveIntegrationToken};
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- var Xn=Object.defineProperty;var Qn=(o=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(o,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):o)(function(o){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+o+'" is not supported')});var mr=(o,e,t)=>()=>{if(t)throw t[0];try{return o&&(e=o(o=0)),e}catch(r){throw t=[r],r}};var gr=(o,e)=>{for(var t in e)Xn(o,t,{get:e[t],enumerable:!0})};var br={};gr(br,{zodToJson:()=>de});import{z as yr}from"zod";import{zodToJsonSchema as oo}from"zod-to-json-schema";function so(o){if(!o||typeof o!="object")return o;if(Array.isArray(o.type))return o.type.includes("null")||(o.type=[...o.type,"null"]),o;if(typeof o.type=="string")return o.type=[o.type,"null"],o;for(let e of["anyOf","oneOf"])if(Array.isArray(o[e]))return o[e].some(t=>t&&t.type==="null")||(o[e]=[...o[e],{type:"null"}]),o;return{anyOf:[o,{type:"null"}]}}function ve(o){if(!o||typeof o!="object")return o;for(let e of["$defs","definitions"])if(o[e]&&typeof o[e]=="object")for(let t of Object.keys(o[e]))o[e][t]=ve(o[e][t]);for(let e of["anyOf","oneOf","allOf"])Array.isArray(o[e])&&(o[e]=o[e].map(ve));if(o.properties&&typeof o.properties=="object"){o.additionalProperties=!1;let e=Object.keys(o.properties),t=new Set(Array.isArray(o.required)?o.required:[]);for(let r of e){let n=ve(o.properties[r]);t.has(r)||(n=so(n)),o.properties[r]=n}o.required=e}return o.items&&(Array.isArray(o.items)?o.items=o.items.map(ve):o.items=ve(o.items)),o}function de(o,e={target:"openApi3"}){if(!o)return null;let t=e?.target==="openAi",r=null;if(typeof yr?.toJSONSchema=="function")try{r=yr.toJSONSchema(o)}catch{}if(!r)try{r=oo(o,e)}catch{return null}if(t&&r)try{return ve(r)}catch{return r}return r}var Ye=mr(()=>{});var cn={};gr(cn,{clearConnectedCache:()=>qs,clearTokenCache:()=>ln,getConnectedIntegrations:()=>Vs,resolveIntegrationToken:()=>Ot});import{existsSync as Ys,readFileSync as Hs}from"node:fs";import{homedir as Zs}from"node:os";import{join as Ws}from"node:path";function on(){let o=process.env.ZIBBY_SELF_HOST;return o!=null&&o!==""&&o!=="0"&&o.toLowerCase()!=="false"}function sn(){if(process.env.PROJECT_API_TOKEN)return process.env.PROJECT_API_TOKEN;if(process.env.ZIBBY_USER_TOKEN)return process.env.ZIBBY_USER_TOKEN;try{let o=Ws(Zs(),".zibby","config.json");return Ys(o)&&JSON.parse(Hs(o,"utf-8")).sessionToken||null}catch{return null}}function an(){return process.env.ZIBBY_ACCOUNT_API_URL?process.env.ZIBBY_ACCOUNT_API_URL.replace(/\/$/,""):(process.env.ZIBBY_ENV||"prod")==="local"?"http://localhost:3001":process.env.ZIBBY_PROD_ACCOUNT_API_URL||"https://api-prod.zibby.app"}async function Ot(o){if(on()){let a=nn[o];if(a&&process.env[a])return{token:process.env[a]}}let e=Date.now(),t=$t.get(o);if(t&&t.expiresAt>e)return t.data;let r=sn();if(!r)throw new Error("Missing session credential: neither PROJECT_API_TOKEN nor ZIBBY_USER_TOKEN is set in this process env (and no ~/.zibby/config.json session). If this is an MCP skill child, the spawning skill must forward them \u2014 check the skill's envKeys / resolve() env (see @zibby/skills backend-session-env-contract). Interactive CLI: run `zibby login`.");let n=`${an()}/integrations/token/${o}`,s=await fetch(n,{method:"GET",headers:{Authorization:`Bearer ${r}`}});if(!s.ok){let a=await s.text().catch(()=>"");if(s.status===404){let l="";try{l=String(JSON.parse(a)?.error||"").trim()}catch{}throw new Error(l||`${o} is not connected. Connect it at https://studio.zibby.dev/integrations`)}throw s.status===401||s.status===403?new Error("Session expired. Run `zibby login` to re-authenticate."):new Error(`Failed to resolve ${o} token (${s.status}): ${a}`)}let i=await s.json();if(!i||typeof i!="object")throw new Error(`Invalid response from ${o} token endpoint: expected object, got ${typeof i}`);if(o==="jira"){if(!i.token||typeof i.token!="string")throw new Error(`Invalid jira token response: token is ${typeof i.token}, expected string`);if(!i.cloudId)throw new Error("Invalid jira token response: missing cloudId")}else if(o==="github"&&(!i.token||typeof i.token!="string"))throw new Error(`Invalid github token response: token is ${typeof i.token}, expected string`);let c=((i.expiresInSec||3e3)-120)*1e3;return $t.set(o,{data:i,expiresAt:e+c}),i}function ln(o){o?$t.delete(o):$t.clear()}function rn(o){let e=process.env.WORKFLOW_ENABLED_INTEGRATIONS;if(typeof e!="string"||e.trim()==="")return o;let t=new Set(e.split(",").map(n=>n.trim()).filter(Boolean));if(t.size===0)return o;let r={};for(let[n,s]of Object.entries(o))t.has(n)&&(r[n]=s);return r}async function Vs(){let o=Date.now();if(De&&De.expiresAt>o)return De.data;if(on()){let t={};for(let[n,s]of Object.entries(nn))t[n]=!!process.env[s];let r=rn(t);return De={data:r,expiresAt:o+6e4},r}let e=sn();if(!e)return{};try{let t=await fetch(`${an()}/integrations/status`,{method:"GET",headers:{Authorization:`Bearer ${e}`}});if(!t.ok)return{};let r=await t.json(),n={};if(r&&typeof r=="object")for(let[i,c]of Object.entries(r))c&&typeof c=="object"&&"connected"in c&&(n[i]=!!c.connected);let s=rn(n);return De={data:s,expiresAt:o+6e4},s}catch{return{}}}function qs(){De=null}var $t,nn,De,It=mr(()=>{$t=new Map,nn={github:"GITHUB_TOKEN",gitlab:"GITLAB_TOKEN",sentry:"SENTRY_AUTH_TOKEN",slack:"SLACK_BOT_TOKEN"};De=null});import{readFileSync as Yn,existsSync as Hn}from"node:fs";import{join as Je,resolve as Zn,isAbsolute as ca}from"node:path";import{DEFAULT_OUTPUT_BASE as ua,SESSIONS_DIR as Wn,RESULT_FILE as pa,resolveWorkflowSession as fa,clearInheritedSessionEnvForFreshRun as da,readPinnedSessionPathFromEnv as ma}from"@zibby/agent-workflow";import{registerStrategy as Tt}from"@zibby/agent-workflow";import{AgentStrategy as po,getSkill as wr,NO_INTEGRATION_TOGGLEABLE_SKILL_IDS as fo}from"@zibby/agent-workflow";import{query as mo}from"@anthropic-ai/claude-agent-sdk";import eo from"node:process";var hr=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 Te(o=eo.env){let e={},t=new Set(hr);for(let[r,n]of Object.entries(o))t.has(r)||n!==void 0&&(e[r]=n);return e}function lt(o){return!!o&&(o.transport==="http"||typeof o.url=="string"&&!o.command)}var to=new Set(["claude"]);function ro(){let o=String(process.env.MCP_ALWAYS_LOAD??"").trim().toLowerCase();return!(o==="0"||o==="false"||o==="off")}function no(o,e){return to.has(o)?ro()?typeof e.alwaysLoad=="boolean"?{alwaysLoad:e.alwaysLoad}:{}:{}:{}}function re(o,e,{processEnv:t}={}){if(!e)return null;let r=no(o,e);if(lt(e)){let s=String(e.url||"").trim();if(!s)return null;let i=e.headers&&typeof e.headers=="object"?e.headers:void 0;switch(o){case"claude":return{type:"http",url:s,...i&&{headers:i},...r};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},...r}}}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,...r}}function ct(o){return lt(o)?`http \u2192 ${String(o.url||"").replace(/\?.*$/,"")}`:`${o?.command||"?"} ${(o?.args||[]).join(" ")}`.trim()}Ye();import{writeFileSync as Lt,mkdirSync as Mt,existsSync as Ie,readFileSync as Er}from"fs";import{homedir as Ar}from"os";import{join as te}from"path";import He from"chalk";var ne={debug:0,info:1,warn:2,error:3,silent:4},ut=class{constructor(){this._level=this._getLogLevel()}_getLogLevel(){if(process.env.ZIBBY_DEBUG==="true")return ne.debug;if(process.env.ZIBBY_VERBOSE==="true")return ne.info;let e=process.env.LOG_LEVEL?.toLowerCase();return e&&e in ne?ne[e]:ne.info}_shouldLog(e){return ne[e]>=this._level}_formatMessage(e,t,r={}){let n=new Date().toISOString(),i=`${this._getPrefix(e)} ${t}`;return Object.keys(r).length>0&&(i+=He.dim(` ${JSON.stringify(r)}`)),i}_getPrefix(e){return{debug:He.gray("[DEBUG]"),info:He.cyan("[INFO]"),warn:He.yellow("[WARN]"),error:He.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 ne&&(this._level=ne[e])}getLevel(){return Object.keys(ne).find(e=>ne[e]===this._level)}},f=new ut;import{timeline as ie,Timeline as Ia,WORKFLOW_GRAPH_LOG_MARKER_PREFIX as Ca}from"@zibby/agent-workflow";var $e=[{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 Ze(o){let e={};for(let t of $e)t.vendor===o&&(e[t.alias]=t.canonicalId);return e}function io(o){if(!o||typeof o!="string")return null;let e=o.toLowerCase();for(let t of $e)if(t.alias.toLowerCase()===e)return t.family??null;for(let t of $e)if(t.canonicalId.toLowerCase()===e)return t.family??null;return null}function Sr(o){let e=String(o||"").match(/(\d+(?:\.\d+)?)/);return e?parseFloat(e[1]):0}function _r(o){let e=String(o||"").toLowerCase();return/\b(base|mini)\b/.test(e)?0:/\b(opus|pro)\b/.test(e)?2:1}function ao(o,e){let t=Sr(e.label)-Sr(o.label);if(t!==0)return t;let r=_r(e.label)-_r(o.label);return r!==0?r:o.label.localeCompare(e.label)}function lo(){let o=[],e=new Map;for(let r of $e)r.pickerVisible&&(e.has(r.vendor)||(e.set(r.vendor,[]),o.push(r.vendor)),e.get(r.vendor).push({value:`${r.vendor}:${r.alias}`,label:r.label||`${r.vendor}:${r.alias}`,vendor:r.vendor,alias:r.alias,isDefault:!!r.isDefault}));let t=[];for(let r of o)t.push(...e.get(r).sort(ao));return t}function Oe(o,e){let t=typeof e=="string"?e.trim():"";if(t&&t!=="auto")return t;if(t==="auto"&&$e.some(r=>r.vendor===o&&r.isDefault))return"auto";throw new Error(`[${o}] 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 ce={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"},co={ASSISTANT:"assistant",CLAUDE:"claude",CURSOR:"cursor",CODEX:"codex",GEMINI:"gemini"},uo={DEBUG:"debug",INFO:"info",WARN:"warn",ERROR:"error",SILENT:"silent"},pt=Ze("claude"),ft=Ze("codex"),Rt=Ze("gemini"),dt={CURSOR_AGENT_DEFAULT:1200*1e3,OPENAI_REQUEST:18e4};function V(o){let e=`${o}_POOL`,t=process.env[e];if(!t||typeof t!="string")return{picked:null,count:0,dispose:()=>{}};let r=t.split(/[,\n]+/).map(i=>i.trim()).filter(Boolean);if(r.length===0)return{picked:null,count:0,dispose:()=>{}};let n=r[Math.floor(Math.random()*r.length)],s=process.env[o];return process.env[o]=n,f.debug(`[auth-pool] ${o}: picked 1 of ${r.length} from pool (***${n.slice(-4)})`),{picked:n,count:r.length,dispose(){s===void 0?delete process.env[o]:process.env[o]=s}}}function mt(o){if(!o||typeof o!="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(o.input_tokens,o.inputTokens,o.prompt_tokens,o.promptTokens),r=e(o.output_tokens,o.outputTokens,o.completion_tokens,o.completionTokens);return t==null&&r==null?null:{input:t||0,output:r||0}}import{createRequire as go}from"module";import J from"process";var xr=go(import.meta.url);function ho(o){let e=2166136261;for(let t=0;t<o.length;t++)e^=o.charCodeAt(t),e=Math.imul(e,16777619)>>>0;return e.toString(16).padStart(8,"0")}function Tr(o){if(!o||typeof o!="object")return null;let e=o.message?.content??o.content;return Array.isArray(e)&&e.length||typeof e=="string"&&e.length?e:typeof o.text=="string"&&o.text.length?o.text:null}function yo(o){let e=Tr(o);if(e===null)return null;let t;try{t=JSON.stringify(e)}catch{return null}return typeof t!="string"||!t?null:`${`${o.type||o.constructor?.name||"?"}`}:${t.length}:${ho(t)}`}function bo(o){if(!o||typeof o!="object")return"a message with no type";let e=o.type||o.constructor?.name||"unknown-type",t=o.subtype?`/${o.subtype}`:"",r=Tr(o);if(typeof r=="string")return`${e}${t} text "${r.slice(0,80)}"`;if(!Array.isArray(r))return`${e}${t} (no readable content)`;let n=r.slice(0,4).map(s=>!s||typeof s!="object"?String(s).slice(0,30):s.type==="tool_use"?`tool_use ${s.name||"(unnamed)"}`:s.type==="tool_result"?`tool_result${s.is_error?" (error)":""}`:s.type==="text"&&typeof s.text=="string"?`text "${s.text.slice(0,60)}"`:s.type==="thinking"?"thinking":String(s.type||"block").slice(0,30));return r.length>n.length&&n.push(`+${r.length-n.length} more`),`${e}${t} [${n.join(", ")}]`}var vr=(o,e)=>{let t=String(o??"");return t.length>e?`${t.slice(0,e)}\u2026`:t},So=/secret|token|password|passwd|credential|authorization|bearer|api[-_]?key|private[-_]?key|access[-_]?key/i,$r=(o,e=0)=>{if(o==null||e>6||typeof o!="object")return o;let t=Array.isArray(o)?[]:{};for(let[r,n]of Object.entries(o)){let s=So.test(r)||r==="value"&&typeof o.key=="string";t[r]=s&&typeof n=="string"&&n?"[redacted]":$r(n,e+1)}return t},Or=o=>{try{if(o==null)return"";let e=$r(o),t=typeof e=="string"?e:JSON.stringify(e);return vr(String(t).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""}},_o=500;function wo(o){let e=o&&typeof o=="object"?o.content:void 0,t=new Set,r=0;if(typeof e=="string")r=e.length,e&&t.add("text");else if(Array.isArray(e))for(let a of e){if(typeof a=="string"){t.add("text"),r+=a.length;continue}!a||typeof a!="object"||(t.add(typeof a.type=="string"&&a.type?a.type:"unknown"),typeof a.text=="string"&&(r+=a.text.length))}else if(e!=null){t.add("json");try{r=JSON.stringify(e).length}catch{r=0}}let n=!(o&&o.is_error===!0),s={ok:n,chars:r};if(t.size&&(s.kind=[...t].join("+")),n)return s;let i=e;Array.isArray(e)&&(i=e.map(a=>typeof a=="string"?a:a&&typeof a.text=="string"?a.text:"").filter(Boolean).join(`
1
+ var Xn=Object.defineProperty;var Qn=(o=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(o,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):o)(function(o){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+o+'" is not supported')});var mr=(o,e,t)=>()=>{if(t)throw t[0];try{return o&&(e=o(o=0)),e}catch(r){throw t=[r],r}};var gr=(o,e)=>{for(var t in e)Xn(o,t,{get:e[t],enumerable:!0})};var br={};gr(br,{zodToJson:()=>de});import{z as yr}from"zod";import{zodToJsonSchema as oo}from"zod-to-json-schema";function so(o){if(!o||typeof o!="object")return o;if(Array.isArray(o.type))return o.type.includes("null")||(o.type=[...o.type,"null"]),o;if(typeof o.type=="string")return o.type=[o.type,"null"],o;for(let e of["anyOf","oneOf"])if(Array.isArray(o[e]))return o[e].some(t=>t&&t.type==="null")||(o[e]=[...o[e],{type:"null"}]),o;return{anyOf:[o,{type:"null"}]}}function ve(o){if(!o||typeof o!="object")return o;for(let e of["$defs","definitions"])if(o[e]&&typeof o[e]=="object")for(let t of Object.keys(o[e]))o[e][t]=ve(o[e][t]);for(let e of["anyOf","oneOf","allOf"])Array.isArray(o[e])&&(o[e]=o[e].map(ve));if(o.properties&&typeof o.properties=="object"){o.additionalProperties=!1;let e=Object.keys(o.properties),t=new Set(Array.isArray(o.required)?o.required:[]);for(let r of e){let n=ve(o.properties[r]);t.has(r)||(n=so(n)),o.properties[r]=n}o.required=e}return o.items&&(Array.isArray(o.items)?o.items=o.items.map(ve):o.items=ve(o.items)),o}function de(o,e={target:"openApi3"}){if(!o)return null;let t=e?.target==="openAi",r=null;if(typeof yr?.toJSONSchema=="function")try{r=yr.toJSONSchema(o)}catch{}if(!r)try{r=oo(o,e)}catch{return null}if(t&&r)try{return ve(r)}catch{return r}return r}var Ye=mr(()=>{});var cn={};gr(cn,{clearConnectedCache:()=>qs,clearTokenCache:()=>ln,getConnectedIntegrations:()=>Vs,resolveIntegrationToken:()=>Ot});import{existsSync as Ys,readFileSync as Hs}from"node:fs";import{homedir as Zs}from"node:os";import{join as Ws}from"node:path";function on(){let o=process.env.ZIBBY_SELF_HOST;return o!=null&&o!==""&&o!=="0"&&o.toLowerCase()!=="false"}function sn(){if(process.env.PROJECT_API_TOKEN)return process.env.PROJECT_API_TOKEN;if(process.env.ZIBBY_USER_TOKEN)return process.env.ZIBBY_USER_TOKEN;try{let o=Ws(Zs(),".zibby","config.json");return Ys(o)&&JSON.parse(Hs(o,"utf-8")).sessionToken||null}catch{return null}}function an(){return process.env.ZIBBY_ACCOUNT_API_URL?process.env.ZIBBY_ACCOUNT_API_URL.replace(/\/$/,""):(process.env.ZIBBY_ENV||"prod")==="local"?"http://localhost:3001":process.env.ZIBBY_PROD_ACCOUNT_API_URL||"https://api-prod.zibby.app"}async function Ot(o){if(on()){let a=nn[o];if(a&&process.env[a])return{token:process.env[a]}}let e=Date.now(),t=$t.get(o);if(t&&t.expiresAt>e)return t.data;let r=sn();if(!r)throw new Error("Missing session credential: neither PROJECT_API_TOKEN nor ZIBBY_USER_TOKEN is set in this process env (and no ~/.zibby/config.json session). If this is an MCP skill child, the spawning skill must forward them \u2014 check the skill's envKeys / resolve() env (see @zibby/skills backend-session-env-contract). Interactive CLI: run `zibby login`.");let n=`${an()}/integrations/token/${o}`,s=await fetch(n,{method:"GET",headers:{Authorization:`Bearer ${r}`}});if(!s.ok){let a=await s.text().catch(()=>"");if(s.status===404){let l="";try{l=String(JSON.parse(a)?.error||"").trim()}catch{}throw new Error(l||`${o} is not connected. Connect it at https://studio.zibby.dev/integrations`)}throw s.status===401||s.status===403?new Error("Session expired. Run `zibby login` to re-authenticate."):new Error(`Failed to resolve ${o} token (${s.status}): ${a}`)}let i=await s.json();if(!i||typeof i!="object")throw new Error(`Invalid response from ${o} token endpoint: expected object, got ${typeof i}`);if(o==="jira"){if(!i.token||typeof i.token!="string")throw new Error(`Invalid jira token response: token is ${typeof i.token}, expected string`);if(!i.cloudId&&!i.instanceUrl&&!i.baseUrl)throw new Error("Invalid jira token response: carries neither cloudId (OAuth connection) nor instanceUrl (API-token connection) \u2014 reconnect Jira.")}else if(o==="github"&&(!i.token||typeof i.token!="string"))throw new Error(`Invalid github token response: token is ${typeof i.token}, expected string`);let c=((i.expiresInSec||3e3)-120)*1e3;return $t.set(o,{data:i,expiresAt:e+c}),i}function ln(o){o?$t.delete(o):$t.clear()}function rn(o){let e=process.env.WORKFLOW_ENABLED_INTEGRATIONS;if(typeof e!="string"||e.trim()==="")return o;let t=new Set(e.split(",").map(n=>n.trim()).filter(Boolean));if(t.size===0)return o;let r={};for(let[n,s]of Object.entries(o))t.has(n)&&(r[n]=s);return r}async function Vs(){let o=Date.now();if(De&&De.expiresAt>o)return De.data;if(on()){let t={};for(let[n,s]of Object.entries(nn))t[n]=!!process.env[s];let r=rn(t);return De={data:r,expiresAt:o+6e4},r}let e=sn();if(!e)return{};try{let t=await fetch(`${an()}/integrations/status`,{method:"GET",headers:{Authorization:`Bearer ${e}`}});if(!t.ok)return{};let r=await t.json(),n={};if(r&&typeof r=="object")for(let[i,c]of Object.entries(r))c&&typeof c=="object"&&"connected"in c&&(n[i]=!!c.connected);let s=rn(n);return De={data:s,expiresAt:o+6e4},s}catch{return{}}}function qs(){De=null}var $t,nn,De,It=mr(()=>{$t=new Map,nn={github:"GITHUB_TOKEN",gitlab:"GITLAB_TOKEN",sentry:"SENTRY_AUTH_TOKEN",slack:"SLACK_BOT_TOKEN"};De=null});import{readFileSync as Yn,existsSync as Hn}from"node:fs";import{join as Je,resolve as Zn,isAbsolute as ca}from"node:path";import{DEFAULT_OUTPUT_BASE as ua,SESSIONS_DIR as Wn,RESULT_FILE as pa,resolveWorkflowSession as fa,clearInheritedSessionEnvForFreshRun as da,readPinnedSessionPathFromEnv as ma}from"@zibby/agent-workflow";import{registerStrategy as Tt}from"@zibby/agent-workflow";import{AgentStrategy as po,getSkill as wr,NO_INTEGRATION_TOGGLEABLE_SKILL_IDS as fo}from"@zibby/agent-workflow";import{query as mo}from"@anthropic-ai/claude-agent-sdk";import eo from"node:process";var hr=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 Te(o=eo.env){let e={},t=new Set(hr);for(let[r,n]of Object.entries(o))t.has(r)||n!==void 0&&(e[r]=n);return e}function lt(o){return!!o&&(o.transport==="http"||typeof o.url=="string"&&!o.command)}var to=new Set(["claude"]);function ro(){let o=String(process.env.MCP_ALWAYS_LOAD??"").trim().toLowerCase();return!(o==="0"||o==="false"||o==="off")}function no(o,e){return to.has(o)?ro()?typeof e.alwaysLoad=="boolean"?{alwaysLoad:e.alwaysLoad}:{}:{}:{}}function re(o,e,{processEnv:t}={}){if(!e)return null;let r=no(o,e);if(lt(e)){let s=String(e.url||"").trim();if(!s)return null;let i=e.headers&&typeof e.headers=="object"?e.headers:void 0;switch(o){case"claude":return{type:"http",url:s,...i&&{headers:i},...r};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},...r}}}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,...r}}function ct(o){return lt(o)?`http \u2192 ${String(o.url||"").replace(/\?.*$/,"")}`:`${o?.command||"?"} ${(o?.args||[]).join(" ")}`.trim()}Ye();import{writeFileSync as Lt,mkdirSync as Mt,existsSync as Ie,readFileSync as Er}from"fs";import{homedir as Ar}from"os";import{join as te}from"path";import He from"chalk";var ne={debug:0,info:1,warn:2,error:3,silent:4},ut=class{constructor(){this._level=this._getLogLevel()}_getLogLevel(){if(process.env.ZIBBY_DEBUG==="true")return ne.debug;if(process.env.ZIBBY_VERBOSE==="true")return ne.info;let e=process.env.LOG_LEVEL?.toLowerCase();return e&&e in ne?ne[e]:ne.info}_shouldLog(e){return ne[e]>=this._level}_formatMessage(e,t,r={}){let n=new Date().toISOString(),i=`${this._getPrefix(e)} ${t}`;return Object.keys(r).length>0&&(i+=He.dim(` ${JSON.stringify(r)}`)),i}_getPrefix(e){return{debug:He.gray("[DEBUG]"),info:He.cyan("[INFO]"),warn:He.yellow("[WARN]"),error:He.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 ne&&(this._level=ne[e])}getLevel(){return Object.keys(ne).find(e=>ne[e]===this._level)}},f=new ut;import{timeline as ie,Timeline as Ia,WORKFLOW_GRAPH_LOG_MARKER_PREFIX as Ca}from"@zibby/agent-workflow";var $e=[{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 Ze(o){let e={};for(let t of $e)t.vendor===o&&(e[t.alias]=t.canonicalId);return e}function io(o){if(!o||typeof o!="string")return null;let e=o.toLowerCase();for(let t of $e)if(t.alias.toLowerCase()===e)return t.family??null;for(let t of $e)if(t.canonicalId.toLowerCase()===e)return t.family??null;return null}function Sr(o){let e=String(o||"").match(/(\d+(?:\.\d+)?)/);return e?parseFloat(e[1]):0}function _r(o){let e=String(o||"").toLowerCase();return/\b(base|mini)\b/.test(e)?0:/\b(opus|pro)\b/.test(e)?2:1}function ao(o,e){let t=Sr(e.label)-Sr(o.label);if(t!==0)return t;let r=_r(e.label)-_r(o.label);return r!==0?r:o.label.localeCompare(e.label)}function lo(){let o=[],e=new Map;for(let r of $e)r.pickerVisible&&(e.has(r.vendor)||(e.set(r.vendor,[]),o.push(r.vendor)),e.get(r.vendor).push({value:`${r.vendor}:${r.alias}`,label:r.label||`${r.vendor}:${r.alias}`,vendor:r.vendor,alias:r.alias,isDefault:!!r.isDefault}));let t=[];for(let r of o)t.push(...e.get(r).sort(ao));return t}function Oe(o,e){let t=typeof e=="string"?e.trim():"";if(t&&t!=="auto")return t;if(t==="auto"&&$e.some(r=>r.vendor===o&&r.isDefault))return"auto";throw new Error(`[${o}] 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 ce={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"},co={ASSISTANT:"assistant",CLAUDE:"claude",CURSOR:"cursor",CODEX:"codex",GEMINI:"gemini"},uo={DEBUG:"debug",INFO:"info",WARN:"warn",ERROR:"error",SILENT:"silent"},pt=Ze("claude"),ft=Ze("codex"),Rt=Ze("gemini"),dt={CURSOR_AGENT_DEFAULT:1200*1e3,OPENAI_REQUEST:18e4};function V(o){let e=`${o}_POOL`,t=process.env[e];if(!t||typeof t!="string")return{picked:null,count:0,dispose:()=>{}};let r=t.split(/[,\n]+/).map(i=>i.trim()).filter(Boolean);if(r.length===0)return{picked:null,count:0,dispose:()=>{}};let n=r[Math.floor(Math.random()*r.length)],s=process.env[o];return process.env[o]=n,f.debug(`[auth-pool] ${o}: picked 1 of ${r.length} from pool (***${n.slice(-4)})`),{picked:n,count:r.length,dispose(){s===void 0?delete process.env[o]:process.env[o]=s}}}function mt(o){if(!o||typeof o!="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(o.input_tokens,o.inputTokens,o.prompt_tokens,o.promptTokens),r=e(o.output_tokens,o.outputTokens,o.completion_tokens,o.completionTokens);return t==null&&r==null?null:{input:t||0,output:r||0}}import{createRequire as go}from"module";import J from"process";var xr=go(import.meta.url);function ho(o){let e=2166136261;for(let t=0;t<o.length;t++)e^=o.charCodeAt(t),e=Math.imul(e,16777619)>>>0;return e.toString(16).padStart(8,"0")}function Tr(o){if(!o||typeof o!="object")return null;let e=o.message?.content??o.content;return Array.isArray(e)&&e.length||typeof e=="string"&&e.length?e:typeof o.text=="string"&&o.text.length?o.text:null}function yo(o){let e=Tr(o);if(e===null)return null;let t;try{t=JSON.stringify(e)}catch{return null}return typeof t!="string"||!t?null:`${`${o.type||o.constructor?.name||"?"}`}:${t.length}:${ho(t)}`}function bo(o){if(!o||typeof o!="object")return"a message with no type";let e=o.type||o.constructor?.name||"unknown-type",t=o.subtype?`/${o.subtype}`:"",r=Tr(o);if(typeof r=="string")return`${e}${t} text "${r.slice(0,80)}"`;if(!Array.isArray(r))return`${e}${t} (no readable content)`;let n=r.slice(0,4).map(s=>!s||typeof s!="object"?String(s).slice(0,30):s.type==="tool_use"?`tool_use ${s.name||"(unnamed)"}`:s.type==="tool_result"?`tool_result${s.is_error?" (error)":""}`:s.type==="text"&&typeof s.text=="string"?`text "${s.text.slice(0,60)}"`:s.type==="thinking"?"thinking":String(s.type||"block").slice(0,30));return r.length>n.length&&n.push(`+${r.length-n.length} more`),`${e}${t} [${n.join(", ")}]`}var vr=(o,e)=>{let t=String(o??"");return t.length>e?`${t.slice(0,e)}\u2026`:t},So=/secret|token|password|passwd|credential|authorization|bearer|api[-_]?key|private[-_]?key|access[-_]?key/i,$r=(o,e=0)=>{if(o==null||e>6||typeof o!="object")return o;let t=Array.isArray(o)?[]:{};for(let[r,n]of Object.entries(o)){let s=So.test(r)||r==="value"&&typeof o.key=="string";t[r]=s&&typeof n=="string"&&n?"[redacted]":$r(n,e+1)}return t},Or=o=>{try{if(o==null)return"";let e=$r(o),t=typeof e=="string"?e:JSON.stringify(e);return vr(String(t).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""}},_o=500;function wo(o){let e=o&&typeof o=="object"?o.content:void 0,t=new Set,r=0;if(typeof e=="string")r=e.length,e&&t.add("text");else if(Array.isArray(e))for(let a of e){if(typeof a=="string"){t.add("text"),r+=a.length;continue}!a||typeof a!="object"||(t.add(typeof a.type=="string"&&a.type?a.type:"unknown"),typeof a.text=="string"&&(r+=a.text.length))}else if(e!=null){t.add("json");try{r=JSON.stringify(e).length}catch{r=0}}let n=!(o&&o.is_error===!0),s={ok:n,chars:r};if(t.size&&(s.kind=[...t].join("+")),n)return s;let i=e;Array.isArray(e)&&(i=e.map(a=>typeof a=="string"?a:a&&typeof a.text=="string"?a.text:"").filter(Boolean).join(`
2
2
  `));let c=Or(i);return c&&(s.error=c),s}function xo(){try{if(J.env.CLAUDE_CODE_EXECUTABLE&&Ie(J.env.CLAUDE_CODE_EXECUTABLE))return J.env.CLAUDE_CODE_EXECUTABLE;let o=J.platform,e=J.arch,t=`@anthropic-ai/claude-agent-sdk-${o}-${e}`,r=o==="win32"?"claude.exe":"claude";try{let n=xr.resolve(`${t}/package.json`),s=te(n,"..",r);if(Ie(s))return s}catch{}try{let n=xr.resolve("@anthropic-ai/claude-agent-sdk/package.json"),s=te(n,"..");for(let c of[r,te("vendor",r),te("bin",r)]){let a=te(s,c);if(Ie(a))return a}let i=te(s,"..",`claude-agent-sdk-${o}-${e}`,r);if(Ie(i))return i}catch{}}catch{}return null}var gt=xo();gt&&f.debug(`Claude native CLI resolved to baked binary: ${gt}`);var me=class extends po{constructor(){super("claude","Claude (Anthropic API)",50)}canHandle(e){let t=!!J.env.ANTHROPIC_API_KEY||!!J.env.ANTHROPIC_API_KEY_POOL,r=!!J.env.CLAUDE_CODE_OAUTH_TOKEN||!!J.env.CLAUDE_CODE_OAUTH_TOKEN_POOL,n=!!J.env.ANTHROPIC_AUTH_TOKEN||!!J.env.ANTHROPIC_AUTH_TOKEN_POOL,s=t||r||n;return s||f.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:r,workspace:n=J.cwd(),schema:s=null,images:i=[],skills:c=null,sessionPath:a=null,nodeName:l=null,timeout:u,config:d={},activityLog:m=!1,signal:p=null,sessionId:g,resume:y,forkSession:h,sessionStore:b}=t,_=Oe("claude",r),E=pt[_]||_;pt[_]&&_!==E&&f.debug(`Mapped model: ${_} \u2192 ${E}`);let S=[V("ANTHROPIC_API_KEY"),V("CLAUDE_CODE_OAUTH_TOKEN"),V("ANTHROPIC_AUTH_TOKEN")];try{f.debug(`Invoking Claude Agent SDK with model: ${E}, skills: ${JSON.stringify(c)}`);let T=vr,P=($,I)=>{try{console.log(JSON.stringify({mode:$,...I}))}catch{}},N=J.env.CLAUDE_CODE_OAUTH_TOKEN,O=J.env.ANTHROPIC_API_KEY,D=J.env.ANTHROPIC_AUTH_TOKEN;J.env.CLAUDE_CODE_CREDENTIALS_JSON?To(J.env.CLAUDE_CODE_CREDENTIALS_JSON):N&&Ao(N,J.env.__ZIBBY_CLAUDE_PLAN);let z=J.env.__ZIBBY_CLAUDE_PLAN,k=z?z.charAt(0).toUpperCase()+z.slice(1):null,U;if(N?U=k?`Claude ${k} plan \xB7 ***${N.slice(-4)}`:`Subscription \xB7 ***${N.slice(-4)}`:O?U=`API key \xB7 ***${O.slice(-4)}`:D?U=`Bearer \xB7 ***${D.slice(-4)}`:U="NONE \u2014 request will fail",!m){let $=(await import("chalk")).default;console.log(""),console.log(` ${$.cyan("\u25C6")} ${$.bold(E)}`),console.log(` ${$.dim("Auth: ")}${U}`),console.log(` ${$.dim("Workdir: ")}${n}`),console.log(""),console.log($.bold("Prompt sent to LLM:")),console.log($.dim("\u2500".repeat(60))),console.log($.dim(e)),console.log($.dim("\u2500".repeat(60)))}let{allowedTools:j,mcpServers:w}=this._resolveSkills(c,{sessionPath:a,workspace:n,nodeName:l});for(let $ of t.extraMcpServers||[])if($&&$.serverName&&$.def){if(Object.prototype.hasOwnProperty.call(w,$.serverName)){console.warn(`[custom-mcp] skip "${$.serverName}" \u2014 a built-in skill already owns that MCP name (no shadowing)`);continue}let I=re("claude",$.def);I&&(w[$.serverName]=I,j.push(`mcp__${$.serverName}__*`))}try{let $={cwd:n,allowedTools:j,...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:E,env:Te(J.env),...gt&&{pathToClaudeCodeExecutable:gt},...Object.keys(w).length>0&&{mcpServers:w},...g&&{sessionId:g},...y&&{resume:y},...h&&{forkSession:!0},...b&&{sessionStore:b}};if(s){let q=typeof s.parse=="function"?de(s):s;$.outputFormat={type:"json_schema",schema:q},f.debug("Structured output enforced via SDK outputFormat")}f.debug(`Agent SDK options: ${JSON.stringify({cwd:$.cwd,toolCount:j.length,permissionMode:$.permissionMode,model:$.model,hasOutputFormat:!!$.outputFormat})}`);let I="",x=0,R=new Map,M=[];f.debug("Starting Claude Agent SDK query stream");let C=e,G=Array.isArray(i)?i.filter(A=>A&&typeof A.path=="string"&&A.path.startsWith("/")):[];if(G.length){let A=G.map((q,F)=>` ${F+1}. ${q.path}${q.name?` (${q.name})`:""}`).join(`
3
3
  `);C=`${e}
4
4
 
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zibby/core",
3
- "version": "0.5.52",
3
+ "version": "0.5.53",
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,4 +1,4 @@
1
- var on=Object.defineProperty;var pt=(n,e,t)=>()=>{if(t)throw t[0];try{return n&&(e=n(n=0)),e}catch(o){throw t=[o],o}};var mt=(n,e)=>{for(var t in e)on(n,t,{get:e[t],enumerable:!0})};var Ct={};mt(Ct,{zodToJson:()=>ce});import{z as kt}from"zod";import{zodToJsonSchema as Ln}from"zod-to-json-schema";function Mn(n){if(!n||typeof n!="object")return n;if(Array.isArray(n.type))return n.type.includes("null")||(n.type=[...n.type,"null"]),n;if(typeof n.type=="string")return n.type=[n.type,"null"],n;for(let e of["anyOf","oneOf"])if(Array.isArray(n[e]))return n[e].some(t=>t&&t.type==="null")||(n[e]=[...n[e],{type:"null"}]),n;return{anyOf:[n,{type:"null"}]}}function he(n){if(!n||typeof n!="object")return n;for(let e of["$defs","definitions"])if(n[e]&&typeof n[e]=="object")for(let t of Object.keys(n[e]))n[e][t]=he(n[e][t]);for(let e of["anyOf","oneOf","allOf"])Array.isArray(n[e])&&(n[e]=n[e].map(he));if(n.properties&&typeof n.properties=="object"){n.additionalProperties=!1;let e=Object.keys(n.properties),t=new Set(Array.isArray(n.required)?n.required:[]);for(let o of e){let r=he(n.properties[o]);t.has(o)||(r=Mn(r)),n.properties[o]=r}n.required=e}return n.items&&(Array.isArray(n.items)?n.items=n.items.map(he):n.items=he(n.items)),n}function ce(n,e={target:"openApi3"}){if(!n)return null;let t=e?.target==="openAi",o=null;if(typeof kt?.toJSONSchema=="function")try{o=kt.toJSONSchema(n)}catch{}if(!o)try{o=Ln(n,e)}catch{return null}if(t&&o)try{return he(o)}catch{return o}return o}var we=pt(()=>{});var en={};mt(en,{clearConnectedCache:()=>Mo,clearTokenCache:()=>Ro,getConnectedIntegrations:()=>Lo,resolveIntegrationToken:()=>Po});import{existsSync as $o,readFileSync as ko}from"node:fs";import{homedir as Co}from"node:os";import{join as No}from"node:path";function Xt(){let n=process.env.ZIBBY_SELF_HOST;return n!=null&&n!==""&&n!=="0"&&n.toLowerCase()!=="false"}function qt(){if(process.env.PROJECT_API_TOKEN)return process.env.PROJECT_API_TOKEN;if(process.env.ZIBBY_USER_TOKEN)return process.env.ZIBBY_USER_TOKEN;try{let n=No(Co(),".zibby","config.json");return $o(n)&&JSON.parse(ko(n,"utf-8")).sessionToken||null}catch{return null}}function Qt(){return process.env.ZIBBY_ACCOUNT_API_URL?process.env.ZIBBY_ACCOUNT_API_URL.replace(/\/$/,""):(process.env.ZIBBY_ENV||"prod")==="local"?"http://localhost:3001":process.env.ZIBBY_PROD_ACCOUNT_API_URL||"https://api-prod.zibby.app"}async function Po(n){if(Xt()){let l=Wt[n];if(l&&process.env[l])return{token:process.env[l]}}let e=Date.now(),t=qe.get(n);if(t&&t.expiresAt>e)return t.data;let o=qt();if(!o)throw new Error("Missing session credential: neither PROJECT_API_TOKEN nor ZIBBY_USER_TOKEN is set in this process env (and no ~/.zibby/config.json session). If this is an MCP skill child, the spawning skill must forward them \u2014 check the skill's envKeys / resolve() env (see @zibby/skills backend-session-env-contract). Interactive CLI: run `zibby login`.");let r=`${Qt()}/integrations/token/${n}`,s=await fetch(r,{method:"GET",headers:{Authorization:`Bearer ${o}`}});if(!s.ok){let l=await s.text().catch(()=>"");if(s.status===404){let f="";try{f=String(JSON.parse(l)?.error||"").trim()}catch{}throw new Error(f||`${n} is not connected. Connect it at https://studio.zibby.dev/integrations`)}throw s.status===401||s.status===403?new Error("Session expired. Run `zibby login` to re-authenticate."):new Error(`Failed to resolve ${n} token (${s.status}): ${l}`)}let i=await s.json();if(!i||typeof i!="object")throw new Error(`Invalid response from ${n} token endpoint: expected object, got ${typeof i}`);if(n==="jira"){if(!i.token||typeof i.token!="string")throw new Error(`Invalid jira token response: token is ${typeof i.token}, expected string`);if(!i.cloudId)throw new Error("Invalid jira token response: missing cloudId")}else if(n==="github"&&(!i.token||typeof i.token!="string"))throw new Error(`Invalid github token response: token is ${typeof i.token}, expected string`);let a=((i.expiresInSec||3e3)-120)*1e3;return qe.set(n,{data:i,expiresAt:e+a}),i}function Ro(n){n?qe.delete(n):qe.clear()}function Vt(n){let e=process.env.WORKFLOW_ENABLED_INTEGRATIONS;if(typeof e!="string"||e.trim()==="")return n;let t=new Set(e.split(",").map(r=>r.trim()).filter(Boolean));if(t.size===0)return n;let o={};for(let[r,s]of Object.entries(n))t.has(r)&&(o[r]=s);return o}async function Lo(){let n=Date.now();if(be&&be.expiresAt>n)return be.data;if(Xt()){let t={};for(let[r,s]of Object.entries(Wt))t[r]=!!process.env[s];let o=Vt(t);return be={data:o,expiresAt:n+6e4},o}let e=qt();if(!e)return{};try{let t=await fetch(`${Qt()}/integrations/status`,{method:"GET",headers:{Authorization:`Bearer ${e}`}});if(!t.ok)return{};let o=await t.json(),r={};if(o&&typeof o=="object")for(let[i,a]of Object.entries(o))a&&typeof a=="object"&&"connected"in a&&(r[i]=!!a.connected);let s=Vt(r);return be={data:s,expiresAt:n+6e4},s}catch{return{}}}function Mo(){be=null}var qe,Wt,be,tn=pt(()=>{qe=new Map,Wt={github:"GITHUB_TOKEN",gitlab:"GITLAB_TOKEN",sentry:"SENTRY_AUTH_TOKEN",slack:"SLACK_BOT_TOKEN"};be=null});import{resolveInvocationModel as Do,resolveInvocationExtras as Bo}from"@zibby/agent-workflow";import{AgentStrategy as vn,DEFAULT_OUTPUT_BASE as wn,SESSION_INFO_FILE as xn,STOP_REQUEST_FILE as $n,getAllSkills as kn,getSkill as bt}from"@zibby/agent-workflow";import{spawn as Cn,execSync as le}from"node:child_process";import{writeFileSync as Tt,readFileSync as It,mkdirSync as vt,existsSync as Ie,accessSync as wt,constants as xt,unlinkSync as Nn}from"node:fs";import{join as te,resolve as Pn}from"node:path";import{homedir as ve}from"node:os";import Te from"chalk";var oe={debug:0,info:1,warn:2,error:3,silent:4},Qe=class{constructor(){this._level=this._getLogLevel()}_getLogLevel(){if(process.env.ZIBBY_DEBUG==="true")return oe.debug;if(process.env.ZIBBY_VERBOSE==="true")return oe.info;let e=process.env.LOG_LEVEL?.toLowerCase();return e&&e in oe?oe[e]:oe.info}_shouldLog(e){return oe[e]>=this._level}_formatMessage(e,t,o={}){let r=new Date().toISOString(),i=`${this._getPrefix(e)} ${t}`;return Object.keys(o).length>0&&(i+=Te.dim(` ${JSON.stringify(o)}`)),i}_getPrefix(e){return{debug:Te.gray("[DEBUG]"),info:Te.cyan("[INFO]"),warn:Te.yellow("[WARN]"),error:Te.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 oe&&(this._level=oe[e])}getLevel(){return Object.keys(oe).find(e=>oe[e]===this._level)}},c=new Qe;var gt=[{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 Ne(n){let e={};for(let t of gt)t.vendor===n&&(e[t.alias]=t.canonicalId);return e}function de(n,e){let t=typeof e=="string"?e.trim():"";if(t&&t!=="auto")return t;if(t==="auto"&&gt.some(o=>o.vendor===n&&o.isDefault))return"auto";throw new Error(`[${n}] 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 ae={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 et=Ne("claude"),tt=Ne("codex"),yt=Ne("gemini"),Pe={CURSOR_AGENT_DEFAULT:1200*1e3,OPENAI_REQUEST:18e4};var pe=class n{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(`
1
+ var on=Object.defineProperty;var pt=(n,e,t)=>()=>{if(t)throw t[0];try{return n&&(e=n(n=0)),e}catch(o){throw t=[o],o}};var mt=(n,e)=>{for(var t in e)on(n,t,{get:e[t],enumerable:!0})};var Ct={};mt(Ct,{zodToJson:()=>ce});import{z as kt}from"zod";import{zodToJsonSchema as Ln}from"zod-to-json-schema";function Mn(n){if(!n||typeof n!="object")return n;if(Array.isArray(n.type))return n.type.includes("null")||(n.type=[...n.type,"null"]),n;if(typeof n.type=="string")return n.type=[n.type,"null"],n;for(let e of["anyOf","oneOf"])if(Array.isArray(n[e]))return n[e].some(t=>t&&t.type==="null")||(n[e]=[...n[e],{type:"null"}]),n;return{anyOf:[n,{type:"null"}]}}function he(n){if(!n||typeof n!="object")return n;for(let e of["$defs","definitions"])if(n[e]&&typeof n[e]=="object")for(let t of Object.keys(n[e]))n[e][t]=he(n[e][t]);for(let e of["anyOf","oneOf","allOf"])Array.isArray(n[e])&&(n[e]=n[e].map(he));if(n.properties&&typeof n.properties=="object"){n.additionalProperties=!1;let e=Object.keys(n.properties),t=new Set(Array.isArray(n.required)?n.required:[]);for(let o of e){let r=he(n.properties[o]);t.has(o)||(r=Mn(r)),n.properties[o]=r}n.required=e}return n.items&&(Array.isArray(n.items)?n.items=n.items.map(he):n.items=he(n.items)),n}function ce(n,e={target:"openApi3"}){if(!n)return null;let t=e?.target==="openAi",o=null;if(typeof kt?.toJSONSchema=="function")try{o=kt.toJSONSchema(n)}catch{}if(!o)try{o=Ln(n,e)}catch{return null}if(t&&o)try{return he(o)}catch{return o}return o}var we=pt(()=>{});var en={};mt(en,{clearConnectedCache:()=>Mo,clearTokenCache:()=>Ro,getConnectedIntegrations:()=>Lo,resolveIntegrationToken:()=>Po});import{existsSync as $o,readFileSync as ko}from"node:fs";import{homedir as Co}from"node:os";import{join as No}from"node:path";function Xt(){let n=process.env.ZIBBY_SELF_HOST;return n!=null&&n!==""&&n!=="0"&&n.toLowerCase()!=="false"}function qt(){if(process.env.PROJECT_API_TOKEN)return process.env.PROJECT_API_TOKEN;if(process.env.ZIBBY_USER_TOKEN)return process.env.ZIBBY_USER_TOKEN;try{let n=No(Co(),".zibby","config.json");return $o(n)&&JSON.parse(ko(n,"utf-8")).sessionToken||null}catch{return null}}function Qt(){return process.env.ZIBBY_ACCOUNT_API_URL?process.env.ZIBBY_ACCOUNT_API_URL.replace(/\/$/,""):(process.env.ZIBBY_ENV||"prod")==="local"?"http://localhost:3001":process.env.ZIBBY_PROD_ACCOUNT_API_URL||"https://api-prod.zibby.app"}async function Po(n){if(Xt()){let l=Wt[n];if(l&&process.env[l])return{token:process.env[l]}}let e=Date.now(),t=qe.get(n);if(t&&t.expiresAt>e)return t.data;let o=qt();if(!o)throw new Error("Missing session credential: neither PROJECT_API_TOKEN nor ZIBBY_USER_TOKEN is set in this process env (and no ~/.zibby/config.json session). If this is an MCP skill child, the spawning skill must forward them \u2014 check the skill's envKeys / resolve() env (see @zibby/skills backend-session-env-contract). Interactive CLI: run `zibby login`.");let r=`${Qt()}/integrations/token/${n}`,s=await fetch(r,{method:"GET",headers:{Authorization:`Bearer ${o}`}});if(!s.ok){let l=await s.text().catch(()=>"");if(s.status===404){let f="";try{f=String(JSON.parse(l)?.error||"").trim()}catch{}throw new Error(f||`${n} is not connected. Connect it at https://studio.zibby.dev/integrations`)}throw s.status===401||s.status===403?new Error("Session expired. Run `zibby login` to re-authenticate."):new Error(`Failed to resolve ${n} token (${s.status}): ${l}`)}let i=await s.json();if(!i||typeof i!="object")throw new Error(`Invalid response from ${n} token endpoint: expected object, got ${typeof i}`);if(n==="jira"){if(!i.token||typeof i.token!="string")throw new Error(`Invalid jira token response: token is ${typeof i.token}, expected string`);if(!i.cloudId&&!i.instanceUrl&&!i.baseUrl)throw new Error("Invalid jira token response: carries neither cloudId (OAuth connection) nor instanceUrl (API-token connection) \u2014 reconnect Jira.")}else if(n==="github"&&(!i.token||typeof i.token!="string"))throw new Error(`Invalid github token response: token is ${typeof i.token}, expected string`);let a=((i.expiresInSec||3e3)-120)*1e3;return qe.set(n,{data:i,expiresAt:e+a}),i}function Ro(n){n?qe.delete(n):qe.clear()}function Vt(n){let e=process.env.WORKFLOW_ENABLED_INTEGRATIONS;if(typeof e!="string"||e.trim()==="")return n;let t=new Set(e.split(",").map(r=>r.trim()).filter(Boolean));if(t.size===0)return n;let o={};for(let[r,s]of Object.entries(n))t.has(r)&&(o[r]=s);return o}async function Lo(){let n=Date.now();if(be&&be.expiresAt>n)return be.data;if(Xt()){let t={};for(let[r,s]of Object.entries(Wt))t[r]=!!process.env[s];let o=Vt(t);return be={data:o,expiresAt:n+6e4},o}let e=qt();if(!e)return{};try{let t=await fetch(`${Qt()}/integrations/status`,{method:"GET",headers:{Authorization:`Bearer ${e}`}});if(!t.ok)return{};let o=await t.json(),r={};if(o&&typeof o=="object")for(let[i,a]of Object.entries(o))a&&typeof a=="object"&&"connected"in a&&(r[i]=!!a.connected);let s=Vt(r);return be={data:s,expiresAt:n+6e4},s}catch{return{}}}function Mo(){be=null}var qe,Wt,be,tn=pt(()=>{qe=new Map,Wt={github:"GITHUB_TOKEN",gitlab:"GITLAB_TOKEN",sentry:"SENTRY_AUTH_TOKEN",slack:"SLACK_BOT_TOKEN"};be=null});import{resolveInvocationModel as Do,resolveInvocationExtras as Bo}from"@zibby/agent-workflow";import{AgentStrategy as vn,DEFAULT_OUTPUT_BASE as wn,SESSION_INFO_FILE as xn,STOP_REQUEST_FILE as $n,getAllSkills as kn,getSkill as bt}from"@zibby/agent-workflow";import{spawn as Cn,execSync as le}from"node:child_process";import{writeFileSync as Tt,readFileSync as It,mkdirSync as vt,existsSync as Ie,accessSync as wt,constants as xt,unlinkSync as Nn}from"node:fs";import{join as te,resolve as Pn}from"node:path";import{homedir as ve}from"node:os";import Te from"chalk";var oe={debug:0,info:1,warn:2,error:3,silent:4},Qe=class{constructor(){this._level=this._getLogLevel()}_getLogLevel(){if(process.env.ZIBBY_DEBUG==="true")return oe.debug;if(process.env.ZIBBY_VERBOSE==="true")return oe.info;let e=process.env.LOG_LEVEL?.toLowerCase();return e&&e in oe?oe[e]:oe.info}_shouldLog(e){return oe[e]>=this._level}_formatMessage(e,t,o={}){let r=new Date().toISOString(),i=`${this._getPrefix(e)} ${t}`;return Object.keys(o).length>0&&(i+=Te.dim(` ${JSON.stringify(o)}`)),i}_getPrefix(e){return{debug:Te.gray("[DEBUG]"),info:Te.cyan("[INFO]"),warn:Te.yellow("[WARN]"),error:Te.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 oe&&(this._level=oe[e])}getLevel(){return Object.keys(oe).find(e=>oe[e]===this._level)}},c=new Qe;var gt=[{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 Ne(n){let e={};for(let t of gt)t.vendor===n&&(e[t.alias]=t.canonicalId);return e}function de(n,e){let t=typeof e=="string"?e.trim():"";if(t&&t!=="auto")return t;if(t==="auto"&&gt.some(o=>o.vendor===n&&o.isDefault))return"auto";throw new Error(`[${n}] 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 ae={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 et=Ne("claude"),tt=Ne("codex"),yt=Ne("gemini"),Pe={CURSOR_AGENT_DEFAULT:1200*1e3,OPENAI_REQUEST:18e4};var pe=class n{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(`
2
2
  `);this.buffer=t.pop()||"";let o="";for(let r of t)if(r.trim())try{let s=JSON.parse(r);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+=`${r}
3
3
  `,o+=`${r}
4
4
  `,this.extractedResult=s)}catch{if(r.includes('"text"')||r.includes('"content"')){let i=r.match(/"text"\s*:\s*"([^"]*)/),a=r.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],u=f&&typeof f=="object"?f.args??f.input??f:void 0;t(l,o(u))}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 r=e.message??e;if(Array.isArray(r?.tool_calls)){for(let i of r.tool_calls)t(i.name,o(i.input??i.arguments));return}let s=r?.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,r;for(;(r=o.exec(e))!==null;){let d=r[1].trim();try{JSON.parse(d),t.push({text:d,source:"markdown"})}catch{}}let s=0,i=0;for(;s<e.length&&(s=e.indexOf("{",s),s!==-1);){let d=0,g=s;for(let S=s;S<e.length;S++)if(e[S]==="{")d++;else if(e[S]==="}"&&(d--,d===0)){g=S,t.push({text:e.substring(s,g+1),source:"brace"}),i++;break}s=g+1}let a=this.extractedResult,l=a?JSON.stringify(a).length:0,f=0,u=-1;for(let d=0;d<t.length;d++){let g=t[d];try{let S=g.text.replace(/,(\s*[}\]])/g,"$1"),N=JSON.parse(S);this.isValidResult(N)&&(f++,l=JSON.stringify(N).length,a=N,u=d)}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 n;o.zodSchema=t,o.processChunk(e),o.flush();let r=o.getResult();return!r&&process.env.LOG_LEVEL==="debug"&&console.error("[StreamingParser] No result extracted from",e?.length||0,"chars"),r}};import{z as ht}from"zod";import{zodToJsonSchema as rn}from"zod-to-json-schema";function sn(n){if(!n)return null;if(typeof ht?.toJSONSchema=="function")try{return ht.toJSONSchema(n)}catch{}try{return rn(n,{target:"openApi3"})}catch{return null}}var Re=class{static generateFileOutputInstructions(e,t){let o;typeof e?.parse=="function"?o=sn(e):o=e;let r=this._buildExample(o);return`
@@ -1 +1 @@
1
- import{existsSync as T,readFileSync as _}from"node:fs";import{homedir as y}from"node:os";import{join as I}from"node:path";var b=new Map,x={github:"GITHUB_TOKEN",gitlab:"GITLAB_TOKEN",sentry:"SENTRY_AUTH_TOKEN",slack:"SLACK_BOT_TOKEN"};function k(){let t=process.env.ZIBBY_SELF_HOST;return t!=null&&t!==""&&t!=="0"&&t.toLowerCase()!=="false"}function $(){if(process.env.PROJECT_API_TOKEN)return process.env.PROJECT_API_TOKEN;if(process.env.ZIBBY_USER_TOKEN)return process.env.ZIBBY_USER_TOKEN;try{let t=I(y(),".zibby","config.json");return T(t)&&JSON.parse(_(t,"utf-8")).sessionToken||null}catch{return null}}function O(){return process.env.ZIBBY_ACCOUNT_API_URL?process.env.ZIBBY_ACCOUNT_API_URL.replace(/\/$/,""):(process.env.ZIBBY_ENV||"prod")==="local"?"http://localhost:3001":process.env.ZIBBY_PROD_ACCOUNT_API_URL||"https://api-prod.zibby.app"}async function w(t){if(k()){let i=x[t];if(i&&process.env[i])return{token:process.env[i]}}let e=Date.now(),n=b.get(t);if(n&&n.expiresAt>e)return n.data;let r=$();if(!r)throw new Error("Missing session credential: neither PROJECT_API_TOKEN nor ZIBBY_USER_TOKEN is set in this process env (and no ~/.zibby/config.json session). If this is an MCP skill child, the spawning skill must forward them \u2014 check the skill's envKeys / resolve() env (see @zibby/skills backend-session-env-contract). Interactive CLI: run `zibby login`.");let a=`${O()}/integrations/token/${t}`,s=await fetch(a,{method:"GET",headers:{Authorization:`Bearer ${r}`}});if(!s.ok){let i=await s.text().catch(()=>"");if(s.status===404){let u="";try{u=String(JSON.parse(i)?.error||"").trim()}catch{}throw new Error(u||`${t} is not connected. Connect it at https://studio.zibby.dev/integrations`)}throw s.status===401||s.status===403?new Error("Session expired. Run `zibby login` to re-authenticate."):new Error(`Failed to resolve ${t} token (${s.status}): ${i}`)}let o=await s.json();if(!o||typeof o!="object")throw new Error(`Invalid response from ${t} token endpoint: expected object, got ${typeof o}`);if(t==="jira"){if(!o.token||typeof o.token!="string")throw new Error(`Invalid jira token response: token is ${typeof o.token}, expected string`);if(!o.cloudId)throw new Error("Invalid jira token response: missing cloudId")}else if(t==="github"&&(!o.token||typeof o.token!="string"))throw new Error(`Invalid github token response: token is ${typeof o.token}, expected string`);let l=((o.expiresInSec||3e3)-120)*1e3;return b.set(t,{data:o,expiresAt:e+l}),o}var K=Object.freeze(["github.com","gitlab.com"]);function m(t){try{return new URL(t).hostname.toLowerCase()}catch{return""}}function d(t){if(typeof t!="string"||t===""||/[\\\x00-\x20\x7f]/.test(t))return"";let e;try{e=new URL(t)}catch{return""}return e.protocol!=="https:"?"":e.hostname.toLowerCase()}function v(t=process.env){let e=t&&(t.GITLAB_URL||t.GITLAB_INSTANCE_URL)||"";return m(e)}function h(t={}){if(t.gitlabHost){let e=String(t.gitlabHost).trim().toLowerCase();return e?e.includes("://")?m(e):e.replace(/:\d+$/,""):""}return v()}function S(t,e={}){let n=d(t);if(!n)return!1;if(n==="github.com"||n==="gitlab.com")return!0;let r=h(e);return!!(r&&n===r)}function A(t,e={}){if(t==="github.com")return"github";if(t==="gitlab.com")return"gitlab";let n=h(e);return n&&t===n?"gitlab":null}function C(t,e,n={}){if(!t||!e)return t;let r=d(t);if(!r)return t;if(r==="github.com")return t.replace(/^https:\/\/(?:[^@/]+@)?github\.com(?=[:/]|$)/i,`https://x-access-token:${e}@github.com`);if(r==="gitlab.com")return t.replace(/^https:\/\/(?:[^@/]+@)?gitlab\.com(?=[:/]|$)/i,`https://oauth2:${e}@gitlab.com`);let a=h(n);if(a&&r===a){let s=a.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),o=new RegExp(`^https:\\/\\/(?:[^@/]+@)?${s}(?=[:/]|$)`,"i");return t.replace(o,`https://oauth2:${e}@${a}`)}return t}function B(t){return t&&String(t).replace(/^(https:\/\/)[^@/]+@/i,"$1")}function N(t,e){let n=t==null?"":String(t);return e&&(n=n.split(e).join("***")),n=n.replace(/(https?:\/\/)(?:x-access-token|oauth2):[^@\s/]+@/gi,"$1"),n=n.replace(/(https?:\/\/)[^@\s/:]+:[^@\s/]+@/gi,"$1"),n}async function P(t,e,n){try{await t("git",["remote","set-url","origin",B(n)],e)}catch(r){console.warn(`\u26A0\uFE0F could not scrub token from origin remote (continuing): ${r?.message||r}`)}}async function z({run:t,repoPath:e,repoUrl:n,branch:r,token:a,resolveToken:s=w,gitlabHost:o}={}){if(typeof t!="function")throw new Error("securePush: `run` (a spawn wrapper resolving {code,stdout,stderr}) is required");if(!r)throw new Error("securePush: `branch` is required");let l=h({gitlabHost:o}),i=d(n),u=S(n,{gitlabHost:l}),f=a||"";if(!f&&u&&typeof s=="function"){let p=A(i,{gitlabHost:l});if(p)try{f=(await s(p))?.token||""}catch{}}else!f&&!u&&console.warn(`\u26A0\uFE0F push target host '${i||"(unparseable)"}' is not a trusted VCS host \u2014 refusing to mint a token`);let g=f&&u,E=g?C(n,f,{gitlabHost:l}):"origin",c=await t("git",["push",E,r],e);if(!c||c.code!==0){let p=N(c&&c.stderr||"",f);throw new Error(`git push failed (exit ${c?c.code:"?"}): ${String(p).slice(-500)}`)}return{code:c.code,stdout:c.stdout,stderr:c.stderr,pushedAuthed:!!g,target:g?"<authed>":"origin"}}export{K as TRUSTED_VCS_HOSTS,C as authedUrl,m as hostnameOf,S as isTrustedVcsHost,A as providerForHost,N as redactGitSecrets,d as safeVcsHostname,P as scrubRemoteToTokenless,z as securePush,v as selfHostGitlabHost,B as tokenlessUrl};
1
+ import{existsSync as _,readFileSync as m}from"node:fs";import{homedir as y}from"node:os";import{join as I}from"node:path";var b=new Map,k={github:"GITHUB_TOKEN",gitlab:"GITLAB_TOKEN",sentry:"SENTRY_AUTH_TOKEN",slack:"SLACK_BOT_TOKEN"};function x(){let t=process.env.ZIBBY_SELF_HOST;return t!=null&&t!==""&&t!=="0"&&t.toLowerCase()!=="false"}function O(){if(process.env.PROJECT_API_TOKEN)return process.env.PROJECT_API_TOKEN;if(process.env.ZIBBY_USER_TOKEN)return process.env.ZIBBY_USER_TOKEN;try{let t=I(y(),".zibby","config.json");return _(t)&&JSON.parse(m(t,"utf-8")).sessionToken||null}catch{return null}}function $(){return process.env.ZIBBY_ACCOUNT_API_URL?process.env.ZIBBY_ACCOUNT_API_URL.replace(/\/$/,""):(process.env.ZIBBY_ENV||"prod")==="local"?"http://localhost:3001":process.env.ZIBBY_PROD_ACCOUNT_API_URL||"https://api-prod.zibby.app"}async function w(t){if(x()){let i=k[t];if(i&&process.env[i])return{token:process.env[i]}}let e=Date.now(),n=b.get(t);if(n&&n.expiresAt>e)return n.data;let r=O();if(!r)throw new Error("Missing session credential: neither PROJECT_API_TOKEN nor ZIBBY_USER_TOKEN is set in this process env (and no ~/.zibby/config.json session). If this is an MCP skill child, the spawning skill must forward them \u2014 check the skill's envKeys / resolve() env (see @zibby/skills backend-session-env-contract). Interactive CLI: run `zibby login`.");let a=`${$()}/integrations/token/${t}`,s=await fetch(a,{method:"GET",headers:{Authorization:`Bearer ${r}`}});if(!s.ok){let i=await s.text().catch(()=>"");if(s.status===404){let u="";try{u=String(JSON.parse(i)?.error||"").trim()}catch{}throw new Error(u||`${t} is not connected. Connect it at https://studio.zibby.dev/integrations`)}throw s.status===401||s.status===403?new Error("Session expired. Run `zibby login` to re-authenticate."):new Error(`Failed to resolve ${t} token (${s.status}): ${i}`)}let o=await s.json();if(!o||typeof o!="object")throw new Error(`Invalid response from ${t} token endpoint: expected object, got ${typeof o}`);if(t==="jira"){if(!o.token||typeof o.token!="string")throw new Error(`Invalid jira token response: token is ${typeof o.token}, expected string`);if(!o.cloudId&&!o.instanceUrl&&!o.baseUrl)throw new Error("Invalid jira token response: carries neither cloudId (OAuth connection) nor instanceUrl (API-token connection) \u2014 reconnect Jira.")}else if(t==="github"&&(!o.token||typeof o.token!="string"))throw new Error(`Invalid github token response: token is ${typeof o.token}, expected string`);let l=((o.expiresInSec||3e3)-120)*1e3;return b.set(t,{data:o,expiresAt:e+l}),o}var K=Object.freeze(["github.com","gitlab.com"]);function E(t){try{return new URL(t).hostname.toLowerCase()}catch{return""}}function d(t){if(typeof t!="string"||t===""||/[\\\x00-\x20\x7f]/.test(t))return"";let e;try{e=new URL(t)}catch{return""}return e.protocol!=="https:"?"":e.hostname.toLowerCase()}function v(t=process.env){let e=t&&(t.GITLAB_URL||t.GITLAB_INSTANCE_URL)||"";return E(e)}function h(t={}){if(t.gitlabHost){let e=String(t.gitlabHost).trim().toLowerCase();return e?e.includes("://")?E(e):e.replace(/:\d+$/,""):""}return v()}function A(t,e={}){let n=d(t);if(!n)return!1;if(n==="github.com"||n==="gitlab.com")return!0;let r=h(e);return!!(r&&n===r)}function S(t,e={}){if(t==="github.com")return"github";if(t==="gitlab.com")return"gitlab";let n=h(e);return n&&t===n?"gitlab":null}function C(t,e,n={}){if(!t||!e)return t;let r=d(t);if(!r)return t;if(r==="github.com")return t.replace(/^https:\/\/(?:[^@/]+@)?github\.com(?=[:/]|$)/i,`https://x-access-token:${e}@github.com`);if(r==="gitlab.com")return t.replace(/^https:\/\/(?:[^@/]+@)?gitlab\.com(?=[:/]|$)/i,`https://oauth2:${e}@gitlab.com`);let a=h(n);if(a&&r===a){let s=a.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),o=new RegExp(`^https:\\/\\/(?:[^@/]+@)?${s}(?=[:/]|$)`,"i");return t.replace(o,`https://oauth2:${e}@${a}`)}return t}function B(t){return t&&String(t).replace(/^(https:\/\/)[^@/]+@/i,"$1")}function N(t,e){let n=t==null?"":String(t);return e&&(n=n.split(e).join("***")),n=n.replace(/(https?:\/\/)(?:x-access-token|oauth2):[^@\s/]+@/gi,"$1"),n=n.replace(/(https?:\/\/)[^@\s/:]+:[^@\s/]+@/gi,"$1"),n}async function P(t,e,n){try{await t("git",["remote","set-url","origin",B(n)],e)}catch(r){console.warn(`\u26A0\uFE0F could not scrub token from origin remote (continuing): ${r?.message||r}`)}}async function z({run:t,repoPath:e,repoUrl:n,branch:r,token:a,resolveToken:s=w,gitlabHost:o}={}){if(typeof t!="function")throw new Error("securePush: `run` (a spawn wrapper resolving {code,stdout,stderr}) is required");if(!r)throw new Error("securePush: `branch` is required");let l=h({gitlabHost:o}),i=d(n),u=A(n,{gitlabHost:l}),f=a||"";if(!f&&u&&typeof s=="function"){let p=S(i,{gitlabHost:l});if(p)try{f=(await s(p))?.token||""}catch{}}else!f&&!u&&console.warn(`\u26A0\uFE0F push target host '${i||"(unparseable)"}' is not a trusted VCS host \u2014 refusing to mint a token`);let g=f&&u,T=g?C(n,f,{gitlabHost:l}):"origin",c=await t("git",["push",T,r],e);if(!c||c.code!==0){let p=N(c&&c.stderr||"",f);throw new Error(`git push failed (exit ${c?c.code:"?"}): ${String(p).slice(-500)}`)}return{code:c.code,stdout:c.stdout,stderr:c.stderr,pushedAuthed:!!g,target:g?"<authed>":"origin"}}export{K as TRUSTED_VCS_HOSTS,C as authedUrl,E as hostnameOf,A as isTrustedVcsHost,S as providerForHost,N as redactGitSecrets,d as safeVcsHostname,P as scrubRemoteToTokenless,z as securePush,v as selfHostGitlabHost,B as tokenlessUrl};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zibby/core",
3
- "version": "0.5.52",
3
+ "version": "0.5.53",
4
4
  "description": "Core test automation engine with multi-agent and multi-MCP support",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",