@zibby/core 0.5.4 → 0.5.6

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,9 +1,9 @@
1
- import I from"axios";import{homedir as A}from"node:os";import{join as h}from"node:path";import{existsSync as x,readFileSync as N}from"node:fs";import{toJSONSchema as P}from"zod";import d from"chalk";var i={debug:0,info:1,warn:2,error:3,silent:4},g=class{constructor(){this._level=this._getLogLevel()}_getLogLevel(){if(process.env.ZIBBY_DEBUG==="true")return i.debug;if(process.env.ZIBBY_VERBOSE==="true")return i.info;let o=process.env.LOG_LEVEL?.toLowerCase();return o&&o in i?i[o]:i.info}_shouldLog(o){return i[o]>=this._level}_formatMessage(o,t,f={}){let s=new Date().toISOString(),a=`${this._getPrefix(o)} ${t}`;return Object.keys(f).length>0&&(a+=d.dim(` ${JSON.stringify(f)}`)),a}_getPrefix(o){return{debug:d.gray("[DEBUG]"),info:d.cyan("[INFO]"),warn:d.yellow("[WARN]"),error:d.red("\u274C [ERROR]")}[o]||""}debug(o,t){this._shouldLog("debug")&&console.log(this._formatMessage("debug",o,t))}info(o,t){this._shouldLog("info")&&console.log(this._formatMessage("info",o,t))}warn(o,t){this._shouldLog("warn")&&console.warn(this._formatMessage("warn",o,t))}error(o,t){this._shouldLog("error")&&console.error(this._formatMessage("error",o,t))}setLevel(o){o in i&&(this._level=i[o])}getLevel(){return Object.keys(i).find(o=>i[o]===this._level)}},n=new g;var O={ASSISTANT:"gpt-5.4-nano-2026-03-17",CLAUDE:"claude-sonnet-4-6",CURSOR:"auto",CODEX:"o4-mini",GEMINI:"gemini-2.5-pro",OPENAI_POSTPROCESSING:"gpt-4o-mini"};var m={CURSOR_AGENT_DEFAULT:1200*1e3,OPENAI_REQUEST:18e4};function b(){if(process.env.OPENAI_PROXY_TOKEN)return n.debug("[Auth] Using OPENAI_PROXY_TOKEN (ECS execution)"),process.env.OPENAI_PROXY_TOKEN;if(process.env.ZIBBY_USER_TOKEN)return n.debug("[Auth] Using ZIBBY_USER_TOKEN (CI/CD PAT)"),process.env.ZIBBY_USER_TOKEN;try{let e=h(A(),".zibby","config.json");if(x(e)){let o=JSON.parse(N(e,"utf-8"));if(o.sessionToken)return n.debug("[Auth] Using session token from zibby login"),o.sessionToken}}catch(e){n.debug(`[Auth] Could not read zibby login session: ${e.message}`)}return null}function R(){return process.env.OPENAI_PROXY_URL?process.env.OPENAI_PROXY_URL.replace(/\/v1\/?$/,""):"https://api-prod.zibby.app/openai-proxy"}function c(e){if(!(typeof e!="object"||e===null)){if(Object.keys(e).length===0){e.type="object",e.additionalProperties=!0;return}if(e.type||(e.properties?e.type="object":e.items&&(e.type="array")),e.type==="object")if(e.properties){for(let[o,t]of Object.entries(e.properties))t.type==="object"&&t.additionalProperties&&t.additionalProperties!==!1&&(!t.properties||Object.keys(t.properties).length===0)&&(e.properties[o]={type:["object","null"]});e.additionalProperties=!1,e.required=Object.keys(e.properties),Object.values(e.properties).forEach(c)}else"additionalProperties"in e||(e.additionalProperties=!0);e.type==="array"&&e.items&&c(e.items),e.anyOf&&e.anyOf.forEach(c),e.oneOf&&e.oneOf.forEach(c),e.allOf&&e.allOf.forEach(c)}}async function k(e,o){n.info("\u{1F527} [OpenAI Proxy] Formatting structured output...");let t=b();if(!t)throw new Error("Authentication required for structured output processing.\n Local development: Run `zibby login`\n CI/CD: Set ZIBBY_USER_TOKEN environment variable (Personal Access Token from UI settings)");let f=R();n.info(`\u{1F517} Using OpenAI proxy: ${f}`);let s=P(o),p=s;if(s.$ref&&s.definitions){let r=s.$ref.split("/").pop();p=s.definitions[r]||s,n.debug(`Extracted schema from $ref: ${r}`)}delete p.$schema,c(p);let a=4e5,E=e;e.length>a&&(n.warn(`\u26A0\uFE0F [OpenAI Proxy] Raw text (${e.length} chars) exceeds limit, keeping last ${a} chars`),E=`... [truncated early content] ...
2
- ${e.slice(-a)}`);let _=`Extract and format the following information into structured JSON matching the schema.
1
+ import _ from"axios";import{homedir as h}from"node:os";import{join as S}from"node:path";import{existsSync as P,readFileSync as k}from"node:fs";import{toJSONSchema as A}from"zod";import f from"chalk";var l={debug:0,info:1,warn:2,error:3,silent:4},g=class{constructor(){this._level=this._getLogLevel()}_getLogLevel(){if(process.env.ZIBBY_DEBUG==="true")return l.debug;if(process.env.ZIBBY_VERBOSE==="true")return l.info;let o=process.env.LOG_LEVEL?.toLowerCase();return o&&o in l?l[o]:l.info}_shouldLog(o){return l[o]>=this._level}_formatMessage(o,a,d={}){let r=new Date().toISOString(),s=`${this._getPrefix(o)} ${a}`;return Object.keys(d).length>0&&(s+=f.dim(` ${JSON.stringify(d)}`)),s}_getPrefix(o){return{debug:f.gray("[DEBUG]"),info:f.cyan("[INFO]"),warn:f.yellow("[WARN]"),error:f.red("\u274C [ERROR]")}[o]||""}debug(o,a){this._shouldLog("debug")&&console.log(this._formatMessage("debug",o,a))}info(o,a){this._shouldLog("info")&&console.log(this._formatMessage("info",o,a))}warn(o,a){this._shouldLog("warn")&&console.warn(this._formatMessage("warn",o,a))}error(o,a){this._shouldLog("error")&&console.error(this._formatMessage("error",o,a))}setLevel(o){o in l&&(this._level=l[o])}getLevel(){return Object.keys(l).find(o=>l[o]===this._level)}},i=new g;var x=[{alias:"auto",canonicalId:"claude-sonnet-4-6",vendor:"claude",label:"Claude \xB7 Sonnet 4.6",family:"claude-sonnet-4",pickerVisible:!0,isDefault:!0},{alias:"opus-4.8",canonicalId:"claude-opus-4-8",vendor:"claude",label:"Claude \xB7 Opus 4.8",family:"claude-opus-4",pickerVisible:!0},{alias:"opus-4-8",canonicalId:"claude-opus-4-8",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.8"},{alias:"sonnet-4.8",canonicalId:"claude-sonnet-4-8",vendor:"claude",label:"Claude \xB7 Sonnet 4.8",family:"claude-sonnet-4",pickerVisible:!0},{alias:"sonnet-4-8",canonicalId:"claude-sonnet-4-8",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-7",vendor:"claude",label:"Claude \xB7 Sonnet 4.7",family:"claude-sonnet-4",pickerVisible:!0},{alias:"sonnet-4-7",canonicalId:"claude-sonnet-4-7",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.7"},{alias:"sonnet-4.6",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4",aliasOf:"auto"},{alias:"sonnet-4-6",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4",aliasOf:"auto"},{alias:"opus-4.6",canonicalId:"claude-opus-4-6",vendor:"claude",label:"Claude \xB7 Opus 4.6",family:"claude-opus-4",pickerVisible:!0},{alias:"opus-4-6",canonicalId:"claude-opus-4-6",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.6"},{alias:"sonnet-4.5",canonicalId:"claude-sonnet-4-5-20250929",vendor:"claude",label:"Claude \xB7 Sonnet 4.5",family:"claude-sonnet-4",pickerVisible:!0},{alias:"sonnet-4-5",canonicalId:"claude-sonnet-4-5-20250929",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.5"},{alias:"opus-4.5",canonicalId:"claude-opus-4-5-20251101",vendor:"claude",label:"Claude \xB7 Opus 4.5",family:"claude-opus-4",pickerVisible:!0},{alias:"opus-4-5",canonicalId:"claude-opus-4-5-20251101",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.5"},{alias:"haiku-4.5",canonicalId:"claude-haiku-4-5-20251001",vendor:"claude",label:"Claude \xB7 Haiku 4.5",family:"claude-haiku-4"},{alias:"haiku-4-5",canonicalId:"claude-haiku-4-5-20251001",vendor:"claude",family:"claude-haiku-4",aliasOf:"haiku-4.5"},{alias:"claude-opus-4-8",canonicalId:"claude-opus-4-8",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.8"},{alias:"claude-sonnet-4-8",canonicalId:"claude-sonnet-4-8",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-7",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.7"},{alias:"claude-sonnet-4-6",canonicalId:"claude-sonnet-4-6",vendor:"claude",family:"claude-sonnet-4",aliasOf:"auto"},{alias:"claude-opus-4-6",canonicalId:"claude-opus-4-6",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.6"},{alias:"claude-sonnet-4-5-20250929",canonicalId:"claude-sonnet-4-5-20250929",vendor:"claude",family:"claude-sonnet-4",aliasOf:"sonnet-4.5"},{alias:"claude-opus-4-5-20251101",canonicalId:"claude-opus-4-5-20251101",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.5"},{alias:"claude-haiku-4-5-20251001",canonicalId:"claude-haiku-4-5-20251001",vendor:"claude",family:"claude-haiku-4",aliasOf:"haiku-4.5"},{alias:"claude-opus-4-20250514",canonicalId:"claude-opus-4-20250514",vendor:"claude",family:"claude-opus-4",aliasOf:"opus-4.5"},{alias:"auto",canonicalId:"o4-mini",vendor:"codex",label:"Codex \xB7 o4-mini",family:"o4-mini",isDefault:!0},{alias:"o4-mini",canonicalId:"o4-mini",vendor:"codex",label:"Codex \xB7 o4-mini",family:"o4-mini",pickerVisible:!0},{alias:"o3",canonicalId:"o3",vendor:"codex",family:"o3"},{alias:"o3-mini",canonicalId:"o3-mini",vendor:"codex",family:"o3-mini"},{alias:"codex-mini",canonicalId:"codex-mini-latest",vendor:"codex",family:"codex-mini"},{alias:"gpt-4o",canonicalId:"gpt-4o",vendor:"codex",label:"Codex \xB7 GPT-4o",family:"gpt-4o",pickerVisible:!0},{alias:"gpt-4o-mini",canonicalId:"gpt-4o-mini",vendor:"codex",label:"Codex \xB7 GPT-4o mini",family:"gpt-4o-mini",pickerVisible:!0},{alias:"gpt-5.2-codex",canonicalId:"gpt-5.2-codex",vendor:"codex",label:"Codex \xB7 GPT-5.2",family:"gpt-5",pickerVisible:!0},{alias:"gpt-5.2",canonicalId:"gpt-5.2",vendor:"codex",label:"Codex \xB7 GPT-5.2 base",family:"gpt-5",pickerVisible:!0},{alias:"gpt-5.3",canonicalId:"gpt-5.3",vendor:"codex",label:"Codex \xB7 GPT-5.3",family:"gpt-5",pickerVisible:!0},{alias:"gpt-5.3-codex",canonicalId:"gpt-5.3-codex",vendor:"codex",family:"gpt-5"},{alias:"gpt-5.4",canonicalId:"gpt-5.4",vendor:"codex",label:"Codex \xB7 GPT-5.4",family:"gpt-5",pickerVisible:!0},{alias:"gpt-5.5",canonicalId:"gpt-5.5",vendor:"codex",label:"Codex \xB7 GPT-5.5",family:"gpt-5",pickerVisible:!0},{alias:"auto",canonicalId:"gemini-3-pro",vendor:"gemini",label:"Gemini \xB7 3 Pro",family:"gemini-3",isDefault:!0},{alias:"gemini-3-pro",canonicalId:"gemini-3-pro",vendor:"gemini",label:"Gemini \xB7 3 Pro",family:"gemini-3",pickerVisible:!0},{alias:"gemini-3-flash",canonicalId:"gemini-3-flash",vendor:"gemini",label:"Gemini \xB7 3 Flash",family:"gemini-3",pickerVisible:!0},{alias:"gemini-2.5-pro",canonicalId:"gemini-2.5-pro",vendor:"gemini",label:"Gemini \xB7 2.5 Pro",family:"gemini-2.5",pickerVisible:!0},{alias:"gemini-2.5-flash",canonicalId:"gemini-2.5-flash",vendor:"gemini",label:"Gemini \xB7 2.5 Flash",family:"gemini-2.5",pickerVisible:!0}];function m(e){let o={};for(let a of x)a.vendor===e&&(o[a.alias]=a.canonicalId);return o}var O={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 $=m("claude"),D=m("codex"),w=m("gemini"),b={CURSOR_AGENT_DEFAULT:1200*1e3,OPENAI_REQUEST:18e4};function N(){if(process.env.OPENAI_PROXY_TOKEN)return i.debug("[Auth] Using OPENAI_PROXY_TOKEN (ECS execution)"),process.env.OPENAI_PROXY_TOKEN;if(process.env.ZIBBY_USER_TOKEN)return i.debug("[Auth] Using ZIBBY_USER_TOKEN (CI/CD PAT)"),process.env.ZIBBY_USER_TOKEN;try{let e=S(h(),".zibby","config.json");if(P(e)){let o=JSON.parse(k(e,"utf-8"));if(o.sessionToken)return i.debug("[Auth] Using session token from zibby login"),o.sessionToken}}catch(e){i.debug(`[Auth] Could not read zibby login session: ${e.message}`)}return null}function T(){return process.env.OPENAI_PROXY_URL?process.env.OPENAI_PROXY_URL.replace(/\/v1\/?$/,""):"https://api-prod.zibby.app/openai-proxy"}function u(e){if(!(typeof e!="object"||e===null)){if(Object.keys(e).length===0){e.type="object",e.additionalProperties=!0;return}if(e.type||(e.properties?e.type="object":e.items&&(e.type="array")),e.type==="object")if(e.properties){for(let[o,a]of Object.entries(e.properties))a.type==="object"&&a.additionalProperties&&a.additionalProperties!==!1&&(!a.properties||Object.keys(a.properties).length===0)&&(e.properties[o]={type:["object","null"]});e.additionalProperties=!1,e.required=Object.keys(e.properties),Object.values(e.properties).forEach(u)}else"additionalProperties"in e||(e.additionalProperties=!0);e.type==="array"&&e.items&&u(e.items),e.anyOf&&e.anyOf.forEach(u),e.oneOf&&e.oneOf.forEach(u),e.allOf&&e.allOf.forEach(u)}}async function K(e,o){i.info("\u{1F527} [OpenAI Proxy] Formatting structured output...");let a=N();if(!a)throw new Error("Authentication required for structured output processing.\n Local development: Run `zibby login`\n CI/CD: Set ZIBBY_USER_TOKEN environment variable (Personal Access Token from UI settings)");let d=T();i.info(`\u{1F517} Using OpenAI proxy: ${d}`);let r=A(o),t=r;if(r.$ref&&r.definitions){let n=r.$ref.split("/").pop();t=r.definitions[n]||r,i.debug(`Extracted schema from $ref: ${n}`)}delete t.$schema,u(t);let s=4e5,y=e;e.length>s&&(i.warn(`\u26A0\uFE0F [OpenAI Proxy] Raw text (${e.length} chars) exceeds limit, keeping last ${s} chars`),y=`... [truncated early content] ...
2
+ ${e.slice(-s)}`);let I=`Extract and format the following information into structured JSON matching the schema.
3
3
 
4
4
  RAW CONTENT:
5
- ${E}
5
+ ${y}
6
6
 
7
- Extract all relevant information and format it according to the schema. If any required fields are missing, do your best to infer them from the content.`,y={model:O.OPENAI_POSTPROCESSING,messages:[{role:"user",content:_}],response_format:{type:"json_schema",json_schema:{name:"extract",schema:p,strict:!0}}};n.info(`\u{1F4E4} Sending to OpenAI proxy: model=${O.OPENAI_POSTPROCESSING}, schema keys=${Object.keys(p.properties||{}).join(", ")}`),n.debug(` Schema size: ${JSON.stringify(p).length} chars`),n.debug(` Prompt size: ${_.length} chars`);try{let r={"Content-Type":"application/json"};process.env.OPENAI_PROXY_TOKEN?(r["x-proxy-token"]=t,r["x-execution-id"]=process.env.EXECUTION_ID||""):(r.Authorization=`Bearer ${t}`,r["x-api-key"]=process.env.ZIBBY_API_KEY||"",r["x-execution-id"]=process.env.EXECUTION_ID||"");let u=(await I.post(f,y,{headers:r,timeout:m.OPENAI_REQUEST})).data?.choices?.[0]?.message?.content;if(!u)throw new Error("OpenAI proxy returned empty response");let S=JSON.parse(u);return n.info("\u2705 Successfully formatted with OpenAI proxy"),{structured:S,raw:e}}catch(r){if(r.response){let l=r.response.status,u=r.response.data;throw n.error(`\u274C OpenAI proxy request failed: ${l}`),n.error(` Status: ${l}`),n.error(` Response: ${JSON.stringify(u,null,2)}`),l===401||l===403?new Error(`Authentication failed for OpenAI proxy.
7
+ Extract all relevant information and format it according to the schema. If any required fields are missing, do your best to infer them from the content.`,E={model:O.OPENAI_POSTPROCESSING,messages:[{role:"user",content:I}],response_format:{type:"json_schema",json_schema:{name:"extract",schema:t,strict:!0}}};i.info(`\u{1F4E4} Sending to OpenAI proxy: model=${O.OPENAI_POSTPROCESSING}, schema keys=${Object.keys(t.properties||{}).join(", ")}`),i.debug(` Schema size: ${JSON.stringify(t).length} chars`),i.debug(` Prompt size: ${I.length} chars`);try{let n={"Content-Type":"application/json"};process.env.OPENAI_PROXY_TOKEN?(n["x-proxy-token"]=a,n["x-execution-id"]=process.env.EXECUTION_ID||""):(n.Authorization=`Bearer ${a}`,n["x-api-key"]=process.env.ZIBBY_API_KEY||"",n["x-execution-id"]=process.env.EXECUTION_ID||"");let c=(await _.post(d,E,{headers:n,timeout:b.OPENAI_REQUEST})).data?.choices?.[0]?.message?.content;if(!c)throw new Error("OpenAI proxy returned empty response");let v=JSON.parse(c);return i.info("\u2705 Successfully formatted with OpenAI proxy"),{structured:v,raw:e}}catch(n){if(n.response){let p=n.response.status,c=n.response.data;throw i.error(`\u274C OpenAI proxy request failed: ${p}`),i.error(` Status: ${p}`),i.error(` Response: ${JSON.stringify(c,null,2)}`),p===401||p===403?new Error(`Authentication failed for OpenAI proxy.
8
8
  Run \`zibby login\` or set ZIBBY_USER_TOKEN environment variable.
9
- Response: ${JSON.stringify(u)}`,{cause:r}):new Error(`Failed to format Cursor output: ${u?.error?.message||"Unknown error"}`,{cause:r})}throw n.error(`\u274C OpenAI proxy request failed: ${r.message}`),new Error(`Failed to format output: ${r.message}`,{cause:r})}}export{k as formatWithOpenAIProxy};
9
+ Response: ${JSON.stringify(c)}`,{cause:n}):new Error(`Failed to format Cursor output: ${c?.error?.message||"Unknown error"}`,{cause:n})}throw i.error(`\u274C OpenAI proxy request failed: ${n.message}`),new Error(`Failed to format output: ${n.message}`,{cause:n})}}export{K as formatWithOpenAIProxy};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zibby/core",
3
- "version": "0.5.4",
3
+ "version": "0.5.6",
4
4
  "description": "Core test automation engine with multi-agent and multi-MCP support",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -34,8 +34,9 @@
34
34
  "test:state-schema": "vitest run test/state-schema.test.js",
35
35
  "test:state-schema:e2e": "node test/state-schema.e2e.test.js",
36
36
  "export:workflows": "node scripts/export-default-workflows.js",
37
- "lint": "eslint .",
38
- "lint:fix": "eslint --fix ."
37
+ "export:models": "node scripts/export-models-json.mjs",
38
+ "lint": "eslint src test scripts --cache --cache-location node_modules/.cache/eslint/",
39
+ "lint:fix": "eslint --fix src test scripts --cache --cache-location node_modules/.cache/eslint/"
39
40
  },
40
41
  "keywords": [
41
42
  "testing",