@zibby/core 0.5.3 → 0.5.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 f,readFileSync as u}from"node:fs";import{homedir as l}from"node:os";import{join as h}from"node:path";var o=new Map;function w(){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=h(l(),".zibby","config.json");return f(e)&&JSON.parse(u(e,"utf-8")).sessionToken||null}catch{return null}}function k(){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://account-api-prod.zibby.app"}async function E(e){let s=Date.now(),r=o.get(e);if(r&&r.expiresAt>s)return r.data;let i=w();if(!i)throw new Error("No session token. Run `zibby login` first.");let c=`${k()}/integrations/token/${e}`,n=await fetch(c,{method:"GET",headers:{Authorization:`Bearer ${i}`}});if(!n.ok){let p=await n.text().catch(()=>"");throw n.status===404?new Error(`${e} is not connected. Connect it at https://studio.zibby.dev/integrations`):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}): ${p}`)}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 a=((t.expiresInSec||3e3)-120)*1e3;return o.set(e,{data:t,expiresAt:s+a}),t}function g(e){e?o.delete(e):o.clear()}export{g as clearTokenCache,E as resolveIntegrationToken};
1
+ import{existsSync as f,readFileSync as u}from"node:fs";import{homedir as l}from"node:os";import{join as h}from"node:path";var o=new Map;function w(){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=h(l(),".zibby","config.json");return f(e)&&JSON.parse(u(e,"utf-8")).sessionToken||null}catch{return null}}function k(){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 E(e){let s=Date.now(),r=o.get(e);if(r&&r.expiresAt>s)return r.data;let i=w();if(!i)throw new Error("No session token. Run `zibby login` first.");let c=`${k()}/integrations/token/${e}`,n=await fetch(c,{method:"GET",headers:{Authorization:`Bearer ${i}`}});if(!n.ok){let p=await n.text().catch(()=>"");throw n.status===404?new Error(`${e} is not connected. Connect it at https://studio.zibby.dev/integrations`):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}): ${p}`)}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 a=((t.expiresInSec||3e3)-120)*1e3;return o.set(e,{data:t,expiresAt:s+a}),t}function g(e){e?o.delete(e):o.clear()}export{g as clearTokenCache,E as resolveIntegrationToken};
package/dist/index.js CHANGED
@@ -144,7 +144,7 @@ ${h.join(`
144
144
 
145
145
  ${g}
146
146
  `),p.debug(`Prompt length: ${f.length} chars`),process.env.STAGE!=="prod"&&p.debug(`Full prompt:
147
- ${f}`),r.invoke(f,m)}import{SKILLS as pp}from"@zibby/agent-workflow";import{registerSkill as dp,getSkill as mp,hasSkill as gp,getAllSkills as hp,listSkillIds as yp}from"@zibby/agent-workflow";var vo={READ_FILE:"read_file",WRITE_FILE:"write_file",LIST_DIRECTORY:"list_directory",RUN_COMMAND:"run_command",OPEN_URL:"open_url",WAIT:"wait"},Ao={LIST_PROJECTS:"jira_list_projects",SEARCH:"jira_search",GET_ISSUE:"jira_get_issue",CREATE_ISSUE:"jira_create_issue",LIST_SPRINTS:"jira_list_sprints",GET_SPRINT_ISSUES:"jira_get_sprint_issues",GET_COMMENTS:"jira_get_comments",ADD_COMMENT:"jira_add_comment",EDIT_ISSUE:"jira_edit_issue",TRANSITION_ISSUE:"jira_transition_issue"},$o={GET_USER:"github_get_user",LIST_ORGS:"github_list_orgs",LIST_REPOS:"github_list_repos",CLONE:"github_clone",SEARCH_REPOS:"github_search_repos",SEARCH_ISSUES:"github_search_issues",SEARCH_CODE:"github_search_code",GET_PR:"github_get_pr",GET_PR_DIFF:"github_get_pr_diff",LIST_PR_FILES:"github_list_pr_files",LIST_PR_COMMENTS:"github_list_pr_comments",LIST_COMMITS:"github_list_commits",GET_COMMIT:"github_get_commit",GET_FILE:"github_get_file",CREATE_ISSUE:"github_create_issue"},Oo={LIST_CHANNELS:"slack_list_channels",POST_MESSAGE:"slack_post_message",REPLY_TO_THREAD:"slack_reply_to_thread",ADD_REACTION:"slack_add_reaction",GET_CHANNEL_HISTORY:"slack_get_channel_history",GET_THREAD_REPLIES:"slack_get_thread_replies",GET_USERS:"slack_get_users",GET_USER_PROFILE:"slack_get_user_profile"},Io={GENERATE:"run_generate",TEST:"run_test",STATUS:"run_status",CANCEL:"run_cancel",WAIT:"run_wait",ARTIFACTS:"run_artifacts",LIST_SPECS:"list_specs"},Co={GET_TEST_HISTORY:"memory_get_test_history",GET_SELECTORS:"memory_get_selectors",GET_PAGE_MODEL:"memory_get_page_model",GET_NAVIGATION:"memory_get_navigation",SAVE_INSIGHT:"memory_save_insight"},Po={STORE:"memory_store",RECALL:"memory_recall",BRIEF:"memory_brief",END_SESSION:"memory_end_session",TASK_LOG:"task_log",TASK_HISTORY:"task_history"},ko={INSTALL:"install_skill",UNINSTALL:"uninstall_skill",LIST_AVAILABLE:"list_available_skills"},xl={...vo,...Ao,...$o,...Oo,...Io,...Co,...Po,...ko};import{existsSync as No,readFileSync as Ro}from"node:fs";import{homedir as Lo}from"node:os";import{join as Mo}from"node:path";var et=new Map;function Uo(){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 i=Mo(Lo(),".zibby","config.json");return No(i)&&JSON.parse(Ro(i,"utf-8")).sessionToken||null}catch{return null}}function Do(){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://account-api-prod.zibby.app"}async function Fo(i){let e=Date.now(),t=et.get(i);if(t&&t.expiresAt>e)return t.data;let r=Uo();if(!r)throw new Error("No session token. Run `zibby login` first.");let n=`${Do()}/integrations/token/${i}`,o=await fetch(n,{method:"GET",headers:{Authorization:`Bearer ${r}`}});if(!o.ok){let a=await o.text().catch(()=>"");throw o.status===404?new Error(`${i} is not connected. Connect it at https://studio.zibby.dev/integrations`):o.status===401||o.status===403?new Error("Session expired. Run `zibby login` to re-authenticate."):new Error(`Failed to resolve ${i} token (${o.status}): ${a}`)}let s=await o.json();if(!s||typeof s!="object")throw new Error(`Invalid response from ${i} token endpoint: expected object, got ${typeof s}`);if(i==="jira"){if(!s.token||typeof s.token!="string")throw new Error(`Invalid jira token response: token is ${typeof s.token}, expected string`);if(!s.cloudId)throw new Error("Invalid jira token response: missing cloudId")}else if(i==="github"&&(!s.token||typeof s.token!="string"))throw new Error(`Invalid github token response: token is ${typeof s.token}, expected string`);let c=((s.expiresInSec||3e3)-120)*1e3;return et.set(i,{data:s,expiresAt:e+c}),s}function jo(i){i?et.delete(i):et.clear()}import{readdir as Bo,access as gr,copyFile as Go,constants as hr}from"fs/promises";import{join as tt,relative as Ko}from"node:path";async function Jo(i={}){let{testResultsDir:e="test-results",testsDir:t="tests",projectRoot:r=process.cwd(),verbose:n=!0}=i;n&&console.log(`\u{1F3A5} Organizing test videos...
147
+ ${f}`),r.invoke(f,m)}import{SKILLS as pp}from"@zibby/agent-workflow";import{registerSkill as dp,getSkill as mp,hasSkill as gp,getAllSkills as hp,listSkillIds as yp}from"@zibby/agent-workflow";var vo={READ_FILE:"read_file",WRITE_FILE:"write_file",LIST_DIRECTORY:"list_directory",RUN_COMMAND:"run_command",OPEN_URL:"open_url",WAIT:"wait"},Ao={LIST_PROJECTS:"jira_list_projects",SEARCH:"jira_search",GET_ISSUE:"jira_get_issue",CREATE_ISSUE:"jira_create_issue",LIST_SPRINTS:"jira_list_sprints",GET_SPRINT_ISSUES:"jira_get_sprint_issues",GET_COMMENTS:"jira_get_comments",ADD_COMMENT:"jira_add_comment",EDIT_ISSUE:"jira_edit_issue",TRANSITION_ISSUE:"jira_transition_issue"},$o={GET_USER:"github_get_user",LIST_ORGS:"github_list_orgs",LIST_REPOS:"github_list_repos",CLONE:"github_clone",SEARCH_REPOS:"github_search_repos",SEARCH_ISSUES:"github_search_issues",SEARCH_CODE:"github_search_code",GET_PR:"github_get_pr",GET_PR_DIFF:"github_get_pr_diff",LIST_PR_FILES:"github_list_pr_files",LIST_PR_COMMENTS:"github_list_pr_comments",LIST_COMMITS:"github_list_commits",GET_COMMIT:"github_get_commit",GET_FILE:"github_get_file",CREATE_ISSUE:"github_create_issue"},Oo={LIST_CHANNELS:"slack_list_channels",POST_MESSAGE:"slack_post_message",REPLY_TO_THREAD:"slack_reply_to_thread",ADD_REACTION:"slack_add_reaction",GET_CHANNEL_HISTORY:"slack_get_channel_history",GET_THREAD_REPLIES:"slack_get_thread_replies",GET_USERS:"slack_get_users",GET_USER_PROFILE:"slack_get_user_profile"},Io={GENERATE:"run_generate",TEST:"run_test",STATUS:"run_status",CANCEL:"run_cancel",WAIT:"run_wait",ARTIFACTS:"run_artifacts",LIST_SPECS:"list_specs"},Co={GET_TEST_HISTORY:"memory_get_test_history",GET_SELECTORS:"memory_get_selectors",GET_PAGE_MODEL:"memory_get_page_model",GET_NAVIGATION:"memory_get_navigation",SAVE_INSIGHT:"memory_save_insight"},Po={STORE:"memory_store",RECALL:"memory_recall",BRIEF:"memory_brief",END_SESSION:"memory_end_session",TASK_LOG:"task_log",TASK_HISTORY:"task_history"},ko={INSTALL:"install_skill",UNINSTALL:"uninstall_skill",LIST_AVAILABLE:"list_available_skills"},xl={...vo,...Ao,...$o,...Oo,...Io,...Co,...Po,...ko};import{existsSync as No,readFileSync as Ro}from"node:fs";import{homedir as Lo}from"node:os";import{join as Mo}from"node:path";var et=new Map;function Uo(){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 i=Mo(Lo(),".zibby","config.json");return No(i)&&JSON.parse(Ro(i,"utf-8")).sessionToken||null}catch{return null}}function Do(){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 Fo(i){let e=Date.now(),t=et.get(i);if(t&&t.expiresAt>e)return t.data;let r=Uo();if(!r)throw new Error("No session token. Run `zibby login` first.");let n=`${Do()}/integrations/token/${i}`,o=await fetch(n,{method:"GET",headers:{Authorization:`Bearer ${r}`}});if(!o.ok){let a=await o.text().catch(()=>"");throw o.status===404?new Error(`${i} is not connected. Connect it at https://studio.zibby.dev/integrations`):o.status===401||o.status===403?new Error("Session expired. Run `zibby login` to re-authenticate."):new Error(`Failed to resolve ${i} token (${o.status}): ${a}`)}let s=await o.json();if(!s||typeof s!="object")throw new Error(`Invalid response from ${i} token endpoint: expected object, got ${typeof s}`);if(i==="jira"){if(!s.token||typeof s.token!="string")throw new Error(`Invalid jira token response: token is ${typeof s.token}, expected string`);if(!s.cloudId)throw new Error("Invalid jira token response: missing cloudId")}else if(i==="github"&&(!s.token||typeof s.token!="string"))throw new Error(`Invalid github token response: token is ${typeof s.token}, expected string`);let c=((s.expiresInSec||3e3)-120)*1e3;return et.set(i,{data:s,expiresAt:e+c}),s}function jo(i){i?et.delete(i):et.clear()}import{readdir as Bo,access as gr,copyFile as Go,constants as hr}from"fs/promises";import{join as tt,relative as Ko}from"node:path";async function Jo(i={}){let{testResultsDir:e="test-results",testsDir:t="tests",projectRoot:r=process.cwd(),verbose:n=!0}=i;n&&console.log(`\u{1F3A5} Organizing test videos...
148
148
  `);let o=tt(r,e),s=tt(r,t);try{let c=await Bo(o),a=0;for(let l of c){if(l.startsWith("."))continue;let u=tt(o,l,"video.webm");try{await gr(u,hr.F_OK)}catch{continue}let m=l.replace(/-chromium$/,"").replace(/-firefox$/,"").replace(/-webkit$/,""),d=await zo(s,m);if(d){let f=d.replace(/\.spec\.(js|ts)$/,".spec.webm");await Go(u,f),n&&console.log(`\u2705 ${Ko(r,f)}`),a++}else n&&console.log(`\u26A0\uFE0F Could not find test file for: ${l}`)}return n&&(console.log(`
149
149
  \u{1F3AC} Organized ${a} video(s)`),console.log(`\u{1F4C2} Videos are now next to their test files in ${t}/`)),{movedCount:a,success:!0}}catch(c){return n&&console.error("\u274C Error organizing videos:",c.message),{movedCount:0,success:!1,error:c.message}}}async function zo(i,e){let t=e.split("-");for(let r=t.length;r>0;r--){let o=t.slice(0,r).join("/");for(let s of["js","ts"]){let c=tt(i,`${o}.spec.${s}`);try{return await gr(c,hr.F_OK),c}catch{}}}return null}var Ue=class{constructor(e,t={}){this.apiKey=e,this.baseUrl=t.baseUrl||process.env.ZIBBY_API_URL||"https://api-prod.zibby.app",this.enabled=!!e}isEnabled(){return this.enabled}};function yr(){let i=process.env.ZIBBY_API_KEY;return new Ue(i)}import{execSync as Yo}from"node:child_process";import{existsSync as Ho,mkdirSync as Wo}from"node:fs";import{join as Zo}from"node:path";async function Xo(i={}){let{baseDir:e="/workspace/repos",repos:t=null,depth:r=1,branch:n=null}=i,o=process.env.REPOS;if(!o)throw new Error("REPOS environment variable not set. Are you running in a Zibby workflow container?");let s;try{s=JSON.parse(o)}catch(l){throw new Error(`Failed to parse REPOS env var: ${l.message}`,{cause:l})}if(!Array.isArray(s)||s.length===0)throw new Error("No repositories configured for this project");let c=t?s.filter(l=>t.includes(l.name)):s;if(c.length===0)throw new Error(`No matching repositories found. Available: ${s.map(l=>l.name).join(", ")}`);Ho(e)||Wo(e,{recursive:!0});let a={};return await Promise.all(c.map(async l=>{let u=l.provider||"github",m=u==="gitlab"?process.env.GITLAB_TOKEN:process.env.GITHUB_TOKEN;if(!m){console.error(`${u.toUpperCase()}_TOKEN not set, skipping ${l.name}`),a[l.name]=null;return}let d=l.name.replace(/\//g,"-"),f=Zo(e,d),g=l.cloneUrl||l.url;if(!g){console.error(`Repository "${l.name}" has no clone URL`),a[l.name]=null;return}let y;u==="gitlab"?y=g.replace(/^https:\/\//,`https://oauth2:${m}@`):y=g.replace(/^https:\/\//,`https://x-access-token:${m}@`);let h=["clone"];r>0&&h.push("--depth",r.toString()),n&&h.push("--branch",n),h.push(y,f);let S=`git ${h.join(" ")}`;console.log(`Cloning ${l.name} (${u}) to ${f}...`);try{Yo(S,{stdio:"pipe",env:{...process.env,GIT_TERMINAL_PROMPT:"0"}}),console.log(`Repository ${l.name} cloned successfully`),a[l.name]=f}catch(w){let T=w.message.replace(m,"***").replace(y,g);console.error(`Failed to clone ${l.name}: ${T}`),a[l.name]=null}})),a}var Sr=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/i;function qo(i){return typeof i=="string"&&Sr.test(i)}var br=qo;function Vo(i){if(!br(i))throw TypeError("Invalid UUID");let e;return Uint8Array.of((e=parseInt(i.slice(0,8),16))>>>24,e>>>16&255,e>>>8&255,e&255,(e=parseInt(i.slice(9,13),16))>>>8,e&255,(e=parseInt(i.slice(14,18),16))>>>8,e&255,(e=parseInt(i.slice(19,23),16))>>>8,e&255,(e=parseInt(i.slice(24,36),16))/1099511627776&255,e/4294967296&255,e>>>24&255,e>>>16&255,e>>>8&255,e&255)}var _t=Vo;var K=[];for(let i=0;i<256;++i)K.push((i+256).toString(16).slice(1));function wr(i,e=0){return(K[i[e+0]]+K[i[e+1]]+K[i[e+2]]+K[i[e+3]]+"-"+K[i[e+4]]+K[i[e+5]]+"-"+K[i[e+6]]+K[i[e+7]]+"-"+K[i[e+8]]+K[i[e+9]]+"-"+K[i[e+10]]+K[i[e+11]]+K[i[e+12]]+K[i[e+13]]+K[i[e+14]]+K[i[e+15]]).toLowerCase()}function Qo(i){i=unescape(encodeURIComponent(i));let e=new Uint8Array(i.length);for(let t=0;t<i.length;++t)e[t]=i.charCodeAt(t);return e}var _r="6ba7b810-9dad-11d1-80b4-00c04fd430c8",xr="6ba7b811-9dad-11d1-80b4-00c04fd430c8";function xt(i,e,t,r,n,o){let s=typeof t=="string"?Qo(t):t,c=typeof r=="string"?_t(r):r;if(typeof r=="string"&&(r=_t(r)),r?.length!==16)throw TypeError("Namespace must be array-like (16 iterable integer values, 0-255)");let a=new Uint8Array(16+s.length);if(a.set(c),a.set(s,c.length),a=e(a),a[6]=a[6]&15|i,a[8]=a[8]&63|128,n){if(o=o||0,o<0||o+16>n.length)throw new RangeError(`UUID byte range ${o}:${o+15} is out of buffer bounds`);for(let l=0;l<16;++l)n[o+l]=a[l];return n}return wr(a)}import{createHash as es}from"crypto";function ts(i){return Array.isArray(i)?i=Buffer.from(i):typeof i=="string"&&(i=Buffer.from(i,"utf8")),es("sha1").update(i).digest()}var Er=ts;function Et(i,e,t,r){return xt(80,Er,i,e,t,r)}Et.DNS=_r;Et.URL=xr;var Tt=Et;var Tr="@zibby/core ZibbySessionStore/1",De=class{constructor({apiUrl:e,apiKey:t,workflowUuid:r,fetchImpl:n=globalThis.fetch}){if(!e)throw new Error("ZibbySessionStore: apiUrl is required");if(!t)throw new Error("ZibbySessionStore: apiKey is required");if(!r)throw new Error("ZibbySessionStore: workflowUuid is required");this._apiUrl=String(e).replace(/\/+$/,""),this._apiKey=t,this._workflowUuid=r,this._fetch=n}async append(e,t){if(!Array.isArray(t)||t.length===0)return;let r=`${this._apiUrl}/workflows/${encodeURIComponent(this._workflowUuid)}/sessions/${encodeURIComponent(e.sessionId)}/append`,n=await this._fetch(r,{method:"POST",headers:{Authorization:`Bearer ${this._apiKey}`,"Content-Type":"application/json","User-Agent":Tr},body:JSON.stringify({entries:t})});if(!n.ok)throw new Error(`ZibbySessionStore.append HTTP ${n.status}`)}async load(e){let t=`${this._apiUrl}/workflows/${encodeURIComponent(this._workflowUuid)}/sessions/${encodeURIComponent(e.sessionId)}`,r;try{r=await this._fetch(t,{method:"GET",headers:{Authorization:`Bearer ${this._apiKey}`,"User-Agent":Tr}})}catch{return null}if(r.status===404||!r.ok)return null;let n;try{n=await r.json()}catch{return null}let o=Array.isArray(n?.entries)?n.entries:null;return o&&o.length>0?o:null}};var rs="6ba7b810-9dad-11d1-80b4-00c04fd430c8",vr=new Set;function ns(){return(process.env.PROGRESS_API_URL||process.env.ZIBBY_API_BASE||"").replace(/\/executions\/?$/,"").replace(/\/+$/,"")}function Ar({namespace:i=rs}={}){return{id:"session",description:"Persist agent conversation state across invocations (Claude-only in v1)",envKeys:[],tools:[],invokeAgentOptions(e,t){let r=e?.conversationId,n=e?.workflowUuid;if(!r||!n)return null;let o=t?.agentType;if(o&&o!=="claude")return vr.has(o)||(console.warn(`[SKILLS.SESSION] agent type '${o}' does not support native sessions \u2014 node running stateless`),vr.add(o)),null;let s=Tt(`${n}:${r}`,i),c=ns(),a=process.env.PROJECT_API_TOKEN||process.env.ZIBBY_USER_TOKEN,l=null;if(c&&a)try{l=new De({apiUrl:c,apiKey:a,workflowUuid:n})}catch(d){console.warn(`[SKILLS.SESSION] failed to build SessionStore: ${d.message}`),l=null}return e.resetConversation?{sessionId:s,resume:s,forkSession:!0,...l&&{sessionStore:l}}:e.hasPriorSession?{resume:s,...l&&{sessionStore:l}}:{sessionId:s,...l&&{sessionStore:l}}}}}import{spawn as $r}from"node:child_process";import{readFileSync as os,writeFileSync as ss,existsSync as rt}from"node:fs";import{homedir as Or}from"node:os";import{join as we}from"node:path";async function is(){let i=we(Or(),".local/share/cursor-agent/versions");if(!rt(i))throw new Error(`cursor-agent not found at ${i}. Please install cursor-agent first.`);return console.log(`\u{1F527} Patching cursor-agent for CI/CD...
150
150
  `),new Promise((e,t)=>{let r=we(__dirname,"../../scripts/patch-cursor-mcp.py");if(!rt(r)){t(new Error("Patch script not found"));return}let n=$r("python3",[r],{stdio:"inherit"});n.on("close",o=>{o===0?e({success:!0}):t(new Error(`Patch failed with code ${o}`))}),n.on("error",o=>{t(o)})})}function as(){let i=we(Or(),".local/share/cursor-agent/versions");if(!rt(i))return{patched:!1,installed:!1};try{let e=Hr("fs").readdirSync(i);if(e.length===0)return{patched:!1,installed:!1};let t=e.sort().reverse()[0],r=we(i,t,"index.js");return rt(r)?{patched:os(r,"utf-8").includes("AUTO-APPROVE MCP TOOLS FOR CI/CD"),installed:!0,path:r}:{patched:!1,installed:!1}}catch(e){return{patched:!1,installed:!1,error:e.message}}}async function ls(i){return console.log(`\u{1F511} Getting MCP approval keys...
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zibby/core",
3
- "version": "0.5.3",
3
+ "version": "0.5.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",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zibby/core",
3
- "version": "0.5.3",
3
+ "version": "0.5.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",