@zibby/core 2.0.13 → 2.0.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/constants.js +1 -1
- package/dist/index.js +115 -115
- package/dist/mcp/tool-broker-server.js +6 -3
- package/dist/models.js +1 -1
- package/dist/package.json +5 -4
- package/dist/register-built-in-strategies.js +32 -32
- package/dist/strategies/assistant-strategy.js +4 -4
- package/dist/strategies/claude-strategy.js +4 -4
- package/dist/strategies/codex-strategy.js +8 -8
- package/dist/strategies/cursor-strategy.js +11 -11
- package/dist/strategies/gemini-strategy.js +10 -10
- package/dist/strategies/index.js +75 -75
- package/dist/strategies/tool-broker.js +1 -1
- package/dist/strategies/utils/openai-proxy-formatter.js +3 -3
- package/package.json +5 -4
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{readFileSync as
|
|
3
|
-
`).map(
|
|
4
|
-
`))):
|
|
2
|
+
import{mkdirSync as oe,readFileSync as ne,renameSync as se,writeFileSync as ie}from"fs";import{dirname as ae}from"path";import{isDeepStrictEqual as ce}from"util";import{createHash as le}from"crypto";import{McpServer as ue}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as pe}from"@modelcontextprotocol/sdk/server/stdio.js";import{Client as me}from"@modelcontextprotocol/sdk/client/index.js";import{StdioClientTransport as fe}from"@modelcontextprotocol/sdk/client/stdio.js";import{StreamableHTTPClientTransport as de}from"@modelcontextprotocol/sdk/client/streamableHttp.js";import{z as c}from"zod";var f=e=>console.error(`[tool-broker] ${e}`),Z=process.argv.indexOf("--spec"),L=Z!==-1?process.argv[Z+1]:null;L||(console.error("[tool-broker] usage: tool-broker-server.js --spec <path>"),process.exit(2));var h;try{h=JSON.parse(ne(L,"utf8"))}catch(e){console.error(`[tool-broker] cannot read spec ${L}: ${e.message}`),process.exit(2)}var b=h.servers&&typeof h.servers=="object"?h.servers:{},E=new Set(Array.isArray(h.pinned)?h.pinned:[]),he=8,ge=16*1024,R=10,B=(Array.isArray(h.warmTools)?h.warmTools:[]).filter(e=>e&&typeof e.server=="string"&&typeof e.tool=="string").slice(0,he),O=typeof h.usagePath=="string"&&h.usagePath.trim()?h.usagePath.trim():null,V=new Map;function Y(e,t){if(!O||E.has(e))return;let r={server:e,tool:t,lastUsedAt:Date.now()};V.set(`${e}\0${t}`,r);try{oe(ae(O),{recursive:!0,mode:448});let o=`${O}.${process.pid}.tmp`;ie(o,JSON.stringify({usedTools:[...V.values()]}),{mode:384}),se(o,O)}catch(o){f(`cannot write turn-local usage record: ${o?.message||String(o)}`)}}var y=new Map;function ye(e){if(e&&(e.transport==="http"||e.type==="http"||e.url&&!e.command)){let r=e.headers||e.http_headers||void 0;return new de(new URL(e.url),r?{requestInit:{headers:r}}:void 0)}if(!e||!e.command)throw new Error("config has neither a url nor a command");return new fe({command:e.command,args:e.args||[],env:e.env||void 0,cwd:e.cwd||void 0,stderr:"inherit"})}async function U(e){if(y.has(e))return y.get(e);let t=b[e],r={name:e},o=null;for(let s=0;s<2;s+=1){let n=new me({name:"zibby-tool-broker",version:"1.0.0"},{capabilities:{}}),i;try{i=ye(t),await n.connect(i);let u=await n.listTools();return r.client=n,r.transport=i,r.tools=(u.tools||[]).map(g=>({name:g.name,description:g.description||"",inputSchema:g.inputSchema||{}})),f(`connected ${e} (${r.tools.length} tools)`),y.set(e,r),r}catch(u){if(o=u,await n.close().catch(()=>{}),s===0&&u?.code===404&&!!i?.sessionId){f(`stale resumed session from ${e}; retrying one fresh initialize`);continue}break}}return r.error=o&&o.message?o.message:String(o),r.tools=[],f(`FAILED ${e}: ${r.error}`),y.set(e,r),r}async function H(){await Promise.all(Object.keys(b).map(e=>U(e)))}function ve(e,t=140){let r=String(e||"").split(`
|
|
3
|
+
`).map(o=>o.trim()).find(Boolean)||"";return r.length>t?`${r.slice(0,t-1)}\u2026`:r}function P(e){let t=String(e||"").trim();if(!t)return"";t.startsWith("mcp__")&&(t=t.slice(5));for(let r of[":","/","__"]){let o=t.indexOf(r);if(o>0&&o+r.length<t.length)return`${t.slice(0,o)}:${t.slice(o+r.length)}`}return t}function Q(e){let t=P(e);if(t.includes(":")){let[o,...s]=t.split(":"),n=s.join(":"),i=y.get(o);if(!i)return{error:`no such server "${o}". Call list_tools to see what exists.`};if(i.error)return{error:`server "${o}" failed to connect: ${i.error}`};let u=i.tools.find(g=>g.name===n);return u?{server:o,entry:i,tool:u}:{error:`server "${o}" has no tool "${n}". Call list_tools({server:"${o}"}).`}}let r=[];for(let[o,s]of y)for(let n of s.tools)n.name===t&&r.push({server:o,entry:s,tool:n});return r.length===1?r[0]:r.length===0?{error:`no tool named "${t}". Call list_tools to see the catalogue.`}:{error:`"${t}" exists on ${r.map(o=>o.server).join(", ")} \u2014 address it as "<server>:${t}".`}}function X({name:e,server:t,tool:r}={}){let o=P(e),s=!!(String(t||"").trim()||String(r||"").trim());if(s&&(!String(t||"").trim()||!String(r||"").trim()))return{error:"server and tool must be provided together."};let n=s?P(`${String(t).trim()}:${String(r).trim()}`):"";return!o&&!n?{error:"provide name or server + tool."}:o&&n&&o!==n?{error:`conflicting tool references: name resolves to "${o}" but server + tool resolves to "${n}".`}:{name:o||n}}function $e({arguments:e,args:t,input:r}={}){let o=[e,t,r].filter(n=>n!==void 0);if(o.length>1&&!o.every(n=>ce(n,o[0])))return{error:"conflicting argument objects: arguments, args and input must agree when more than one is supplied."};let s=o[0]??{};return!s||typeof s!="object"||Array.isArray(s)?{error:"tool arguments must be an object."}:{value:s}}function I(e){let t=JSON.stringify(e?.tool?.inputSchema||{}),r=t.length>4e3?`${t.slice(0,3999)}\u2026`:t;return`Input schema for ${e.server}:${e.tool.name}: ${r}`}function G(e,t){return e?.isError?{...e,content:[...Array.isArray(e.content)?e.content:[],{type:"text",text:I(t)}]}:e}var N=e=>({content:[{type:"text",text:e}]}),v=e=>({content:[{type:"text",text:e}],isError:!0});function z(e){if(!e||typeof e!="object")return"value";if(Array.isArray(e.enum)&&e.enum.length&&e.enum.length<=4)return e.enum.map(r=>JSON.stringify(r)).join("|");let t=e.oneOf||e.anyOf;return Array.isArray(t)&&t.length&&t.length<=4?t.map(z).join("|"):e.type==="array"?`${z(e.items)}[]`:Array.isArray(e.type)?e.type.join("|"):typeof e.type=="string"?e.type:"value"}function Se(e){let t=e&&e.inputSchema,r=t&&t.properties&&typeof t.properties=="object"?t.properties:{},o=Object.keys(r);if(!o.length)return"()";let s=new Set(Array.isArray(t.required)?t.required:[]);return`(${o.map(n=>`${n}${s.has(n)?"":"?"}:${z(r[n])}`).join(", ")})`}var w=new ue({name:"zibby-tool-broker",version:"1.0.0"},{capabilities:{tools:{}}}),we=Object.keys(b).join(", "),K=B.map(e=>`${e.server}:${e.tool}`).join(", ");w.registerTool("list_tools",{description:`List tools as name + compact top-level argument signature + one line each. Call flat tools directly from that signature; use describe_tool only for nested or unclear arguments. Servers: ${we||"(none)"}. ${K?`Recent candidates (exposed directly when their current schema is available): ${K}. `:""}Use an already-exposed direct tool without rediscovering it. Start here only when no currently exposed tool provides the capability you need.`,inputSchema:{server:c.string().optional().describe('Limit to one server (e.g. "jira"). Omit for everything.'),query:c.string().optional().describe('Keywords to narrow the list (e.g. "jira issue"). Omit to see everything.'),all:c.boolean().optional().describe("Return the complete catalogue even when query matches many tools.")}},async({server:e,query:t,all:r=!1}={})=>{await H();let o=String(t||"").toLowerCase().split(/[^a-z0-9]+/i).filter(a=>a.length>2),s=a=>String(a||"").replace(/([a-z0-9])([A-Z])/g,"$1 $2").toLowerCase().split(/[^a-z0-9]+/i).filter(Boolean),n=(a,l)=>a===l||Math.min(a.length,l.length)>=4&&(a.startsWith(l)||l.startsWith(a)),i=(a,l,d)=>{let $=s(l.name),p=s(Object.keys(l.inputSchema?.properties||{}).join(" ")),j=s(l.description),x=s(a),m=0;return $.some(S=>n(d,S))&&(m=Math.max(m,6)),p.some(S=>n(d,S))&&(m=Math.max(m,3)),j.some(S=>n(d,S))&&(m=Math.max(m,1)),x.some(S=>n(d,S))&&(m=Math.max(m,1)),m},u=(a,l,d)=>{if(!o.length)return 1;let $=o.filter(x=>!d.tools.every(m=>i(a,m,x)>0));if(!$.length)return 1;let p=0,j=0;for(let x of $){let m=i(a,l,x);m&&(j+=1),p+=m}return j?p+j*2:0},g=a=>{let l=[],d=0,$="";for(let p of a){if(p.error){l.push(`## ${p.server} \u2014 UNAVAILABLE: ${p.error}`);continue}p.server!==$&&($=p.server,l.push(`## ${p.server}`)),d+=1,l.push(`- ${p.server}:${p.tool.name}${Se(p.tool)} \u2014 ${ve(p.tool.description)}`)}return{lines:l,count:d}},_=[];for(let[a,l]of y)if(!(e&&a!==e)){if(l.error){_.push({server:a,error:l.error,score:0});continue}for(let d of l.tools)_.push({server:a,tool:d,score:u(a,d,l)})}let W=r||!o.length?_:_.filter(a=>a.error||a.score>0),A=W.filter(a=>a.tool).sort((a,l)=>l.score-a.score||a.server.localeCompare(l.server)||a.tool.name.localeCompare(l.tool.name)),re=W.filter(a=>a.error),D=!!(o.length&&!r&&A.length>R),te=[...re,...D?A.slice(0,R):A],{lines:T,count:F}=g(te),M="";return o.length&&A.length===0?({lines:T,count:F}=g(_),M=`Nothing matched "${t}", so here is everything. `):D&&(M=`Showing the top ${R} of ${A.length} matches. Use all:true, server, or a narrower query for the rest. `),T.length?(T.push(""),T.push(`${M}${F} tools. Call flat signatures directly with call_tool; describe_tool is only for nested/unclear parameters.`),N(T.join(`
|
|
4
|
+
`))):N(e?`No server named "${e}".`:"No tools are connected.")});w.registerTool("describe_tool",{description:"Full parameter schema for ONE tool. Accepts name or server + tool.",inputSchema:{name:c.string().optional().describe('e.g. "jira:jira_list_projects"'),server:c.string().optional().describe("Server name when using the split form."),tool:c.string().optional().describe("Tool name when using the split form.")}},async(e={})=>{await H();let t=X(e);if(t.error)return v(t.error);let r=Q(t.name);return r.error?v(r.error):N(JSON.stringify({name:`${r.server}:${r.tool.name}`,description:r.tool.description,inputSchema:r.tool.inputSchema},null,2))});w.registerTool("call_tool",{description:"Invoke a tool from its compact list_tools signature. Accepts name or server + tool and arguments/args/input aliases; use describe_tool only for nested or unclear arguments. Conflicting duplicate forms are rejected.",inputSchema:{name:c.string().optional().describe('e.g. "jira:jira_list_projects", "jira/jira_list_projects", or "mcp__jira__jira_list_projects"'),server:c.string().optional().describe("Server name when using the split form."),tool:c.string().optional().describe("Tool name when using the split form."),arguments:c.record(c.string(),c.any()).optional().describe("Arguments object; omit when the tool takes none."),args:c.record(c.string(),c.any()).optional().describe("Alias for arguments."),input:c.record(c.string(),c.any()).optional().describe("Alias for arguments.")}},async(e={})=>{await H();let t=X(e);if(t.error)return v(t.error);let r=$e(e);if(r.error)return v(r.error);let o=Q(t.name);if(o.error)return v(o.error);try{let s=await o.entry.client.callTool({name:o.tool.name,arguments:r.value});return s?.isError||Y(o.server,o.tool.name),G(s,o)}catch(s){return v(`${o.server}:${o.tool.name} threw: ${s&&s.message?s.message:String(s)}
|
|
5
|
+
${I(o)}`)}});for(let e of E){if(!b[e]){f(`pinned server "${e}" is not in the spec \u2014 ignoring`);continue}let t=await U(e);if(t.error){f(`pinned server "${e}" did not connect; its tools are absent from turn 1`);continue}for(let r of t.tools)w.registerTool(r.name,{description:r.description||r.name,inputSchema:ee(r.inputSchema)},async(o={})=>{let s={server:e,entry:t,tool:r};try{let n=await t.client.callTool({name:r.name,arguments:o});return G(n,s)}catch(n){return v(`${e}:${r.name} threw: ${n&&n.message?n.message:String(n)}
|
|
6
|
+
${I(s)}`)}});f(`pinned ${e} (${t.tools.length} tools exposed directly)`)}var k=[],q=0;function be(e,t){let r=`${e}__${t}`.replace(/[^a-zA-Z0-9_-]/g,"_");if(r.length<=128)return r;let o=le("sha256").update(`${e}\0${t}`).digest("hex").slice(0,8);return`${r.slice(0,119)}_${o}`}var _e=[...new Set(B.map(e=>e.server).filter(e=>b[e]&&!E.has(e)))];await Promise.all(_e.map(e=>U(e)));for(let e of B){if(E.has(e.server))continue;let t=y.get(e.server),r=t?.tools?.find(i=>i.name===e.tool);if(!r){f(`warm tool ${e.server}:${e.tool} is unavailable \u2014 leaving it behind discovery`);continue}let o=Buffer.byteLength(JSON.stringify({description:r.description||"",inputSchema:r.inputSchema||{}}),"utf8");if(q+o>ge){f(`warm schema budget reached before ${e.server}:${e.tool} \u2014 leaving it behind discovery`);continue}let s=be(e.server,e.tool);if(k.some(i=>i.exposedName===s)){f(`warm tool name collision for ${e.server}:${e.tool} as ${s} \u2014 skipping`);continue}let n={server:e.server,entry:t,tool:r};w.registerTool(s,{description:r.description||r.name,inputSchema:ee(r.inputSchema)},async(i={})=>{try{let u=await t.client.callTool({name:r.name,arguments:i});return u?.isError||Y(e.server,r.name),G(u,n)}catch(u){return v(`${e.server}:${r.name} threw: ${u&&u.message?u.message:String(u)}
|
|
7
|
+
${I(n)}`)}}),q+=o,k.push({server:e.server,tool:r.name,exposedName:s})}k.length&&f(`warmed ${k.length} recent tool(s), ${q} schema bytes`);function ee(e={}){let t=e&&e.properties||{},r=new Set(Array.isArray(e?.required)?e.required:[]),o={};for(let[s,n]of Object.entries(t)){let i;Array.isArray(n?.enum)&&n.enum.length?i=c.enum(n.enum.map(String)):n?.type==="string"?i=c.string():n?.type==="number"||n?.type==="integer"?i=c.number():n?.type==="boolean"?i=c.boolean():n?.type==="array"?i=c.array(c.any()):n?.type==="object"?i=c.record(c.string(),c.any()):i=c.any(),n?.description&&(i=i.describe(n.description)),r.has(s)||(i=i.optional()),o[s]=i}return o}await w.connect(new pe);var C=null;async function J(e){return C||(C=(async()=>{let t=[...y.values()].filter(s=>s?.client),o=(await Promise.allSettled(t.map(async s=>{try{typeof s.transport?.terminateSession=="function"&&await s.transport.terminateSession()}finally{await s.client.close()}}))).filter(s=>s.status==="rejected");o.length&&f(`shutdown (${e}): ${o.length} backing connection(s) did not close cleanly`),await w.close().catch(()=>{})})(),C)}process.stdin.once("end",()=>{J("stdin ended")});for(let e of["SIGTERM","SIGINT","SIGHUP"])process.once(e,()=>{J(e).finally(()=>process.exit(e==="SIGINT"?130:0))});process.stdin.readableEnded&&J("stdin already ended");f(`ready \u2014 3 broker tools + ${E.size} pinned server(s) + ${k.length} warm tool(s) in front of ${Object.keys(b).length} server(s)`);
|
package/dist/models.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var i=[{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",pickerVisible:!0},{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.6-luna",vendor:"codex",label:"Codex \xB7 GPT-5.2",family:"gpt-5",retiredCanonicalId:"gpt-5.2-codex",unavailable:"2026-08-26 API-key probe: 404 Model not found"},{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.5",vendor:"codex",label:"Codex \xB7 GPT-5.3",family:"gpt-5",retiredCanonicalId:"gpt-5.3",unavailable:"2026-08-26 API-key probe: model_not_found"},{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:"gpt-5.6-sol",canonicalId:"gpt-5.6-sol",vendor:"codex",label:"Codex \xB7 GPT-5.6 Sol",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 s(e){let a={};for(let l of i)l.vendor===e&&(a[l.alias]=l.canonicalId);return a}function t(){let e={};for(let a of i)a.unavailable&&(e[a.alias]=a.unavailable,e[`${a.vendor}:${a.alias}`]=a.unavailable,e[a.retiredCanonicalId||a.canonicalId]=a.unavailable);return e}function
|
|
1
|
+
var i=[{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",pickerVisible:!0},{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.6-luna",vendor:"codex",label:"Codex \xB7 GPT-5.2",family:"gpt-5",retiredCanonicalId:"gpt-5.2-codex",unavailable:"2026-08-26 API-key probe: 404 Model not found"},{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.5",vendor:"codex",label:"Codex \xB7 GPT-5.3",family:"gpt-5",retiredCanonicalId:"gpt-5.3",unavailable:"2026-08-26 API-key probe: model_not_found"},{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.4-mini",canonicalId:"gpt-5.4-mini",vendor:"codex",label:"Codex \xB7 GPT-5.4 mini",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:"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:"gpt-5.6-sol",canonicalId:"gpt-5.6-sol",vendor:"codex",label:"Codex \xB7 GPT-5.6 Sol",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 s(e){let a={};for(let l of i)l.vendor===e&&(a[l.alias]=l.canonicalId);return a}function t(){let e={};for(let a of i)a.unavailable&&(e[a.alias]=a.unavailable,e[`${a.vendor}:${a.alias}`]=a.unavailable,e[a.retiredCanonicalId||a.canonicalId]=a.unavailable);return e}function d(){let e={};for(let a of i)!a.retiredCanonicalId||a.retiredCanonicalId===a.canonicalId||(e[a.alias]={alias:a.alias,vendor:a.vendor,requested:a.retiredCanonicalId,actual:a.canonicalId,evidence:a.unavailable||"retired by the vendor"});return e}function r(e,a){let l=d()[a];return!l||l.vendor!==e?null:`MODEL REPOINTED: this run pinned "${l.alias}" (${l.requested}), but that model is RETIRED at the vendor (${l.evidence}) \u2014 running on "${l.actual}" instead. Output did NOT come from ${l.requested}. Redeploy the agent with a current model to make the pin match reality.`}function p(e){if(!e||typeof e!="string")return null;let a=e.toLowerCase();for(let l of i)if(l.alias.toLowerCase()===a)return l.family??null;for(let l of i)if(l.canonicalId.toLowerCase()===a)return l.family??null;return null}function o(e){let a=String(e||"").match(/(\d+(?:\.\d+)?)/);return a?parseFloat(a[1]):0}function c(e){let a=String(e||"").toLowerCase();return/\b(base|mini)\b/.test(a)?0:/\b(opus|pro)\b/.test(a)?2:1}function u(e,a){let l=o(a.label)-o(e.label);if(l!==0)return l;let n=c(a.label)-c(e.label);return n!==0?n:e.label.localeCompare(a.label)}function f(){let e=[],a=new Map;for(let n of i)n.pickerVisible&&(n.unavailable||(a.has(n.vendor)||(a.set(n.vendor,[]),e.push(n.vendor)),a.get(n.vendor).push({value:`${n.vendor}:${n.alias}`,label:n.label||`${n.vendor}:${n.alias}`,vendor:n.vendor,alias:n.alias})));let l=[];for(let n of e)l.push(...a.get(n).sort(u));return l}function m(e,a){let l=typeof a=="string"?a.trim():"";if(l)return l;throw new Error(`[${e}] 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.`)}export{i as MODEL_REGISTRY,s as buildVendorModelMap,f as getPickerModels,d as getRepointedModels,t as getUnavailableModels,r as repointWarning,m as requireModelAlias,p as resolveModelFamily};
|
package/dist/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zibby/core",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.15",
|
|
4
4
|
"description": "Core test automation engine with multi-agent and multi-MCP support",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -33,6 +33,7 @@
|
|
|
33
33
|
"test:watch": "vitest",
|
|
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
|
+
"eval:tool-broker-working-set": "node test/tool-broker-working-set.eval.mjs",
|
|
36
37
|
"export:workflows": "node scripts/export-default-workflows.js",
|
|
37
38
|
"export:models": "node scripts/export-models-json.mjs",
|
|
38
39
|
"lint": "eslint src test scripts --cache --cache-location node_modules/.cache/eslint/",
|
|
@@ -69,9 +70,9 @@
|
|
|
69
70
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
70
71
|
"@openai/codex-sdk": "^0.144.6",
|
|
71
72
|
"@playwright/mcp": "^0.0.70",
|
|
72
|
-
"@zibby/agent-workflow": "2.0.
|
|
73
|
-
"@zibby/mcp-browser": "2.0.
|
|
74
|
-
"@zibby/skill-ids": "2.0.
|
|
73
|
+
"@zibby/agent-workflow": "2.0.15",
|
|
74
|
+
"@zibby/mcp-browser": "2.0.15",
|
|
75
|
+
"@zibby/skill-ids": "2.0.15",
|
|
75
76
|
"acorn": "^8.15.0",
|
|
76
77
|
"acorn-walk": "^8.3.5",
|
|
77
78
|
"axios": "^1.15.0",
|