@zibby/core 2.0.3 → 2.0.4

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 to=Object.defineProperty;var ro=(n=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(n,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):n)(function(n){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+n+'" is not supported')});var br=(n,e,t)=>()=>{if(t)throw t[0];try{return n&&(e=n(n=0)),e}catch(r){throw t=[r],r}};var Sr=(n,e)=>{for(var t in e)to(n,t,{get:e[t],enumerable:!0})};var xr={};Sr(xr,{zodToJson:()=>de});import{z as wr}from"zod";import{zodToJsonSchema as ao}from"zod-to-json-schema";function lo(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 ve(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]=ve(n[e][t]);for(let e of["anyOf","oneOf","allOf"])Array.isArray(n[e])&&(n[e]=n[e].map(ve));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 r of e){let o=ve(n.properties[r]);t.has(r)||(o=lo(o)),n.properties[r]=o}n.required=e}return n.items&&(Array.isArray(n.items)?n.items=n.items.map(ve):n.items=ve(n.items)),n}function de(n,e={target:"openApi3"}){if(!n)return null;let t=e?.target==="openAi",r=null;if(typeof wr?.toJSONSchema=="function")try{r=wr.toJSONSchema(n)}catch{}if(!r)try{r=ao(n,e)}catch{return null}if(t&&r)try{return ve(r)}catch{return r}return r}var He=br(()=>{});var dn={};Sr(dn,{clearConnectedCache:()=>ei,clearTokenCache:()=>fn,getConnectedIntegrations:()=>Qs,resolveIntegrationToken:()=>Ct});import{existsSync as Vs,readFileSync as Ws}from"node:fs";import{homedir as qs}from"node:os";import{join as Xs}from"node:path";function cn(){let n=process.env.ZIBBY_SELF_HOST;return n!=null&&n!==""&&n!=="0"&&n.toLowerCase()!=="false"}function un(){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=Xs(qs(),".zibby","config.json");return Vs(n)&&JSON.parse(Ws(n,"utf-8")).sessionToken||null}catch{return null}}function pn(){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 Ct(n){if(cn()){let a=ln[n];if(a&&process.env[a])return{token:process.env[a]}}let e=Date.now(),t=It.get(n);if(t&&t.expiresAt>e)return t.data;let r=un();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 o=`${pn()}/integrations/token/${n}`,s=await fetch(o,{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||`${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}): ${a}`)}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 c=((i.expiresInSec||3e3)-120)*1e3;return It.set(n,{data:i,expiresAt:e+c}),i}function fn(n){n?It.delete(n):It.clear()}function an(n){let e=process.env.WORKFLOW_ENABLED_INTEGRATIONS;if(typeof e!="string"||e.trim()==="")return n;let t=new Set(e.split(",").map(o=>o.trim()).filter(Boolean));if(t.size===0)return n;let r={};for(let[o,s]of Object.entries(n))t.has(o)&&(r[o]=s);return r}async function Qs(){let n=Date.now();if(Me&&Me.expiresAt>n)return Me.data;if(cn()){let t={};for(let[o,s]of Object.entries(ln))t[o]=!!process.env[s];let r=an(t);return Me={data:r,expiresAt:n+6e4},r}let e=un();if(!e)return{};try{let t=await fetch(`${pn()}/integrations/status`,{method:"GET",headers:{Authorization:`Bearer ${e}`}});if(!t.ok)return{};let r=await t.json(),o={};if(r&&typeof r=="object")for(let[i,c]of Object.entries(r))c&&typeof c=="object"&&"connected"in c&&(o[i]=!!c.connected);let s=an(o);return Me={data:s,expiresAt:n+6e4},s}catch{return{}}}function ei(){Me=null}var It,ln,Me,Pt=br(()=>{It=new Map,ln={github:"GITHUB_TOKEN",gitlab:"GITLAB_TOKEN",sentry:"SENTRY_AUTH_TOKEN",slack:"SLACK_BOT_TOKEN"};Me=null});import{readFileSync as Vn,existsSync as Wn}from"node:fs";import{join as Je,resolve as qn,isAbsolute as fa}from"node:path";import{DEFAULT_OUTPUT_BASE as da,SESSIONS_DIR as Xn,RESULT_FILE as ma,resolveWorkflowSession as ga,clearInheritedSessionEnvForFreshRun as ha,readPinnedSessionPathFromEnv as ya}from"@zibby/agent-workflow";import{registerStrategy as $t}from"@zibby/agent-workflow";import{AgentStrategy as go,getSkill as Tr,NO_INTEGRATION_TOGGLEABLE_SKILL_IDS as ho}from"@zibby/agent-workflow";import{query as yo}from"@anthropic-ai/claude-agent-sdk";import no from"node:process";var _r=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(n=no.env){let e={},t=new Set(_r);for(let[r,o]of Object.entries(n))t.has(r)||o!==void 0&&(e[r]=o);return e}function ut(n){return!!n&&(n.transport==="http"||typeof n.url=="string"&&!n.command)}var oo=new Set(["claude"]);function so(){let n=String(process.env.MCP_ALWAYS_LOAD??"").trim().toLowerCase();return!(n==="0"||n==="false"||n==="off")}function io(n,e){return oo.has(n)?so()?typeof e.alwaysLoad=="boolean"?{alwaysLoad:e.alwaysLoad}:{}:{}:{}}function re(n,e,{processEnv:t}={}){if(!e)return null;let r=io(n,e);if(ut(e)){let s=String(e.url||"").trim();if(!s)return null;let i=e.headers&&typeof e.headers=="object"?e.headers:void 0;switch(n){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 o={command:e.command};return e.args?.length&&(o.args=e.args),e.cwd&&(o.cwd=e.cwd),t?o.env={...t,...e.env||{}}:e.env&&Object.keys(e.env).length&&(o.env=e.env),{...o,...r}}function pt(n){return ut(n)?`http \u2192 ${String(n.url||"").replace(/\?.*$/,"")}`:`${n?.command||"?"} ${(n?.args||[]).join(" ")}`.trim()}He();import{writeFileSync as Dt,mkdirSync as jt,existsSync as Oe,readFileSync as $r}from"fs";import{homedir as Or}from"os";import{join as te}from"path";import Ye from"chalk";var ne={debug:0,info:1,warn:2,error:3,silent:4},ft=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 o=new Date().toISOString(),i=`${this._getPrefix(e)} ${t}`;return Object.keys(r).length>0&&(i+=Ye.dim(` ${JSON.stringify(r)}`)),i}_getPrefix(e){return{debug:Ye.gray("[DEBUG]"),info:Ye.cyan("[INFO]"),warn:Ye.yellow("[WARN]"),error:Ye.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)}},p=new ft;import{timeline as ie,Timeline as ka,WORKFLOW_GRAPH_LOG_MARKER_PREFIX as Na}from"@zibby/agent-workflow";var Ze=[{alias:"opus-4.8",canonicalId:"claude-opus-4-8",vendor:"claude",label:"Claude \xB7 Opus 4.8",family:"claude-opus-4",pickerVisible:!0},{alias:"opus-4-8",canonicalId:"claude-opus-4-8",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.8"},{alias:"opus-5",canonicalId:"claude-opus-5",vendor:"claude",label:"Claude \xB7 Opus 5",family:"claude-opus-5",pickerVisible:!0},{alias:"claude-opus-5",canonicalId:"claude-opus-5",vendor:"claude",family:"claude-opus-5",aliasOf:"opus-5"},{alias:"sonnet-5",canonicalId:"claude-sonnet-5",vendor:"claude",label:"Claude \xB7 Sonnet 5",family:"claude-sonnet-5",pickerVisible:!0},{alias:"claude-sonnet-5",canonicalId:"claude-sonnet-5",vendor:"claude",family:"claude-sonnet-5",aliasOf:"sonnet-5"},{alias:"fable-5",canonicalId:"claude-fable-5",vendor:"claude",label:"Claude \xB7 Fable 5",family:"claude-fable-5",pickerVisible:!0},{alias:"claude-fable-5",canonicalId:"claude-fable-5",vendor:"claude",family:"claude-fable-5",aliasOf:"fable-5"},{alias:"sonnet-4.8",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4"},{alias:"sonnet-4-8",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.8"},{alias:"opus-4.7",canonicalId:"claude-opus-4-7",vendor:"claude",label:"Claude \xB7 Opus 4.7",family:"claude-opus-4",pickerVisible:!0},{alias:"opus-4-7",canonicalId:"claude-opus-4-7",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.7"},{alias:"sonnet-4.7",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4"},{alias:"sonnet-4-7",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.7"},{alias:"sonnet-4.6",canonicalId:"claude-sonnet-4-6",vendor:"claude",label:"Claude \xB7 Sonnet 4.6",family:"claude-sonnet-4",pickerVisible:!0},{alias:"sonnet-4-6",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.6"},{alias:"opus-4.6",canonicalId:"claude-opus-4-6",vendor:"claude",label:"Claude \xB7 Opus 4.6",family:"claude-opus-4",pickerVisible:!0},{alias:"opus-4-6",canonicalId:"claude-opus-4-6",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.6"},{alias:"sonnet-4.5",canonicalId:"claude-sonnet-4-5-20250929",vendor:"claude",label:"Claude \xB7 Sonnet 4.5",family:"claude-sonnet-4",pickerVisible:!0},{alias:"sonnet-4-5",canonicalId:"claude-sonnet-4-5-20250929",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.5"},{alias:"opus-4.5",canonicalId:"claude-opus-4-5-20251101",vendor:"claude",label:"Claude \xB7 Opus 4.5",family:"claude-opus-4",pickerVisible:!0},{alias:"opus-4-5",canonicalId:"claude-opus-4-5-20251101",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.5"},{alias:"haiku-4.5",canonicalId:"claude-haiku-4-5-20251001",vendor:"claude",label:"Claude \xB7 Haiku 4.5",family:"claude-haiku-4"},{alias:"haiku-4-5",canonicalId:"claude-haiku-4-5-20251001",vendor:"claude",family:"claude-haiku-4",aliasOf:"haiku-4.5"},{alias:"claude-opus-4-8",canonicalId:"claude-opus-4-8",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.8"},{alias:"claude-sonnet-4-8",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.8"},{alias:"claude-opus-4-7",canonicalId:"claude-opus-4-7",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.7"},{alias:"claude-sonnet-4-7",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.7"},{alias:"claude-sonnet-4-6",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.6"},{alias:"claude-opus-4-6",canonicalId:"claude-opus-4-6",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.6"},{alias:"claude-sonnet-4-5-20250929",canonicalId:"claude-sonnet-4-5-20250929",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.5"},{alias:"claude-opus-4-5-20251101",canonicalId:"claude-opus-4-5-20251101",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.5"},{alias:"claude-haiku-4-5-20251001",canonicalId:"claude-haiku-4-5-20251001",vendor:"claude",family:"claude-haiku-4",aliasOf:"haiku-4.5"},{alias:"claude-opus-4-20250514",canonicalId:"claude-opus-4-20250514",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.5"},{alias:"o4-mini",canonicalId:"o4-mini",vendor:"codex",label:"Codex \xB7 o4-mini",family:"o4-mini",pickerVisible:!0},{alias:"o3",canonicalId:"o3",vendor:"codex",family:"o3"},{alias:"o3-mini",canonicalId:"o3-mini",vendor:"codex",family:"o3-mini"},{alias:"codex-mini",canonicalId:"codex-mini-latest",vendor:"codex",family:"codex-mini"},{alias:"gpt-4o",canonicalId:"gpt-4o",vendor:"codex",label:"Codex \xB7 GPT-4o",family:"gpt-4o",pickerVisible:!0},{alias:"gpt-4o-mini",canonicalId:"gpt-4o-mini",vendor:"codex",label:"Codex \xB7 GPT-4o mini",family:"gpt-4o-mini",pickerVisible:!0},{alias:"gpt-5.2-codex",canonicalId:"gpt-5.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:"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 Ve(n){let e={};for(let t of Ze)t.vendor===n&&(e[t.alias]=t.canonicalId);return e}function co(n){if(!n||typeof n!="string")return null;let e=n.toLowerCase();for(let t of Ze)if(t.alias.toLowerCase()===e)return t.family??null;for(let t of Ze)if(t.canonicalId.toLowerCase()===e)return t.family??null;return null}function Er(n){let e=String(n||"").match(/(\d+(?:\.\d+)?)/);return e?parseFloat(e[1]):0}function Ar(n){let e=String(n||"").toLowerCase();return/\b(base|mini)\b/.test(e)?0:/\b(opus|pro)\b/.test(e)?2:1}function uo(n,e){let t=Er(e.label)-Er(n.label);if(t!==0)return t;let r=Ar(e.label)-Ar(n.label);return r!==0?r:n.label.localeCompare(e.label)}function po(){let n=[],e=new Map;for(let r of Ze)r.pickerVisible&&(e.has(r.vendor)||(e.set(r.vendor,[]),n.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}));let t=[];for(let r of n)t.push(...e.get(r).sort(uo));return t}function $e(n,e){let t=typeof e=="string"?e.trim():"";if(t)return t;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 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"},fo={ASSISTANT:"assistant",CLAUDE:"claude",CURSOR:"cursor",CODEX:"codex",GEMINI:"gemini"},mo={DEBUG:"debug",INFO:"info",WARN:"warn",ERROR:"error",SILENT:"silent"},dt=Ve("claude"),mt=Ve("codex"),Ut=Ve("gemini"),gt={CURSOR_AGENT_DEFAULT:1200*1e3,OPENAI_REQUEST:18e4};function W(n){let e=`${n}_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 o=r[Math.floor(Math.random()*r.length)],s=process.env[n];return process.env[n]=o,p.debug(`[auth-pool] ${n}: picked 1 of ${r.length} from pool (***${o.slice(-4)})`),{picked:o,count:r.length,dispose(){s===void 0?delete process.env[n]:process.env[n]=s}}}function ht(n){if(!n||typeof n!="object")return null;let e=(...o)=>{for(let s of o){if(s==null||s==="")continue;let i=Number(s);if(Number.isFinite(i))return i}return null},t=e(n.input_tokens,n.inputTokens,n.prompt_tokens,n.promptTokens),r=e(n.output_tokens,n.outputTokens,n.completion_tokens,n.completionTokens);return t==null&&r==null?null:{input:t||0,output:r||0}}import{createRequire as bo}from"module";import J from"process";var vr=bo(import.meta.url);function So(n){let e=2166136261;for(let t=0;t<n.length;t++)e^=n.charCodeAt(t),e=Math.imul(e,16777619)>>>0;return e.toString(16).padStart(8,"0")}function Ir(n){if(!n||typeof n!="object")return null;let e=n.message?.content??n.content;return Array.isArray(e)&&e.length||typeof e=="string"&&e.length?e:typeof n.text=="string"&&n.text.length?n.text:null}function _o(n){let e=Ir(n);if(e===null)return null;let t;try{t=JSON.stringify(e)}catch{return null}return typeof t!="string"||!t?null:`${`${n.type||n.constructor?.name||"?"}`}:${t.length}:${So(t)}`}function wo(n){if(!n||typeof n!="object")return"a message with no type";let e=n.type||n.constructor?.name||"unknown-type",t=n.subtype?`/${n.subtype}`:"",r=Ir(n);if(typeof r=="string")return`${e}${t} text "${r.slice(0,80)}"`;if(!Array.isArray(r))return`${e}${t} (no readable content)`;let o=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>o.length&&o.push(`+${r.length-o.length} more`),`${e}${t} [${o.join(", ")}]`}var Cr=(n,e)=>{let t=String(n??"");return t.length>e?`${t.slice(0,e)}\u2026`:t},xo=/secret|token|password|passwd|credential|authorization|bearer|api[-_]?key|private[-_]?key|access[-_]?key/i,Pr=(n,e=0)=>{if(n==null||e>6||typeof n!="object")return n;let t=Array.isArray(n)?[]:{};for(let[r,o]of Object.entries(n)){let s=xo.test(r)||r==="value"&&typeof n.key=="string";t[r]=s&&typeof o=="string"&&o?"[redacted]":Pr(o,e+1)}return t},kr=n=>{try{if(n==null)return"";let e=Pr(n),t=typeof e=="string"?e:JSON.stringify(e);return Cr(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""}},Eo=500;function Ao(n){let e=n&&typeof n=="object"?n.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 o=!(n&&n.is_error===!0),s={ok:o,chars:r};if(t.size&&(s.kind=[...t].join("+")),o)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 to=Object.defineProperty;var ro=(n=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(n,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):n)(function(n){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+n+'" is not supported')});var br=(n,e,t)=>()=>{if(t)throw t[0];try{return n&&(e=n(n=0)),e}catch(r){throw t=[r],r}};var Sr=(n,e)=>{for(var t in e)to(n,t,{get:e[t],enumerable:!0})};var xr={};Sr(xr,{zodToJson:()=>de});import{z as wr}from"zod";import{zodToJsonSchema as ao}from"zod-to-json-schema";function lo(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 ve(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]=ve(n[e][t]);for(let e of["anyOf","oneOf","allOf"])Array.isArray(n[e])&&(n[e]=n[e].map(ve));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 r of e){let o=ve(n.properties[r]);t.has(r)||(o=lo(o)),n.properties[r]=o}n.required=e}return n.items&&(Array.isArray(n.items)?n.items=n.items.map(ve):n.items=ve(n.items)),n}function de(n,e={target:"openApi3"}){if(!n)return null;let t=e?.target==="openAi",r=null;if(typeof wr?.toJSONSchema=="function")try{r=wr.toJSONSchema(n)}catch{}if(!r)try{r=ao(n,e)}catch{return null}if(t&&r)try{return ve(r)}catch{return r}return r}var He=br(()=>{});var dn={};Sr(dn,{clearConnectedCache:()=>ei,clearTokenCache:()=>fn,getConnectedIntegrations:()=>Qs,resolveIntegrationToken:()=>Ct});import{existsSync as Vs,readFileSync as Ws}from"node:fs";import{homedir as qs}from"node:os";import{join as Xs}from"node:path";function cn(){let n=process.env.ZIBBY_SELF_HOST;return n!=null&&n!==""&&n!=="0"&&n.toLowerCase()!=="false"}function un(){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=Xs(qs(),".zibby","config.json");return Vs(n)&&JSON.parse(Ws(n,"utf-8")).sessionToken||null}catch{return null}}function pn(){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 Ct(n){if(cn()){let a=ln[n];if(a&&process.env[a])return{token:process.env[a]}}let e=Date.now(),t=It.get(n);if(t&&t.expiresAt>e)return t.data;let r=un();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 o=`${pn()}/integrations/token/${n}`,s=await fetch(o,{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||`${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}): ${a}`)}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 c=((i.expiresInSec||3e3)-120)*1e3;return It.set(n,{data:i,expiresAt:e+c}),i}function fn(n){n?It.delete(n):It.clear()}function an(n){let e=process.env.WORKFLOW_ENABLED_INTEGRATIONS;if(typeof e!="string"||e.trim()==="")return n;let t=new Set(e.split(",").map(o=>o.trim()).filter(Boolean));if(t.size===0)return n;let r={};for(let[o,s]of Object.entries(n))t.has(o)&&(r[o]=s);return r}async function Qs(){let n=Date.now();if(Me&&Me.expiresAt>n)return Me.data;if(cn()){let t={};for(let[o,s]of Object.entries(ln))t[o]=!!process.env[s];let r=an(t);return Me={data:r,expiresAt:n+6e4},r}let e=un();if(!e)return{};try{let t=await fetch(`${pn()}/integrations/status`,{method:"GET",headers:{Authorization:`Bearer ${e}`}});if(!t.ok)return{};let r=await t.json(),o={};if(r&&typeof r=="object")for(let[i,c]of Object.entries(r))c&&typeof c=="object"&&"connected"in c&&(o[i]=!!c.connected);let s=an(o);return Me={data:s,expiresAt:n+6e4},s}catch{return{}}}function ei(){Me=null}var It,ln,Me,Pt=br(()=>{It=new Map,ln={github:"GITHUB_TOKEN",gitlab:"GITLAB_TOKEN",sentry:"SENTRY_AUTH_TOKEN",slack:"SLACK_BOT_TOKEN"};Me=null});import{readFileSync as Vn,existsSync as Wn}from"node:fs";import{join as Je,resolve as qn,isAbsolute as fa}from"node:path";import{DEFAULT_OUTPUT_BASE as da,SESSIONS_DIR as Xn,RESULT_FILE as ma,resolveWorkflowSession as ga,clearInheritedSessionEnvForFreshRun as ha,readPinnedSessionPathFromEnv as ya}from"@zibby/agent-workflow";import{registerStrategy as $t}from"@zibby/agent-workflow";import{AgentStrategy as go,getSkill as Tr,NO_INTEGRATION_TOGGLEABLE_SKILL_IDS as ho}from"@zibby/agent-workflow";import{query as yo}from"@anthropic-ai/claude-agent-sdk";import no from"node:process";var _r=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(n=no.env){let e={},t=new Set(_r);for(let[r,o]of Object.entries(n))t.has(r)||o!==void 0&&(e[r]=o);return e}function ut(n){return!!n&&(n.transport==="http"||typeof n.url=="string"&&!n.command)}var oo=new Set(["claude"]);function so(){let n=String(process.env.MCP_ALWAYS_LOAD??"").trim().toLowerCase();return!(n==="0"||n==="false"||n==="off")}function io(n,e){return oo.has(n)?so()?typeof e.alwaysLoad=="boolean"?{alwaysLoad:e.alwaysLoad}:{}:{}:{}}function re(n,e,{processEnv:t}={}){if(!e)return null;let r=io(n,e);if(ut(e)){let s=String(e.url||"").trim();if(!s)return null;let i=e.headers&&typeof e.headers=="object"?e.headers:void 0;switch(n){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 o={command:e.command};return e.args?.length&&(o.args=e.args),e.cwd&&(o.cwd=e.cwd),t?o.env={...t,...e.env||{}}:e.env&&Object.keys(e.env).length&&(o.env=e.env),{...o,...r}}function pt(n){return ut(n)?`http \u2192 ${String(n.url||"").replace(/\?.*$/,"")}`:`${n?.command||"?"} ${(n?.args||[]).join(" ")}`.trim()}He();import{writeFileSync as Dt,mkdirSync as jt,existsSync as Oe,readFileSync as $r}from"fs";import{homedir as Or}from"os";import{join as te}from"path";import Ye from"chalk";var ne={debug:0,info:1,warn:2,error:3,silent:4},ft=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 o=new Date().toISOString(),i=`${this._getPrefix(e)} ${t}`;return Object.keys(r).length>0&&(i+=Ye.dim(` ${JSON.stringify(r)}`)),i}_getPrefix(e){return{debug:Ye.gray("[DEBUG]"),info:Ye.cyan("[INFO]"),warn:Ye.yellow("[WARN]"),error:Ye.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)}},p=new ft;import{timeline as ie,Timeline as ka,WORKFLOW_GRAPH_LOG_MARKER_PREFIX as Na}from"@zibby/agent-workflow";var Ze=[{alias:"opus-4.8",canonicalId:"claude-opus-4-8",vendor:"claude",label:"Claude \xB7 Opus 4.8",family:"claude-opus-4",pickerVisible:!0},{alias:"opus-4-8",canonicalId:"claude-opus-4-8",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.8"},{alias:"opus-5",canonicalId:"claude-opus-5",vendor:"claude",label:"Claude \xB7 Opus 5",family:"claude-opus-5",pickerVisible:!0},{alias:"claude-opus-5",canonicalId:"claude-opus-5",vendor:"claude",family:"claude-opus-5",aliasOf:"opus-5"},{alias:"sonnet-5",canonicalId:"claude-sonnet-5",vendor:"claude",label:"Claude \xB7 Sonnet 5",family:"claude-sonnet-5",pickerVisible:!0},{alias:"claude-sonnet-5",canonicalId:"claude-sonnet-5",vendor:"claude",family:"claude-sonnet-5",aliasOf:"sonnet-5"},{alias:"fable-5",canonicalId:"claude-fable-5",vendor:"claude",label:"Claude \xB7 Fable 5",family:"claude-fable-5",pickerVisible:!0},{alias:"claude-fable-5",canonicalId:"claude-fable-5",vendor:"claude",family:"claude-fable-5",aliasOf:"fable-5"},{alias:"sonnet-4.8",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4"},{alias:"sonnet-4-8",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.8"},{alias:"opus-4.7",canonicalId:"claude-opus-4-7",vendor:"claude",label:"Claude \xB7 Opus 4.7",family:"claude-opus-4",pickerVisible:!0},{alias:"opus-4-7",canonicalId:"claude-opus-4-7",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.7"},{alias:"sonnet-4.7",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4"},{alias:"sonnet-4-7",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.7"},{alias:"sonnet-4.6",canonicalId:"claude-sonnet-4-6",vendor:"claude",label:"Claude \xB7 Sonnet 4.6",family:"claude-sonnet-4",pickerVisible:!0},{alias:"sonnet-4-6",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.6"},{alias:"opus-4.6",canonicalId:"claude-opus-4-6",vendor:"claude",label:"Claude \xB7 Opus 4.6",family:"claude-opus-4",pickerVisible:!0},{alias:"opus-4-6",canonicalId:"claude-opus-4-6",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.6"},{alias:"sonnet-4.5",canonicalId:"claude-sonnet-4-5-20250929",vendor:"claude",label:"Claude \xB7 Sonnet 4.5",family:"claude-sonnet-4",pickerVisible:!0},{alias:"sonnet-4-5",canonicalId:"claude-sonnet-4-5-20250929",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.5"},{alias:"opus-4.5",canonicalId:"claude-opus-4-5-20251101",vendor:"claude",label:"Claude \xB7 Opus 4.5",family:"claude-opus-4",pickerVisible:!0},{alias:"opus-4-5",canonicalId:"claude-opus-4-5-20251101",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.5"},{alias:"haiku-4.5",canonicalId:"claude-haiku-4-5-20251001",vendor:"claude",label:"Claude \xB7 Haiku 4.5",family:"claude-haiku-4"},{alias:"haiku-4-5",canonicalId:"claude-haiku-4-5-20251001",vendor:"claude",family:"claude-haiku-4",aliasOf:"haiku-4.5"},{alias:"claude-opus-4-8",canonicalId:"claude-opus-4-8",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.8"},{alias:"claude-sonnet-4-8",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.8"},{alias:"claude-opus-4-7",canonicalId:"claude-opus-4-7",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.7"},{alias:"claude-sonnet-4-7",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.7"},{alias:"claude-sonnet-4-6",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.6"},{alias:"claude-opus-4-6",canonicalId:"claude-opus-4-6",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.6"},{alias:"claude-sonnet-4-5-20250929",canonicalId:"claude-sonnet-4-5-20250929",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.5"},{alias:"claude-opus-4-5-20251101",canonicalId:"claude-opus-4-5-20251101",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.5"},{alias:"claude-haiku-4-5-20251001",canonicalId:"claude-haiku-4-5-20251001",vendor:"claude",family:"claude-haiku-4",aliasOf:"haiku-4.5"},{alias:"claude-opus-4-20250514",canonicalId:"claude-opus-4-20250514",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.5"},{alias:"o4-mini",canonicalId:"o4-mini",vendor:"codex",label:"Codex \xB7 o4-mini",family:"o4-mini",pickerVisible:!0},{alias:"o3",canonicalId:"o3",vendor:"codex",family:"o3"},{alias:"o3-mini",canonicalId:"o3-mini",vendor:"codex",family:"o3-mini"},{alias:"codex-mini",canonicalId:"codex-mini-latest",vendor:"codex",family:"codex-mini"},{alias:"gpt-4o",canonicalId:"gpt-4o",vendor:"codex",label:"Codex \xB7 GPT-4o",family:"gpt-4o",pickerVisible:!0},{alias:"gpt-4o-mini",canonicalId:"gpt-4o-mini",vendor:"codex",label:"Codex \xB7 GPT-4o mini",family:"gpt-4o-mini",pickerVisible:!0},{alias:"gpt-5.2-codex",canonicalId:"gpt-5.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:"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 Ve(n){let e={};for(let t of Ze)t.vendor===n&&(e[t.alias]=t.canonicalId);return e}function co(n){if(!n||typeof n!="string")return null;let e=n.toLowerCase();for(let t of Ze)if(t.alias.toLowerCase()===e)return t.family??null;for(let t of Ze)if(t.canonicalId.toLowerCase()===e)return t.family??null;return null}function Er(n){let e=String(n||"").match(/(\d+(?:\.\d+)?)/);return e?parseFloat(e[1]):0}function Ar(n){let e=String(n||"").toLowerCase();return/\b(base|mini)\b/.test(e)?0:/\b(opus|pro)\b/.test(e)?2:1}function uo(n,e){let t=Er(e.label)-Er(n.label);if(t!==0)return t;let r=Ar(e.label)-Ar(n.label);return r!==0?r:n.label.localeCompare(e.label)}function po(){let n=[],e=new Map;for(let r of Ze)r.pickerVisible&&(e.has(r.vendor)||(e.set(r.vendor,[]),n.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}));let t=[];for(let r of n)t.push(...e.get(r).sort(uo));return t}function $e(n,e){let t=typeof e=="string"?e.trim():"";if(t)return t;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 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"},fo={ASSISTANT:"assistant",CLAUDE:"claude",CURSOR:"cursor",CODEX:"codex",GEMINI:"gemini"},mo={DEBUG:"debug",INFO:"info",WARN:"warn",ERROR:"error",SILENT:"silent"},dt=Ve("claude"),mt=Ve("codex"),Ut=Ve("gemini"),gt={CURSOR_AGENT_DEFAULT:1200*1e3,OPENAI_REQUEST:18e4};function W(n){let e=`${n}_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 o=r[Math.floor(Math.random()*r.length)],s=process.env[n];return process.env[n]=o,p.debug(`[auth-pool] ${n}: picked 1 of ${r.length} from pool (***${o.slice(-4)})`),{picked:o,count:r.length,dispose(){s===void 0?delete process.env[n]:process.env[n]=s}}}function ht(n){if(!n||typeof n!="object")return null;let e=(...o)=>{for(let s of o){if(s==null||s==="")continue;let i=Number(s);if(Number.isFinite(i))return i}return null},t=e(n.input_tokens,n.inputTokens,n.prompt_tokens,n.promptTokens),r=e(n.output_tokens,n.outputTokens,n.completion_tokens,n.completionTokens);return t==null&&r==null?null:{input:t||0,output:r||0}}import{createRequire as bo}from"module";import J from"process";var vr=bo(import.meta.url);function So(n){let e=2166136261;for(let t=0;t<n.length;t++)e^=n.charCodeAt(t),e=Math.imul(e,16777619)>>>0;return e.toString(16).padStart(8,"0")}function Ir(n){if(!n||typeof n!="object")return null;let e=n.message?.content??n.content;return Array.isArray(e)&&e.length||typeof e=="string"&&e.length?e:typeof n.text=="string"&&n.text.length?n.text:null}function _o(n){let e=Ir(n);if(e===null)return null;let t;try{t=JSON.stringify(e)}catch{return null}return typeof t!="string"||!t?null:`${`${n.type||n.constructor?.name||"?"}`}:${t.length}:${So(t)}`}function wo(n){if(!n||typeof n!="object")return"a message with no type";let e=n.type||n.constructor?.name||"unknown-type",t=n.subtype?`/${n.subtype}`:"",r=Ir(n);if(typeof r=="string")return`${e}${t} text "${r.slice(0,80)}"`;if(!Array.isArray(r))return`${e}${t} (no readable content)`;let o=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>o.length&&o.push(`+${r.length-o.length} more`),`${e}${t} [${o.join(", ")}]`}var Cr=(n,e)=>{let t=String(n??"");return t.length>e?`${t.slice(0,e)}\u2026`:t},xo=/secret|token|password|passwd|credential|authorization|bearer|api[-_]?key|private[-_]?key|access[-_]?key/i,Pr=(n,e=0)=>{if(n==null||e>6||typeof n!="object")return n;let t=Array.isArray(n)?[]:{};for(let[r,o]of Object.entries(n)){let s=xo.test(r)||r==="value"&&typeof n.key=="string";t[r]=s&&typeof o=="string"&&o?"[redacted]":Pr(o,e+1)}return t},kr=n=>{try{if(n==null)return"";let e=Pr(n),t=typeof e=="string"?e:JSON.stringify(e);return Cr(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""}},Eo=500;function Ao(n){let e=n&&typeof n=="object"?n.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 o=!(n&&n.is_error===!0),s={ok:o,chars:r};if(t.size&&(s.kind=[...t].join("+")),o)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=kr(i);return c&&(s.error=c),s}function To(){try{if(J.env.CLAUDE_CODE_EXECUTABLE&&Oe(J.env.CLAUDE_CODE_EXECUTABLE))return J.env.CLAUDE_CODE_EXECUTABLE;let n=J.platform,e=J.arch,t=`@anthropic-ai/claude-agent-sdk-${n}-${e}`,r=n==="win32"?"claude.exe":"claude";try{let o=vr.resolve(`${t}/package.json`),s=te(o,"..",r);if(Oe(s))return s}catch{}try{let o=vr.resolve("@anthropic-ai/claude-agent-sdk/package.json"),s=te(o,"..");for(let c of[r,te("vendor",r),te("bin",r)]){let a=te(s,c);if(Oe(a))return a}let i=te(s,"..",`claude-agent-sdk-${n}-${e}`,r);if(Oe(i))return i}catch{}}catch{}return null}var yt=To();yt&&p.debug(`Claude native CLI resolved to baked binary: ${yt}`);var me=class extends go{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,o=!!J.env.ANTHROPIC_AUTH_TOKEN||!!J.env.ANTHROPIC_AUTH_TOKEN_POOL,s=t||r||o;return s||p.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:o=J.cwd(),schema:s=null,images:i=[],skills:c=null,sessionPath:a=null,nodeName:l=null,timeout:u,config:d={},activityLog:m=!1,signal:f=null,sessionId:g,resume:y,forkSession:h,sessionStore:b}=t,_=$e("claude",r),E=dt[_]||_;dt[_]&&_!==E&&p.debug(`Mapped model: ${_} \u2192 ${E}`);let S=[W("ANTHROPIC_API_KEY"),W("CLAUDE_CODE_OAUTH_TOKEN"),W("ANTHROPIC_AUTH_TOKEN")];try{p.debug(`Invoking Claude Agent SDK with model: ${E}, skills: ${JSON.stringify(c)}`);let T=Cr,P=($,I)=>{try{console.log(JSON.stringify({mode:$,...I}))}catch{}},N=J.env.CLAUDE_CODE_OAUTH_TOKEN,O=J.env.ANTHROPIC_API_KEY,U=J.env.ANTHROPIC_AUTH_TOKEN;J.env.CLAUDE_CODE_CREDENTIALS_JSON?Oo(J.env.CLAUDE_CODE_CREDENTIALS_JSON):N&&$o(N,J.env.__ZIBBY_CLAUDE_PLAN);let z=J.env.__ZIBBY_CLAUDE_PLAN,k=z?z.charAt(0).toUpperCase()+z.slice(1):null,D;if(N?D=k?`Claude ${k} plan \xB7 ***${N.slice(-4)}`:`Subscription \xB7 ***${N.slice(-4)}`:O?D=`API key \xB7 ***${O.slice(-4)}`:U?D=`Bearer \xB7 ***${U.slice(-4)}`:D="NONE \u2014 request will fail",!m){let $=(await import("chalk")).default;console.log(""),console.log(` ${$.cyan("\u25C6")} ${$.bold(E)}`),console.log(` ${$.dim("Auth: ")}${D}`),console.log(` ${$.dim("Workdir: ")}${o}`),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:o,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:o,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),...yt&&{pathToClaudeCodeExecutable:yt},...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},p.debug("Structured output enforced via SDK outputFormat")}p.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=[];p.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": "2.0.3",
3
+ "version": "2.0.4",
4
4
  "description": "Core test automation engine with multi-agent and multi-MCP support",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -69,9 +69,9 @@
69
69
  "@modelcontextprotocol/sdk": "^1.29.0",
70
70
  "@openai/codex-sdk": "^0.143.0",
71
71
  "@playwright/mcp": "^0.0.70",
72
- "@zibby/agent-workflow": "2.0.3",
73
- "@zibby/mcp-browser": "2.0.3",
74
- "@zibby/skill-ids": "2.0.3",
72
+ "@zibby/agent-workflow": "2.0.4",
73
+ "@zibby/mcp-browser": "2.0.4",
74
+ "@zibby/skill-ids": "2.0.4",
75
75
  "acorn": "^8.15.0",
76
76
  "acorn-walk": "^8.3.5",
77
77
  "axios": "^1.15.0",
@@ -1,4 +1,4 @@
1
- var nn=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)nn(n,t,{get:e[t],enumerable:!0})};var kt={};mt(kt,{zodToJson:()=>ce});import{z as $t}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 ye(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]=ye(n[e][t]);for(let e of["anyOf","oneOf","allOf"])Array.isArray(n[e])&&(n[e]=n[e].map(ye));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=ye(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(ye):n.items=ye(n.items)),n}function ce(n,e={target:"openApi3"}){if(!n)return null;let t=e?.target==="openAi",o=null;if(typeof $t?.toJSONSchema=="function")try{o=$t.toJSONSchema(n)}catch{}if(!o)try{o=Ln(n,e)}catch{return null}if(t&&o)try{return ye(o)}catch{return o}return o}var ve=pt(()=>{});var Qt={};mt(Qt,{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 Wt(){let n=process.env.ZIBBY_SELF_HOST;return n!=null&&n!==""&&n!=="0"&&n.toLowerCase()!=="false"}function Xt(){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(Wt()){let l=Vt[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=Xt();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 Zt(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(Wt()){let t={};for(let[r,s]of Object.entries(Vt))t[r]=!!process.env[s];let o=Zt(t);return be={data:o,expiresAt:n+6e4},o}let e=Xt();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=Zt(r);return be={data:s,expiresAt:n+6e4},s}catch{return{}}}function Mo(){be=null}var qe,Vt,be,en=pt(()=>{qe=new Map,Vt={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 wn,DEFAULT_OUTPUT_BASE as vn,SESSION_INFO_FILE as xn,STOP_REQUEST_FILE as $n,getAllSkills as kn,getSkill as Ot}from"@zibby/agent-workflow";import{spawn as Cn,execSync as le}from"node:child_process";import{writeFileSync as bt,readFileSync as Tt,mkdirSync as It,existsSync as Ie,accessSync as wt,constants as vt,unlinkSync as Nn}from"node:fs";import{join as te,resolve as Pn}from"node:path";import{homedir as we}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 on=[{alias:"opus-4.8",canonicalId:"claude-opus-4-8",vendor:"claude",label:"Claude \xB7 Opus 4.8",family:"claude-opus-4",pickerVisible:!0},{alias:"opus-4-8",canonicalId:"claude-opus-4-8",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.8"},{alias:"opus-5",canonicalId:"claude-opus-5",vendor:"claude",label:"Claude \xB7 Opus 5",family:"claude-opus-5",pickerVisible:!0},{alias:"claude-opus-5",canonicalId:"claude-opus-5",vendor:"claude",family:"claude-opus-5",aliasOf:"opus-5"},{alias:"sonnet-5",canonicalId:"claude-sonnet-5",vendor:"claude",label:"Claude \xB7 Sonnet 5",family:"claude-sonnet-5",pickerVisible:!0},{alias:"claude-sonnet-5",canonicalId:"claude-sonnet-5",vendor:"claude",family:"claude-sonnet-5",aliasOf:"sonnet-5"},{alias:"fable-5",canonicalId:"claude-fable-5",vendor:"claude",label:"Claude \xB7 Fable 5",family:"claude-fable-5",pickerVisible:!0},{alias:"claude-fable-5",canonicalId:"claude-fable-5",vendor:"claude",family:"claude-fable-5",aliasOf:"fable-5"},{alias:"sonnet-4.8",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4"},{alias:"sonnet-4-8",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.8"},{alias:"opus-4.7",canonicalId:"claude-opus-4-7",vendor:"claude",label:"Claude \xB7 Opus 4.7",family:"claude-opus-4",pickerVisible:!0},{alias:"opus-4-7",canonicalId:"claude-opus-4-7",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.7"},{alias:"sonnet-4.7",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4"},{alias:"sonnet-4-7",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.7"},{alias:"sonnet-4.6",canonicalId:"claude-sonnet-4-6",vendor:"claude",label:"Claude \xB7 Sonnet 4.6",family:"claude-sonnet-4",pickerVisible:!0},{alias:"sonnet-4-6",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.6"},{alias:"opus-4.6",canonicalId:"claude-opus-4-6",vendor:"claude",label:"Claude \xB7 Opus 4.6",family:"claude-opus-4",pickerVisible:!0},{alias:"opus-4-6",canonicalId:"claude-opus-4-6",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.6"},{alias:"sonnet-4.5",canonicalId:"claude-sonnet-4-5-20250929",vendor:"claude",label:"Claude \xB7 Sonnet 4.5",family:"claude-sonnet-4",pickerVisible:!0},{alias:"sonnet-4-5",canonicalId:"claude-sonnet-4-5-20250929",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.5"},{alias:"opus-4.5",canonicalId:"claude-opus-4-5-20251101",vendor:"claude",label:"Claude \xB7 Opus 4.5",family:"claude-opus-4",pickerVisible:!0},{alias:"opus-4-5",canonicalId:"claude-opus-4-5-20251101",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.5"},{alias:"haiku-4.5",canonicalId:"claude-haiku-4-5-20251001",vendor:"claude",label:"Claude \xB7 Haiku 4.5",family:"claude-haiku-4"},{alias:"haiku-4-5",canonicalId:"claude-haiku-4-5-20251001",vendor:"claude",family:"claude-haiku-4",aliasOf:"haiku-4.5"},{alias:"claude-opus-4-8",canonicalId:"claude-opus-4-8",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.8"},{alias:"claude-sonnet-4-8",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.8"},{alias:"claude-opus-4-7",canonicalId:"claude-opus-4-7",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.7"},{alias:"claude-sonnet-4-7",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.7"},{alias:"claude-sonnet-4-6",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.6"},{alias:"claude-opus-4-6",canonicalId:"claude-opus-4-6",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.6"},{alias:"claude-sonnet-4-5-20250929",canonicalId:"claude-sonnet-4-5-20250929",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.5"},{alias:"claude-opus-4-5-20251101",canonicalId:"claude-opus-4-5-20251101",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.5"},{alias:"claude-haiku-4-5-20251001",canonicalId:"claude-haiku-4-5-20251001",vendor:"claude",family:"claude-haiku-4",aliasOf:"haiku-4.5"},{alias:"claude-opus-4-20250514",canonicalId:"claude-opus-4-20250514",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.5"},{alias:"o4-mini",canonicalId:"o4-mini",vendor:"codex",label:"Codex \xB7 o4-mini",family:"o4-mini",pickerVisible:!0},{alias:"o3",canonicalId:"o3",vendor:"codex",family:"o3"},{alias:"o3-mini",canonicalId:"o3-mini",vendor:"codex",family:"o3-mini"},{alias:"codex-mini",canonicalId:"codex-mini-latest",vendor:"codex",family:"codex-mini"},{alias:"gpt-4o",canonicalId:"gpt-4o",vendor:"codex",label:"Codex \xB7 GPT-4o",family:"gpt-4o",pickerVisible:!0},{alias:"gpt-4o-mini",canonicalId:"gpt-4o-mini",vendor:"codex",label:"Codex \xB7 GPT-4o mini",family:"gpt-4o-mini",pickerVisible:!0},{alias:"gpt-5.2-codex",canonicalId:"gpt-5.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:"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 on)t.vendor===n&&(e[t.alias]=t.canonicalId);return e}function de(n,e){let t=typeof e=="string"?e.trim():"";if(t)return t;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"),gt=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 nn=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)nn(n,t,{get:e[t],enumerable:!0})};var kt={};mt(kt,{zodToJson:()=>ce});import{z as $t}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 ye(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]=ye(n[e][t]);for(let e of["anyOf","oneOf","allOf"])Array.isArray(n[e])&&(n[e]=n[e].map(ye));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=ye(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(ye):n.items=ye(n.items)),n}function ce(n,e={target:"openApi3"}){if(!n)return null;let t=e?.target==="openAi",o=null;if(typeof $t?.toJSONSchema=="function")try{o=$t.toJSONSchema(n)}catch{}if(!o)try{o=Ln(n,e)}catch{return null}if(t&&o)try{return ye(o)}catch{return o}return o}var ve=pt(()=>{});var Qt={};mt(Qt,{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 Wt(){let n=process.env.ZIBBY_SELF_HOST;return n!=null&&n!==""&&n!=="0"&&n.toLowerCase()!=="false"}function Xt(){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(Wt()){let l=Vt[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=Xt();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 Zt(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(Wt()){let t={};for(let[r,s]of Object.entries(Vt))t[r]=!!process.env[s];let o=Zt(t);return be={data:o,expiresAt:n+6e4},o}let e=Xt();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=Zt(r);return be={data:s,expiresAt:n+6e4},s}catch{return{}}}function Mo(){be=null}var qe,Vt,be,en=pt(()=>{qe=new Map,Vt={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 wn,DEFAULT_OUTPUT_BASE as vn,SESSION_INFO_FILE as xn,STOP_REQUEST_FILE as $n,getAllSkills as kn,getSkill as Ot}from"@zibby/agent-workflow";import{spawn as Cn,execSync as le}from"node:child_process";import{writeFileSync as bt,readFileSync as Tt,mkdirSync as It,existsSync as Ie,accessSync as wt,constants as vt,unlinkSync as Nn}from"node:fs";import{join as te,resolve as Pn}from"node:path";import{homedir as we}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 on=[{alias:"opus-4.8",canonicalId:"claude-opus-4-8",vendor:"claude",label:"Claude \xB7 Opus 4.8",family:"claude-opus-4",pickerVisible:!0},{alias:"opus-4-8",canonicalId:"claude-opus-4-8",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.8"},{alias:"opus-5",canonicalId:"claude-opus-5",vendor:"claude",label:"Claude \xB7 Opus 5",family:"claude-opus-5",pickerVisible:!0},{alias:"claude-opus-5",canonicalId:"claude-opus-5",vendor:"claude",family:"claude-opus-5",aliasOf:"opus-5"},{alias:"sonnet-5",canonicalId:"claude-sonnet-5",vendor:"claude",label:"Claude \xB7 Sonnet 5",family:"claude-sonnet-5",pickerVisible:!0},{alias:"claude-sonnet-5",canonicalId:"claude-sonnet-5",vendor:"claude",family:"claude-sonnet-5",aliasOf:"sonnet-5"},{alias:"fable-5",canonicalId:"claude-fable-5",vendor:"claude",label:"Claude \xB7 Fable 5",family:"claude-fable-5",pickerVisible:!0},{alias:"claude-fable-5",canonicalId:"claude-fable-5",vendor:"claude",family:"claude-fable-5",aliasOf:"fable-5"},{alias:"sonnet-4.8",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4"},{alias:"sonnet-4-8",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.8"},{alias:"opus-4.7",canonicalId:"claude-opus-4-7",vendor:"claude",label:"Claude \xB7 Opus 4.7",family:"claude-opus-4",pickerVisible:!0},{alias:"opus-4-7",canonicalId:"claude-opus-4-7",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.7"},{alias:"sonnet-4.7",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4"},{alias:"sonnet-4-7",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.7"},{alias:"sonnet-4.6",canonicalId:"claude-sonnet-4-6",vendor:"claude",label:"Claude \xB7 Sonnet 4.6",family:"claude-sonnet-4",pickerVisible:!0},{alias:"sonnet-4-6",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.6"},{alias:"opus-4.6",canonicalId:"claude-opus-4-6",vendor:"claude",label:"Claude \xB7 Opus 4.6",family:"claude-opus-4",pickerVisible:!0},{alias:"opus-4-6",canonicalId:"claude-opus-4-6",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.6"},{alias:"sonnet-4.5",canonicalId:"claude-sonnet-4-5-20250929",vendor:"claude",label:"Claude \xB7 Sonnet 4.5",family:"claude-sonnet-4",pickerVisible:!0},{alias:"sonnet-4-5",canonicalId:"claude-sonnet-4-5-20250929",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.5"},{alias:"opus-4.5",canonicalId:"claude-opus-4-5-20251101",vendor:"claude",label:"Claude \xB7 Opus 4.5",family:"claude-opus-4",pickerVisible:!0},{alias:"opus-4-5",canonicalId:"claude-opus-4-5-20251101",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.5"},{alias:"haiku-4.5",canonicalId:"claude-haiku-4-5-20251001",vendor:"claude",label:"Claude \xB7 Haiku 4.5",family:"claude-haiku-4"},{alias:"haiku-4-5",canonicalId:"claude-haiku-4-5-20251001",vendor:"claude",family:"claude-haiku-4",aliasOf:"haiku-4.5"},{alias:"claude-opus-4-8",canonicalId:"claude-opus-4-8",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.8"},{alias:"claude-sonnet-4-8",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.8"},{alias:"claude-opus-4-7",canonicalId:"claude-opus-4-7",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.7"},{alias:"claude-sonnet-4-7",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.7"},{alias:"claude-sonnet-4-6",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.6"},{alias:"claude-opus-4-6",canonicalId:"claude-opus-4-6",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.6"},{alias:"claude-sonnet-4-5-20250929",canonicalId:"claude-sonnet-4-5-20250929",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.5"},{alias:"claude-opus-4-5-20251101",canonicalId:"claude-opus-4-5-20251101",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.5"},{alias:"claude-haiku-4-5-20251001",canonicalId:"claude-haiku-4-5-20251001",vendor:"claude",family:"claude-haiku-4",aliasOf:"haiku-4.5"},{alias:"claude-opus-4-20250514",canonicalId:"claude-opus-4-20250514",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.5"},{alias:"o4-mini",canonicalId:"o4-mini",vendor:"codex",label:"Codex \xB7 o4-mini",family:"o4-mini",pickerVisible:!0},{alias:"o3",canonicalId:"o3",vendor:"codex",family:"o3"},{alias:"o3-mini",canonicalId:"o3-mini",vendor:"codex",family:"o3-mini"},{alias:"codex-mini",canonicalId:"codex-mini-latest",vendor:"codex",family:"codex-mini"},{alias:"gpt-4o",canonicalId:"gpt-4o",vendor:"codex",label:"Codex \xB7 GPT-4o",family:"gpt-4o",pickerVisible:!0},{alias:"gpt-4o-mini",canonicalId:"gpt-4o-mini",vendor:"codex",label:"Codex \xB7 GPT-4o mini",family:"gpt-4o-mini",pickerVisible:!0},{alias:"gpt-5.2-codex",canonicalId:"gpt-5.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:"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 on)t.vendor===n&&(e[t.alias]=t.canonicalId);return e}function de(n,e){let t=typeof e=="string"?e.trim():"";if(t)return t;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"),gt=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{execSync as v}from"node:child_process";import{existsSync as A,mkdirSync as N}from"node:fs";import{join as C}from"node:path";function y(t,e,r,o,s="clone"){try{t(`git -C "${e}" remote set-url origin "${r}"`,{stdio:"pipe"})}catch(c){let i=String(c&&c.message||c);o&&(i=i.split(o).join("***")),console.error(`[${s}] WARNING: failed to strip token from .git/config: ${i}`)}}import{existsSync as L,readFileSync as j}from"node:fs";import{homedir as P}from"node:os";import{join as K}from"node:path";var Z=Object.freeze(["github.com","gitlab.com"]);function u(t){try{return new URL(t).hostname.toLowerCase()}catch{return""}}function E(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 x(t=process.env){let e=t&&(t.GITLAB_URL||t.GITLAB_INSTANCE_URL)||"";return u(e)}function m(t={}){if(t.gitlabHost){let e=String(t.gitlabHost).trim().toLowerCase();return e?e.includes("://")?u(e):e.replace(/:\d+$/,""):""}return x()}function O(t,e={}){if(t==="github.com")return"github";if(t==="gitlab.com")return"gitlab";let r=m(e);return r&&t===r?"gitlab":null}function b(t={},e={}){let r=t&&(t.cloneUrl||t.url)||"",o=u(r);if(!o)return null;let s=t.provider==="github"||t.provider==="gitlab"?t.provider:null,c=$(t,e),i=O(o,c?{gitlabHost:c}:{});return i?s&&s!==i?null:i:s==="gitlab"?"gitlab":null}function $(t,e={}){let r=m(e);return r||(t&&t.provider==="gitlab"?E(t.cloneUrl||t.url||""):"")}function T(t={},e="",r={}){let o=t&&(t.cloneUrl||t.url)||"";if(!o||!e||!b(t,r))return o;let s=$(t,r);return k(o,e,s?{gitlabHost:s}:{})}function k(t,e,r={}){if(!t||!e)return t;let o=E(t);if(!o)return t;if(o==="github.com")return t.replace(/^https:\/\/(?:[^@/]+@)?github\.com(?=[:/]|$)/i,`https://x-access-token:${e}@github.com`);if(o==="gitlab.com")return t.replace(/^https:\/\/(?:[^@/]+@)?gitlab\.com(?=[:/]|$)/i,`https://oauth2:${e}@gitlab.com`);let s=m(r);if(s&&o===s){let c=s.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),i=new RegExp(`^https:\\/\\/(?:[^@/]+@)?${c}(?=[:/]|$)`,"i");return t.replace(i,`https://oauth2:${e}@${s}`)}return t}async function Q(t={}){let{baseDir:e="/workspace/repos",repos:r=null,depth:o=1,branch:s=null}=t,c=process.env.REPOS;if(!c)throw new Error("REPOS environment variable not set. Are you running in a Zibby workflow container?");let i;try{i=JSON.parse(c)}catch(n){throw new Error(`Failed to parse REPOS env var: ${n.message}`,{cause:n})}if(!Array.isArray(i)||i.length===0)throw new Error("No repositories configured for this project");let w=r?i.filter(n=>r.includes(n.name)):i;if(w.length===0)throw new Error(`No matching repositories found. Available: ${i.map(n=>n.name).join(", ")}`);A(e)||N(e,{recursive:!0});let l={};return await Promise.all(w.map(async n=>{let a=n.cloneUrl||n.url;if(!a){console.error(`Repository "${n.name}" has no clone URL`),l[n.name]=null;return}let f=b(n);if(!f){console.error(`Refusing to clone ${n.name}: '${u(a)||a}' is not a recognized VCS host (expected github.com, gitlab.com, or the self-hosted GitLab named by GITLAB_URL/GITLAB_INSTANCE_URL${n.provider?`; the repo declares provider='${n.provider}'`:""}). No token was sent.`),l[n.name]=null;return}let p=f==="gitlab"?process.env.GITLAB_TOKEN:process.env.GITHUB_TOKEN;if(!p){console.error(`${f.toUpperCase()}_TOKEN not set, skipping ${n.name}`),l[n.name]=null;return}let _=n.name.replace(/\//g,"-"),h=C(e,_),d=T({...n,cloneUrl:a},p);if(d===a){console.error(`Refusing to clone ${n.name}: could not safely attach credentials to '${a}' (an https:// URL on an exact trusted host is required). No token was sent.`),l[n.name]=null;return}let g=["clone"];o>0&&g.push("--depth",o.toString()),s&&g.push("--branch",s),g.push(d,h);let R=`git ${g.join(" ")}`;console.log(`Cloning ${n.name} (${f}) to ${h}...`);try{v(R,{stdio:"pipe",env:{...process.env,GIT_TERMINAL_PROMPT:"0"}}),y(v,h,a,p,`cloneRepo:${n.name}`),console.log(`Repository ${n.name} cloned successfully`),l[n.name]=h}catch(I){let S=I.message.replace(p,"***").replace(d,a);console.error(`Failed to clone ${n.name}: ${S}`),l[n.name]=null}})),l}export{Q as cloneRepo};
1
+ import{execSync as v}from"node:child_process";import{existsSync as A,mkdirSync as N}from"node:fs";import{join as C}from"node:path";function y(t,e,r,o,s="clone"){try{t(`git -C "${e}" remote set-url origin "${r}"`,{stdio:"pipe"})}catch(c){let i=String(c&&c.message||c);o&&(i=i.split(o).join("***")),console.error(`[${s}] WARNING: failed to strip token from .git/config: ${i}`)}}import{existsSync as L,readFileSync as j}from"node:fs";import{homedir as P}from"node:os";import{join as K}from"node:path";var Z=Object.freeze(["github.com","gitlab.com"]);function u(t){try{return new URL(t).hostname.toLowerCase()}catch{return""}}function E(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 x(t=process.env){let e=t&&(t.GITLAB_URL||t.GITLAB_INSTANCE_URL)||"";return u(e)}function m(t={}){if(t.gitlabHost){let e=String(t.gitlabHost).trim().toLowerCase();return e?e.includes("://")?u(e):e.replace(/:\d+$/,""):""}return x()}function O(t,e={}){if(t==="github.com")return"github";if(t==="gitlab.com")return"gitlab";let r=m(e);return r&&t===r?"gitlab":null}function b(t={},e={}){let r=t&&(t.cloneUrl||t.url)||"",o=u(r);if(!o)return null;let s=t.provider==="github"||t.provider==="gitlab"?t.provider:null,c=$(t,e),i=O(o,c?{gitlabHost:c}:{});return i?s&&s!==i?null:i:s==="gitlab"?"gitlab":null}function $(t,e={}){let r=m(e);return r||(t&&t.provider==="gitlab"?E(t.cloneUrl||t.url||""):"")}function T(t={},e="",r={}){let o=t&&(t.cloneUrl||t.url)||"";if(!o||!e||!b(t,r))return o;let s=$(t,r);return k(o,e,s?{gitlabHost:s}:{})}function k(t,e,r={}){if(!t||!e)return t;let o=E(t);if(!o)return t;if(o==="github.com")return t.replace(/^https:\/\/(?:[^@/]+@)?github\.com(?=[:/]|$)/i,`https://x-access-token:${e}@github.com`);if(o==="gitlab.com")return t.replace(/^https:\/\/(?:[^@/]+@)?gitlab\.com(?=[:/]|$)/i,`https://oauth2:${e}@gitlab.com`);let s=m(r);if(s&&o===s){let c=s.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),i=new RegExp(`^https:\\/\\/(?:[^@/]+@)?${c}(?=[:/]|$)`,"i");return t.replace(i,`https://oauth2:${e}@${s}`)}return t}async function Q(t={}){let{baseDir:e="/workspace/repos",repos:r=null,depth:o=1,branch:s=null}=t,c=process.env.REPOS;if(!c)throw new Error("REPOS environment variable not set. Are you running in a Zibby workflow container?");let i;try{i=JSON.parse(c)}catch(n){throw new Error(`Failed to parse REPOS env var: ${n.message}`,{cause:n})}if(!Array.isArray(i)||i.length===0)throw new Error("No repositories configured for this project");let w=r?i.filter(n=>r.includes(n.name)):i;if(w.length===0)throw new Error(`No matching repositories found. Available: ${i.map(n=>n.name).join(", ")}`);A(e)||N(e,{recursive:!0});let l={};return await Promise.all(w.map(async n=>{let a=n.cloneUrl||n.url;if(!a){console.error(`Repository "${n.name}" has no clone URL`),l[n.name]=null;return}let f=b(n);if(!f){console.error(`Refusing to clone ${n.name}: '${u(a)||a}' is not a recognized VCS host (expected github.com, gitlab.com, or the self-hosted GitLab named by GITLAB_URL/GITLAB_INSTANCE_URL${n.provider?`; the repo declares provider='${n.provider}'`:""}). No token was sent.`),l[n.name]=null;return}let p=f==="gitlab"?process.env.GITLAB_TOKEN:process.env.GITHUB_TOKEN;if(!p){console.error(`${f.toUpperCase()}_TOKEN not set, skipping ${n.name}`),l[n.name]=null;return}let _=n.name.replace(/\//g,"-"),h=C(e,_),g=T({...n,cloneUrl:a},p);if(g===a){console.error(`Refusing to clone ${n.name}: could not safely attach credentials to '${a}' (an https:// URL on an exact trusted host is required). No token was sent.`),l[n.name]=null;return}let d=["clone"];o>0&&d.push("--depth",o.toString()),s&&d.push("--branch",s),d.push(g,h);let R=`git ${d.join(" ")}`;console.log(`Cloning ${n.name} (${f}) to ${h}...`);try{v(R,{stdio:"pipe",env:{...process.env,GIT_TERMINAL_PROMPT:"0"}}),y(v,h,a,p,`cloneRepo:${n.name}`),console.log(`Repository ${n.name} cloned successfully`),l[n.name]=h}catch(I){let S=I.message.replace(p,"***").replace(g,a);console.error(`Failed to clone ${n.name}: ${S}`),l[n.name]=null}})),l}export{Q as cloneRepo};
@@ -1,2 +1,2 @@
1
- import{execSync as y}from"node:child_process";import{existsSync as _,mkdirSync as k}from"node:fs";import{join as T,resolve as A}from"node:path";function b(t,e,o,n,s="clone"){try{t(`git -C "${e}" remote set-url origin "${o}"`,{stdio:"pipe"})}catch(r){let i=String(r&&r.message||r);n&&(i=i.split(n).join("***")),console.error(`[${s}] WARNING: failed to strip token from .git/config: ${i}`)}}import{existsSync as U,readFileSync as P}from"node:fs";import{homedir as H}from"node:os";import{join as K}from"node:path";var Y=Object.freeze(["github.com","gitlab.com"]);function a(t){try{return new URL(t).hostname.toLowerCase()}catch{return""}}function m(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 R(t=process.env){let e=t&&(t.GITLAB_URL||t.GITLAB_INSTANCE_URL)||"";return a(e)}function h(t={}){if(t.gitlabHost){let e=String(t.gitlabHost).trim().toLowerCase();return e?e.includes("://")?a(e):e.replace(/:\d+$/,""):""}return R()}function x(t,e={}){if(t==="github.com")return"github";if(t==="gitlab.com")return"gitlab";let o=h(e);return o&&t===o?"gitlab":null}function d(t={},e={}){let o=t&&(t.cloneUrl||t.url)||"",n=a(o);if(!n)return null;let s=t.provider==="github"||t.provider==="gitlab"?t.provider:null,r=w(t,e),i=x(n,r?{gitlabHost:r}:{});return i?s&&s!==i?null:i:s==="gitlab"?"gitlab":null}function w(t,e={}){let o=h(e);return o||(t&&t.provider==="gitlab"?m(t.cloneUrl||t.url||""):"")}function E(t={},e="",o={}){let n=t&&(t.cloneUrl||t.url)||"";if(!n||!e||!d(t,o))return n;let s=w(t,o);return S(n,e,s?{gitlabHost:s}:{})}function S(t,e,o={}){if(!t||!e)return t;let n=m(t);if(!n)return t;if(n==="github.com")return t.replace(/^https:\/\/(?:[^@/]+@)?github\.com(?=[:/]|$)/i,`https://x-access-token:${e}@github.com`);if(n==="gitlab.com")return t.replace(/^https:\/\/(?:[^@/]+@)?gitlab\.com(?=[:/]|$)/i,`https://oauth2:${e}@gitlab.com`);let s=h(o);if(s&&n===s){let r=s.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),i=new RegExp(`^https:\\/\\/(?:[^@/]+@)?${r}(?=[:/]|$)`,"i");return t.replace(i,`https://oauth2:${e}@${s}`)}return t}var I="/workspace/repos",O=".zibby/repos";function $(){return process.env.REPOS?I:A(process.cwd(),O)}function C(t){return String(t).replace(/\//g,"-")}function N(){let t=process.env.REPOS;if(!t)return[];try{let e=JSON.parse(t);return Array.isArray(e)?e:[]}catch{return[]}}function g(t={}){let e=t.baseDir||$();return N().map((n,s)=>{let r=T(e,C(n.name));return{name:n.name,url:n.cloneUrl||n.url||null,branch:n.branch||null,provider:n.provider||"github",localPath:r,isCheckedOut:_(T(r,".git")),primary:s===0}})}function v(t,e={}){let o=g(e);return o.length===0?null:t?o.find(n=>n.name===t)||null:o[0]}function Q(t,e={}){let o=v(t,e);return o?o.localPath:null}async function X(t,e={}){let{branch:o=null,depth:n=1,baseDir:s=$()}=e,r=v(t,{baseDir:s});if(!r){let c=g({baseDir:s}).map(f=>f.name).join(", ")||"(none)";throw new Error(`No repo "${t||"primary"}" configured for this workflow. Available: ${c}. Configure repos under project integrations, or set the REPOS env var.`)}if(r.isCheckedOut)return r.localPath;if(!r.url)throw new Error(`Repo "${r.name}" has no clone URL configured.`);let i=d(r);if(!i)throw new Error(`Cannot clone ${r.name}: '${a(r.url)||r.url}' is not a recognized VCS host (expected github.com, gitlab.com, or the self-hosted GitLab named by GITLAB_URL/GITLAB_INSTANCE_URL${r.provider?`; the repo declares provider='${r.provider}'`:""}). No token was sent.`);let u=i==="gitlab"?process.env.GITLAB_TOKEN:process.env.GITHUB_TOKEN;if(!u)throw new Error(`${i==="gitlab"?"GITLAB_TOKEN":"GITHUB_TOKEN"} not set \u2014 cannot clone ${r.name}. Connect the integration under project settings.`);_(s)||k(s,{recursive:!0});let p=E(r,u);if(p===r.url)throw new Error(`Cannot clone ${r.name}: could not safely attach credentials to '${r.url}' (an https:// URL on an exact trusted host is required). No token was sent.`);let l=["clone"];n>0&&l.push("--depth",String(n)),(o||r.branch)&&l.push("--branch",o||r.branch),l.push(p,r.localPath);try{y(`git ${l.join(" ")}`,{stdio:"pipe",env:{...process.env,GIT_TERMINAL_PROMPT:"0"}})}catch(c){let f=String(c.message||c).replace(u,"***").replace(p,r.url);throw new Error(`Failed to clone ${r.name}: ${f}`,{cause:c})}return b(y,r.localPath,r.url,u,`ensureRepo:${r.name}`),r.localPath}function tt(t={}){let e=g(t);if(e.length===0)return null;let o=["## Available repositories",""];for(let n of e){let s=n.isCheckedOut?"already checked out at":"will be checked out to",r=n.primary?" (primary)":"";o.push(`- \`${n.name}\`${r} \u2014 ${s} \`${n.localPath}\``)}return o.push(""),o.push(`To materialize a repo: call the \`git_checkout\` skill with the repo name (e.g. \`git_checkout({ url: "${e[0].name}" })\`). In code, \`import { ensureRepo } from "@zibby/core"\` and \`await ensureRepo()\` returns the local path (clones on first call, no-op after).`),o.join(`
1
+ import{execSync as y}from"node:child_process";import{existsSync as _,mkdirSync as x}from"node:fs";import{join as T,resolve as I}from"node:path";function b(t,e,o,n,s="clone"){try{t(`git -C "${e}" remote set-url origin "${o}"`,{stdio:"pipe"})}catch(r){let i=String(r&&r.message||r);n&&(i=i.split(n).join("***")),console.error(`[${s}] WARNING: failed to strip token from .git/config: ${i}`)}}import{existsSync as L,readFileSync as P}from"node:fs";import{homedir as H}from"node:os";import{join as K}from"node:path";var Y=Object.freeze(["github.com","gitlab.com"]);function a(t){try{return new URL(t).hostname.toLowerCase()}catch{return""}}function m(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 R(t=process.env){let e=t&&(t.GITLAB_URL||t.GITLAB_INSTANCE_URL)||"";return a(e)}function h(t={}){if(t.gitlabHost){let e=String(t.gitlabHost).trim().toLowerCase();return e?e.includes("://")?a(e):e.replace(/:\d+$/,""):""}return R()}function A(t,e={}){if(t==="github.com")return"github";if(t==="gitlab.com")return"gitlab";let o=h(e);return o&&t===o?"gitlab":null}function d(t={},e={}){let o=t&&(t.cloneUrl||t.url)||"",n=a(o);if(!n)return null;let s=t.provider==="github"||t.provider==="gitlab"?t.provider:null,r=w(t,e),i=A(n,r?{gitlabHost:r}:{});return i?s&&s!==i?null:i:s==="gitlab"?"gitlab":null}function w(t,e={}){let o=h(e);return o||(t&&t.provider==="gitlab"?m(t.cloneUrl||t.url||""):"")}function E(t={},e="",o={}){let n=t&&(t.cloneUrl||t.url)||"";if(!n||!e||!d(t,o))return n;let s=w(t,o);return k(n,e,s?{gitlabHost:s}:{})}function k(t,e,o={}){if(!t||!e)return t;let n=m(t);if(!n)return t;if(n==="github.com")return t.replace(/^https:\/\/(?:[^@/]+@)?github\.com(?=[:/]|$)/i,`https://x-access-token:${e}@github.com`);if(n==="gitlab.com")return t.replace(/^https:\/\/(?:[^@/]+@)?gitlab\.com(?=[:/]|$)/i,`https://oauth2:${e}@gitlab.com`);let s=h(o);if(s&&n===s){let r=s.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),i=new RegExp(`^https:\\/\\/(?:[^@/]+@)?${r}(?=[:/]|$)`,"i");return t.replace(i,`https://oauth2:${e}@${s}`)}return t}var S="/workspace/repos",O=".zibby/repos";function $(){return process.env.REPOS?S:I(process.cwd(),O)}function C(t){return String(t).replace(/\//g,"-")}function N(){let t=process.env.REPOS;if(!t)return[];try{let e=JSON.parse(t);return Array.isArray(e)?e:[]}catch{return[]}}function g(t={}){let e=t.baseDir||$();return N().map((n,s)=>{let r=T(e,C(n.name));return{name:n.name,url:n.cloneUrl||n.url||null,branch:n.branch||null,provider:n.provider||"github",localPath:r,isCheckedOut:_(T(r,".git")),primary:s===0}})}function v(t,e={}){let o=g(e);return o.length===0?null:t?o.find(n=>n.name===t)||null:o[0]}function Q(t,e={}){let o=v(t,e);return o?o.localPath:null}async function X(t,e={}){let{branch:o=null,depth:n=1,baseDir:s=$()}=e,r=v(t,{baseDir:s});if(!r){let c=g({baseDir:s}).map(f=>f.name).join(", ")||"(none)";throw new Error(`No repo "${t||"primary"}" configured for this workflow. Available: ${c}. Configure repos under project integrations, or set the REPOS env var.`)}if(r.isCheckedOut)return r.localPath;if(!r.url)throw new Error(`Repo "${r.name}" has no clone URL configured.`);let i=d(r);if(!i)throw new Error(`Cannot clone ${r.name}: '${a(r.url)||r.url}' is not a recognized VCS host (expected github.com, gitlab.com, or the self-hosted GitLab named by GITLAB_URL/GITLAB_INSTANCE_URL${r.provider?`; the repo declares provider='${r.provider}'`:""}). No token was sent.`);let u=i==="gitlab"?process.env.GITLAB_TOKEN:process.env.GITHUB_TOKEN;if(!u)throw new Error(`${i==="gitlab"?"GITLAB_TOKEN":"GITHUB_TOKEN"} not set \u2014 cannot clone ${r.name}. Connect the integration under project settings.`);_(s)||x(s,{recursive:!0});let p=E(r,u);if(p===r.url)throw new Error(`Cannot clone ${r.name}: could not safely attach credentials to '${r.url}' (an https:// URL on an exact trusted host is required). No token was sent.`);let l=["clone"];n>0&&l.push("--depth",String(n)),(o||r.branch)&&l.push("--branch",o||r.branch),l.push(p,r.localPath);try{y(`git ${l.join(" ")}`,{stdio:"pipe",env:{...process.env,GIT_TERMINAL_PROMPT:"0"}})}catch(c){let f=String(c.message||c).replace(u,"***").replace(p,r.url);throw new Error(`Failed to clone ${r.name}: ${f}`,{cause:c})}return b(y,r.localPath,r.url,u,`ensureRepo:${r.name}`),r.localPath}function tt(t={}){let e=g(t);if(e.length===0)return null;let o=["## Available repositories",""];for(let n of e){let s=n.isCheckedOut?"already checked out at":"will be checked out to",r=n.primary?" (primary)":"";o.push(`- \`${n.name}\`${r} \u2014 ${s} \`${n.localPath}\``)}return o.push(""),o.push(`To materialize a repo: call the \`git_checkout\` skill with the repo name (e.g. \`git_checkout({ url: "${e[0].name}" })\`). In code, \`import { ensureRepo } from "@zibby/core"\` and \`await ensureRepo()\` returns the local path (clones on first call, no-op after).`),o.join(`
2
2
  `)}export{tt as buildRepoContextHint,X as ensureRepo,v as getRepo,g as listRepos,Q as repoPath};
@@ -1 +1 @@
1
- import{existsSync as v,readFileSync as x}from"node:fs";import{homedir as I}from"node:os";import{join as k}from"node:path";var w=new Map,$={github:"GITHUB_TOKEN",gitlab:"GITLAB_TOKEN",sentry:"SENTRY_AUTH_TOKEN",slack:"SLACK_BOT_TOKEN"};function O(){let t=process.env.ZIBBY_SELF_HOST;return t!=null&&t!==""&&t!=="0"&&t.toLowerCase()!=="false"}function S(){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=k(I(),".zibby","config.json");return v(t)&&JSON.parse(x(t,"utf-8")).sessionToken||null}catch{return null}}function A(){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 m(t){if(O()){let c=$[t];if(c&&process.env[c])return{token:process.env[c]}}let e=Date.now(),n=w.get(t);if(n&&n.expiresAt>e)return n.data;let r=S();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=`${A()}/integrations/token/${t}`,i=await fetch(s,{method:"GET",headers:{Authorization:`Bearer ${r}`}});if(!i.ok){let c=await i.text().catch(()=>"");if(i.status===404){let u="";try{u=String(JSON.parse(c)?.error||"").trim()}catch{}throw new Error(u||`${t} is not connected. Connect it at https://studio.zibby.dev/integrations`)}throw i.status===401||i.status===403?new Error("Session expired. Run `zibby login` to re-authenticate."):new Error(`Failed to resolve ${t} token (${i.status}): ${c}`)}let o=await i.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 f=((o.expiresInSec||3e3)-120)*1e3;return w.set(t,{data:o,expiresAt:e+f}),o}var z=Object.freeze(["github.com","gitlab.com"]);function b(t){try{return new URL(t).hostname.toLowerCase()}catch{return""}}function g(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 C(t=process.env){let e=t&&(t.GITLAB_URL||t.GITLAB_INSTANCE_URL)||"";return b(e)}function p(t={}){if(t.gitlabHost){let e=String(t.gitlabHost).trim().toLowerCase();return e?e.includes("://")?b(e):e.replace(/:\d+$/,""):""}return C()}function B(t,e={}){let n=g(t);if(!n)return!1;if(n==="github.com"||n==="gitlab.com")return!0;let r=p(e);return!!(r&&n===r)}function E(t,e={}){if(t==="github.com")return"github";if(t==="gitlab.com")return"gitlab";let n=p(e);return n&&t===n?"gitlab":null}function R(t={},e={}){let n=t&&(t.cloneUrl||t.url)||"",r=b(n);if(!r)return null;let s=t.provider==="github"||t.provider==="gitlab"?t.provider:null,i=T(t,e),o=E(r,i?{gitlabHost:i}:{});return o?s&&s!==o?null:o:s==="gitlab"?"gitlab":null}function T(t,e={}){let n=p(e);return n||(t&&t.provider==="gitlab"?g(t.cloneUrl||t.url||""):"")}function G(t={},e="",n={}){let r=t&&(t.cloneUrl||t.url)||"";if(!r||!e||!R(t,n))return r;let s=T(t,n);return _(r,e,s?{gitlabHost:s}:{})}function _(t,e,n={}){if(!t||!e)return t;let r=g(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 s=p(n);if(s&&r===s){let i=s.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),o=new RegExp(`^https:\\/\\/(?:[^@/]+@)?${i}(?=[:/]|$)`,"i");return t.replace(o,`https://oauth2:${e}@${s}`)}return t}function N(t){return t&&String(t).replace(/^(https:\/\/)[^@/]+@/i,"$1")}function H(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 F(t,e,n){try{await t("git",["remote","set-url","origin",N(n)],e)}catch(r){console.warn(`\u26A0\uFE0F could not scrub token from origin remote (continuing): ${r?.message||r}`)}}async function Y({run:t,repoPath:e,repoUrl:n,branch:r,token:s,resolveToken:i=m,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 f=p({gitlabHost:o}),c=g(n),u=B(n,{gitlabHost:f}),l=s||"";if(!l&&u&&typeof i=="function"){let h=E(c,{gitlabHost:f});if(h)try{l=(await i(h))?.token||""}catch{}}else!l&&!u&&console.warn(`\u26A0\uFE0F push target host '${c||"(unparseable)"}' is not a trusted VCS host \u2014 refusing to mint a token`);let d=l&&u,y=d?_(n,l,{gitlabHost:f}):"origin",a=await t("git",["push",y,r],e);if(!a||a.code!==0){let h=H(a&&a.stderr||"",l);throw new Error(`git push failed (exit ${a?a.code:"?"}): ${String(h).slice(-500)}`)}return{code:a.code,stdout:a.stdout,stderr:a.stderr,pushedAuthed:!!d,target:d?"<authed>":"origin"}}export{z as TRUSTED_VCS_HOSTS,_ as authedUrl,G as authedUrlForRepo,b as hostnameOf,B as isTrustedVcsHost,E as providerForHost,R as providerForRepo,H as redactGitSecrets,g as safeVcsHostname,F as scrubRemoteToTokenless,Y as securePush,C as selfHostGitlabHost,N as tokenlessUrl};
1
+ import{existsSync as v,readFileSync as x}from"node:fs";import{homedir as I}from"node:os";import{join as k}from"node:path";var w=new Map,O={github:"GITHUB_TOKEN",gitlab:"GITLAB_TOKEN",sentry:"SENTRY_AUTH_TOKEN",slack:"SLACK_BOT_TOKEN"};function $(){let t=process.env.ZIBBY_SELF_HOST;return t!=null&&t!==""&&t!=="0"&&t.toLowerCase()!=="false"}function A(){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=k(I(),".zibby","config.json");return v(t)&&JSON.parse(x(t,"utf-8")).sessionToken||null}catch{return null}}function S(){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 m(t){if($()){let c=O[t];if(c&&process.env[c])return{token:process.env[c]}}let e=Date.now(),n=w.get(t);if(n&&n.expiresAt>e)return n.data;let r=A();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=`${S()}/integrations/token/${t}`,i=await fetch(s,{method:"GET",headers:{Authorization:`Bearer ${r}`}});if(!i.ok){let c=await i.text().catch(()=>"");if(i.status===404){let u="";try{u=String(JSON.parse(c)?.error||"").trim()}catch{}throw new Error(u||`${t} is not connected. Connect it at https://studio.zibby.dev/integrations`)}throw i.status===401||i.status===403?new Error("Session expired. Run `zibby login` to re-authenticate."):new Error(`Failed to resolve ${t} token (${i.status}): ${c}`)}let o=await i.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 f=((o.expiresInSec||3e3)-120)*1e3;return w.set(t,{data:o,expiresAt:e+f}),o}var z=Object.freeze(["github.com","gitlab.com"]);function b(t){try{return new URL(t).hostname.toLowerCase()}catch{return""}}function g(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 C(t=process.env){let e=t&&(t.GITLAB_URL||t.GITLAB_INSTANCE_URL)||"";return b(e)}function h(t={}){if(t.gitlabHost){let e=String(t.gitlabHost).trim().toLowerCase();return e?e.includes("://")?b(e):e.replace(/:\d+$/,""):""}return C()}function B(t,e={}){let n=g(t);if(!n)return!1;if(n==="github.com"||n==="gitlab.com")return!0;let r=h(e);return!!(r&&n===r)}function E(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 R(t={},e={}){let n=t&&(t.cloneUrl||t.url)||"",r=b(n);if(!r)return null;let s=t.provider==="github"||t.provider==="gitlab"?t.provider:null,i=T(t,e),o=E(r,i?{gitlabHost:i}:{});return o?s&&s!==o?null:o:s==="gitlab"?"gitlab":null}function T(t,e={}){let n=h(e);return n||(t&&t.provider==="gitlab"?g(t.cloneUrl||t.url||""):"")}function G(t={},e="",n={}){let r=t&&(t.cloneUrl||t.url)||"";if(!r||!e||!R(t,n))return r;let s=T(t,n);return _(r,e,s?{gitlabHost:s}:{})}function _(t,e,n={}){if(!t||!e)return t;let r=g(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 s=h(n);if(s&&r===s){let i=s.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),o=new RegExp(`^https:\\/\\/(?:[^@/]+@)?${i}(?=[:/]|$)`,"i");return t.replace(o,`https://oauth2:${e}@${s}`)}return t}function U(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 F(t,e,n){try{await t("git",["remote","set-url","origin",U(n)],e)}catch(r){console.warn(`\u26A0\uFE0F could not scrub token from origin remote (continuing): ${r?.message||r}`)}}async function Y({run:t,repoPath:e,repoUrl:n,branch:r,token:s,resolveToken:i=m,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 f=h({gitlabHost:o}),c=g(n),u=B(n,{gitlabHost:f}),l=s||"";if(!l&&u&&typeof i=="function"){let p=E(c,{gitlabHost:f});if(p)try{l=(await i(p))?.token||""}catch{}}else!l&&!u&&console.warn(`\u26A0\uFE0F push target host '${c||"(unparseable)"}' is not a trusted VCS host \u2014 refusing to mint a token`);let d=l&&u,y=d?_(n,l,{gitlabHost:f}):"origin",a=await t("git",["push",y,r],e);if(!a||a.code!==0){let p=N(a&&a.stderr||"",l);throw new Error(`git push failed (exit ${a?a.code:"?"}): ${String(p).slice(-500)}`)}return{code:a.code,stdout:a.stdout,stderr:a.stderr,pushedAuthed:!!d,target:d?"<authed>":"origin"}}export{z as TRUSTED_VCS_HOSTS,_ as authedUrl,G as authedUrlForRepo,b as hostnameOf,B as isTrustedVcsHost,E as providerForHost,R as providerForRepo,N as redactGitSecrets,g as safeVcsHostname,F as scrubRemoteToTokenless,Y as securePush,C as selfHostGitlabHost,U as tokenlessUrl};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zibby/core",
3
- "version": "2.0.3",
3
+ "version": "2.0.4",
4
4
  "description": "Core test automation engine with multi-agent and multi-MCP support",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -69,9 +69,9 @@
69
69
  "@modelcontextprotocol/sdk": "^1.29.0",
70
70
  "@openai/codex-sdk": "^0.143.0",
71
71
  "@playwright/mcp": "^0.0.70",
72
- "@zibby/agent-workflow": "2.0.3",
73
- "@zibby/mcp-browser": "2.0.3",
74
- "@zibby/skill-ids": "2.0.3",
72
+ "@zibby/agent-workflow": "2.0.4",
73
+ "@zibby/mcp-browser": "2.0.4",
74
+ "@zibby/skill-ids": "2.0.4",
75
75
  "acorn": "^8.15.0",
76
76
  "acorn-walk": "^8.3.5",
77
77
  "axios": "^1.15.0",