@xenosystem/agent-sdk 0.9.32 → 0.9.34
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/artifacts/index.cjs +1 -1
- package/dist/artifacts/index.js +1 -1
- package/dist/automation/index.cjs +1 -1
- package/dist/automation/index.js +1 -1
- package/dist/control-plane/index.cjs +1 -1
- package/dist/control-plane/index.js +1 -1
- package/dist/electron/index.cjs +111 -111
- package/dist/electron/index.js +114 -114
- package/dist/electron/metafile-cjs.json +1 -1
- package/dist/electron/metafile-esm.json +1 -1
- package/dist/index.cjs +245 -245
- package/dist/index.js +254 -254
- package/dist/metafile-cjs.json +1 -1
- package/dist/metafile-esm.json +1 -1
- package/dist/providers/index.cjs +8 -8
- package/dist/providers/index.js +9 -9
- package/dist/providers/metafile-cjs.json +1 -1
- package/dist/providers/metafile-esm.json +1 -1
- package/dist/session/index.cjs +1 -1
- package/dist/session/index.js +1 -1
- package/package.json +1 -1
package/dist/providers/index.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
var
|
|
2
|
-
`).trim();o.length>0&&t.push({role:n.role,content:o})}return t}var fn="http://localhost:3338",gn=
|
|
3
|
-
`);p=f.pop()??"";for(let
|
|
1
|
+
var rt="https://api.xenostudio.ai";var po=300*1e3;function ot(e,t){return{id:t?.id??"dual",...t?.model?{model:t.model}:{},capabilities:{streaming:!0,tools:!1,vision:!1},async complete(n,r,o,i,s){let a=mn(r);if(i){let d="";for await(let u of e.chatStream({model:n,messages:a})){if(s?.aborted)break;d+=u,i(u)}return{content:d.length>0?[{type:"text",text:d}]:[],stopReason:"end_turn",usageReported:!1,inputTokens:0,outputTokens:0}}let l=await e.chat({model:n,messages:a});return{content:l.content.length>0?[{type:"text",text:l.content}]:[],stopReason:"end_turn",usageReported:typeof l.usage?.promptTokens=="number",inputTokens:l.usage?.promptTokens??0,outputTokens:l.usage?.completionTokens??0}}}}function mn(e){let t=[];for(let n of e){if(typeof n.content=="string"){t.push({role:n.role,content:n.content});continue}let r=[];for(let i of n.content)if(i.type==="text")r.push(i.text);else if(i.type==="tool_use")r.push(`[tool_use ${i.name} ${JSON.stringify(i.input)}]`);else if(i.type==="tool_result"){let s=typeof i.content=="string"?i.content:JSON.stringify(i.content);r.push(`[tool_result ${i.tool_use_id}: ${s}]`)}let o=r.join(`
|
|
2
|
+
`).trim();o.length>0&&t.push({role:n.role,content:o})}return t}var fn="http://localhost:3338",gn=rt,yn=2e3,_e=12e4,hn=3e4,Se=class{localUrl;cloudUrl;cloudApiKey;mode;defaultLocalModel;defaultCloudModel;localAvailable=null;localModelName=null;lastHealthCheck=0;constructor(t){this.localUrl=t?.localUrl??fn,this.cloudUrl=t?.cloudUrl??gn,this.cloudApiKey=t?.cloudApiKey??process.env.XENO_API_KEY??"",this.mode=t?.mode??"auto",this.defaultLocalModel=t?.localModel??"default",this.defaultCloudModel=t?.cloudModel??"claude-sonnet-4-6"}async chat(t){let n=await this.shouldUseLocal();if(this.mode==="local"&&!n)return{success:!1,content:"",endpoint:"local",model:"",usage:{promptTokens:0,completionTokens:0,totalTokens:0},error:"Local xeno-rt is not available and mode is set to local-only"};if(n)try{return await this.chatLocal(t)}catch(r){return this.mode==="local"?{success:!1,content:"",endpoint:"local",model:t.model??this.defaultLocalModel,usage:{promptTokens:0,completionTokens:0,totalTokens:0},error:r instanceof Error?r.message:String(r)}:this.chatCloud(t)}return this.chatCloud(t)}async*chatStream(t){let n=await this.shouldUseLocal();if(this.mode==="local"&&!n)throw new Error("Local xeno-rt is not available and mode is set to local-only");let r=n?this.localUrl:this.cloudUrl,o=t.model??(n?this.defaultLocalModel:this.defaultCloudModel),i=t.systemPrompt?[{role:"system",content:t.systemPrompt},...t.messages]:t.messages,s={model:o,messages:i,stream:!0,max_tokens:t.maxTokens??4096,temperature:t.temperature??.7};t.jsonMode&&(s.response_format={type:"json_object"}),t.stop&&t.stop.length>0&&(s.stop=t.stop);let a={"Content-Type":"application/json"};n||(a.Authorization=`Bearer ${this.cloudApiKey}`,a["User-Agent"]="XenoAgentSDK/0.4.0");let l=new AbortController,c=setTimeout(()=>l.abort(),_e);try{let d=await fetch(`${r}/v1/chat/completions`,{method:"POST",headers:a,body:JSON.stringify(s),signal:l.signal});if(!d.ok){let g=await d.text().catch(()=>"");throw new Error(`LLM stream failed (HTTP ${d.status}): ${g}`)}if(!d.body)throw new Error("Response body is null \u2014 streaming not supported");let u=d.body.getReader(),m=new TextDecoder,p="";for(;;){let{done:g,value:y}=await u.read();if(g)break;p+=m.decode(y,{stream:!0});let f=p.split(`
|
|
3
|
+
`);p=f.pop()??"";for(let x of f){let C=x.trim();if(!C||!C.startsWith("data: "))continue;let w=C.slice(6);if(w==="[DONE]")return;try{let M=JSON.parse(w).choices[0]?.delta.content;M&&(yield M)}catch{}}}}finally{clearTimeout(c)}}async isLocalAvailable(t=!1){let n=Date.now();if(!t&&this.localAvailable!==null&&n-this.lastHealthCheck<hn)return this.localAvailable;try{let r=new AbortController,o=setTimeout(()=>r.abort(),yn);try{let i=await fetch(`${this.localUrl}/v1/models`,{signal:r.signal});if(!i.ok)return this.localAvailable=!1,this.localModelName=null,this.lastHealthCheck=n,!1;let s=await i.json();return this.localModelName=s.data?.[0]?.id??null,this.localAvailable=!0,this.lastHealthCheck=n,!0}finally{clearTimeout(o)}}catch{return this.localAvailable=!1,this.localModelName=null,this.lastHealthCheck=n,!1}}setMode(t){this.mode=t}getMode(){return this.mode}setLocalUrl(t){this.localUrl=t,this.localAvailable=null,this.lastHealthCheck=0}setCloudApiKey(t){this.cloudApiKey=t}async getStatus(){let t=await this.isLocalAvailable(),n;return this.mode==="local"?n="local":this.mode==="cloud"?n="cloud":n=t?"local":"cloud",{mode:this.mode,localAvailable:t,activeEndpoint:n,localModel:this.localModelName??void 0,localUrl:this.localUrl,cloudUrl:this.cloudUrl}}asLLMProvider(t){return ot(this,t)}async shouldUseLocal(){return this.mode==="cloud"?!1:this.mode==="local"?this.isLocalAvailable():this.isLocalAvailable()}async chatLocal(t){let n=t.model??this.defaultLocalModel,r=t.systemPrompt?[{role:"system",content:t.systemPrompt},...t.messages]:t.messages,o={model:n,messages:r,stream:!1,max_tokens:t.maxTokens??4096,temperature:t.temperature??.7};t.jsonMode&&(o.response_format={type:"json_object"}),t.stop&&t.stop.length>0&&(o.stop=t.stop);let i=new AbortController,s=setTimeout(()=>i.abort(),_e);try{let a=await fetch(`${this.localUrl}/v1/chat/completions`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o),signal:i.signal});if(!a.ok){let p=await a.text().catch(()=>"");throw new Error(`Local LLM request failed (HTTP ${a.status}): ${p}`)}let l=await a.json(),u=(l.choices?.[0]??{}).message??{},m=l.usage??{};return{success:!0,content:String(u.content??""),endpoint:"local",model:String(l.model??n),usage:{promptTokens:m.prompt_tokens??0,completionTokens:m.completion_tokens??0,totalTokens:m.total_tokens??0}}}finally{clearTimeout(s)}}async chatCloud(t){let n=t.model??this.defaultCloudModel,r=t.systemPrompt?[{role:"system",content:t.systemPrompt},...t.messages]:t.messages,o={model:n,messages:r,stream:!1,max_tokens:t.maxTokens??4096,temperature:t.temperature??.7};t.jsonMode&&(o.response_format={type:"json_object"}),t.stop&&t.stop.length>0&&(o.stop=t.stop);let i={"Content-Type":"application/json",Authorization:`Bearer ${this.cloudApiKey}`,"User-Agent":"XenoAgentSDK/0.4.0"},s=new AbortController,a=setTimeout(()=>s.abort(),_e);try{let l=await fetch(`${this.cloudUrl}/v1/chat/completions`,{method:"POST",headers:i,body:JSON.stringify(o),signal:s.signal});if(!l.ok){let g=`Cloud LLM request failed (HTTP ${l.status})`;try{let f=(await l.json()).error;g=typeof f=="string"?f:f?.message??g}catch{}return{success:!1,content:"",endpoint:"cloud",model:n,usage:{promptTokens:0,completionTokens:0,totalTokens:0},error:g}}let c=await l.json(),m=(c.choices?.[0]??{}).message??{},p=c.usage??{};return{success:!0,content:String(m.content??""),endpoint:"cloud",model:String(c.model??n),usage:{promptTokens:p.prompt_tokens??0,completionTokens:p.completion_tokens??0,totalTokens:p.total_tokens??0}}}finally{clearTimeout(a)}}};import{randomUUID as Ke}from"node:crypto";function bn(e){return/^data:([^;,]+)[;,]/i.exec(e.trim())?.[1]}function wn(e){let t=[];for(let n of e){if(n.type==="text"){t.push(n.text);continue}if(n.type==="image_url"){t.push(`[image ${bn(n.image_url.url)??"unknown"}]`);continue}let r=n.text??n.data;if(r&&r.trim().length>0){t.push(r);continue}let o=n.uri??n.mimeType??"resource";t.push(`[resource ${o}]`)}return t.join(`
|
|
4
4
|
|
|
5
|
-
`).trim()}function Z(e){return typeof e=="string"?e:wn(e)}import{performance as Me}from"node:perf_hooks";var vn=1;var Pn=12,xn=128,Rn=/^xeno\.[a-z0-9]+(?:[._][a-z0-9]+)*$/u,Cn=/^[a-z0-9]+(?:[._-][a-z0-9]+)*$/u,Tn=/(?:[\\/]|@|https?:|bearer|token|secret|password|credential|api[_-]?key|[0-9a-f]{8}-[0-9a-f-]{27,})/iu,kn=new Set(["arch","cached","capability","category","component","contained","error_code","frame_kind","gate","method","mode","operation","outcome","platform","previous_state","protocol_version","provider","queue","reason","recovery","retry_kind","state","status","tool","transport","trigger"]),ot=new Set,it=new Map;function _n(e){let t=e.trim().toLowerCase();return!t||t.length>64||Tn.test(t)||!Cn.test(t)?null:t}function Sn(e,t){if(typeof t=="boolean")return t;if(typeof t=="number")return e!=="protocol_version"||!Number.isInteger(t)||t<0||t>100?null:t;if(typeof t!="string")return null;let n=_n(t);if(!n)return null;let r=it.get(e);return r||(r=new Set,it.set(e,r)),!r.has(n)&&r.size>=xn?"other":(r.add(n),n)}function En(e={}){let t={};for(let[n,r]of Object.entries(e)){if(Object.keys(t).length>=Pn)break;if(!kn.has(n))continue;let o=Sn(n,r);o!==null&&(t[n]=o)}return Object.freeze(t)}function st(e){if(ot.size===0||!Rn.test(e.name)||e.name.length>128)return;let t=e.kind==="event"?1:e.value??1;if(!Number.isFinite(t)||t<0)return;let n=Object.freeze({schemaVersion:vn,kind:e.kind,name:e.name,value:Math.min(t,Number.MAX_SAFE_INTEGER),timestamp:(e.timestamp??new Date).toISOString(),attributes:En(e.attributes)});for(let r of ot)try{r(n)}catch{}}function H(e,t=1,n){st({kind:"counter",name:e,value:t,attributes:n})}function Ee(e,t,n){st({kind:"histogram",name:e,value:t,attributes:n})}import{lookup as Ln}from"node:dns/promises";import{isIP as le}from"node:net";var An=["context length","context window","maximum context","too many tokens","request too large"];function at(e){let t=e.toLowerCase();return An.some(n=>t.includes(n))}var x=class extends Error{category;code;retryable;providerId;statusCode;retryAfterMs;requestId;constructor(t,n){super(t,n.cause!==void 0?{cause:n.cause}:void 0),this.name="ProviderError",this.category=n.category,this.code=n.code,this.retryable=n.retryable??!1,this.providerId=n.providerId,this.statusCode=n.statusCode,this.retryAfterMs=n.retryAfterMs,this.requestId=n.requestId}};function Ae(e,t=Date.now()){if(!e)return;let n=Number(e.trim());if(Number.isFinite(n)&&n>=0)return Math.ceil(n*1e3);let r=Date.parse(e);if(Number.isFinite(r))return Math.max(0,r-t)}function In(e){if(typeof e=="string")return e;if(!e||typeof e!="object")return"";let t=e,n=t.error;if(typeof n=="string")return n;if(n&&typeof n=="object"){let r=n;if(typeof r.message=="string")return r.message;if(typeof r.type=="string")return r.type}return typeof t.message=="string"?t.message:""}function lt(e,t){return t.some(n=>e.includes(n))}function Ie(e){let t=In(e.body).trim(),n=t.toLowerCase(),r=t?`: ${t.slice(0,1e3)}`:"",o={providerId:e.providerId,statusCode:e.statusCode,retryAfterMs:e.retryAfterMs,requestId:e.requestId};return e.statusCode===401?new x(`Provider authentication failed${r}`,{...o,category:"authentication",code:"PROVIDER_AUTHENTICATION_FAILED"}):e.statusCode===403?new x(`Provider authorization failed${r}`,{...o,category:"authorization",code:"PROVIDER_AUTHORIZATION_FAILED"}):e.statusCode===429?new x(`Provider rate limit reached${r}`,{...o,category:"rate_limit",code:"PROVIDER_RATE_LIMITED",retryable:!0}):at(n)?new x(`Provider context window exceeded${r}`,{...o,category:"context_overflow",code:"PROVIDER_CONTEXT_OVERFLOW"}):lt(n,["safety","content policy","blocked_reason","responsible_ai_policy_violation"])?new x(`Provider safety policy refused the request${r}`,{...o,category:"safety_refusal",code:"PROVIDER_SAFETY_REFUSAL"}):e.statusCode===404||lt(n,["model not found","model does not exist","unsupported model"])?new x(`Provider model is unavailable${r}`,{...o,category:"unsupported_model",code:"PROVIDER_MODEL_UNSUPPORTED"}):e.statusCode===408||e.statusCode===504?new x(`Provider request timed out${r}`,{...o,category:"timeout",code:"PROVIDER_TIMEOUT",retryable:!0}):e.statusCode>=500||e.statusCode===409||e.statusCode===425?new x(`Provider server error${r}`,{...o,category:"server",code:"PROVIDER_SERVER_ERROR",retryable:!0}):new x(`Provider rejected the request with HTTP ${e.statusCode}${r}`,{...o,category:"unsupported_capability",code:"PROVIDER_CAPABILITY_UNSUPPORTED"})}function v(e,t,n){return new x(`Malformed ${e} response: ${t}`,{providerId:e,category:"malformed_response",code:"PROVIDER_MALFORMED_RESPONSE",...n!==void 0?{cause:n}:{}})}function z(e,t){return H("xeno.provider.capability_mismatches",1,{component:"provider_contract",provider:e,capability:t,error_code:"provider_capability_unsupported"}),new x(`${e} does not advertise the required ${t} capability`,{providerId:e,category:"unsupported_capability",code:"PROVIDER_CAPABILITY_UNSUPPORTED"})}var ut=new Set(["metadata.google.internal","metadata.azure.internal","instance-data.ec2.internal"]);function S(e){return new x(`Provider endpoint rejected: ${e}`,{category:"endpoint_policy",code:"PROVIDER_ENDPOINT_REJECTED"})}function On(e){let t=e.split(".");if(t.length!==4)return null;let n=t.map(r=>Number(r));return n.every(r=>Number.isInteger(r)&&r>=0&&r<=255)?n:null}function ct(e){let t=On(e);if(!t)return"public";let[n,r]=t;return n===0?"unspecified":n===127?"loopback":n===169&&r===254?"link-local":n===10||n===172&&r>=16&&r<=31||n===192&&r===168?"private":"public"}function ce(e){let t=e.toLowerCase().replace(/^\[|\]$/g,"").split("%")[0];le(t)===6&&(t=new URL(`http://[${t}]`).hostname.slice(1,-1));let n=/^::ffff:([0-9a-f]{1,4}):([0-9a-f]{1,4})$/.exec(t);if(n){let r=Number.parseInt(n[1],16),o=Number.parseInt(n[2],16);return`${r>>8}.${r&255}.${o>>8}.${o&255}`}return t}function mt(e){let t=ce(e);return le(t)===4?ct(t):t==="::"||t==="::0"?"unspecified":t==="::1"?"loopback":t.startsWith("::ffff:")?ct(t.slice(7)):/^f[cd]/.test(t)?"private":/^fe[89ab]/.test(t)?"link-local":"public"}function dt(e){return e==="example"||e.endsWith(".example")||e==="test"||e.endsWith(".test")||e==="invalid"||e.endsWith(".invalid")}function Mn(e){return e==="localhost"||e.endsWith(".localhost")}function K(e,t={}){let n;try{n=new URL(e)}catch{throw S("the URL is invalid")}if(n.username||n.password)throw S("embedded credentials are forbidden");if(n.hash||n.search)throw S("base URLs cannot contain a query or fragment");if(!n.hostname||n.hostname.includes("%"))throw S("the hostname is empty or ambiguous");if(ut.has(n.hostname.toLowerCase()))throw S("cloud metadata destinations are forbidden");if(n.protocol!=="https:"&&n.protocol!=="http:")throw S(`scheme ${n.protocol} is unsupported`);let r=t.profile??"public-https";if(n.protocol==="http:"&&r!=="local-network")throw S("plain HTTP requires the explicit local-network profile");let o=n.hostname.replace(/^\[|\]$/g,""),i=le(o)?mt(o):null;if(i==="link-local"||i==="unspecified")throw S(`${i} destinations are forbidden`);if(r==="public-https"&&(i==="private"||i==="loopback"||Mn(n.hostname)))throw S("private and loopback destinations require the local-network profile");if(r==="local-network"&&n.protocol==="http:"&&i==="public"&&!t.allowedHosts?.includes(n.hostname))throw S("local-network HTTP must resolve to loopback or a private address");return n}async function Le(e,t={}){await Oe(e,t)}async function Oe(e,t={}){let n=e.hostname.toLowerCase().replace(/^\[|\]$/g,"");if(ut.has(n))throw S("cloud metadata destinations are forbidden");let r=new Set((t.allowedHosts??[]).map(s=>s.toLowerCase())),o=le(n)?[n]:dt(n)?[]:t.resolveHostname?await t.resolveHostname(n):(await Ln(n,{all:!0,verbatim:!0})).map(s=>s.address);if(!o.length&&!dt(n))throw S("DNS resolution returned no addresses");let i=t.profile??"public-https";for(let s of o){let a=mt(s);if(a==="link-local"||a==="unspecified")throw S(`DNS resolved to a forbidden ${a} address`);if(i==="public-https"&&a!=="public"&&!r.has(n))throw S(`DNS resolved public endpoint to ${a} address ${s}`);if(i==="local-network"&&e.protocol==="http:"&&a==="public"&&!r.has(n))throw S(`local-network HTTP resolved to public address ${s}`)}return o}import{request as $n}from"node:http";import{request as Nn}from"node:https";import{isIP as pt}from"node:net";import{once as Dn}from"node:events";function ft(e,t){return{dispatch(n,r){let o,i=!1,s=d=>{i||(i=!0,o?.destroy(),r.onError(d))},a=t[0];if(!a||!pt(a)||new URL(n.origin).origin!==e.origin)return queueMicrotask(()=>s(new Error("Provider connection has no authorized pinned address"))),!0;let l=n.headers??{},c=(e.protocol==="https:"?Nn:$n)(new URL(n.path,e.origin),{method:n.method,headers:l,agent:!1,rejectUnauthorized:!0,lookup:(d,u,m)=>{let p={address:a,family:pt(a)};typeof u=="object"&&u.all?m(null,[p]):m(null,a,p.family)}},d=>{o=d;let u=d.rawHeaders.map(p=>Buffer.from(p)),m=()=>d.resume();r.onHeaders(d.statusCode??500,u,m,d.statusMessage??"")===!1&&d.pause(),d.on("data",p=>{r.onData(p)||d.pause()}),d.on("end",()=>{i||(i=!0,r.onComplete(d.rawTrailers.map(p=>Buffer.from(p))))}),d.on("error",s),d.on("aborted",()=>s(new Error("Provider response was interrupted")))});return c.on("socket",d=>{d.once("connect",()=>{(!d.remoteAddress||ce(d.remoteAddress)!==ce(a))&&c.destroy(new Error("Provider socket did not connect to its authorized address"))})}),c.on("error",s),r.onConnect(d=>c.destroy(d??new Error("Provider request aborted"))),(async()=>{try{let d=n.body;if(typeof d=="string"||d instanceof Uint8Array)c.end(d);else{if(d)for await(let u of d){if(c.destroyed)return;c.write(u)||await Dn(c,"drain")}c.end()}}catch(d){c.destroy(d instanceof Error?d:new Error("Provider request body failed"))}})(),!0}}}var F={connectTimeoutMs:15e3,totalTimeoutMs:12e4,idleTimeoutMs:3e4,maxResponseBytes:8*1024*1024,maxHeaderBytes:64*1024,maxEventBytes:1024*1024};function jn(e={}){for(let[t,n]of Object.entries(e))if(n!==void 0&&(!Number.isSafeInteger(n)||n<1))throw v("provider-transport",`${t} must be a positive safe integer`);return{connectTimeoutMs:Math.max(100,e.connectTimeoutMs??F.connectTimeoutMs),totalTimeoutMs:Math.max(100,e.totalTimeoutMs??F.totalTimeoutMs),idleTimeoutMs:Math.max(100,e.idleTimeoutMs??F.idleTimeoutMs),maxResponseBytes:Math.max(1024,e.maxResponseBytes??F.maxResponseBytes),maxHeaderBytes:Math.max(1024,e.maxHeaderBytes??F.maxHeaderBytes),maxEventBytes:Math.max(1024,e.maxEventBytes??F.maxEventBytes)}}async function ee(e,t){let n,r=new Promise((o,i)=>{n=()=>i(new Error("Provider operation aborted")),t.addEventListener("abort",n,{once:!0}),t.aborted&&n()});try{return await Promise.race([e,r])}finally{t.removeEventListener("abort",n)}}function de(e,t,n,r){try{return e.decode(t,{stream:n})}catch{throw v(r,"response is not valid UTF-8")}}function $e(e,t,n){let r=new x(t==="cancelled"?"Provider request was cancelled":"Provider request timed out",{providerId:e,category:t,code:t==="cancelled"?"PROVIDER_CANCELLED":"PROVIDER_TIMEOUT",retryable:t==="timeout",...n!==void 0?{cause:n}:{}});return t==="cancelled"&&(r.name="AbortError"),r}function qn(e){let t=0;return e.forEach((n,r)=>{t+=Buffer.byteLength(r)+Buffer.byteLength(n)+4}),t}async function gt(e,t,n,r){if(!e.body)return"";let o=e.body.getReader(),i=new TextDecoder("utf-8",{fatal:!0}),s=0,a="",l,c=()=>{l&&clearTimeout(l),l=setTimeout(()=>r.abort("idle-timeout"),n.idleTimeoutMs)};c();try{for(;;){let{value:d,done:u}=await ee(o.read(),r.signal);if(u)break;if(c(),s+=d.byteLength,s>n.maxResponseBytes)throw v(t,`response exceeded ${n.maxResponseBytes} bytes`);a+=de(i,d,!0,t)}return a+=de(i,void 0,!1,t),a}finally{l&&clearTimeout(l),o.cancel().catch(()=>{}),o.releaseLock()}}async function yt(e,t,n,r){let o=Me.now(),i=jn(n.limits);H("xeno.provider.requests",1,{component:"provider_transport",provider:n.providerId,transport:"http"});let s=new AbortController,a=null,l=t.signal,c=()=>s.abort("caller");if(l?.aborted)throw $e(n.providerId,"cancelled");l?.addEventListener("abort",c,{once:!0});let d=setTimeout(()=>{a="total",s.abort("total-timeout")},i.totalTimeoutMs),u=setTimeout(()=>{a="connect",s.abort("connect-timeout")},i.connectTimeoutMs),m;try{let p=await ee(Oe(e,n.endpointPolicy),s.signal);if(s.signal.aborted)throw new Error("Provider request aborted before dispatch");let g={...t,signal:s.signal,redirect:"manual",dispatcher:ft(e,p)},y=fetch(e,g);y.then(w=>{s.signal.aborted&&w.body?.cancel().catch(()=>{})},()=>{});let f=await ee(y,s.signal);if(m=f,clearTimeout(u),qn(f.headers)>i.maxHeaderBytes)throw v(n.providerId,`response headers exceeded ${i.maxHeaderBytes} bytes`);if(f.redirected||f.status>=300&&f.status<400)throw new x("Provider redirects are disabled",{providerId:n.providerId,category:"endpoint_policy",code:"PROVIDER_ENDPOINT_REJECTED",statusCode:f.status});let P=f.headers.get("content-length");if(P&&/^\d+$/.test(P)&&Number(P)>i.maxResponseBytes)throw v(n.providerId,`response exceeded ${i.maxResponseBytes} bytes`);if(!f.ok){let w=await gt(f,n.providerId,i,s),I=w;try{I=w?JSON.parse(w):{}}catch{}throw Ie({providerId:n.providerId,statusCode:f.status,body:I,retryAfterMs:Ae(f.headers.get("retry-after")),requestId:f.headers.get("request-id")??f.headers.get("x-request-id")??void 0})}let C=await ee(r(f,s,i),s.signal);return H("xeno.provider.request_results",1,{component:"provider_transport",provider:n.providerId,transport:"http",outcome:"success"}),Ee("xeno.provider.request_duration_ms",Me.now()-o,{component:"provider_transport",provider:n.providerId,transport:"http",outcome:"success"}),C}catch(p){let g;throw p instanceof x?g=p:l?.aborted||s.signal.reason==="caller"?g=$e(n.providerId,"cancelled",p):a||s.signal.reason==="idle-timeout"?g=$e(n.providerId,"timeout",p):g=new x("Provider transport failed",{providerId:n.providerId,category:"transport",code:"PROVIDER_TRANSPORT_ERROR",retryable:!0,cause:p}),s.abort("request-failed"),m?.body&&!m.body.locked&&m.body.cancel().catch(()=>{}),H("xeno.provider.request_results",1,{component:"provider_transport",provider:n.providerId,transport:"http",outcome:"error",category:g.category,error_code:g.code}),Ee("xeno.provider.request_duration_ms",Me.now()-o,{component:"provider_transport",provider:n.providerId,transport:"http",outcome:"error",category:g.category}),g}finally{clearTimeout(u),clearTimeout(d),l?.removeEventListener("abort",c)}}async function Ne(e,t,n){return yt(e,t,n,async(r,o,i)=>{let s=await gt(r,n.providerId,i,o),a;try{a=s?JSON.parse(s):{}}catch(l){throw v(n.providerId,"body is not valid JSON",l)}if(!a||typeof a!="object"||Array.isArray(a))throw v(n.providerId,"JSON body must be an object");return a})}async function te(e,t,n,r){return yt(e,t,n,async(o,i,s)=>{if(!o.body)throw v(n.providerId,"stream response has no body");let a=o.body.getReader(),l=new TextDecoder("utf-8",{fatal:!0}),c="",d=0,u="message",m=[],p,g=()=>{p&&clearTimeout(p),p=setTimeout(()=>i.abort("idle-timeout"),s.idleTimeoutMs)},y=async()=>{if(m.length===0){u="message";return}let f=m.join(`
|
|
6
|
-
`);if(Buffer.byteLength(f)>s.maxEventBytes)throw v(n.providerId,`stream event exceeded ${s.maxEventBytes} bytes`);await r({event:u,data:f}),u="message",m=[]};g();try{for(;;){let{value:f,done:
|
|
7
|
-
`);if(C<0)break;let w=c.slice(0,C).replace(/\r$/,"");if(c=c.slice(C+1),!w)await y();else if(!w.startsWith(":")){let I=w.indexOf(":"),M=I<0?w:w.slice(0,I),tt=I<0?"":w.slice(I+1).replace(/^ /,"");M==="event"?u=tt:M==="data"&&m.push(tt)}}}if(c+=de(l,void 0,!1,n.providerId),c.trim())for(let f of c.split(/\r?\n/))f.startsWith("data:")?m.push(f.slice(5).replace(/^ /,"")):f.startsWith("event:")&&(u=f.slice(6).trim());await y()}finally{p&&clearTimeout(p),a.cancel().catch(()=>{}),a.releaseLock()}})}import{createHash as cr}from"node:crypto";import{isIP as ht}from"node:net";var ge=class extends Error{issues;constructor(t){super(`Invalid JSON Schema: ${t.map(n=>`${n.path||"#"} ${n.message}`).join("; ")}`),this.name="JsonSchemaCompilationError",this.issues=t}},je="https://json-schema.org/draft/2020-12/schema",Un=new Set(["string","number","integer","boolean","array","object","null"]),Jn=new Set(["$schema","$id","$anchor","$ref","$defs","$comment","title","description","default","examples","deprecated","readOnly","writeOnly","type","enum","const","multipleOf","maximum","exclusiveMaximum","minimum","exclusiveMinimum","maxLength","minLength","pattern","format","prefixItems","items","contains","minContains","maxContains","minItems","maxItems","uniqueItems","properties","patternProperties","additionalProperties","required","dependentRequired","minProperties","maxProperties","allOf","anyOf","oneOf","not"]),Pt=new Map([["date",e=>Tt(e)],["date-time",e=>sr(e)],["time",e=>kt(e)],["duration",e=>/^P(?!$)(?:\d+(?:[.,]\d+)?Y)?(?:\d+(?:[.,]\d+)?M)?(?:\d+(?:[.,]\d+)?W)?(?:\d+(?:[.,]\d+)?D)?(?:T(?=\d)(?:\d+(?:[.,]\d+)?H)?(?:\d+(?:[.,]\d+)?M)?(?:\d+(?:[.,]\d+)?S)?)?$/u.test(e)],["email",e=>bt(e)],["idn-email",e=>bt(e)],["hostname",e=>Ue(e)],["idn-hostname",e=>Ue(e)],["ipv4",e=>ht(e)===4],["ipv6",e=>ht(e)===6],["uuid",e=>/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/iu.test(e)],["uri",e=>wt(e)],["iri",e=>wt(e)],["uri-reference",e=>vt(e)],["iri-reference",e=>vt(e)],["uri-template",e=>ar(e)],["json-pointer",e=>/^(?:\/(?:[^~/]|~[01])*)*$/u.test(e)],["relative-json-pointer",e=>/^(?:0|[1-9]\d*)(?:#|(?:\/(?:[^~/]|~[01])*)*)$/u.test(e)],["regex",(e,t)=>Xe(e,t.maxPatternLength)!==void 0]]);function Xn(e={}){return{strictKeywords:e.strictKeywords??!0,assertFormats:e.assertFormats??!1,maxSchemaDepth:U(e.maxSchemaDepth,64,1,256,"maxSchemaDepth"),maxSchemaNodes:U(e.maxSchemaNodes,4096,1,1e5,"maxSchemaNodes"),maxReferences:U(e.maxReferences,512,0,1e4,"maxReferences"),maxPatternLength:U(e.maxPatternLength,256,1,4096,"maxPatternLength"),maxValidationDepth:U(e.maxValidationDepth,128,1,1024,"maxValidationDepth"),maxValidationSteps:U(e.maxValidationSteps,1e5,100,1e7,"maxValidationSteps"),maxValidationErrors:U(e.maxValidationErrors,64,1,1024,"maxValidationErrors"),maxInputBytes:U(e.maxInputBytes,16*1024*1024,1024,256*1024*1024,"maxInputBytes")}}function U(e,t,n,r,o){let i=e??t;if(!Number.isInteger(i)||i<n||i>r)throw new TypeError(`${o} must be an integer from ${n} to ${r}.`);return i}function Vn(e,t={}){let n={root:e,options:Xn(t),issues:[],rawByPointer:new Map,anchors:new Map,compiledByPointer:new Map,schemaNodes:0,references:0,nextNodeId:1};pe(e,"",0,n);let r=X(e,"",0,n);if(n.issues.length>0||!r)throw new ge(n.issues);return Object.freeze({dialect:je,formatAssertion:n.options.assertFormats,validate(o){let i=[],s=qe(o);if(s)return i.push({path:s.path,keyword:"type",schemaPath:"#",message:s.message}),{valid:!1,errors:i,steps:0,truncated:!1};let a=JSON.stringify(o),l=Buffer.byteLength(a??"null","utf8");if(l>n.options.maxInputBytes)return i.push({path:"",keyword:"maxInputBytes",schemaPath:"#",message:`input is ${l} bytes; limit is ${n.options.maxInputBytes}`}),{valid:!1,errors:i,steps:0,truncated:!1};let c={options:n.options,errors:i,budget:{steps:0,exhausted:!1},activePairs:new Set,objectIds:new WeakMap,nextObjectId:{value:1}};return $(o,r,"",0,c),{valid:i.length===0,errors:i,steps:c.budget.steps,truncated:c.budget.exhausted||i.length>=n.options.maxValidationErrors}}})}function xt(e,t={}){if(!E(e)||e.type!=="object"||!E(e.properties))throw new ge([{path:"#",keyword:"type",message:"tool input schema root must declare type object and a properties object"}]);return Vn(e,t)}function pe(e,t,n,r){if(n>r.options.maxSchemaDepth){h(r,t,void 0,`schema depth exceeds ${r.options.maxSchemaDepth}`);return}if(typeof e!="boolean"&&!E(e)){h(r,t,void 0,"schema must be an object or boolean");return}if(!r.rawByPointer.has(t)){if(r.schemaNodes+=1,r.schemaNodes>r.options.maxSchemaNodes){h(r,t,void 0,`schema node count exceeds ${r.options.maxSchemaNodes}`);return}if(r.rawByPointer.set(t,e),typeof e!="boolean"){e.$anchor!==void 0&&(typeof e.$anchor!="string"||!/^[A-Za-z][A-Za-z0-9._:-]*$/u.test(e.$anchor)?h(r,t,"$anchor","$anchor must be a valid plain-name anchor"):r.anchors.has(e.$anchor)?h(r,t,"$anchor",`duplicate anchor ${e.$anchor}`):r.anchors.set(e.$anchor,t));for(let o of["$defs","properties","patternProperties"]){let i=e[o];if(i!==void 0){if(!E(i)){h(r,t,o,`${o} must be an object`);continue}for(let[s,a]of Object.entries(i))pe(a,N(t,o,s),n+1,r)}}for(let o of["items","contains","additionalProperties","not"])e[o]!==void 0&&pe(e[o],N(t,o),n+1,r);for(let o of["prefixItems","allOf","anyOf","oneOf"]){let i=e[o];if(i!==void 0){if(!Array.isArray(i)){h(r,t,o,`${o} must be an array of schemas`);continue}i.forEach((s,a)=>pe(s,N(t,o,String(a)),n+1,r))}}}}}function X(e,t,n,r){let o=r.compiledByPointer.get(t);if(o)return o;if(typeof e!="boolean"&&!E(e))return;let i={id:r.nextNodeId++,schemaPath:St(t)};if(r.compiledByPointer.set(t,i),typeof e=="boolean")return i.boolean=e,i;if(Bn(e,t,r),Hn(e,t,r),e.$schema!==void 0&&(t!==""||e.$schema!==je&&e.$schema!==`${je}#`)&&h(r,t,"$schema",t===""?`unsupported dialect ${String(e.$schema)}`:"$schema is only supported at the root"),e.$id!==void 0&&typeof e.$id!="string"&&h(r,t,"$id","$id must be a string"),e.$ref!==void 0)if(typeof e.$ref!="string")h(r,t,"$ref","$ref must be a string");else{r.references+=1,r.references>r.options.maxReferences&&h(r,t,"$ref",`reference count exceeds ${r.options.maxReferences}`);let s=Gn(e.$ref,t,r);if(s!==void 0){let a=r.rawByPointer.get(s);a===void 0?h(r,t,"$ref",`unresolved local reference ${e.$ref}`):i.ref=X(a,s,n+1,r)}}if(i.types=zn(e.type,t,r),e.enum!==void 0){let s=e.enum;!Array.isArray(s)||s.length===0?h(r,t,"enum","enum must be a non-empty array"):s.some((a,l)=>s.some((c,d)=>d<l&&Q(a,c)))?h(r,t,"enum","enum values must be unique"):s.some(a=>qe(a))?h(r,t,"enum","enum values must be JSON values"):i.enumValues=s}if(Object.prototype.hasOwnProperty.call(e,"const")&&(qe(e.const)?h(r,t,"const","const must be a JSON value"):(i.hasConst=!0,i.constValue=e.const)),i.multipleOf=Wn(e.multipleOf,t,"multipleOf",r),i.maximum=ne(e.maximum,t,"maximum",r),i.exclusiveMaximum=ne(e.exclusiveMaximum,t,"exclusiveMaximum",r),i.minimum=ne(e.minimum,t,"minimum",r),i.exclusiveMinimum=ne(e.exclusiveMinimum,t,"exclusiveMinimum",r),i.maxLength=J(e.maxLength,t,"maxLength",r),i.minLength=J(e.minLength,t,"minLength",r),i.minItems=J(e.minItems,t,"minItems",r),i.maxItems=J(e.maxItems,t,"maxItems",r),i.minContains=J(e.minContains,t,"minContains",r),i.maxContains=J(e.maxContains,t,"maxContains",r),i.minProperties=J(e.minProperties,t,"minProperties",r),i.maxProperties=J(e.maxProperties,t,"maxProperties",r),Yn(i,t,r),e.pattern!==void 0)if(typeof e.pattern!="string")h(r,t,"pattern","pattern must be a string");else{let s=Xe(e.pattern,r.options.maxPatternLength);s?i.pattern={source:e.pattern,regex:s}:h(r,t,"pattern","pattern is invalid or outside the safe regex subset")}if(e.format!==void 0&&(typeof e.format!="string"?h(r,t,"format","format must be a string"):r.options.assertFormats&&!Pt.has(e.format)?h(r,t,"format",`unsupported asserted format ${e.format}`):i.format=e.format),i.prefixItems=me(e.prefixItems,t,"prefixItems",n,r,!0),i.items=ue(e.items,t,"items",n,r),i.contains=ue(e.contains,t,"contains",n,r),(e.minContains!==void 0||e.maxContains!==void 0)&&e.contains===void 0&&h(r,t,"contains","minContains/maxContains require contains"),e.uniqueItems!==void 0&&(typeof e.uniqueItems!="boolean"?h(r,t,"uniqueItems","uniqueItems must be boolean"):i.uniqueItems=e.uniqueItems),i.properties=Kn(e.properties,t,"properties",n,r),i.patternProperties=Fn(e.patternProperties,t,n,r),i.additionalProperties=ue(e.additionalProperties,t,"additionalProperties",n,r),i.required=Rt(e.required,t,"required",r,!0),i.dependentRequired=Qn(e.dependentRequired,t,r),i.allOf=me(e.allOf,t,"allOf",n,r,!1),i.anyOf=me(e.anyOf,t,"anyOf",n,r,!1),i.oneOf=me(e.oneOf,t,"oneOf",n,r,!1),i.not=ue(e.not,t,"not",n,r),E(e.$defs))for(let[s,a]of Object.entries(e.$defs))X(a,N(t,"$defs",s),n+1,r);return i}function Bn(e,t,n){if(n.options.strictKeywords)for(let r of Object.keys(e))!Jn.has(r)&&!r.startsWith("x-")&&h(n,t,r,`unsupported keyword ${r}`)}function Hn(e,t,n){for(let r of["$comment","title","description"])e[r]!==void 0&&typeof e[r]!="string"&&h(n,t,r,`${r} must be a string`);for(let r of["deprecated","readOnly","writeOnly"])e[r]!==void 0&&typeof e[r]!="boolean"&&h(n,t,r,`${r} must be boolean`);e.examples!==void 0&&!Array.isArray(e.examples)&&h(n,t,"examples","examples must be an array")}function zn(e,t,n){if(e===void 0)return;let r=Array.isArray(e)?e:[e];if(r.length===0||r.some(o=>typeof o!="string"||!Un.has(o))){h(n,t,"type","type must be a recognized type or non-empty unique type array");return}return new Set(r).size!==r.length&&h(n,t,"type","type array must not contain duplicates"),r}function ue(e,t,n,r,o){if(e!==void 0)return X(e,N(t,n),r+1,o)}function me(e,t,n,r,o,i){if(e!==void 0){if(!Array.isArray(e)||!i&&e.length===0){h(o,t,n,`${n} must be ${i?"an array":"a non-empty array"} of schemas`);return}return e.map((s,a)=>X(s,N(t,n,String(a)),r+1,o)).filter(s=>!!s)}}function Kn(e,t,n,r,o){if(e===void 0)return;if(!E(e)){h(o,t,n,`${n} must be an object of schemas`);return}let i=new Map;for(let[s,a]of Object.entries(e)){let l=X(a,N(t,n,s),r+1,o);l&&i.set(s,l)}return i}function Fn(e,t,n,r){if(e===void 0)return;if(!E(e)){h(r,t,"patternProperties","patternProperties must be an object of schemas");return}let o=[];for(let[i,s]of Object.entries(e)){let a=Xe(i,r.options.maxPatternLength);if(!a){h(r,t,"patternProperties",`pattern ${JSON.stringify(i)} is invalid or outside the safe regex subset`);continue}let l=X(s,N(t,"patternProperties",i),n+1,r);l&&o.push({pattern:{source:i,regex:a},schema:l})}return o}function Qn(e,t,n){if(e===void 0)return;if(!E(e)){h(n,t,"dependentRequired","dependentRequired must be an object");return}let r=new Map;for(let[o,i]of Object.entries(e)){let s=Rt(i,N(t,"dependentRequired",o),"dependentRequired",n,!0);s&&r.set(o,s)}return r}function Rt(e,t,n,r,o){if(e!==void 0){if(!Array.isArray(e)||e.some(i=>typeof i!="string")){h(r,t,n,`${n} must be an array of strings`);return}return o&&new Set(e).size!==e.length&&h(r,t,n,`${n} values must be unique`),e}}function Wn(e,t,n,r){let o=ne(e,t,n,r);return o!==void 0&&o<=0&&h(r,t,n,`${n} must be greater than zero`),o!==void 0&&o>0?o:void 0}function ne(e,t,n,r){if(e!==void 0){if(typeof e!="number"||!Number.isFinite(e)){h(r,t,n,`${n} must be a finite number`);return}return e}}function J(e,t,n,r){if(e!==void 0){if(!Number.isSafeInteger(e)||e<0){h(r,t,n,`${n} must be a non-negative safe integer`);return}return e}}function Yn(e,t,n){for(let[r,o,i]of[[e.minLength,e.maxLength,"length"],[e.minItems,e.maxItems,"items"],[e.minContains,e.maxContains,"contains"],[e.minProperties,e.maxProperties,"properties"]])r!==void 0&&o!==void 0&&r>o&&h(n,t,i,`minimum ${i} exceeds maximum`)}function Gn(e,t,n){if(!e.startsWith("#")){h(n,t,"$ref","remote and file references are not supported");return}if(e==="#")return"";if(e.startsWith("#/")){let s=`/${e.slice(2).split("/").map(a=>a.replace(/~1/g,"/").replace(/~0/g,"~")).map(_t).join("/")}`;return n.rawByPointer.has(s)||h(n,t,"$ref",`unresolved JSON Pointer ${e}`),s}let r=e.slice(1),o=n.anchors.get(r);return o===void 0&&h(n,t,"$ref",`unresolved anchor ${e}`),o}function $(e,t,n,r,o){if(!Ct(o)||o.errors.length>=o.options.maxValidationErrors)return;if(r>o.options.maxValidationDepth){T(o,n,"maxDepth",t,`validation depth exceeds ${o.options.maxValidationDepth}`);return}if(t.boolean!==void 0){t.boolean||T(o,n,"falseSchema",t,"is rejected by the false schema");return}let i=or(t,e,o);if(!o.activePairs.has(i)){o.activePairs.add(i);try{if(t.ref&&$(e,t.ref,n,r+1,o),t.enumValues&&!t.enumValues.some(s=>Q(s,e))&&T(o,n,"enum",t,`expected one of ${t.enumValues.map(Je).join(", ")} but got ${De(e)}`),t.hasConst&&!Q(t.constValue,e)&&T(o,n,"const",t,`expected ${Je(t.constValue)} but got ${De(e)}`),t.types&&!t.types.some(s=>ir(e,s))){let s=t.types.length===1?t.types[0]:`one of [${t.types.join(", ")}]`;T(o,n,"type",t,`expected type ${s} but got ${De(e)}`);return}Zn(e,t,n,r,o),typeof e=="number"&&er(e,t,n,o),typeof e=="string"&&tr(e,t,n,o),Array.isArray(e)&&nr(e,t,n,r,o),E(e)&&rr(e,t,n,r,o)}finally{o.activePairs.delete(i)}}}function Zn(e,t,n,r,o){for(let i of t.allOf??[])$(e,i,n,r+1,o);if(t.anyOf&&t.anyOf.filter(s=>fe(e,s,n,r+1,o)).length===0&&T(o,n,"anyOf",t,"must match at least one anyOf branch"),t.oneOf){let i=t.oneOf.filter(s=>fe(e,s,n,r+1,o)).length;i!==1&&T(o,n,"oneOf",t,`must match exactly one oneOf branch; matched ${i}`)}t.not&&fe(e,t.not,n,r+1,o)&&T(o,n,"not",t,"must not match the disallowed schema")}function er(e,t,n,r){t.multipleOf!==void 0&&!lr(e,t.multipleOf)&&T(r,n,"multipleOf",t,`must be a multiple of ${t.multipleOf}`),t.maximum!==void 0&&e>t.maximum&&T(r,n,"maximum",t,`must be <= ${t.maximum}`),t.exclusiveMaximum!==void 0&&e>=t.exclusiveMaximum&&T(r,n,"exclusiveMaximum",t,`must be < ${t.exclusiveMaximum}`),t.minimum!==void 0&&e<t.minimum&&T(r,n,"minimum",t,`must be >= ${t.minimum}`),t.exclusiveMinimum!==void 0&&e<=t.exclusiveMinimum&&T(r,n,"exclusiveMinimum",t,`must be > ${t.exclusiveMinimum}`)}function tr(e,t,n,r){let o=[...e].length;if(t.minLength!==void 0&&o<t.minLength&&T(r,n,"minLength",t,`must contain at least ${t.minLength} Unicode code points`),t.maxLength!==void 0&&o>t.maxLength&&T(r,n,"maxLength",t,`must contain at most ${t.maxLength} Unicode code points`),t.pattern&&!t.pattern.regex.test(e)&&T(r,n,"pattern",t,`must match pattern ${JSON.stringify(t.pattern.source)}`),t.format&&r.options.assertFormats){let i=Pt.get(t.format);i&&!i(e,r.options)&&T(r,n,"format",t,`must match format ${t.format}`)}}function nr(e,t,n,r,o){if(t.minItems!==void 0&&e.length<t.minItems&&T(o,n,"minItems",t,`must contain at least ${t.minItems} items`),t.maxItems!==void 0&&e.length>t.maxItems&&T(o,n,"maxItems",t,`must contain at most ${t.maxItems} items`),t.uniqueItems)e:for(let s=0;s<e.length;s+=1)for(let a=0;a<s;a+=1){if(!Ct(o))break e;if(Q(e[s],e[a])){T(o,L(n,String(s)),"uniqueItems",t,`duplicates item ${a}`);break e}}let i=t.prefixItems?.length??0;if(t.prefixItems?.forEach((s,a)=>{a<e.length&&$(e[a],s,L(n,String(a)),r+1,o)}),t.items)for(let s=i;s<e.length;s+=1)$(e[s],t.items,L(n,String(s)),r+1,o);if(t.contains){let s=0;for(let l=0;l<e.length;l+=1)fe(e[l],t.contains,L(n,String(l)),r+1,o)&&(s+=1);let a=t.minContains??1;s<a&&T(o,n,"minContains",t,`contains matched ${s} items; minimum is ${a}`),t.maxContains!==void 0&&s>t.maxContains&&T(o,n,"maxContains",t,`contains matched ${s} items; maximum is ${t.maxContains}`)}}function rr(e,t,n,r,o){let i=Object.keys(e);t.minProperties!==void 0&&i.length<t.minProperties&&T(o,n,"minProperties",t,`must contain at least ${t.minProperties} properties`),t.maxProperties!==void 0&&i.length>t.maxProperties&&T(o,n,"maxProperties",t,`must contain at most ${t.maxProperties} properties`);for(let s of t.required??[])Object.prototype.hasOwnProperty.call(e,s)||T(o,L(n,s),"required",t,"is required");for(let[s,a]of t.dependentRequired??[])if(Object.prototype.hasOwnProperty.call(e,s))for(let l of a)Object.prototype.hasOwnProperty.call(e,l)||T(o,L(n,l),"dependentRequired",t,`is required when ${s} is present`);for(let s of i){let a=!1,l=t.properties?.get(s);l&&(a=!0,$(e[s],l,L(n,s),r+1,o));for(let c of t.patternProperties??[])c.pattern.regex.test(s)&&(a=!0,$(e[s],c.schema,L(n,s),r+1,o));!a&&t.additionalProperties&&$(e[s],t.additionalProperties,L(n,s),r+1,o)}}function fe(e,t,n,r,o){let i={...o,errors:[],activePairs:new Set(o.activePairs)};return $(e,t,n,r,i),i.errors.length===0&&!i.budget.exhausted}function Ct(e){return e.budget.steps+=1,e.budget.steps<=e.options.maxValidationSteps?!0:(e.budget.exhausted||(e.budget.exhausted=!0,T(e,"","maxValidationSteps",{schemaPath:"#"},`validation steps exceed ${e.options.maxValidationSteps}`)),!1)}function T(e,t,n,r,o){e.errors.length>=e.options.maxValidationErrors||e.errors.push({path:t,keyword:n,schemaPath:r.schemaPath,message:o})}function or(e,t,n){if(t!==null&&typeof t=="object"){let r=n.objectIds.get(t);return r===void 0&&(r=n.nextObjectId.value++,n.objectIds.set(t,r)),`${e.id}:object:${r}`}return`${e.id}:${typeof t}:${Je(t)}`}function ir(e,t){switch(t){case"string":return typeof e=="string";case"number":return typeof e=="number"&&Number.isFinite(e);case"integer":return typeof e=="number"&&Number.isSafeInteger(e);case"boolean":return typeof e=="boolean";case"array":return Array.isArray(e);case"object":return E(e);case"null":return e===null}}function qe(e){let t=new WeakSet,n=(r,o)=>{if(r===null||typeof r=="string"||typeof r=="boolean")return;if(typeof r=="number")return Number.isFinite(r)?void 0:{path:o,message:"must be a finite JSON number"};if(typeof r!="object")return{path:o,message:`must be a JSON value, not ${typeof r}`};if(t.has(r))return{path:o,message:"must not contain cyclic references"};t.add(r);let i=Array.isArray(r)?r.entries():Object.entries(r);for(let[s,a]of i){let l=n(a,L(o,String(s)));if(l)return l}t.delete(r)};return n(e,"")}function Xe(e,t){if(!([...e].length>t)&&!/\\(?:[1-9]|k<)/u.test(e)&&!/\(\?<(?:[=!]|[A-Za-z])/u.test(e)&&!/\((?:[^()\\]|\\.)*[+*{](?:[^()\\]|\\.)*\)[+*{?]/u.test(e))try{return new RegExp(e,"u")}catch{return}}function Tt(e){let t=/^(\d{4})-(\d{2})-(\d{2})$/u.exec(e);if(!t)return!1;let n=new Date(Date.UTC(Number(t[1]),Number(t[2])-1,Number(t[3])));return n.getUTCFullYear()===Number(t[1])&&n.getUTCMonth()===Number(t[2])-1&&n.getUTCDate()===Number(t[3])}function kt(e){let t=/^(\d{2}):(\d{2}):(\d{2})(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})$/u.exec(e);return t?Number(t[1])<=23&&Number(t[2])<=59&&Number(t[3])<=60:!1}function sr(e){let t=/^([^Tt ]+)[Tt ](.+)$/u.exec(e);return!!(t&&Tt(t[1])&&kt(t[2]))}function bt(e){if([...e].length>254||/[\s<>(),;:\\"\[\]]/u.test(e))return!1;let t=e.lastIndexOf("@");return t>0&&t<e.length-1&&[...e.slice(0,t)].length<=64&&Ue(e.slice(t+1))}function Ue(e){if([...e].length>253)return!1;let t=e.endsWith(".")?e.slice(0,-1):e;return t.length>0&&t.split(".").every(n=>n.length>0&&n.length<=63&&!n.startsWith("-")&&!n.endsWith("-")&&/^[\p{L}\p{N}-]+$/u.test(n))}function wt(e){try{return!!(new URL(e).protocol&&!/\s/u.test(e))}catch{return!1}}function vt(e){try{return new URL(e,"https://xeno.invalid/"),!/\s/u.test(e)}catch{return!1}}function ar(e){let t=0;for(let n of e)if(n==="{"&&(t+=1),n==="}"&&(t-=1),t<0||t>1)return!1;return t===0&&![...e].some(n=>{let r=n.codePointAt(0);return r<=31||r===127})}function lr(e,t){let n=e/t;return Math.abs(n-Math.round(n))<=Number.EPSILON*Math.max(1,Math.abs(n))*8}function E(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Q(e,t){if(Object.is(e,t))return!0;if(typeof e!=typeof t||e===null||t===null)return!1;if(Array.isArray(e)&&Array.isArray(t))return e.length===t.length&&e.every((n,r)=>Q(n,t[r]));if(E(e)&&E(t)){let n=Object.keys(e),r=Object.keys(t);return n.length===r.length&&n.every(o=>Object.prototype.hasOwnProperty.call(t,o)&&Q(e[o],t[o]))}return!1}function L(e,t){let n=/^[A-Za-z_$][A-Za-z0-9_$]*$/u.test(t)?t:`[${JSON.stringify(t)}]`;return e.length===0?n:n.startsWith("[")?`${e}${n}`:`${e}.${n}`}function N(e,...t){return`${e}/${t.map(_t).join("/")}`}function _t(e){return e.replace(/~/g,"~0").replace(/\//g,"~1")}function St(e){return e.length===0?"#":`#${e}`}function h(e,t,n,r){e.issues.length>=64||e.issues.push({path:St(t),...n?{keyword:n}:{},message:r})}function De(e){return e===null?"null":Array.isArray(e)?"array":typeof e=="number"?Number.isSafeInteger(e)?"integer":"number":typeof e}function Je(e){try{let t=JSON.stringify(e);return t===void 0?String(e):t}catch{return String(e)}}var _=class extends Error{dialect;path;constructor(t,n,r){super(`Tool schema cannot be projected to ${t} at ${n}: ${r}`),this.name="ToolSchemaProjectionError",this.dialect=t,this.path=n}},Et=new Set(["$schema","$id","$anchor","$defs","$comment","title","default","examples","deprecated","readOnly","writeOnly"]),dr=new Set(["type","description","enum","format","properties","required","items","minItems","maxItems","minLength","maxLength","minimum","maximum","anyOf"]);function It(e,t){xt(e);let n=Be(e),r=n,o=At(n);if(t==="xeno")return{schema:n,dialect:t,canonicalSha256:o,projectedSha256:o,changes:[]};let i={dialect:t,root:r,pointers:new Map,anchors:new Map,changes:[],activeReferences:new Set};ye(r,"",i);let s=V(r,"#",i);if(!W(s))throw new _(t,"#","provider tool root must remain an object schema");return ur(n,s,t),{schema:s,dialect:t,canonicalSha256:o,projectedSha256:At(s),changes:i.changes}}function he(e,t){return e.map(n=>{let r=It(n.input_schema,t);return{definition:{...n,input_schema:r.schema},projection:r}})}function V(e,t,n){if(typeof e=="boolean"){if(n.dialect!=="google")return e;if(e)return{};throw new _(n.dialect,t,"false schemas are not representable by this provider")}if(typeof e.$ref=="string"){let o=mr(e.$ref,t,n);if(n.activeReferences.has(e.$ref))throw new _(n.dialect,t,`recursive reference ${e.$ref} cannot be serialized safely`);let i=Object.fromEntries(Object.entries(e).filter(([a])=>a!=="$ref"&&!Et.has(a)));if(Object.keys(i).length>0){if(n.dialect==="google")throw new _(n.dialect,t,"$ref siblings require an unsupported intersection");n.activeReferences.add(e.$ref);let a=V(o,`${t}/$ref`,n);n.activeReferences.delete(e.$ref);let l=V(i,t,n);return n.changes.push({path:t,keyword:"$ref",action:"transformed",reason:"inlined local reference with sibling intersection"}),{allOf:[a,l]}}n.activeReferences.add(e.$ref);let s=V(o,`${t}/$ref`,n);return n.activeReferences.delete(e.$ref),n.changes.push({path:t,keyword:"$ref",action:"transformed",reason:"inlined local reference"}),s}let r={};for(let[o,i]of Object.entries(e))if(o!=="$ref"){if(Et.has(o)||o.startsWith("x-")){o==="description"?r.description=i:n.changes.push({path:t,keyword:o,action:"omitted",reason:"provider wire metadata is not required for canonical validation"});continue}if(n.dialect==="google"&&!dr.has(o)){if(o==="const"){r.enum=[Be(i)],n.changes.push({path:t,keyword:o,action:"transformed",reason:"Google wire schema represents const as a single-value enum"});continue}if(o==="prefixItems")throw new _(n.dialect,t,"tuple prefixItems cannot preserve the provider structural contract");n.changes.push({path:t,keyword:o,action:"omitted",reason:"constraint remains enforced by canonical local validation"});continue}if(o==="type"&&n.dialect==="google"&&Array.isArray(i)){let s=i.filter(a=>a!=="null");if(s.length!==1||i.length!==2)throw new _(n.dialect,t,"type union cannot be represented without weakening structure");r.type=s[0],r.nullable=!0,n.changes.push({path:t,keyword:o,action:"transformed",reason:"nullable two-type union mapped to Google nullable"});continue}if(o==="properties"||o==="patternProperties"||o==="$defs"){if(!W(i))throw new _(n.dialect,t,`${o} must be an object`);let s={};for(let[a,l]of Object.entries(i))s[a]=V(l,`${t}/${o}/${He(a)}`,n);r[o]=s;continue}if(["items","contains","additionalProperties","not"].includes(o)){r[o]=V(i,`${t}/${o}`,n);continue}if(["prefixItems","allOf","anyOf","oneOf"].includes(o)){if(!Array.isArray(i))throw new _(n.dialect,t,`${o} must be an array`);r[o]=i.map((s,a)=>V(s,`${t}/${o}/${a}`,n));continue}r[o]=Be(i)}if(n.dialect==="google"){let o=e.type!==void 0||e.properties!==void 0||e.items!==void 0,i=r.type!==void 0||r.properties!==void 0||r.items!==void 0;if(!o&&(e.oneOf!==void 0||e.allOf!==void 0||e.not!==void 0)||o&&!i)throw new _(n.dialect,t,"minimum structural contract cannot be represented")}return r}function ur(e,t,n){if(t.type!=="object"||!W(t.properties))throw new _(n,"#","root object/properties contract changed");let r=Object.keys(e.properties).sort(),o=Object.keys(t.properties).sort();if(JSON.stringify(r)!==JSON.stringify(o))throw new _(n,"#","root property identity changed");let i=[...e.required??[]].sort(),s=Array.isArray(t.required)?[...t.required].sort():[];if(JSON.stringify(i)!==JSON.stringify(s))throw new _(n,"#","root required-property contract changed")}function ye(e,t,n){if(n.pointers.set(t,e),typeof e!="boolean"){typeof e.$anchor=="string"&&n.anchors.set(e.$anchor,e);for(let r of["$defs","properties","patternProperties"]){let o=e[r];if(W(o))for(let[i,s]of Object.entries(o))ye(s,`${t}/${r}/${He(i)}`,n)}for(let r of["items","contains","additionalProperties","not"]){let o=e[r];(typeof o=="boolean"||W(o))&&ye(o,`${t}/${r}`,n)}for(let r of["prefixItems","allOf","anyOf","oneOf"]){let o=e[r];Array.isArray(o)&&o.forEach((i,s)=>ye(i,`${t}/${r}/${s}`,n))}}}function mr(e,t,n){if(!e.startsWith("#"))throw new _(n.dialect,t,"remote references are forbidden");if(e==="#")return n.root;if(e.startsWith("#/")){let r=e.slice(1).split("/").map(i=>i.replace(/~1/g,"/").replace(/~0/g,"~")).map(He).join("/"),o=n.pointers.get(r);if(o!==void 0)return o}else{let r=n.anchors.get(e.slice(1));if(r!==void 0)return r}throw new _(n.dialect,t,`unresolved reference ${e}`)}function At(e){return cr("sha256").update(Ve(e)).digest("hex")}function Ve(e){return Array.isArray(e)?`[${e.map(Ve).join(",")}]`:W(e)?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Ve(e[t])}`).join(",")}}`:JSON.stringify(e)}function Be(e){return JSON.parse(JSON.stringify(e))}function He(e){return e.replace(/~/g,"~0").replace(/\//g,"~1")}function W(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var pr={anthropic:{streaming:!1,textInput:!0,imageInput:!0,tools:!0,parallelToolCalls:!0,structuredOutput:!1,reasoningMetadata:!1,usageAccounting:!0,cancellation:!0,retryAfter:!0,promptCaching:!1},"openai-responses":{streaming:!1,textInput:!0,imageInput:!0,tools:!0,parallelToolCalls:!0,structuredOutput:!1,reasoningMetadata:!1,usageAccounting:!0,cancellation:!0,retryAfter:!0,promptCaching:!1},google:{streaming:!1,textInput:!0,imageInput:!0,tools:!0,parallelToolCalls:!0,structuredOutput:!1,reasoningMetadata:!1,usageAccounting:!0,cancellation:!0,retryAfter:!0,promptCaching:!1}};function Mt(e){let t=e.kind==="anthropic"?"https://api.anthropic.com":e.kind==="google"?"https://generativelanguage.googleapis.com":e.kind==="openai-responses"?"https://api.openai.com":null;if(!e.baseURL&&!t)throw new x("Generic OpenAI-compatible providers require baseURL",{category:"endpoint_policy",code:"PROVIDER_ENDPOINT_REJECTED"});let n=K(e.baseURL??t,{profile:e.endpointProfile,allowedHosts:e.allowedHosts,resolveHostname:e.resolveHostname});return n.pathname=n.pathname.replace(/\/$/,""),n}function re(e,t){let n=new URL(e.toString());return n.pathname=`${n.pathname.replace(/\/$/,"")}/${t.replace(/^\//,"")}`,n}function $t(e){let t=e.authentication??{type:"bearer"};if(t.type==="none"||!e.apiKey)return{};if(t.type==="bearer")return{authorization:`Bearer ${e.apiKey}`};let n=t.header.trim().toLowerCase(),r=new Set(["host","content-length","connection","transfer-encoding","cookie","set-cookie","proxy-authorization"]);if(!/^[a-z0-9-]{1,80}$/.test(n)||r.has(n))throw new x("Generic provider authentication header is invalid",{category:"endpoint_policy",code:"PROVIDER_ENDPOINT_REJECTED"});let o=t.prefix??"";if(/[\r\n]/.test(o))throw new x("Generic provider authentication prefix is invalid",{category:"endpoint_policy",code:"PROVIDER_ENDPOINT_REJECTED"});return{[n]:`${o}${e.apiKey}`}}function fr(e){let t;if(e.kind==="openai-compatible"){if(!e.capabilityProfile)throw new x("Generic OpenAI-compatible providers require an explicit capabilityProfile",{category:"unsupported_capability",code:"PROVIDER_CAPABILITY_UNSUPPORTED"});t={...e.capabilityProfile};for(let n of["structuredOutput","promptCaching"])if(t[n])throw z("direct-openai-compatible",n);if(!!e.streaming!=!!t.streaming)throw new x("Generic endpoint streaming config must match capabilityProfile.streaming",{category:"unsupported_capability",code:"PROVIDER_CAPABILITY_UNSUPPORTED"})}else t={...pr[e.kind],streaming:!!e.streaming,reasoningMetadata:e.kind==="anthropic"&&!!e.streaming};return{...t,vision:t.imageInput}}function oe(e,t){return{providerId:t,endpointPolicy:{profile:e.endpointProfile,allowedHosts:e.allowedHosts,resolveHostname:e.resolveHostname},limits:e.transportLimits}}function Nt(e){let t=/^data:([^;,]+);base64,([a-z0-9+/=\r\n]+)$/i.exec(e);return t?{mediaType:t[1],data:t[2].replace(/\s/g,"")}:null}function ie(e){let t=Array.isArray(e.assistant_content)?e.assistant_content:[],n=Array.isArray(e.assistant_only_content)?e.assistant_only_content:[];return[...t,...n].filter(r=>r?.type==="image_url")}function Dt(e){return e.filter(t=>t?.type==="image_url")}function jt(e){return e.some(t=>Array.isArray(t.content)&&t.content.some(n=>n.type==="image_url"||n.type==="tool_result"&&ie(n).length>0))}function Lt(e){let t=Nt(e.image_url.url);return t?{type:"image",source:{type:"base64",media_type:t.mediaType,data:t.data}}:{type:"image",source:{type:"url",url:e.image_url.url}}}function gr(e){return e.map(t=>({role:t.role,content:typeof t.content=="string"?t.content:t.content.flatMap(n=>{if(n.type==="image_url")return[Lt(n)];if(n.type==="text")return[n];if(n.type==="tool_use")return[{type:"tool_use",id:n.id,name:n.name,input:n.input}];let r=ie(n),o=[{type:"text",text:Z(n.content)}];return o.push(...r.map(Lt)),[{type:"tool_result",tool_use_id:n.tool_use_id,content:o,is_error:n.is_error}]})}))}function yr(e){return{type:"input_image",image_url:e.image_url.url,detail:e.image_url.detail??"auto"}}function hr(e){let t=[];for(let n of e){if(typeof n.content=="string"){t.push({role:n.role,content:n.content});continue}let r=n.content.filter(i=>i.type==="text").map(i=>i.text).join(`
|
|
5
|
+
`).trim()}function Z(e){return typeof e=="string"?e:wn(e)}import{performance as $e}from"node:perf_hooks";var vn=1;var Pn=12,xn=128,Rn=/^xeno\.[a-z0-9]+(?:[._][a-z0-9]+)*$/u,Cn=/^[a-z0-9]+(?:[._-][a-z0-9]+)*$/u,Tn=/(?:[\\/]|@|https?:|bearer|token|secret|password|credential|api[_-]?key|[0-9a-f]{8}-[0-9a-f-]{27,})/iu,kn=new Set(["arch","cached","capability","category","component","contained","error_code","frame_kind","gate","method","mode","operation","outcome","platform","previous_state","protocol_version","provider","queue","reason","recovery","retry_kind","state","status","tool","transport","trigger"]),it=new Set,st=new Map;function _n(e){let t=e.trim().toLowerCase();return!t||t.length>64||Tn.test(t)||!Cn.test(t)?null:t}function Sn(e,t){if(typeof t=="boolean")return t;if(typeof t=="number")return e!=="protocol_version"||!Number.isInteger(t)||t<0||t>100?null:t;if(typeof t!="string")return null;let n=_n(t);if(!n)return null;let r=st.get(e);return r||(r=new Set,st.set(e,r)),!r.has(n)&&r.size>=xn?"other":(r.add(n),n)}function En(e={}){let t={};for(let[n,r]of Object.entries(e)){if(Object.keys(t).length>=Pn)break;if(!kn.has(n))continue;let o=Sn(n,r);o!==null&&(t[n]=o)}return Object.freeze(t)}function at(e){if(it.size===0||!Rn.test(e.name)||e.name.length>128)return;let t=e.kind==="event"?1:e.value??1;if(!Number.isFinite(t)||t<0)return;let n=Object.freeze({schemaVersion:vn,kind:e.kind,name:e.name,value:Math.min(t,Number.MAX_SAFE_INTEGER),timestamp:(e.timestamp??new Date).toISOString(),attributes:En(e.attributes)});for(let r of it)try{r(n)}catch{}}function H(e,t=1,n){at({kind:"counter",name:e,value:t,attributes:n})}function Ee(e,t,n){at({kind:"histogram",name:e,value:t,attributes:n})}import{lookup as Ln}from"node:dns/promises";import{isIP as le}from"node:net";var An=["context length","context window","maximum context","too many tokens","request too large"];function lt(e){let t=e.toLowerCase();return An.some(n=>t.includes(n))}var P=class extends Error{category;code;retryable;providerId;statusCode;retryAfterMs;requestId;constructor(t,n){super(t,n.cause!==void 0?{cause:n.cause}:void 0),this.name="ProviderError",this.category=n.category,this.code=n.code,this.retryable=n.retryable??!1,this.providerId=n.providerId,this.statusCode=n.statusCode,this.retryAfterMs=n.retryAfterMs,this.requestId=n.requestId}};function Ie(e,t=Date.now()){if(!e)return;let n=Number(e.trim());if(Number.isFinite(n)&&n>=0)return Math.ceil(n*1e3);let r=Date.parse(e);if(Number.isFinite(r))return Math.max(0,r-t)}function In(e){if(typeof e=="string")return e;if(!e||typeof e!="object")return"";let t=e,n=t.error;if(typeof n=="string")return n;if(n&&typeof n=="object"){let r=n;if(typeof r.message=="string")return r.message;if(typeof r.type=="string")return r.type}return typeof t.message=="string"?t.message:""}function Ae(e,t){return t.some(n=>e.includes(n))}function Le(e){let t=In(e.body).trim(),n=t.toLowerCase(),r=t?`: ${t.slice(0,1e3)}`:"",o={providerId:e.providerId,statusCode:e.statusCode,retryAfterMs:e.retryAfterMs,requestId:e.requestId};return e.statusCode===401?new P(`Provider authentication failed${r}`,{...o,category:"authentication",code:"PROVIDER_AUTHENTICATION_FAILED"}):e.statusCode===403?new P(`Provider authorization failed${r}`,{...o,category:"authorization",code:"PROVIDER_AUTHORIZATION_FAILED"}):Ae(n,["api key not valid","invalid api key","api key expired","api_key_invalid","invalid authentication credentials","missing api key"])?new P(`Provider authentication failed${r}`,{...o,category:"authentication",code:"PROVIDER_AUTHENTICATION_FAILED"}):e.statusCode===429?new P(`Provider rate limit reached${r}`,{...o,category:"rate_limit",code:"PROVIDER_RATE_LIMITED",retryable:!0}):lt(n)?new P(`Provider context window exceeded${r}`,{...o,category:"context_overflow",code:"PROVIDER_CONTEXT_OVERFLOW"}):Ae(n,["safety","content policy","blocked_reason","responsible_ai_policy_violation"])?new P(`Provider safety policy refused the request${r}`,{...o,category:"safety_refusal",code:"PROVIDER_SAFETY_REFUSAL"}):e.statusCode===404||Ae(n,["model not found","model does not exist","unsupported model"])?new P(`Provider model is unavailable${r}`,{...o,category:"unsupported_model",code:"PROVIDER_MODEL_UNSUPPORTED"}):e.statusCode===408||e.statusCode===504?new P(`Provider request timed out${r}`,{...o,category:"timeout",code:"PROVIDER_TIMEOUT",retryable:!0}):e.statusCode>=500||e.statusCode===409||e.statusCode===425?new P(`Provider server error${r}`,{...o,category:"server",code:"PROVIDER_SERVER_ERROR",retryable:!0}):new P(`Provider rejected the request with HTTP ${e.statusCode}${r}`,{...o,category:"unsupported_capability",code:"PROVIDER_CAPABILITY_UNSUPPORTED"})}function v(e,t,n){return new P(`Malformed ${e} response: ${t}`,{providerId:e,category:"malformed_response",code:"PROVIDER_MALFORMED_RESPONSE",...n!==void 0?{cause:n}:{}})}function z(e,t){return H("xeno.provider.capability_mismatches",1,{component:"provider_contract",provider:e,capability:t,error_code:"provider_capability_unsupported"}),new P(`${e} does not advertise the required ${t} capability`,{providerId:e,category:"unsupported_capability",code:"PROVIDER_CAPABILITY_UNSUPPORTED"})}var ut=new Set(["metadata.google.internal","metadata.azure.internal","instance-data.ec2.internal"]);function S(e){return new P(`Provider endpoint rejected: ${e}`,{category:"endpoint_policy",code:"PROVIDER_ENDPOINT_REJECTED"})}function On(e){let t=e.split(".");if(t.length!==4)return null;let n=t.map(r=>Number(r));return n.every(r=>Number.isInteger(r)&&r>=0&&r<=255)?n:null}function ct(e){let t=On(e);if(!t)return"public";let[n,r]=t;return n===0?"unspecified":n===127?"loopback":n===169&&r===254?"link-local":n===10||n===172&&r>=16&&r<=31||n===192&&r===168?"private":"public"}function ce(e){let t=e.toLowerCase().replace(/^\[|\]$/g,"").split("%")[0];le(t)===6&&(t=new URL(`http://[${t}]`).hostname.slice(1,-1));let n=/^::ffff:([0-9a-f]{1,4}):([0-9a-f]{1,4})$/.exec(t);if(n){let r=Number.parseInt(n[1],16),o=Number.parseInt(n[2],16);return`${r>>8}.${r&255}.${o>>8}.${o&255}`}return t}function mt(e){let t=ce(e);return le(t)===4?ct(t):t==="::"||t==="::0"?"unspecified":t==="::1"?"loopback":t.startsWith("::ffff:")?ct(t.slice(7)):/^f[cd]/.test(t)?"private":/^fe[89ab]/.test(t)?"link-local":"public"}function dt(e){return e==="example"||e.endsWith(".example")||e==="test"||e.endsWith(".test")||e==="invalid"||e.endsWith(".invalid")}function Mn(e){return e==="localhost"||e.endsWith(".localhost")}function K(e,t={}){let n;try{n=new URL(e)}catch{throw S("the URL is invalid")}if(n.username||n.password)throw S("embedded credentials are forbidden");if(n.hash||n.search)throw S("base URLs cannot contain a query or fragment");if(!n.hostname||n.hostname.includes("%"))throw S("the hostname is empty or ambiguous");if(ut.has(n.hostname.toLowerCase()))throw S("cloud metadata destinations are forbidden");if(n.protocol!=="https:"&&n.protocol!=="http:")throw S(`scheme ${n.protocol} is unsupported`);let r=t.profile??"public-https";if(n.protocol==="http:"&&r!=="local-network")throw S("plain HTTP requires the explicit local-network profile");let o=n.hostname.replace(/^\[|\]$/g,""),i=le(o)?mt(o):null;if(i==="link-local"||i==="unspecified")throw S(`${i} destinations are forbidden`);if(r==="public-https"&&(i==="private"||i==="loopback"||Mn(n.hostname)))throw S("private and loopback destinations require the local-network profile");if(r==="local-network"&&n.protocol==="http:"&&i==="public"&&!t.allowedHosts?.includes(n.hostname))throw S("local-network HTTP must resolve to loopback or a private address");return n}async function Oe(e,t={}){await Me(e,t)}async function Me(e,t={}){let n=e.hostname.toLowerCase().replace(/^\[|\]$/g,"");if(ut.has(n))throw S("cloud metadata destinations are forbidden");let r=new Set((t.allowedHosts??[]).map(s=>s.toLowerCase())),o=le(n)?[n]:dt(n)?[]:t.resolveHostname?await t.resolveHostname(n):(await Ln(n,{all:!0,verbatim:!0})).map(s=>s.address);if(!o.length&&!dt(n))throw S("DNS resolution returned no addresses");let i=t.profile??"public-https";for(let s of o){let a=mt(s);if(a==="link-local"||a==="unspecified")throw S(`DNS resolved to a forbidden ${a} address`);if(i==="public-https"&&a!=="public"&&!r.has(n))throw S(`DNS resolved public endpoint to ${a} address ${s}`);if(i==="local-network"&&e.protocol==="http:"&&a==="public"&&!r.has(n))throw S(`local-network HTTP resolved to public address ${s}`)}return o}import{request as $n}from"node:http";import{request as Nn}from"node:https";import{isIP as pt}from"node:net";import{once as Dn}from"node:events";function ft(e,t){return{dispatch(n,r){let o,i=!1,s=d=>{i||(i=!0,o?.destroy(),r.onError(d))},a=t[0];if(!a||!pt(a)||new URL(n.origin).origin!==e.origin)return queueMicrotask(()=>s(new Error("Provider connection has no authorized pinned address"))),!0;let l=n.headers??{},c=(e.protocol==="https:"?Nn:$n)(new URL(n.path,e.origin),{method:n.method,headers:l,agent:!1,rejectUnauthorized:!0,lookup:(d,u,m)=>{let p={address:a,family:pt(a)};typeof u=="object"&&u.all?m(null,[p]):m(null,a,p.family)}},d=>{o=d;let u=d.rawHeaders.map(p=>Buffer.from(p)),m=()=>d.resume();r.onHeaders(d.statusCode??500,u,m,d.statusMessage??"")===!1&&d.pause(),d.on("data",p=>{r.onData(p)||d.pause()}),d.on("end",()=>{i||(i=!0,r.onComplete(d.rawTrailers.map(p=>Buffer.from(p))))}),d.on("error",s),d.on("aborted",()=>s(new Error("Provider response was interrupted")))});return c.on("socket",d=>{d.once("connect",()=>{(!d.remoteAddress||ce(d.remoteAddress)!==ce(a))&&c.destroy(new Error("Provider socket did not connect to its authorized address"))})}),c.on("error",s),r.onConnect(d=>c.destroy(d??new Error("Provider request aborted"))),(async()=>{try{let d=n.body;if(typeof d=="string"||d instanceof Uint8Array)c.end(d);else{if(d)for await(let u of d){if(c.destroyed)return;c.write(u)||await Dn(c,"drain")}c.end()}}catch(d){c.destroy(d instanceof Error?d:new Error("Provider request body failed"))}})(),!0}}}var F={connectTimeoutMs:15e3,totalTimeoutMs:12e4,idleTimeoutMs:3e4,maxResponseBytes:8*1024*1024,maxHeaderBytes:64*1024,maxEventBytes:1024*1024};function jn(e={}){for(let[t,n]of Object.entries(e))if(n!==void 0&&(!Number.isSafeInteger(n)||n<1))throw v("provider-transport",`${t} must be a positive safe integer`);return{connectTimeoutMs:Math.max(100,e.connectTimeoutMs??F.connectTimeoutMs),totalTimeoutMs:Math.max(100,e.totalTimeoutMs??F.totalTimeoutMs),idleTimeoutMs:Math.max(100,e.idleTimeoutMs??F.idleTimeoutMs),maxResponseBytes:Math.max(1024,e.maxResponseBytes??F.maxResponseBytes),maxHeaderBytes:Math.max(1024,e.maxHeaderBytes??F.maxHeaderBytes),maxEventBytes:Math.max(1024,e.maxEventBytes??F.maxEventBytes)}}async function ee(e,t){let n,r=new Promise((o,i)=>{n=()=>i(new Error("Provider operation aborted")),t.addEventListener("abort",n,{once:!0}),t.aborted&&n()});try{return await Promise.race([e,r])}finally{t.removeEventListener("abort",n)}}function de(e,t,n,r){try{return e.decode(t,{stream:n})}catch{throw v(r,"response is not valid UTF-8")}}function Ne(e,t,n){let r=new P(t==="cancelled"?"Provider request was cancelled":"Provider request timed out",{providerId:e,category:t,code:t==="cancelled"?"PROVIDER_CANCELLED":"PROVIDER_TIMEOUT",retryable:t==="timeout",...n!==void 0?{cause:n}:{}});return t==="cancelled"&&(r.name="AbortError"),r}function qn(e){let t=0;return e.forEach((n,r)=>{t+=Buffer.byteLength(r)+Buffer.byteLength(n)+4}),t}async function gt(e,t,n,r){if(!e.body)return"";let o=e.body.getReader(),i=new TextDecoder("utf-8",{fatal:!0}),s=0,a="",l,c=()=>{l&&clearTimeout(l),l=setTimeout(()=>r.abort("idle-timeout"),n.idleTimeoutMs)};c();try{for(;;){let{value:d,done:u}=await ee(o.read(),r.signal);if(u)break;if(c(),s+=d.byteLength,s>n.maxResponseBytes)throw v(t,`response exceeded ${n.maxResponseBytes} bytes`);a+=de(i,d,!0,t)}return a+=de(i,void 0,!1,t),a}finally{l&&clearTimeout(l),o.cancel().catch(()=>{}),o.releaseLock()}}async function yt(e,t,n,r){let o=$e.now(),i=jn(n.limits);H("xeno.provider.requests",1,{component:"provider_transport",provider:n.providerId,transport:"http"});let s=new AbortController,a=null,l=t.signal,c=()=>s.abort("caller");if(l?.aborted)throw Ne(n.providerId,"cancelled");l?.addEventListener("abort",c,{once:!0});let d=setTimeout(()=>{a="total",s.abort("total-timeout")},i.totalTimeoutMs),u=setTimeout(()=>{a="connect",s.abort("connect-timeout")},i.connectTimeoutMs),m;try{let p=await ee(Me(e,n.endpointPolicy),s.signal);if(s.signal.aborted)throw new Error("Provider request aborted before dispatch");let g={...t,signal:s.signal,redirect:"manual",dispatcher:ft(e,p)},y=fetch(e,g);y.then(w=>{s.signal.aborted&&w.body?.cancel().catch(()=>{})},()=>{});let f=await ee(y,s.signal);if(m=f,clearTimeout(u),qn(f.headers)>i.maxHeaderBytes)throw v(n.providerId,`response headers exceeded ${i.maxHeaderBytes} bytes`);if(f.redirected||f.status>=300&&f.status<400)throw new P("Provider redirects are disabled",{providerId:n.providerId,category:"endpoint_policy",code:"PROVIDER_ENDPOINT_REJECTED",statusCode:f.status});let x=f.headers.get("content-length");if(x&&/^\d+$/.test(x)&&Number(x)>i.maxResponseBytes)throw v(n.providerId,`response exceeded ${i.maxResponseBytes} bytes`);if(!f.ok){let w=await gt(f,n.providerId,i,s),I=w;try{I=w?JSON.parse(w):{}}catch{}throw Le({providerId:n.providerId,statusCode:f.status,body:I,retryAfterMs:Ie(f.headers.get("retry-after")),requestId:f.headers.get("request-id")??f.headers.get("x-request-id")??void 0})}let C=await ee(r(f,s,i),s.signal);return H("xeno.provider.request_results",1,{component:"provider_transport",provider:n.providerId,transport:"http",outcome:"success"}),Ee("xeno.provider.request_duration_ms",$e.now()-o,{component:"provider_transport",provider:n.providerId,transport:"http",outcome:"success"}),C}catch(p){let g;throw p instanceof P?g=p:l?.aborted||s.signal.reason==="caller"?g=Ne(n.providerId,"cancelled",p):a||s.signal.reason==="idle-timeout"?g=Ne(n.providerId,"timeout",p):g=new P("Provider transport failed",{providerId:n.providerId,category:"transport",code:"PROVIDER_TRANSPORT_ERROR",retryable:!0,cause:p}),s.abort("request-failed"),m?.body&&!m.body.locked&&m.body.cancel().catch(()=>{}),H("xeno.provider.request_results",1,{component:"provider_transport",provider:n.providerId,transport:"http",outcome:"error",category:g.category,error_code:g.code}),Ee("xeno.provider.request_duration_ms",$e.now()-o,{component:"provider_transport",provider:n.providerId,transport:"http",outcome:"error",category:g.category}),g}finally{clearTimeout(u),clearTimeout(d),l?.removeEventListener("abort",c)}}async function De(e,t,n){return yt(e,t,n,async(r,o,i)=>{let s=await gt(r,n.providerId,i,o),a;try{a=s?JSON.parse(s):{}}catch(l){throw v(n.providerId,"body is not valid JSON",l)}if(!a||typeof a!="object"||Array.isArray(a))throw v(n.providerId,"JSON body must be an object");return a})}async function te(e,t,n,r){return yt(e,t,n,async(o,i,s)=>{if(!o.body)throw v(n.providerId,"stream response has no body");let a=o.body.getReader(),l=new TextDecoder("utf-8",{fatal:!0}),c="",d=0,u="message",m=[],p,g=()=>{p&&clearTimeout(p),p=setTimeout(()=>i.abort("idle-timeout"),s.idleTimeoutMs)},y=async()=>{if(m.length===0){u="message";return}let f=m.join(`
|
|
6
|
+
`);if(Buffer.byteLength(f)>s.maxEventBytes)throw v(n.providerId,`stream event exceeded ${s.maxEventBytes} bytes`);await r({event:u,data:f}),u="message",m=[]};g();try{for(;;){let{value:f,done:x}=await ee(a.read(),i.signal);if(x)break;if(g(),d+=f.byteLength,d>s.maxResponseBytes)throw v(n.providerId,`stream exceeded ${s.maxResponseBytes} bytes`);for(c+=de(l,f,!0,n.providerId);;){let C=c.indexOf(`
|
|
7
|
+
`);if(C<0)break;let w=c.slice(0,C).replace(/\r$/,"");if(c=c.slice(C+1),!w)await y();else if(!w.startsWith(":")){let I=w.indexOf(":"),M=I<0?w:w.slice(0,I),nt=I<0?"":w.slice(I+1).replace(/^ /,"");M==="event"?u=nt:M==="data"&&m.push(nt)}}}if(c+=de(l,void 0,!1,n.providerId),c.trim())for(let f of c.split(/\r?\n/))f.startsWith("data:")?m.push(f.slice(5).replace(/^ /,"")):f.startsWith("event:")&&(u=f.slice(6).trim());await y()}finally{p&&clearTimeout(p),a.cancel().catch(()=>{}),a.releaseLock()}})}import{createHash as cr}from"node:crypto";import{isIP as ht}from"node:net";var ge=class extends Error{issues;constructor(t){super(`Invalid JSON Schema: ${t.map(n=>`${n.path||"#"} ${n.message}`).join("; ")}`),this.name="JsonSchemaCompilationError",this.issues=t}},qe="https://json-schema.org/draft/2020-12/schema",Un=new Set(["string","number","integer","boolean","array","object","null"]),Jn=new Set(["$schema","$id","$anchor","$ref","$defs","$comment","title","description","default","examples","deprecated","readOnly","writeOnly","type","enum","const","multipleOf","maximum","exclusiveMaximum","minimum","exclusiveMinimum","maxLength","minLength","pattern","format","prefixItems","items","contains","minContains","maxContains","minItems","maxItems","uniqueItems","properties","patternProperties","additionalProperties","required","dependentRequired","minProperties","maxProperties","allOf","anyOf","oneOf","not"]),Pt=new Map([["date",e=>Tt(e)],["date-time",e=>sr(e)],["time",e=>kt(e)],["duration",e=>/^P(?!$)(?:\d+(?:[.,]\d+)?Y)?(?:\d+(?:[.,]\d+)?M)?(?:\d+(?:[.,]\d+)?W)?(?:\d+(?:[.,]\d+)?D)?(?:T(?=\d)(?:\d+(?:[.,]\d+)?H)?(?:\d+(?:[.,]\d+)?M)?(?:\d+(?:[.,]\d+)?S)?)?$/u.test(e)],["email",e=>bt(e)],["idn-email",e=>bt(e)],["hostname",e=>Je(e)],["idn-hostname",e=>Je(e)],["ipv4",e=>ht(e)===4],["ipv6",e=>ht(e)===6],["uuid",e=>/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/iu.test(e)],["uri",e=>wt(e)],["iri",e=>wt(e)],["uri-reference",e=>vt(e)],["iri-reference",e=>vt(e)],["uri-template",e=>ar(e)],["json-pointer",e=>/^(?:\/(?:[^~/]|~[01])*)*$/u.test(e)],["relative-json-pointer",e=>/^(?:0|[1-9]\d*)(?:#|(?:\/(?:[^~/]|~[01])*)*)$/u.test(e)],["regex",(e,t)=>Ve(e,t.maxPatternLength)!==void 0]]);function Xn(e={}){return{strictKeywords:e.strictKeywords??!0,assertFormats:e.assertFormats??!1,maxSchemaDepth:U(e.maxSchemaDepth,64,1,256,"maxSchemaDepth"),maxSchemaNodes:U(e.maxSchemaNodes,4096,1,1e5,"maxSchemaNodes"),maxReferences:U(e.maxReferences,512,0,1e4,"maxReferences"),maxPatternLength:U(e.maxPatternLength,256,1,4096,"maxPatternLength"),maxValidationDepth:U(e.maxValidationDepth,128,1,1024,"maxValidationDepth"),maxValidationSteps:U(e.maxValidationSteps,1e5,100,1e7,"maxValidationSteps"),maxValidationErrors:U(e.maxValidationErrors,64,1,1024,"maxValidationErrors"),maxInputBytes:U(e.maxInputBytes,16*1024*1024,1024,256*1024*1024,"maxInputBytes")}}function U(e,t,n,r,o){let i=e??t;if(!Number.isInteger(i)||i<n||i>r)throw new TypeError(`${o} must be an integer from ${n} to ${r}.`);return i}function Vn(e,t={}){let n={root:e,options:Xn(t),issues:[],rawByPointer:new Map,anchors:new Map,compiledByPointer:new Map,schemaNodes:0,references:0,nextNodeId:1};pe(e,"",0,n);let r=X(e,"",0,n);if(n.issues.length>0||!r)throw new ge(n.issues);return Object.freeze({dialect:qe,formatAssertion:n.options.assertFormats,validate(o){let i=[],s=Ue(o);if(s)return i.push({path:s.path,keyword:"type",schemaPath:"#",message:s.message}),{valid:!1,errors:i,steps:0,truncated:!1};let a=JSON.stringify(o),l=Buffer.byteLength(a??"null","utf8");if(l>n.options.maxInputBytes)return i.push({path:"",keyword:"maxInputBytes",schemaPath:"#",message:`input is ${l} bytes; limit is ${n.options.maxInputBytes}`}),{valid:!1,errors:i,steps:0,truncated:!1};let c={options:n.options,errors:i,budget:{steps:0,exhausted:!1},activePairs:new Set,objectIds:new WeakMap,nextObjectId:{value:1}};return $(o,r,"",0,c),{valid:i.length===0,errors:i,steps:c.budget.steps,truncated:c.budget.exhausted||i.length>=n.options.maxValidationErrors}}})}function xt(e,t={}){if(!E(e)||e.type!=="object"||!E(e.properties))throw new ge([{path:"#",keyword:"type",message:"tool input schema root must declare type object and a properties object"}]);return Vn(e,t)}function pe(e,t,n,r){if(n>r.options.maxSchemaDepth){h(r,t,void 0,`schema depth exceeds ${r.options.maxSchemaDepth}`);return}if(typeof e!="boolean"&&!E(e)){h(r,t,void 0,"schema must be an object or boolean");return}if(!r.rawByPointer.has(t)){if(r.schemaNodes+=1,r.schemaNodes>r.options.maxSchemaNodes){h(r,t,void 0,`schema node count exceeds ${r.options.maxSchemaNodes}`);return}if(r.rawByPointer.set(t,e),typeof e!="boolean"){e.$anchor!==void 0&&(typeof e.$anchor!="string"||!/^[A-Za-z][A-Za-z0-9._:-]*$/u.test(e.$anchor)?h(r,t,"$anchor","$anchor must be a valid plain-name anchor"):r.anchors.has(e.$anchor)?h(r,t,"$anchor",`duplicate anchor ${e.$anchor}`):r.anchors.set(e.$anchor,t));for(let o of["$defs","properties","patternProperties"]){let i=e[o];if(i!==void 0){if(!E(i)){h(r,t,o,`${o} must be an object`);continue}for(let[s,a]of Object.entries(i))pe(a,N(t,o,s),n+1,r)}}for(let o of["items","contains","additionalProperties","not"])e[o]!==void 0&&pe(e[o],N(t,o),n+1,r);for(let o of["prefixItems","allOf","anyOf","oneOf"]){let i=e[o];if(i!==void 0){if(!Array.isArray(i)){h(r,t,o,`${o} must be an array of schemas`);continue}i.forEach((s,a)=>pe(s,N(t,o,String(a)),n+1,r))}}}}}function X(e,t,n,r){let o=r.compiledByPointer.get(t);if(o)return o;if(typeof e!="boolean"&&!E(e))return;let i={id:r.nextNodeId++,schemaPath:St(t)};if(r.compiledByPointer.set(t,i),typeof e=="boolean")return i.boolean=e,i;if(Bn(e,t,r),Hn(e,t,r),e.$schema!==void 0&&(t!==""||e.$schema!==qe&&e.$schema!==`${qe}#`)&&h(r,t,"$schema",t===""?`unsupported dialect ${String(e.$schema)}`:"$schema is only supported at the root"),e.$id!==void 0&&typeof e.$id!="string"&&h(r,t,"$id","$id must be a string"),e.$ref!==void 0)if(typeof e.$ref!="string")h(r,t,"$ref","$ref must be a string");else{r.references+=1,r.references>r.options.maxReferences&&h(r,t,"$ref",`reference count exceeds ${r.options.maxReferences}`);let s=Gn(e.$ref,t,r);if(s!==void 0){let a=r.rawByPointer.get(s);a===void 0?h(r,t,"$ref",`unresolved local reference ${e.$ref}`):i.ref=X(a,s,n+1,r)}}if(i.types=zn(e.type,t,r),e.enum!==void 0){let s=e.enum;!Array.isArray(s)||s.length===0?h(r,t,"enum","enum must be a non-empty array"):s.some((a,l)=>s.some((c,d)=>d<l&&Q(a,c)))?h(r,t,"enum","enum values must be unique"):s.some(a=>Ue(a))?h(r,t,"enum","enum values must be JSON values"):i.enumValues=s}if(Object.prototype.hasOwnProperty.call(e,"const")&&(Ue(e.const)?h(r,t,"const","const must be a JSON value"):(i.hasConst=!0,i.constValue=e.const)),i.multipleOf=Wn(e.multipleOf,t,"multipleOf",r),i.maximum=ne(e.maximum,t,"maximum",r),i.exclusiveMaximum=ne(e.exclusiveMaximum,t,"exclusiveMaximum",r),i.minimum=ne(e.minimum,t,"minimum",r),i.exclusiveMinimum=ne(e.exclusiveMinimum,t,"exclusiveMinimum",r),i.maxLength=J(e.maxLength,t,"maxLength",r),i.minLength=J(e.minLength,t,"minLength",r),i.minItems=J(e.minItems,t,"minItems",r),i.maxItems=J(e.maxItems,t,"maxItems",r),i.minContains=J(e.minContains,t,"minContains",r),i.maxContains=J(e.maxContains,t,"maxContains",r),i.minProperties=J(e.minProperties,t,"minProperties",r),i.maxProperties=J(e.maxProperties,t,"maxProperties",r),Yn(i,t,r),e.pattern!==void 0)if(typeof e.pattern!="string")h(r,t,"pattern","pattern must be a string");else{let s=Ve(e.pattern,r.options.maxPatternLength);s?i.pattern={source:e.pattern,regex:s}:h(r,t,"pattern","pattern is invalid or outside the safe regex subset")}if(e.format!==void 0&&(typeof e.format!="string"?h(r,t,"format","format must be a string"):r.options.assertFormats&&!Pt.has(e.format)?h(r,t,"format",`unsupported asserted format ${e.format}`):i.format=e.format),i.prefixItems=me(e.prefixItems,t,"prefixItems",n,r,!0),i.items=ue(e.items,t,"items",n,r),i.contains=ue(e.contains,t,"contains",n,r),(e.minContains!==void 0||e.maxContains!==void 0)&&e.contains===void 0&&h(r,t,"contains","minContains/maxContains require contains"),e.uniqueItems!==void 0&&(typeof e.uniqueItems!="boolean"?h(r,t,"uniqueItems","uniqueItems must be boolean"):i.uniqueItems=e.uniqueItems),i.properties=Kn(e.properties,t,"properties",n,r),i.patternProperties=Fn(e.patternProperties,t,n,r),i.additionalProperties=ue(e.additionalProperties,t,"additionalProperties",n,r),i.required=Rt(e.required,t,"required",r,!0),i.dependentRequired=Qn(e.dependentRequired,t,r),i.allOf=me(e.allOf,t,"allOf",n,r,!1),i.anyOf=me(e.anyOf,t,"anyOf",n,r,!1),i.oneOf=me(e.oneOf,t,"oneOf",n,r,!1),i.not=ue(e.not,t,"not",n,r),E(e.$defs))for(let[s,a]of Object.entries(e.$defs))X(a,N(t,"$defs",s),n+1,r);return i}function Bn(e,t,n){if(n.options.strictKeywords)for(let r of Object.keys(e))!Jn.has(r)&&!r.startsWith("x-")&&h(n,t,r,`unsupported keyword ${r}`)}function Hn(e,t,n){for(let r of["$comment","title","description"])e[r]!==void 0&&typeof e[r]!="string"&&h(n,t,r,`${r} must be a string`);for(let r of["deprecated","readOnly","writeOnly"])e[r]!==void 0&&typeof e[r]!="boolean"&&h(n,t,r,`${r} must be boolean`);e.examples!==void 0&&!Array.isArray(e.examples)&&h(n,t,"examples","examples must be an array")}function zn(e,t,n){if(e===void 0)return;let r=Array.isArray(e)?e:[e];if(r.length===0||r.some(o=>typeof o!="string"||!Un.has(o))){h(n,t,"type","type must be a recognized type or non-empty unique type array");return}return new Set(r).size!==r.length&&h(n,t,"type","type array must not contain duplicates"),r}function ue(e,t,n,r,o){if(e!==void 0)return X(e,N(t,n),r+1,o)}function me(e,t,n,r,o,i){if(e!==void 0){if(!Array.isArray(e)||!i&&e.length===0){h(o,t,n,`${n} must be ${i?"an array":"a non-empty array"} of schemas`);return}return e.map((s,a)=>X(s,N(t,n,String(a)),r+1,o)).filter(s=>!!s)}}function Kn(e,t,n,r,o){if(e===void 0)return;if(!E(e)){h(o,t,n,`${n} must be an object of schemas`);return}let i=new Map;for(let[s,a]of Object.entries(e)){let l=X(a,N(t,n,s),r+1,o);l&&i.set(s,l)}return i}function Fn(e,t,n,r){if(e===void 0)return;if(!E(e)){h(r,t,"patternProperties","patternProperties must be an object of schemas");return}let o=[];for(let[i,s]of Object.entries(e)){let a=Ve(i,r.options.maxPatternLength);if(!a){h(r,t,"patternProperties",`pattern ${JSON.stringify(i)} is invalid or outside the safe regex subset`);continue}let l=X(s,N(t,"patternProperties",i),n+1,r);l&&o.push({pattern:{source:i,regex:a},schema:l})}return o}function Qn(e,t,n){if(e===void 0)return;if(!E(e)){h(n,t,"dependentRequired","dependentRequired must be an object");return}let r=new Map;for(let[o,i]of Object.entries(e)){let s=Rt(i,N(t,"dependentRequired",o),"dependentRequired",n,!0);s&&r.set(o,s)}return r}function Rt(e,t,n,r,o){if(e!==void 0){if(!Array.isArray(e)||e.some(i=>typeof i!="string")){h(r,t,n,`${n} must be an array of strings`);return}return o&&new Set(e).size!==e.length&&h(r,t,n,`${n} values must be unique`),e}}function Wn(e,t,n,r){let o=ne(e,t,n,r);return o!==void 0&&o<=0&&h(r,t,n,`${n} must be greater than zero`),o!==void 0&&o>0?o:void 0}function ne(e,t,n,r){if(e!==void 0){if(typeof e!="number"||!Number.isFinite(e)){h(r,t,n,`${n} must be a finite number`);return}return e}}function J(e,t,n,r){if(e!==void 0){if(!Number.isSafeInteger(e)||e<0){h(r,t,n,`${n} must be a non-negative safe integer`);return}return e}}function Yn(e,t,n){for(let[r,o,i]of[[e.minLength,e.maxLength,"length"],[e.minItems,e.maxItems,"items"],[e.minContains,e.maxContains,"contains"],[e.minProperties,e.maxProperties,"properties"]])r!==void 0&&o!==void 0&&r>o&&h(n,t,i,`minimum ${i} exceeds maximum`)}function Gn(e,t,n){if(!e.startsWith("#")){h(n,t,"$ref","remote and file references are not supported");return}if(e==="#")return"";if(e.startsWith("#/")){let s=`/${e.slice(2).split("/").map(a=>a.replace(/~1/g,"/").replace(/~0/g,"~")).map(_t).join("/")}`;return n.rawByPointer.has(s)||h(n,t,"$ref",`unresolved JSON Pointer ${e}`),s}let r=e.slice(1),o=n.anchors.get(r);return o===void 0&&h(n,t,"$ref",`unresolved anchor ${e}`),o}function $(e,t,n,r,o){if(!Ct(o)||o.errors.length>=o.options.maxValidationErrors)return;if(r>o.options.maxValidationDepth){T(o,n,"maxDepth",t,`validation depth exceeds ${o.options.maxValidationDepth}`);return}if(t.boolean!==void 0){t.boolean||T(o,n,"falseSchema",t,"is rejected by the false schema");return}let i=or(t,e,o);if(!o.activePairs.has(i)){o.activePairs.add(i);try{if(t.ref&&$(e,t.ref,n,r+1,o),t.enumValues&&!t.enumValues.some(s=>Q(s,e))&&T(o,n,"enum",t,`expected one of ${t.enumValues.map(Xe).join(", ")} but got ${je(e)}`),t.hasConst&&!Q(t.constValue,e)&&T(o,n,"const",t,`expected ${Xe(t.constValue)} but got ${je(e)}`),t.types&&!t.types.some(s=>ir(e,s))){let s=t.types.length===1?t.types[0]:`one of [${t.types.join(", ")}]`;T(o,n,"type",t,`expected type ${s} but got ${je(e)}`);return}Zn(e,t,n,r,o),typeof e=="number"&&er(e,t,n,o),typeof e=="string"&&tr(e,t,n,o),Array.isArray(e)&&nr(e,t,n,r,o),E(e)&&rr(e,t,n,r,o)}finally{o.activePairs.delete(i)}}}function Zn(e,t,n,r,o){for(let i of t.allOf??[])$(e,i,n,r+1,o);if(t.anyOf&&t.anyOf.filter(s=>fe(e,s,n,r+1,o)).length===0&&T(o,n,"anyOf",t,"must match at least one anyOf branch"),t.oneOf){let i=t.oneOf.filter(s=>fe(e,s,n,r+1,o)).length;i!==1&&T(o,n,"oneOf",t,`must match exactly one oneOf branch; matched ${i}`)}t.not&&fe(e,t.not,n,r+1,o)&&T(o,n,"not",t,"must not match the disallowed schema")}function er(e,t,n,r){t.multipleOf!==void 0&&!lr(e,t.multipleOf)&&T(r,n,"multipleOf",t,`must be a multiple of ${t.multipleOf}`),t.maximum!==void 0&&e>t.maximum&&T(r,n,"maximum",t,`must be <= ${t.maximum}`),t.exclusiveMaximum!==void 0&&e>=t.exclusiveMaximum&&T(r,n,"exclusiveMaximum",t,`must be < ${t.exclusiveMaximum}`),t.minimum!==void 0&&e<t.minimum&&T(r,n,"minimum",t,`must be >= ${t.minimum}`),t.exclusiveMinimum!==void 0&&e<=t.exclusiveMinimum&&T(r,n,"exclusiveMinimum",t,`must be > ${t.exclusiveMinimum}`)}function tr(e,t,n,r){let o=[...e].length;if(t.minLength!==void 0&&o<t.minLength&&T(r,n,"minLength",t,`must contain at least ${t.minLength} Unicode code points`),t.maxLength!==void 0&&o>t.maxLength&&T(r,n,"maxLength",t,`must contain at most ${t.maxLength} Unicode code points`),t.pattern&&!t.pattern.regex.test(e)&&T(r,n,"pattern",t,`must match pattern ${JSON.stringify(t.pattern.source)}`),t.format&&r.options.assertFormats){let i=Pt.get(t.format);i&&!i(e,r.options)&&T(r,n,"format",t,`must match format ${t.format}`)}}function nr(e,t,n,r,o){if(t.minItems!==void 0&&e.length<t.minItems&&T(o,n,"minItems",t,`must contain at least ${t.minItems} items`),t.maxItems!==void 0&&e.length>t.maxItems&&T(o,n,"maxItems",t,`must contain at most ${t.maxItems} items`),t.uniqueItems)e:for(let s=0;s<e.length;s+=1)for(let a=0;a<s;a+=1){if(!Ct(o))break e;if(Q(e[s],e[a])){T(o,L(n,String(s)),"uniqueItems",t,`duplicates item ${a}`);break e}}let i=t.prefixItems?.length??0;if(t.prefixItems?.forEach((s,a)=>{a<e.length&&$(e[a],s,L(n,String(a)),r+1,o)}),t.items)for(let s=i;s<e.length;s+=1)$(e[s],t.items,L(n,String(s)),r+1,o);if(t.contains){let s=0;for(let l=0;l<e.length;l+=1)fe(e[l],t.contains,L(n,String(l)),r+1,o)&&(s+=1);let a=t.minContains??1;s<a&&T(o,n,"minContains",t,`contains matched ${s} items; minimum is ${a}`),t.maxContains!==void 0&&s>t.maxContains&&T(o,n,"maxContains",t,`contains matched ${s} items; maximum is ${t.maxContains}`)}}function rr(e,t,n,r,o){let i=Object.keys(e);t.minProperties!==void 0&&i.length<t.minProperties&&T(o,n,"minProperties",t,`must contain at least ${t.minProperties} properties`),t.maxProperties!==void 0&&i.length>t.maxProperties&&T(o,n,"maxProperties",t,`must contain at most ${t.maxProperties} properties`);for(let s of t.required??[])Object.prototype.hasOwnProperty.call(e,s)||T(o,L(n,s),"required",t,"is required");for(let[s,a]of t.dependentRequired??[])if(Object.prototype.hasOwnProperty.call(e,s))for(let l of a)Object.prototype.hasOwnProperty.call(e,l)||T(o,L(n,l),"dependentRequired",t,`is required when ${s} is present`);for(let s of i){let a=!1,l=t.properties?.get(s);l&&(a=!0,$(e[s],l,L(n,s),r+1,o));for(let c of t.patternProperties??[])c.pattern.regex.test(s)&&(a=!0,$(e[s],c.schema,L(n,s),r+1,o));!a&&t.additionalProperties&&$(e[s],t.additionalProperties,L(n,s),r+1,o)}}function fe(e,t,n,r,o){let i={...o,errors:[],activePairs:new Set(o.activePairs)};return $(e,t,n,r,i),i.errors.length===0&&!i.budget.exhausted}function Ct(e){return e.budget.steps+=1,e.budget.steps<=e.options.maxValidationSteps?!0:(e.budget.exhausted||(e.budget.exhausted=!0,T(e,"","maxValidationSteps",{schemaPath:"#"},`validation steps exceed ${e.options.maxValidationSteps}`)),!1)}function T(e,t,n,r,o){e.errors.length>=e.options.maxValidationErrors||e.errors.push({path:t,keyword:n,schemaPath:r.schemaPath,message:o})}function or(e,t,n){if(t!==null&&typeof t=="object"){let r=n.objectIds.get(t);return r===void 0&&(r=n.nextObjectId.value++,n.objectIds.set(t,r)),`${e.id}:object:${r}`}return`${e.id}:${typeof t}:${Xe(t)}`}function ir(e,t){switch(t){case"string":return typeof e=="string";case"number":return typeof e=="number"&&Number.isFinite(e);case"integer":return typeof e=="number"&&Number.isSafeInteger(e);case"boolean":return typeof e=="boolean";case"array":return Array.isArray(e);case"object":return E(e);case"null":return e===null}}function Ue(e){let t=new WeakSet,n=(r,o)=>{if(r===null||typeof r=="string"||typeof r=="boolean")return;if(typeof r=="number")return Number.isFinite(r)?void 0:{path:o,message:"must be a finite JSON number"};if(typeof r!="object")return{path:o,message:`must be a JSON value, not ${typeof r}`};if(t.has(r))return{path:o,message:"must not contain cyclic references"};t.add(r);let i=Array.isArray(r)?r.entries():Object.entries(r);for(let[s,a]of i){let l=n(a,L(o,String(s)));if(l)return l}t.delete(r)};return n(e,"")}function Ve(e,t){if(!([...e].length>t)&&!/\\(?:[1-9]|k<)/u.test(e)&&!/\(\?<(?:[=!]|[A-Za-z])/u.test(e)&&!/\((?:[^()\\]|\\.)*[+*{](?:[^()\\]|\\.)*\)[+*{?]/u.test(e))try{return new RegExp(e,"u")}catch{return}}function Tt(e){let t=/^(\d{4})-(\d{2})-(\d{2})$/u.exec(e);if(!t)return!1;let n=new Date(Date.UTC(Number(t[1]),Number(t[2])-1,Number(t[3])));return n.getUTCFullYear()===Number(t[1])&&n.getUTCMonth()===Number(t[2])-1&&n.getUTCDate()===Number(t[3])}function kt(e){let t=/^(\d{2}):(\d{2}):(\d{2})(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})$/u.exec(e);return t?Number(t[1])<=23&&Number(t[2])<=59&&Number(t[3])<=60:!1}function sr(e){let t=/^([^Tt ]+)[Tt ](.+)$/u.exec(e);return!!(t&&Tt(t[1])&&kt(t[2]))}function bt(e){if([...e].length>254||/[\s<>(),;:\\"\[\]]/u.test(e))return!1;let t=e.lastIndexOf("@");return t>0&&t<e.length-1&&[...e.slice(0,t)].length<=64&&Je(e.slice(t+1))}function Je(e){if([...e].length>253)return!1;let t=e.endsWith(".")?e.slice(0,-1):e;return t.length>0&&t.split(".").every(n=>n.length>0&&n.length<=63&&!n.startsWith("-")&&!n.endsWith("-")&&/^[\p{L}\p{N}-]+$/u.test(n))}function wt(e){try{return!!(new URL(e).protocol&&!/\s/u.test(e))}catch{return!1}}function vt(e){try{return new URL(e,"https://xeno.invalid/"),!/\s/u.test(e)}catch{return!1}}function ar(e){let t=0;for(let n of e)if(n==="{"&&(t+=1),n==="}"&&(t-=1),t<0||t>1)return!1;return t===0&&![...e].some(n=>{let r=n.codePointAt(0);return r<=31||r===127})}function lr(e,t){let n=e/t;return Math.abs(n-Math.round(n))<=Number.EPSILON*Math.max(1,Math.abs(n))*8}function E(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Q(e,t){if(Object.is(e,t))return!0;if(typeof e!=typeof t||e===null||t===null)return!1;if(Array.isArray(e)&&Array.isArray(t))return e.length===t.length&&e.every((n,r)=>Q(n,t[r]));if(E(e)&&E(t)){let n=Object.keys(e),r=Object.keys(t);return n.length===r.length&&n.every(o=>Object.prototype.hasOwnProperty.call(t,o)&&Q(e[o],t[o]))}return!1}function L(e,t){let n=/^[A-Za-z_$][A-Za-z0-9_$]*$/u.test(t)?t:`[${JSON.stringify(t)}]`;return e.length===0?n:n.startsWith("[")?`${e}${n}`:`${e}.${n}`}function N(e,...t){return`${e}/${t.map(_t).join("/")}`}function _t(e){return e.replace(/~/g,"~0").replace(/\//g,"~1")}function St(e){return e.length===0?"#":`#${e}`}function h(e,t,n,r){e.issues.length>=64||e.issues.push({path:St(t),...n?{keyword:n}:{},message:r})}function je(e){return e===null?"null":Array.isArray(e)?"array":typeof e=="number"?Number.isSafeInteger(e)?"integer":"number":typeof e}function Xe(e){try{let t=JSON.stringify(e);return t===void 0?String(e):t}catch{return String(e)}}var _=class extends Error{dialect;path;constructor(t,n,r){super(`Tool schema cannot be projected to ${t} at ${n}: ${r}`),this.name="ToolSchemaProjectionError",this.dialect=t,this.path=n}},Et=new Set(["$schema","$id","$anchor","$defs","$comment","title","default","examples","deprecated","readOnly","writeOnly"]),dr=new Set(["type","description","enum","format","properties","required","items","minItems","maxItems","minLength","maxLength","minimum","maximum","anyOf"]);function It(e,t){xt(e);let n=He(e),r=n,o=At(n);if(t==="xeno")return{schema:n,dialect:t,canonicalSha256:o,projectedSha256:o,changes:[]};let i={dialect:t,root:r,pointers:new Map,anchors:new Map,changes:[],activeReferences:new Set};ye(r,"",i);let s=V(r,"#",i);if(!W(s))throw new _(t,"#","provider tool root must remain an object schema");return ur(n,s,t),{schema:s,dialect:t,canonicalSha256:o,projectedSha256:At(s),changes:i.changes}}function he(e,t){return e.map(n=>{let r=It(n.input_schema,t);return{definition:{...n,input_schema:r.schema},projection:r}})}function V(e,t,n){if(typeof e=="boolean"){if(n.dialect!=="google")return e;if(e)return{};throw new _(n.dialect,t,"false schemas are not representable by this provider")}if(typeof e.$ref=="string"){let o=mr(e.$ref,t,n);if(n.activeReferences.has(e.$ref))throw new _(n.dialect,t,`recursive reference ${e.$ref} cannot be serialized safely`);let i=Object.fromEntries(Object.entries(e).filter(([a])=>a!=="$ref"&&!Et.has(a)));if(Object.keys(i).length>0){if(n.dialect==="google")throw new _(n.dialect,t,"$ref siblings require an unsupported intersection");n.activeReferences.add(e.$ref);let a=V(o,`${t}/$ref`,n);n.activeReferences.delete(e.$ref);let l=V(i,t,n);return n.changes.push({path:t,keyword:"$ref",action:"transformed",reason:"inlined local reference with sibling intersection"}),{allOf:[a,l]}}n.activeReferences.add(e.$ref);let s=V(o,`${t}/$ref`,n);return n.activeReferences.delete(e.$ref),n.changes.push({path:t,keyword:"$ref",action:"transformed",reason:"inlined local reference"}),s}let r={};for(let[o,i]of Object.entries(e))if(o!=="$ref"){if(Et.has(o)||o.startsWith("x-")){o==="description"?r.description=i:n.changes.push({path:t,keyword:o,action:"omitted",reason:"provider wire metadata is not required for canonical validation"});continue}if(n.dialect==="google"&&!dr.has(o)){if(o==="const"){r.enum=[He(i)],n.changes.push({path:t,keyword:o,action:"transformed",reason:"Google wire schema represents const as a single-value enum"});continue}if(o==="prefixItems")throw new _(n.dialect,t,"tuple prefixItems cannot preserve the provider structural contract");n.changes.push({path:t,keyword:o,action:"omitted",reason:"constraint remains enforced by canonical local validation"});continue}if(o==="type"&&n.dialect==="google"&&Array.isArray(i)){let s=i.filter(a=>a!=="null");if(s.length!==1||i.length!==2)throw new _(n.dialect,t,"type union cannot be represented without weakening structure");r.type=s[0],r.nullable=!0,n.changes.push({path:t,keyword:o,action:"transformed",reason:"nullable two-type union mapped to Google nullable"});continue}if(o==="properties"||o==="patternProperties"||o==="$defs"){if(!W(i))throw new _(n.dialect,t,`${o} must be an object`);let s={};for(let[a,l]of Object.entries(i))s[a]=V(l,`${t}/${o}/${ze(a)}`,n);r[o]=s;continue}if(["items","contains","additionalProperties","not"].includes(o)){r[o]=V(i,`${t}/${o}`,n);continue}if(["prefixItems","allOf","anyOf","oneOf"].includes(o)){if(!Array.isArray(i))throw new _(n.dialect,t,`${o} must be an array`);r[o]=i.map((s,a)=>V(s,`${t}/${o}/${a}`,n));continue}r[o]=He(i)}if(n.dialect==="google"){let o=e.type!==void 0||e.properties!==void 0||e.items!==void 0,i=r.type!==void 0||r.properties!==void 0||r.items!==void 0;if(!o&&(e.oneOf!==void 0||e.allOf!==void 0||e.not!==void 0)||o&&!i)throw new _(n.dialect,t,"minimum structural contract cannot be represented")}return r}function ur(e,t,n){if(t.type!=="object"||!W(t.properties))throw new _(n,"#","root object/properties contract changed");let r=Object.keys(e.properties).sort(),o=Object.keys(t.properties).sort();if(JSON.stringify(r)!==JSON.stringify(o))throw new _(n,"#","root property identity changed");let i=[...e.required??[]].sort(),s=Array.isArray(t.required)?[...t.required].sort():[];if(JSON.stringify(i)!==JSON.stringify(s))throw new _(n,"#","root required-property contract changed")}function ye(e,t,n){if(n.pointers.set(t,e),typeof e!="boolean"){typeof e.$anchor=="string"&&n.anchors.set(e.$anchor,e);for(let r of["$defs","properties","patternProperties"]){let o=e[r];if(W(o))for(let[i,s]of Object.entries(o))ye(s,`${t}/${r}/${ze(i)}`,n)}for(let r of["items","contains","additionalProperties","not"]){let o=e[r];(typeof o=="boolean"||W(o))&&ye(o,`${t}/${r}`,n)}for(let r of["prefixItems","allOf","anyOf","oneOf"]){let o=e[r];Array.isArray(o)&&o.forEach((i,s)=>ye(i,`${t}/${r}/${s}`,n))}}}function mr(e,t,n){if(!e.startsWith("#"))throw new _(n.dialect,t,"remote references are forbidden");if(e==="#")return n.root;if(e.startsWith("#/")){let r=e.slice(1).split("/").map(i=>i.replace(/~1/g,"/").replace(/~0/g,"~")).map(ze).join("/"),o=n.pointers.get(r);if(o!==void 0)return o}else{let r=n.anchors.get(e.slice(1));if(r!==void 0)return r}throw new _(n.dialect,t,`unresolved reference ${e}`)}function At(e){return cr("sha256").update(Be(e)).digest("hex")}function Be(e){return Array.isArray(e)?`[${e.map(Be).join(",")}]`:W(e)?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Be(e[t])}`).join(",")}}`:JSON.stringify(e)}function He(e){return JSON.parse(JSON.stringify(e))}function ze(e){return e.replace(/~/g,"~0").replace(/\//g,"~1")}function W(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var pr={anthropic:{streaming:!1,textInput:!0,imageInput:!0,tools:!0,parallelToolCalls:!0,structuredOutput:!1,reasoningMetadata:!1,usageAccounting:!0,cancellation:!0,retryAfter:!0,promptCaching:!1},"openai-responses":{streaming:!1,textInput:!0,imageInput:!0,tools:!0,parallelToolCalls:!0,structuredOutput:!1,reasoningMetadata:!1,usageAccounting:!0,cancellation:!0,retryAfter:!0,promptCaching:!1},google:{streaming:!1,textInput:!0,imageInput:!0,tools:!0,parallelToolCalls:!0,structuredOutput:!1,reasoningMetadata:!1,usageAccounting:!0,cancellation:!0,retryAfter:!0,promptCaching:!1}};function Mt(e){let t=e.kind==="anthropic"?"https://api.anthropic.com":e.kind==="google"?"https://generativelanguage.googleapis.com":e.kind==="openai-responses"?"https://api.openai.com":null;if(!e.baseURL&&!t)throw new P("Generic OpenAI-compatible providers require baseURL",{category:"endpoint_policy",code:"PROVIDER_ENDPOINT_REJECTED"});let n=K(e.baseURL??t,{profile:e.endpointProfile,allowedHosts:e.allowedHosts,resolveHostname:e.resolveHostname});return n.pathname=n.pathname.replace(/\/$/,""),n}function re(e,t){let n=new URL(e.toString());return n.pathname=`${n.pathname.replace(/\/$/,"")}/${t.replace(/^\//,"")}`,n}function $t(e){let t=e.authentication??{type:"bearer"};if(t.type==="none"||!e.apiKey)return{};if(t.type==="bearer")return{authorization:`Bearer ${e.apiKey}`};let n=t.header.trim().toLowerCase(),r=new Set(["host","content-length","connection","transfer-encoding","cookie","set-cookie","proxy-authorization"]);if(!/^[a-z0-9-]{1,80}$/.test(n)||r.has(n))throw new P("Generic provider authentication header is invalid",{category:"endpoint_policy",code:"PROVIDER_ENDPOINT_REJECTED"});let o=t.prefix??"";if(/[\r\n]/.test(o))throw new P("Generic provider authentication prefix is invalid",{category:"endpoint_policy",code:"PROVIDER_ENDPOINT_REJECTED"});return{[n]:`${o}${e.apiKey}`}}function fr(e){let t;if(e.kind==="openai-compatible"){if(!e.capabilityProfile)throw new P("Generic OpenAI-compatible providers require an explicit capabilityProfile",{category:"unsupported_capability",code:"PROVIDER_CAPABILITY_UNSUPPORTED"});t={...e.capabilityProfile};for(let n of["structuredOutput","promptCaching"])if(t[n])throw z("direct-openai-compatible",n);if(!!e.streaming!=!!t.streaming)throw new P("Generic endpoint streaming config must match capabilityProfile.streaming",{category:"unsupported_capability",code:"PROVIDER_CAPABILITY_UNSUPPORTED"})}else t={...pr[e.kind],streaming:!!e.streaming,reasoningMetadata:e.kind==="anthropic"&&!!e.streaming};return{...t,vision:t.imageInput}}function oe(e,t){return{providerId:t,endpointPolicy:{profile:e.endpointProfile,allowedHosts:e.allowedHosts,resolveHostname:e.resolveHostname},limits:e.transportLimits}}function Nt(e){let t=/^data:([^;,]+);base64,([a-z0-9+/=\r\n]+)$/i.exec(e);return t?{mediaType:t[1],data:t[2].replace(/\s/g,"")}:null}function ie(e){let t=Array.isArray(e.assistant_content)?e.assistant_content:[],n=Array.isArray(e.assistant_only_content)?e.assistant_only_content:[];return[...t,...n].filter(r=>r?.type==="image_url")}function Dt(e){return e.filter(t=>t?.type==="image_url")}function jt(e){return e.some(t=>Array.isArray(t.content)&&t.content.some(n=>n.type==="image_url"||n.type==="tool_result"&&ie(n).length>0))}function Lt(e){let t=Nt(e.image_url.url);return t?{type:"image",source:{type:"base64",media_type:t.mediaType,data:t.data}}:{type:"image",source:{type:"url",url:e.image_url.url}}}function gr(e){return e.map(t=>({role:t.role,content:typeof t.content=="string"?t.content:t.content.flatMap(n=>{if(n.type==="image_url")return[Lt(n)];if(n.type==="text")return[n];if(n.type==="tool_use")return[{type:"tool_use",id:n.id,name:n.name,input:n.input}];let r=ie(n),o=[{type:"text",text:Z(n.content)}];return o.push(...r.map(Lt)),[{type:"tool_result",tool_use_id:n.tool_use_id,content:o,is_error:n.is_error}]})}))}function yr(e){return{type:"input_image",image_url:e.image_url.url,detail:e.image_url.detail??"auto"}}function hr(e){let t=[];for(let n of e){if(typeof n.content=="string"){t.push({role:n.role,content:n.content});continue}let r=n.content.filter(i=>i.type==="text").map(i=>i.text).join(`
|
|
8
8
|
`),o=[...Dt(n.content),...n.content.flatMap(i=>i.type==="tool_result"?ie(i):[])];(r||o.length)&&t.push({role:n.role,content:[...r?[{type:"input_text",text:r}]:[],...o.map(yr)]});for(let i of n.content)i.type==="tool_use"?t.push({type:"function_call",call_id:i.id,name:i.name,arguments:JSON.stringify(i.input)}):i.type==="tool_result"&&t.push({type:"function_call_output",call_id:i.tool_use_id,output:Z(i.content)})}return t}function Ot(e){let t=Nt(e.image_url.url);return t?{inlineData:{mimeType:t.mediaType,data:t.data}}:{fileData:{fileUri:e.image_url.url}}}function br(e){let t=new Map;for(let n of e)if(Array.isArray(n.content))for(let r of n.content)r.type==="tool_use"&&t.set(r.id,r.name);return e.map(n=>typeof n.content=="string"?{role:n.role==="assistant"?"model":"user",parts:[{text:n.content}]}:{role:n.role==="assistant"?"model":"user",parts:n.content.flatMap(r=>{if(r.type==="image_url")return[Ot(r)];if(r.type==="text")return[{text:r.text}];if(r.type==="tool_use")return[{functionCall:{id:r.id,name:r.name,args:r.input},...r.provider_metadata?.thoughtSignature?{thoughtSignature:r.provider_metadata.thoughtSignature}:{}}];let o=Z(r.content);return[{functionResponse:{id:r.tool_use_id,name:t.get(r.tool_use_id)??"unknown_tool",response:r.is_error?{error:o}:{result:o}}},...ie(r).map(Ot)]})})}function qt(e,t){let n=t?[{role:"system",content:t}]:[];for(let r of e){if(typeof r.content=="string"){n.push({role:r.role,content:r.content});continue}let o=r.content.filter(a=>a.type==="text").map(a=>a.text).join(`
|
|
9
|
-
`),i=r.content.filter(a=>a.type==="tool_use").map(a=>({id:a.id,type:"function",function:{name:a.name,arguments:JSON.stringify(a.input)}}));(o||i.length)&&n.push({role:r.role,content:o||null,...i.length?{tool_calls:i}:{}});for(let a of r.content)a.type==="tool_result"&&n.push({role:"tool",tool_call_id:a.tool_use_id,content:Z(a.content)});let s=[...Dt(r.content),...r.content.flatMap(a=>a.type==="tool_result"?ie(a):[])];s.length&&n.push({role:"user",content:s.map(a=>({type:"image_url",image_url:{url:a.image_url.url,detail:a.image_url.detail??"auto"}}))})}return n}function wr(e){return e.map(t=>({name:t.name,description:t.description,parameters:t.input_schema}))}function se(e={}){let t=i=>{let s=Number(i);return Number.isFinite(s)&&s>0?s:0},n=e.input_tokens!==void 0?t(e.input_tokens)+t(e.cache_creation_input_tokens)+t(e.cache_read_input_tokens):t(e.prompt_tokens??e.promptTokenCount??e.prompt_eval_count),r=i=>typeof i=="number"&&Number.isFinite(i),o=r(e.input_tokens)||r(e.prompt_tokens)||r(e.promptTokenCount)||r(e.prompt_eval_count);return{inputTokens:n,outputTokens:t(e.output_tokens??e.completion_tokens??e.candidatesTokenCount??e.eval_count),usageReported:o}}function be(e,t,n){return{content:e,stopReason:t,...se(n)}}function D(e,t,n){if(t&&typeof t=="object"&&!Array.isArray(t))return t;if(typeof t!="string")throw v(e,`${n} arguments must be JSON`);try{let r=JSON.parse(t||"{}");if(!r||typeof r!="object"||Array.isArray(r))throw new Error("arguments are not an object");return r}catch(r){throw v(e,`${n} contains malformed tool arguments`,r)}}function vr(e,t){if(!Array.isArray(t.content))throw v(e,"content must be an array");let n=t.content.flatMap(o=>{if(o.type==="text"&&typeof o.text=="string")return[{type:"text",text:o.text}];if(o.type==="tool_use"){if(!o.id||!o.name)throw v(e,"tool_use is missing id or name");return[{type:"tool_use",id:String(o.id),name:String(o.name),input:D(e,o.input??{},"tool_use")}]}return[]}),r=t.stop_reason==="tool_use"?"tool_use":t.stop_reason==="max_tokens"?"max_tokens":"end_turn";return be(n,r,t.usage??{})}function Pr(e,t){if(!Array.isArray(t.output))throw v(e,"output must be an array");let n=[];for(let i of t.output)if(i.type==="message"){if(!Array.isArray(i.content))throw v(e,"message content must be an array");for(let s of i.content)s.type==="output_text"&&typeof s.text=="string"&&n.push({type:"text",text:s.text})}else if(i.type==="function_call"){if(!i.call_id&&!i.id)throw v(e,"function_call is missing an id");if(!i.name)throw v(e,"function_call is missing a name");n.push({type:"tool_use",id:String(i.call_id??i.id),name:String(i.name),input:D(e,i.arguments??"{}","function_call")})}let r=n.some(i=>i.type==="tool_use"),o=t.status==="incomplete"&&t.incomplete_details?.reason==="max_output_tokens";return be(n,r?"tool_use":o?"max_tokens":"end_turn",t.usage??{})}function xr(e,t){if(!Array.isArray(t.candidates)||t.candidates.length===0){let s=t.promptFeedback?.blockReason;throw s?new x(`Provider safety policy refused the request: ${String(s)}`,{providerId:e,category:"safety_refusal",code:"PROVIDER_SAFETY_REFUSAL"}):v(e,"candidates must contain at least one item")}let n=t.candidates[0]??{};if(!Array.isArray(n.content?.parts))throw v(e,"candidate parts must be an array");let r=n.content.parts.flatMap((s,a)=>{if(typeof s.text=="string")return[{type:"text",text:s.text}];if(s.functionCall){let l=s.functionCall;if(!l.name)throw v(e,"functionCall is missing a name");return[{type:"tool_use",id:String(l.id??`gemini-${a}-${ze().slice(0,8)}`),name:String(l.name),input:D(e,l.args??{},"functionCall"),...s.thoughtSignature?{provider_metadata:{thoughtSignature:s.thoughtSignature}}:{}}]}return[]}),o=r.some(s=>s.type==="tool_use"),i=String(n.finishReason??"").includes("MAX_TOKENS");return be(r,o?"tool_use":i?"max_tokens":"end_turn",t.usageMetadata??{})}function Ut(e,t){if(!Array.isArray(t.choices)||t.choices.length===0)throw v(e,"choices must contain an item");let n=t.choices[0]??{},r=n.message;if(!r||typeof r!="object")throw v(e,"choice message is missing");let o=[];if(typeof r.content=="string"&&r.content&&o.push({type:"text",text:r.content}),Array.isArray(r.tool_calls))for(let s of r.tool_calls){if(!s.id||!s.function?.name)throw v(e,"tool call is missing id or name");o.push({type:"tool_use",id:String(s.id),name:String(s.function.name),input:D(e,s.function.arguments??"{}","tool call")})}let i=n.finish_reason==="length"?"max_tokens":o.some(s=>s.type==="tool_use")?"tool_use":"end_turn";return be(o,i,t.usage??{})}async function b(e,t){try{await e?.onEvent?.(t)}catch{}}async function Jt(e,t,n){await b(n,{type:"message.started"});let r=0;for(let o of e.content)o.type==="text"?(t?.(o.text),await b(n,{type:"text.delta",text:o.text})):o.type==="tool_use"&&(await b(n,{type:"tool_call.started",index:r,toolCallId:o.id,name:o.name}),await b(n,{type:"tool_call.completed",index:r,toolCallId:o.id,name:o.name,input:o.input}),r+=1);await b(n,{type:"usage.updated",inputTokens:e.inputTokens,outputTokens:e.outputTokens}),await b(n,{type:"message.completed",stopReason:e.stopReason})}function we(){return{content:[],inputTokens:0,outputTokens:0,usageReported:!1,stopReason:"end_turn",terminal:!1}}function ve(e,t){if(!t.terminal)throw v(e,"stream ended without a terminal event");return{content:t.content,stopReason:t.stopReason,usageReported:t.usageReported,inputTokens:t.inputTokens,outputTokens:t.outputTokens}}function Pe(e,t){try{let n=JSON.parse(t.data);if(!n||typeof n!="object"||Array.isArray(n))throw new Error("frame is not an object");return n}catch(n){throw v(e,`invalid stream JSON for ${t.event}`,n)}}async function Rr(e){let t=we(),n=new Map;return await te(e.url,{method:"POST",headers:e.headers,body:JSON.stringify({...e.body,stream:!0}),signal:e.signal},oe(e.config,e.providerId),async r=>{let o=Pe(e.providerId,r),i=String(o.type??r.event);if(i==="message_start"){let s=se(o.message?.usage);t.inputTokens=s.inputTokens,s.usageReported&&(t.usageReported=!0),await b(e.context,{type:"message.started",providerMessageId:o.message?.id})}else if(i==="content_block_start"){let s=Number(o.index??0),a=o.content_block??{};if(a.type==="tool_use"){let l={index:s,id:String(a.id),name:String(a.name),arguments:""};n.set(s,l),await b(e.context,{type:"tool_call.started",index:s,toolCallId:l.id,name:l.name})}else if(a.type==="text"&&a.text){let l=String(a.text);t.content.push({type:"text",text:l}),e.onText?.(l),await b(e.context,{type:"text.delta",text:l})}}else if(i==="content_block_delta"){let s=o.delta??{};if(s.type==="text_delta"){let a=String(s.text??"");if(a){let l=t.content.at(-1);l?.type==="text"?l.text+=a:t.content.push({type:"text",text:a}),e.onText?.(a),await b(e.context,{type:"text.delta",text:a})}}else if(s.type==="thinking_delta")await b(e.context,{type:"reasoning.delta",text:String(s.thinking??"")});else if(s.type==="input_json_delta"){let a=Number(o.index??0),l=n.get(a);if(!l)throw v(e.providerId,"tool argument delta arrived before tool start");let c=String(s.partial_json??"");l.arguments+=c,await b(e.context,{type:"tool_call.arguments.delta",index:a,toolCallId:l.id,delta:c})}}else if(i==="content_block_stop"){let s=Number(o.index??0),a=n.get(s);if(a){let l=D(e.providerId,a.arguments||"{}","streamed tool call");t.content.push({type:"tool_use",id:a.id,name:a.name,input:l}),await b(e.context,{type:"tool_call.completed",index:s,toolCallId:a.id,name:a.name,input:l})}}else if(i==="message_delta"){t.outputTokens=Number(o.usage?.output_tokens??t.outputTokens);let s=o.delta?.stop_reason;t.stopReason=s==="tool_use"?"tool_use":s==="max_tokens"?"max_tokens":"end_turn",await b(e.context,{type:"usage.updated",inputTokens:t.inputTokens,outputTokens:t.outputTokens})}else if(i==="message_stop")t.terminal=!0,await b(e.context,{type:"message.completed",stopReason:t.stopReason});else if(i==="error")throw v(e.providerId,String(o.error?.message??"stream error"))}),ve(e.providerId,t)}async function Cr(e){let t=we(),n=new Map;return await te(e.url,{method:"POST",headers:e.headers,body:JSON.stringify({...e.body,stream:!0}),signal:e.signal},oe(e.config,e.providerId),async r=>{if(r.data==="[DONE]")return;let o=Pe(e.providerId,r),i=String(o.type??r.event);if(i==="response.created")await b(e.context,{type:"message.started",providerMessageId:o.response?.id});else if(i==="response.output_text.delta"){let s=String(o.delta??""),a=t.content.at(-1);a?.type==="text"?a.text+=s:t.content.push({type:"text",text:s}),e.onText?.(s),await b(e.context,{type:"text.delta",text:s})}else if(i==="response.output_item.added"&&o.item?.type==="function_call"){let s=Number(o.output_index??n.size),a={index:s,id:String(o.item.call_id??o.item.id),name:String(o.item.name),arguments:String(o.item.arguments??"")};n.set(s,a),await b(e.context,{type:"tool_call.started",index:s,toolCallId:a.id,name:a.name})}else if(i==="response.function_call_arguments.delta"){let s=Number(o.output_index??0),a=n.get(s);if(!a)throw v(e.providerId,"tool argument delta arrived before tool start");let l=String(o.delta??"");a.arguments+=l,await b(e.context,{type:"tool_call.arguments.delta",index:s,toolCallId:a.id,delta:l})}else if(i==="response.output_item.done"&&o.item?.type==="function_call"){let s=Number(o.output_index??0),a=n.get(s)??{index:s,id:String(o.item.call_id??o.item.id),name:String(o.item.name),arguments:""},l=String(o.item.arguments??a.arguments??"{}"),c=D(e.providerId,l,"streamed function call");t.content.push({type:"tool_use",id:a.id,name:a.name,input:c}),t.stopReason="tool_use",await b(e.context,{type:"tool_call.completed",index:s,toolCallId:a.id,name:a.name,input:c})}else if(i==="response.completed"||i==="response.incomplete"){let s=o.response??{},a=se(s.usage??{});t.inputTokens=a.inputTokens,a.usageReported&&(t.usageReported=!0),t.outputTokens=a.outputTokens,i==="response.incomplete"&&(t.stopReason="max_tokens"),t.terminal=!0,await b(e.context,{type:"usage.updated",inputTokens:t.inputTokens,outputTokens:t.outputTokens}),await b(e.context,{type:"message.completed",stopReason:t.stopReason})}else if(i==="response.failed"||i==="error")throw v(e.providerId,String(o.response?.error?.message??o.error?.message??"stream failed"))}),ve(e.providerId,t)}async function Tr(e){let t=we(),n=new Map;await b(e.context,{type:"message.started"}),await te(e.url,{method:"POST",headers:e.headers,body:JSON.stringify({...e.body,stream:!0,stream_options:{include_usage:!0}}),signal:e.signal},oe(e.config,e.providerId),async r=>{if(r.data==="[DONE]"){t.terminal=!0;return}let o=Pe(e.providerId,r);if(o.usage){let i=se(o.usage);t.inputTokens=i.inputTokens,i.usageReported&&(t.usageReported=!0),t.outputTokens=i.outputTokens,await b(e.context,{type:"usage.updated",inputTokens:t.inputTokens,outputTokens:t.outputTokens})}for(let i of o.choices??[]){let s=i.delta??{};if(typeof s.content=="string"&&s.content){let a=t.content.at(-1);a?.type==="text"?a.text+=s.content:t.content.push({type:"text",text:s.content}),e.onText?.(s.content),await b(e.context,{type:"text.delta",text:s.content})}for(let a of s.tool_calls??[]){let l=Number(a.index??0),c=n.get(l);c||(c={index:l,id:String(a.id??`call-${l}`),name:"",arguments:""},n.set(l,c)),a.id&&(c.id=String(a.id)),a.function?.name&&(c.name+=String(a.function.name)),c.name&&!c.started&&(await b(e.context,{type:"tool_call.started",index:l,toolCallId:c.id,name:c.name}),c.started=!0);let d=String(a.function?.arguments??"");d&&(c.arguments+=d,await b(e.context,{type:"tool_call.arguments.delta",index:l,toolCallId:c.id,delta:d}))}i.finish_reason&&(t.stopReason=i.finish_reason==="length"?"max_tokens":n.size?"tool_use":"end_turn")}});for(let r of[...n.values()].sort((o,i)=>o.index-i.index)){let o=D(e.providerId,r.arguments||"{}","streamed tool call");t.content.push({type:"tool_use",id:r.id,name:r.name,input:o}),await b(e.context,{type:"tool_call.completed",index:r.index,toolCallId:r.id,name:r.name,input:o})}return await b(e.context,{type:"message.completed",stopReason:t.stopReason}),ve(e.providerId,t)}async function kr(e){let t=we(),n=0;return await b(e.context,{type:"message.started"}),await te(e.url,{method:"POST",headers:e.headers,body:JSON.stringify(e.body),signal:e.signal},oe(e.config,e.providerId),async r=>{let o=Pe(e.providerId,r);if(o.usageMetadata){let s=se(o.usageMetadata);t.inputTokens=s.inputTokens,s.usageReported&&(t.usageReported=!0),t.outputTokens=s.outputTokens,await b(e.context,{type:"usage.updated",inputTokens:t.inputTokens,outputTokens:t.outputTokens})}let i=o.candidates?.[0];for(let s of i?.content?.parts??[])if(typeof s.text=="string"){let a=t.content.at(-1);a?.type==="text"?a.text+=s.text:t.content.push({type:"text",text:s.text}),e.onText?.(s.text),await b(e.context,{type:"text.delta",text:s.text})}else if(s.functionCall){let a=s.functionCall,l=String(a.id??`gemini-${n}-${ze().slice(0,8)}`),c=String(a.name??""),d=D(e.providerId,a.args??{},"streamed function call");await b(e.context,{type:"tool_call.started",index:n,toolCallId:l,name:c}),t.content.push({type:"tool_use",id:l,name:c,input:d,...s.thoughtSignature?{provider_metadata:{thoughtSignature:s.thoughtSignature}}:{}}),await b(e.context,{type:"tool_call.completed",index:n,toolCallId:l,name:c,input:d}),n+=1}i?.finishReason&&(t.stopReason=String(i.finishReason).includes("MAX_TOKENS")?"max_tokens":n?"tool_use":"end_turn",t.terminal=!0,await b(e.context,{type:"message.completed",stopReason:t.stopReason}))}),ve(e.providerId,t)}function Xt(e){return e instanceof x?{type:"provider.error",code:e.code,category:e.category,retryable:e.retryable}:{type:"provider.error",code:"PROVIDER_TRANSPORT_ERROR",category:"transport",retryable:!1}}function _r(e){if(e.maxTokens!==void 0&&(!Number.isSafeInteger(e.maxTokens)||e.maxTokens<1))throw v("direct-provider","maxTokens must be a positive safe integer");let t=`direct-${e.kind}`,n=Mt(e),r=fr(e),o={profile:e.endpointProfile,allowedHosts:e.allowedHosts,resolveHostname:e.resolveHostname},i={providerId:t,endpointPolicy:o,limits:e.transportLimits};return{id:t,capabilities:r,async complete(s,a,l,c,d,u){if(l.length>0&&!r.tools)throw z(t,"tools");if(jt(a)&&!r.imageInput)throw z(t,"image input");let m=e.kind==="openai-compatible"?"openai-chat":e.kind,p=he(l,m).map(({definition:P})=>P),g,y={"content-type":"application/json"},f;try{if(e.kind==="anthropic"){if(g=re(n,"/v1/messages"),y={...y,"x-api-key":e.apiKey,"anthropic-version":e.anthropicVersion??"2023-06-01"},f={model:s,max_tokens:e.maxTokens??8192,system:u?.systemPrompt,messages:gr(a),tools:p.map(w=>({name:w.name,description:w.description,input_schema:w.input_schema}))},e.streaming)return await Rr({providerId:t,url:g,headers:y,body:f,config:e,signal:d,onText:c,context:u})}else if(e.kind==="google"){let w=e.streaming?"streamGenerateContent":"generateContent";if(g=re(n,`/v1beta/models/${encodeURIComponent(s)}:${w}`),e.streaming&&g.searchParams.set("alt","sse"),y={...y,"x-goog-api-key":e.apiKey},f={systemInstruction:u?.systemPrompt?{parts:[{text:u.systemPrompt}]}:void 0,contents:br(a),tools:p.length>0?[{functionDeclarations:wr(p)}]:void 0,generationConfig:{maxOutputTokens:e.maxTokens??8192}},e.streaming)return await kr({providerId:t,url:g,headers:y,body:f,config:e,signal:d,onText:c,context:u})}else if(e.kind==="openai-compatible"){if(g=re(n,e.chatCompletionsPath??"/v1/chat/completions"),y={...y,...$t(e)},f={model:s,messages:qt(a,u?.systemPrompt),tools:p.length>0?p.map(w=>({type:"function",function:{name:w.name,description:w.description,parameters:w.input_schema}})):void 0,max_tokens:e.maxTokens??8192},e.streaming)return await Tr({providerId:t,url:g,headers:y,body:f,config:e,signal:d,onText:c,context:u})}else if(g=re(n,"/v1/responses"),y={...y,authorization:`Bearer ${e.apiKey}`},f={model:s,instructions:u?.systemPrompt,input:hr(a),tools:p.map(w=>({type:"function",name:w.name,description:w.description,parameters:w.input_schema})),max_output_tokens:e.maxTokens??8192,store:!1},e.streaming)return await Cr({providerId:t,url:g,headers:y,body:f,config:e,signal:d,onText:c,context:u});let P=await Ne(g,{method:"POST",headers:y,body:JSON.stringify(f),signal:d},i),C=e.kind==="anthropic"?vr(t,P):e.kind==="google"?xr(t,P):e.kind==="openai-compatible"?Ut(t,P):Pr(t,P);return await Jt(C,c,u),C}catch(P){throw P instanceof x&&P.category==="cancelled"?await b(u,{type:"provider.cancelled"}):(await b(u,Xt(P)),P instanceof x&&P.retryable&&await b(u,{type:"provider.retry",retryAfterMs:P.retryAfterMs,reason:P.category})),P}}}}function Sr(e){let t="direct-ollama-native";if(e.maxTokens!==void 0&&(!Number.isSafeInteger(e.maxTokens)||e.maxTokens<1))throw v(t,"maxTokens must be a positive safe integer");let n={...e,kind:"openai-compatible"},r=Mt(n);return{id:t,capabilities:{streaming:!1,textInput:!0,imageInput:!1,vision:!1,tools:!0,parallelToolCalls:!1,structuredOutput:!1,reasoningMetadata:!1,usageAccounting:!0,cancellation:!0,retryAfter:!0,promptCaching:!1},async complete(o,i,s,a,l,c){if(jt(i))throw z(t,"image input");try{let d=he(s,"openai-chat").map(({definition:y})=>y),u=qt(i,c?.systemPrompt).map(y=>({...y,content:y.content??"",...y.tool_calls?{tool_calls:y.tool_calls.map(f=>({...f,function:{...f.function,arguments:D(t,f.function.arguments,"tool call")}}))}:{}})),m=await Ne(re(r,"/api/chat"),{method:"POST",signal:l,headers:{"content-type":"application/json",...$t(n)},body:JSON.stringify({model:o,messages:u,stream:!1,options:{num_predict:e.maxTokens??8192},tools:d.map(y=>({type:"function",function:{name:y.name,description:y.description,parameters:y.input_schema}}))})},oe(n,t));if(m.done!==!0||!m.message||typeof m.message!="object")throw v(t,"native completion is missing its terminal message");let p=m.message,g=Ut(t,{choices:[{message:{...p,...Array.isArray(p.tool_calls)?{tool_calls:p.tool_calls.map(y=>({...y,id:y.id??ze()}))}:{}},finish_reason:m.done_reason==="length"?"length":"stop"}],usage:m});return await Jt(g,a,c),g}catch(d){throw await b(c,d instanceof x&&d.category==="cancelled"?{type:"provider.cancelled"}:Xt(d)),d}}}}function Ke(e,t={}){for(let n of e){let r=n.codePointAt(0);if(r===127)return!0;if(!(r>31)&&!(r===9&&t.allowTab===!0)&&!((r===10||r===13)&&t.allowLineBreaks===!0))return!0}return!1}var Vt=1,B={streaming:!0,textInput:!0,imageInput:!0,tools:!0,parallelToolCalls:!0,structuredOutput:!1,reasoningMetadata:!0,usageAccounting:!0,promptCaching:!1,modelDiscovery:!0},xe={...B,reasoningMetadata:!1},Er=[O("xeno","XENO hosted","xeno","openai-compatible","https://api.xenostudio.ai","public-https","bearer-env","XENO_API_KEY","/v1/models",B),O("openai","OpenAI","direct","openai-responses","https://api.openai.com","public-https","bearer-env","OPENAI_API_KEY","/v1/models",B),O("anthropic","Anthropic","direct","anthropic","https://api.anthropic.com","public-https","header-env","ANTHROPIC_API_KEY","/v1/models",{...B,structuredOutput:!1}),O("google","Google AI Studio","direct","google","https://generativelanguage.googleapis.com","public-https","header-env","GOOGLE_API_KEY","/v1beta/models",B),O("openrouter","OpenRouter","gateway","openai-compatible","https://openrouter.ai/api","public-https","bearer-env","OPENROUTER_API_KEY","/v1/models",xe),O("xeno-rt","xeno-rt","local","openai-compatible","http://127.0.0.1:3338","local-network","none",void 0,"/v1/models",xe,["running xeno-rt endpoint"]),O("ollama","Ollama","local","openai-compatible","http://127.0.0.1:11434","local-network","none",void 0,"/v1/models",xe,["Ollama OpenAI compatibility endpoint"]),O("azure-openai","Azure OpenAI","cloud","openai-compatible",void 0,"public-https","header-env","AZURE_OPENAI_API_KEY",void 0,xe,["resource endpoint","deployment","API version","host adapter for deployment-shaped requests"]),O("aws-bedrock","Amazon Bedrock","cloud","aws-bedrock",void 0,"public-https","cloud-chain",void 0,void 0,{...B,modelDiscovery:!1},["AWS credential chain","region","Bedrock host adapter"]),O("vertex-ai","Google Vertex AI","cloud","vertex-ai",void 0,"public-https","cloud-chain",void 0,void 0,{...B,modelDiscovery:!1},["Google application-default credentials","project","region","Vertex host adapter"])],ae=class{presets=new Map;constructor(t=Er){for(let n of t)this.add(n)}add(t){Nr(t),this.presets.set(t.id,structuredClone(t))}get(t){let n=this.presets.get(t);return n?structuredClone(n):void 0}list(){return[...this.presets.values()].map(t=>structuredClone(t)).sort((t,n)=>t.displayName.localeCompare(n.displayName))}resolve(t,n){let r=this.get(t.providerId);if(!r)throw new Error(`Unknown provider preset: ${t.providerId}`);let o=[],i;try{i=Bt(t.baseUrl??r.defaultBaseUrl,r)}catch(l){o.push(l instanceof Error?l.message:String(l))}i||o.push("Provider endpoint is not configured");let s=t.secretRef?.trim()||r.auth.defaultSecretRef;(r.auth.mode==="bearer-env"||r.auth.mode==="header-env")&&!s&&o.push("Credential reference is not configured"),s&&n&&!n(s)&&o.push(`Credential reference ${s} is not available`),(r.adapterKind==="aws-bedrock"||r.adapterKind==="vertex-ai"||r.id==="azure-openai")&&o.push("Provider requires a dedicated host adapter");let a="ready";return t.enabled===!1?a="blocked":o.some(l=>l.includes("host adapter"))?a="requires-host-adapter":o.some(l=>l.includes("Credential"))?a="missing-credential":o.length&&(a="needs-configuration"),{connection:Dr(t),preset:r,...i?{endpoint:i}:{},...s?{secretRef:s}:{},readiness:a,blockers:o}}};async function oi(e){let n=(e.catalog??new ae).resolve(e.connection),r=n.preset.auth.mode,o=n.secretRef?await e.resolveSecretRef?.(n.secretRef):void 0,i=r==="none"?"not-required":r==="cloud-chain"?"external":o?"present":"missing",s={schemaVersion:1,connectionId:n.connection.id,providerId:n.preset.id,...n.endpoint?{endpoint:n.endpoint}:{},readiness:n.readiness,credentialState:i,reachable:!1,authenticated:null,models:[],capabilities:n.preset.capabilities,errors:[...n.blockers]};if(n.readiness==="requires-host-adapter"||n.readiness==="blocked"||!n.endpoint)return s;if((r==="bearer-env"||r==="header-env")&&!o)return{...s,readiness:"missing-credential",errors:Y([...s.errors,`Credential reference ${n.secretRef??"(missing)"} did not resolve`])};if(!n.preset.discoveryPath)return{...s,readiness:"ready",errors:Y(s.errors)};let a=K(n.endpoint,{profile:n.preset.endpointProfile,allowedHosts:n.preset.allowedHosts});try{await Le(a,{profile:n.preset.endpointProfile,allowedHosts:n.preset.allowedHosts,resolveHostname:e.resolveHostname})}catch(u){return{...s,readiness:"blocked",errors:Y([...s.errors,u instanceof Error?u.message:String(u)])}}let l=Ir(a,n.preset.discoveryPath),c=Ar(n.preset,o),d=Date.now();try{let{response:u,text:m}=await Lr(e.fetchImpl??fetch,l,{headers:c},e.timeoutMs??8e3,e.maxResponseBytes??2097152),p=Date.now()-d,g=u.status===401||u.status===403?!1:u.ok?!0:null;if(!u.ok)return{...s,reachable:!0,authenticated:g,latencyMs:p,readiness:g===!1?"missing-credential":"blocked",errors:Y([...s.errors,`Provider discovery returned HTTP ${u.status}`])};let y=JSON.parse(m);return{...s,readiness:"ready",reachable:!0,authenticated:g,latencyMs:p,models:Or(y),errors:Y(s.errors)}}catch(u){return{...s,readiness:"blocked",latencyMs:Date.now()-d,errors:Y([...s.errors,jr(u)])}}}function ii(e,t={}){let n=t.allowedProviderIds?new Set(t.allowedProviderIds):null,r=new Set(t.deniedProviderIds??[]),o=new Map((t.fallbackOrder??[]).map((i,s)=>[i,s]));return e.filter(({connection:i,model:s})=>{let a=i.preset.id;return!(i.readiness!=="ready"||i.connection.enabled===!1||n&&!n.has(a)||r.has(a)||!Mr({...i.preset.capabilities,...s.capabilities??{}},t.require)||t.maxInputCostPerMillion!==void 0&&(s.inputCostPerMillion??1/0)>t.maxInputCostPerMillion||t.maxOutputCostPerMillion!==void 0&&(s.outputCostPerMillion??1/0)>t.maxOutputCostPerMillion)}).sort((i,s)=>{if(t.preferLocal&&i.connection.preset.family!==s.connection.preset.family){if(i.connection.preset.family==="local")return-1;if(s.connection.preset.family==="local")return 1}let a=o.get(i.connection.preset.id)??Number.MAX_SAFE_INTEGER,l=o.get(s.connection.preset.id)??Number.MAX_SAFE_INTEGER;return a-l||i.connection.preset.id.localeCompare(s.connection.preset.id)||i.model.id.localeCompare(s.model.id)})}function si(e,t){if(e.readiness==="requires-host-adapter")throw new Error(`${e.preset.displayName} requires a dedicated host adapter`);if(!e.endpoint)throw new Error("Provider endpoint is not configured");if(e.preset.adapterKind==="aws-bedrock"||e.preset.adapterKind==="vertex-ai")throw new Error("Cloud adapter cannot be represented as DirectProviderConfig");if((e.preset.auth.mode==="bearer-env"||e.preset.auth.mode==="header-env")&&!t)throw new Error("Provider credential did not resolve");let n=$r(e.preset.capabilities);return{kind:e.preset.adapterKind,apiKey:t??"",baseURL:e.endpoint,endpointProfile:e.preset.endpointProfile,allowedHosts:e.preset.allowedHosts,streaming:n.streaming,...e.preset.adapterKind==="openai-compatible"?{capabilityProfile:n}:{},...e.preset.auth.mode==="header-env"?{authentication:{type:"header",header:e.preset.auth.header??Fe(e.preset.id),prefix:e.preset.auth.prefix}}:{},...e.preset.auth.mode==="none"?{authentication:{type:"none"}}:{}}}function O(e,t,n,r,o,i,s,a,l,c,d=[]){return{schemaVersion:Vt,id:e,displayName:t,family:n,adapterKind:r,...o?{defaultBaseUrl:o}:{},endpointProfile:i,...o?{allowedHosts:[new URL(o).hostname]}:{},auth:{mode:s,...a?{defaultSecretRef:a}:{},...s==="header-env"?{header:Fe(e)}:{},description:s==="none"?"No credential required":s==="cloud-chain"?"Provider-owned cloud credential chain":`Environment/credential reference ${a}`},capabilities:c,...l?{discoveryPath:l}:{},requires:d}}function Fe(e){return e==="anthropic"?"x-api-key":e==="google"?"x-goog-api-key":e==="azure-openai"?"api-key":"authorization"}function Ar(e,t){return e.auth.mode==="none"||e.auth.mode==="cloud-chain"?{accept:"application/json"}:t?e.auth.mode==="bearer-env"?{accept:"application/json",authorization:`Bearer ${t}`}:{accept:"application/json",[e.auth.header??Fe(e.id)]:`${e.auth.prefix??""}${t}`}:{accept:"application/json"}}function Bt(e,t){return e?K(e.trim().replace(/\/+$/,""),{profile:t.endpointProfile,allowedHosts:t.allowedHosts}).toString().replace(/\/$/,""):void 0}function Ir(e,t){let n=new URL(e.toString());if(!t.startsWith("/")||t.includes("..")||t.includes("#"))throw new Error("Provider discovery path is invalid");return n.pathname=`${n.pathname.replace(/\/$/,"")}${t}`.replace(/\/{2,}/g,"/"),n}async function Lr(e,t,n,r,o){if(!Number.isSafeInteger(r)||r<1||r>6e4||!Number.isSafeInteger(o)||o<1||o>16*1024*1024)throw new Error("Invalid provider discovery limits");let i=new AbortController,s,a=!1,l,c=new Promise((u,m)=>{l=m}),d=setTimeout(()=>{a=!0;let u=new Error("Provider probe timed out");i.abort(u),l(u),s?.cancel().catch(()=>{})},r);try{let u=e(t,{...n,signal:i.signal,redirect:"manual"});u.then(C=>{a&&C.body?.cancel().catch(()=>{})},()=>{});let m=await Promise.race([u,c]);if(m.redirected||m.status>=300&&m.status<400)throw m.body?.cancel().catch(()=>{}),new Error("Provider discovery redirects are disabled");let p=0;if(m.headers.forEach((C,w)=>{p+=Buffer.byteLength(w)+Buffer.byteLength(C)}),p>64*1024)throw m.body?.cancel().catch(()=>{}),new Error("Provider discovery headers exceed limit");if(!m.ok||!m.body)return m.body?.cancel().catch(()=>{}),{response:m,text:""};let g=m.headers.get("content-length");if(g&&/^\d+$/.test(g)&&Number(g)>o)throw m.body.cancel().catch(()=>{}),new Error(`Provider discovery response exceeds ${o} bytes`);s=m.body.getReader();let y=new TextDecoder("utf-8",{fatal:!0}),f=0,P="";for(;;){let C=await Promise.race([s.read(),c]);if(C.done)break;if(f+=C.value.byteLength,f>o)throw new Error(`Provider discovery response exceeds ${o} bytes`);P+=y.decode(C.value,{stream:!0})}return P+=y.decode(),{response:m,text:P}}finally{clearTimeout(d),i.abort(),s&&(s.cancel().catch(()=>{}),s.releaseLock())}}function Or(e){if(!e||typeof e!="object")return[];let t=e,r=(Array.isArray(t.data)?t.data:Array.isArray(t.models)?t.models:[]).flatMap(o=>{if(!o||typeof o!="object")return[];let i=o,a=(typeof i.id=="string"?i.id:typeof i.name=="string"?i.name.replace(/^models\//,""):"").trim();return!a||a.length>300||Ke(a)?[]:[{id:a,...typeof i.displayName=="string"&&i.displayName.trim()?{displayName:i.displayName.trim().slice(0,300)}:{},...typeof i.owned_by=="string"&&i.owned_by.trim()?{ownedBy:i.owned_by.trim().slice(0,200)}:{},metadataSource:"provider"}]});return[...new Map(r.map(o=>[o.id,o])).values()].sort((o,i)=>o.id.localeCompare(i.id))}function Mr(e,t){return t?Object.entries(t).every(([n,r])=>r!==!0||e[n]===!0):!0}function $r(e){return{streaming:e.streaming,textInput:e.textInput,imageInput:e.imageInput,tools:e.tools,parallelToolCalls:e.parallelToolCalls,structuredOutput:e.structuredOutput,reasoningMetadata:e.reasoningMetadata,usageAccounting:e.usageAccounting,cancellation:!0,retryAfter:!0,promptCaching:e.promptCaching}}function Nr(e){if(e.schemaVersion!==Vt||!/^[a-z0-9][a-z0-9._-]{1,80}$/.test(e.id))throw new Error("Provider preset id is invalid");if(!e.displayName.trim())throw new Error(`Provider preset ${e.id} requires displayName`);if(e.defaultBaseUrl&&Bt(e.defaultBaseUrl,e),e.discoveryPath&&(!e.discoveryPath.startsWith("/")||e.discoveryPath.includes("..")))throw new Error(`Provider preset ${e.id} discoveryPath is invalid`);if(e.auth.header&&!/^[A-Za-z0-9-]{1,80}$/.test(e.auth.header))throw new Error(`Provider preset ${e.id} auth header is invalid`)}function Dr(e){let t=e.id.trim();if(!t||t.length>120||Ke(t))throw new Error("Provider connection id is invalid");let n=e.secretRef?.trim();if(n&&!/^[A-Za-z_][A-Za-z0-9_.:/-]{0,255}$/.test(n))throw new Error("Provider credential reference is invalid");return{id:t,providerId:e.providerId.trim(),...e.baseUrl?.trim()?{baseUrl:e.baseUrl.trim()}:{},...n?{secretRef:n}:{},...e.model?.trim()?{model:e.model.trim().slice(0,300)}:{},enabled:e.enabled!==!1,...e.metadata?{metadata:{...e.metadata}}:{}}}function Y(e){return[...new Set(e)]}function jr(e){return(e instanceof Error?e.message:String(e)).replace(/(Bearer\s+)[A-Za-z0-9._~+/=-]+/gi,"$1[redacted]").replace(/([?&#](?:token|key|secret|password|api[_-]?key)=)[^&#\s]+/gi,"$1[redacted]").slice(0,500)}import{createHash as Gt}from"node:crypto";import{chmod as Fr,mkdir as Zt,open as Qr,readFile as Wr,rename as Yr,unlink as Gr}from"node:fs/promises";import{dirname as Zr,join as Wt,resolve as eo}from"node:path";function Re(e){return JSON.stringify(Qe(e,new Set))}function Qe(e,t){if(e===null||typeof e!="object"){if(typeof e=="number"&&!Number.isFinite(e))throw new TypeError("Artifact JSON cannot contain non-finite numbers");return e}if(t.has(e))throw new TypeError("Artifact JSON cannot contain cycles");if(t.add(e),Array.isArray(e)){let r=e.map(o=>Qe(o,t));return t.delete(e),r}let n={};for(let r of Object.keys(e).sort((o,i)=>o.localeCompare(i))){let o=e[r];if(o===void 0)throw new TypeError(`Artifact JSON property ${r} is undefined`);n[r]=Qe(o,t)}return t.delete(e),n}import{mkdirSync as qr,readFileSync as Ur,rmSync as zt,writeFileSync as Jr}from"node:fs";import{hostname as Kt}from"node:os";import{dirname as Xr}from"node:path";function Vr(){return new Date().toISOString()}function Br(){return new Date(Date.now()-Math.floor(process.uptime()*1e3)).toISOString()}function Ft(e){try{return JSON.parse(Ur(e,"utf8"))}catch{return null}}function Hr(e){if(!e||e<=0)return!1;try{return process.kill(e,0),!0}catch{return!1}}function zr(e){return e.hostname!==Kt()?!0:Hr(e.pid)}function Ht(e,t){qr(Xr(e),{recursive:!0}),Jr(e,JSON.stringify(t,null,2)+`
|
|
10
|
-
`,{encoding:"utf8",flag:"wx"})}function Kr(e,t){let n=Ft(e);n?.pid!==t.pid||n.hostname!==t.hostname||zt(e,{force:!0})}function Qt(e,t,n){let r=Vr(),o={schemaVersion:1,name:t,pid:process.pid,hostname:Kt(),processStartedAt:Br(),version:n,acquiredAt:r,updatedAt:r};try{Ht(e,o)}catch(i){if(i.code!=="EEXIST")throw i;let a=Ft(e);if(a&&zr(a))throw new Error(`${t} is already locked by PID ${a.pid} on ${a.hostname}.`);zt(e,{force:!0}),Ht(e,o)}return{record:o,release:()=>{Kr(e,o)}}}var
|
|
11
|
-
`),i}finally{n.release()}}};function to(e){return en({schemaVersion:Ye,generation:0,updatedAt:e.toISOString(),connections:[],routingPolicy:{}})}function We(e,t,n,r){return en({schemaVersion:Ye,generation:e.generation+1,updatedAt:r.toISOString(),connections:[...t].sort((o,i)=>o.id.localeCompare(i.id)),routingPolicy:n})}function en(e){return{...e,checksum:{algorithm:"sha256",value:Gt("sha256").update(rn(e)).digest("hex")}}}function no(e,t){if(e.schemaVersion!==Ye||!Array.isArray(e.connections))throw new Error("Invalid provider connection snapshot");let{checksum:n,...r}=e;if(n?.algorithm!=="sha256"||n.value!==Gt("sha256").update(rn(r)).digest("hex"))throw new Error("Provider connection snapshot checksum mismatch");let o=new Set;for(let i of e.connections){let s=t.resolve(i).connection;if(tn(s),o.has(s.id))throw new Error(`Duplicate provider connection: ${s.id}`);o.add(s.id)}nn(e.routingPolicy)}function tn(e){let t=JSON.stringify(e);if(/\b(?:sk-[A-Za-z0-9_-]{16,}|xox[baprs]-[A-Za-z0-9-]{16,}|AKIA[0-9A-Z]{16})\b/.test(t))throw new Error("Provider connection configuration cannot contain raw credentials");if(e.baseUrl&&/[?&#](?:token|key|secret|password|api[_-]?key)=/i.test(e.baseUrl))throw new Error("Provider endpoint cannot contain credentials")}function nn(e){let t=r=>r?[...new Set(r.map(o=>o.trim()).filter(Boolean))].sort():void 0,n={...t(e.allowedProviderIds)?{allowedProviderIds:t(e.allowedProviderIds)}:{},...t(e.deniedProviderIds)?{deniedProviderIds:t(e.deniedProviderIds)}:{},...t(e.fallbackOrder)?{fallbackOrder:t(e.fallbackOrder)}:{},...e.preferLocal!==void 0?{preferLocal:!!e.preferLocal}:{},...e.require?{require:{...e.require}}:{}};for(let[r,o]of[["maxInputCostPerMillion",e.maxInputCostPerMillion],["maxOutputCostPerMillion",e.maxOutputCostPerMillion]])if(o!==void 0){if(!Number.isFinite(o)||o<0)throw new Error(`${r} must be a non-negative finite number`);n[r]=o}return n}async function ro(e,t){await Zt(Zr(e),{recursive:!0,mode:448});let n=`${e}.${process.pid}.${Date.now()}.tmp`,r;try{r=await Qr(n,"wx",384),await r.writeFile(t,"utf8"),await r.sync(),await r.close(),r=void 0,await Yr(n,e),await Fr(e,384).catch(()=>{})}finally{r&&await r.close().catch(()=>{}),await Gr(n).catch(()=>{})}}function rn(e){return Re(e)}import{createHash as sn}from"node:crypto";async function on(e,t){t?.throwIfAborted();let n=new AbortController,r=setTimeout(()=>n.abort(new DOMException("Operation acknowledgement timed out.","TimeoutError")),3e4),o=t?AbortSignal.any([t,n.signal]):n.signal,i;try{let s=await new Promise((a,l)=>{i=()=>l(o.reason),o.addEventListener("abort",i,{once:!0}),Promise.resolve().then(()=>(o.throwIfAborted(),e(o))).then(a,l)});return o.throwIfAborted(),s}finally{i&&o.removeEventListener("abort",i),clearTimeout(r)}}var R=class extends Error{constructor(n,r){super(r);this.code=n;this.name="QuotaError"}code;retryable=!1},Ge=class extends Error{constructor(n,r,o){super(`Quota ${n} did not acknowledge; reconcile reservation ${r} before retrying.`,{cause:o});this.phase=n;this.reservationId=r;this.name="QuotaAcknowledgementError"}phase;reservationId;code="ACKNOWLEDGEMENT_FAILED";retryable=!1};function oo(e){return e instanceof Error&&(e.name==="QuotaError"||e.name==="QuotaAcknowledgementError")&&"retryable"in e&&e.retryable===!1&&"code"in e&&typeof e.code=="string"}function k(e){if(typeof e!="number"||!Number.isSafeInteger(e)||e<0)throw new R("INVALID","Quota counters must be non-negative safe integers.");return e}function A(e){if(typeof e!="string"||!e.trim()||e.length>512)throw new R("INVALID","Invalid quota identity.");return e}function j(e){let t=n=>({id:A(n?.id),generation:A(n?.generation)});if(!e||e.agent&&!e.team)throw new R("INVALID","A child quota scope requires its complete ancestry.");return{workspace:t(e.workspace),...e.team?{team:t(e.team)}:{},...e.agent?{agent:t(e.agent)}:{},...e.goal!==void 0?{goal:t(e.goal)}:{}}}function q(e){return JSON.stringify(j(e))}function Ce(e){let t=j(e),n=[{workspace:t.workspace},...t.team?[{workspace:t.workspace,team:t.team}]:[],...t.agent?[{workspace:t.workspace,team:t.team,agent:t.agent}]:[]];return t.goal?n.flatMap(r=>[r,{...r,goal:t.goal}]):n}function Ri(e,t,n){let r=j(n);async function o(i,s,a,l,c,d){if(c?.throwIfAborted(),!e.prepareQuotaRequest)throw new R("UNSUPPORTED","This provider cannot guarantee per-request token bounds.");let u=A(d?.attemptId),m=sn("sha256").update(JSON.stringify([e.id,i,s,a,d?.systemPrompt??""])).digest("hex"),p=sn("sha256").update(JSON.stringify([q(r),e.id,u])).digest("hex"),g=async(C,w,I=c)=>{try{return await on(w,I)}catch(M){throw oo(M)?M:new Ge(C,p,M)}},y=await g("prepare",C=>e.prepareQuotaRequest(i,structuredClone(s),structuredClone(a),d,C)),f=k(k(y.inputTokensUpperBound)+k(y.outputTokensUpperBound));if(y.basis!=="provider-enforced")throw new R("UNSUPPORTED","Estimated token bounds cannot enforce a hard quota.");await g("reserve",()=>t.reserve({id:p,scope:r,requestHash:m,reservedTokens:f})),c?.aborted&&(await g("void",()=>t.void(p),new AbortController().signal),c.throwIfAborted()),await g("dispatch",()=>t.dispatch(p)),c?.throwIfAborted();let P=await y.execute(l,c);if(c?.throwIfAborted(),P.usageReported){let C=k(P.inputTokens),w=k(P.outputTokens);if(C>y.inputTokensUpperBound||w>y.outputTokensUpperBound)throw new R("CORRUPT","Provider exceeded its guaranteed token bound; reservation requires reconciliation.");await g("settle",()=>t.settle(p,k(C+w)))}return P}return{id:e.id,...e.model?{model:e.model}:{},...e.capabilities?{capabilities:e.capabilities}:{},complete:o,completeLocal:o}}import{createHash as io,randomUUID as so}from"node:crypto";import{link as ao,lstat as lo,mkdir as co,open as Ze,readdir as uo,unlink as an}from"node:fs/promises";import{join as et,resolve as mo}from"node:path";var Te=e=>io("sha256").update(Re(e)).digest("hex"),ke=e=>new Date(e).toISOString().slice(0,10);function ln(e){return e.kind==="policy"?e.policy.limits.tokensLifetime!==void 0||e.policy.scope.goal!==void 0:e.kind==="reserve"&&e.reservation.scope.goal!==void 0}function cn(e){return{requestsPerMinute:e.requestsPerMinute===null?null:k(e.requestsPerMinute),tokensPerDay:e.tokensPerDay===null?null:k(e.tokensPerDay),...e.tokensLifetime!==void 0?{tokensLifetime:e.tokensLifetime===null?null:k(e.tokensLifetime)}:{}}}function dn(e,t){return Ce(e).some(n=>q(n)===q(t))}function G(e){return e.reduce((t,n)=>k(t+n),0)}var un=class{constructor(t,n=Date.now,r=1e5){this.now=n;this.maximumEntries=r;this.directory=mo(t),k(r)}now;maximumEntries;directory;async policy(t){return(await this.load()).policies.get(q(t))??null}async setPolicy(t,n,r){let o={scope:j(t),limits:cn(n),revision:k(r)+1};return await this.append(()=>({kind:"policy",policy:o,expectedRevision:r})),o}async reservation(t){return(await this.load()).reservations.get(A(t))??null}async reserve(t){let n={id:A(t.id),scope:j(t.scope),requestHash:A(t.requestHash),reservedTokens:k(t.reservedTokens)};return await this.append((r,o)=>{let i=r.reservations.get(n.id);if(i){if(Te([i.scope,i.requestHash,i.reservedTokens])!==Te([n.scope,n.requestHash,n.reservedTokens]))throw new R("CONFLICT","Reservation identity was reused for different work.");return null}return{kind:"reserve",reservation:{...n,admittedAt:o,state:"reserved"}}}),await this.reservation(n.id)}async dispatch(t){await this.append(()=>({kind:"dispatch",id:A(t)}))}async void(t){await this.append(n=>n.reservations.get(t)?.state==="void"?null:{kind:"void",id:A(t)})}async settle(t,n){k(n),await this.append(r=>{let o=r.reservations.get(t);return o?.state==="settled"&&o.actualTokens===n?null:{kind:"settle",id:A(t),actualTokens:n}})}async snapshot(t){let n=await this.load(),r=k(this.now()),o=j(t);if(r<n.at)throw new R("CLOCK_ROLLBACK","Quota clock moved backwards.");let i=[...n.reservations.values()].filter(a=>dn(a.scope,o)),s=i.filter(a=>ke(a.admittedAt)===ke(r));return{authority:"local-file",policies:Ce(o).flatMap(a=>n.policies.get(q(a))?[n.policies.get(q(a))]:[]),heldTokens:G(s.filter(a=>a.state==="reserved"||a.state==="dispatched").map(a=>a.reservedTokens)),usedTokens:G(s.filter(a=>a.state==="settled").map(a=>a.actualTokens)),lifetimeHeldTokens:G(i.filter(a=>a.state==="reserved"||a.state==="dispatched").map(a=>a.reservedTokens)),lifetimeUsedTokens:G(i.filter(a=>a.state==="settled").map(a=>a.actualTokens)),requestsInLastMinute:i.filter(a=>a.state!=="void"&&a.admittedAt>r-6e4).length,unresolved:i.filter(a=>a.state==="dispatched").length}}apply(t,n,r,o=!0){if(n.kind==="policy"){let s=n.policy,a=q(s.scope);if((t.policies.get(a)?.revision??0)!==n.expectedRevision||s.revision!==n.expectedRevision+1)throw new R("CONFLICT","Quota policy revision changed.");t.policies.set(a,{scope:j(s.scope),revision:k(s.revision),limits:cn(s.limits)});return}if(n.kind==="reserve"){let s=n.reservation;if(A(s.id),A(s.requestHash),j(s.scope),k(s.reservedTokens),s.state!=="reserved"||s.admittedAt!==r||t.reservations.has(s.id))throw new R("CORRUPT","Invalid reservation record.");for(let a of o?Ce(s.scope):[]){let l=t.policies.get(q(a));if(!l)continue;let c=[...t.reservations.values()].filter(u=>dn(u.scope,a)&&u.state!=="void");if(l.limits.requestsPerMinute!==null&&c.filter(u=>u.admittedAt>r-6e4).length>=l.limits.requestsPerMinute)throw new R("EXCEEDED","Ancestor request rate limit reached.");let d=G(c.filter(u=>ke(u.admittedAt)===ke(r)).map(u=>u.state==="settled"?u.actualTokens:u.reservedTokens));if(l.limits.tokensPerDay!==null&&k(d+s.reservedTokens)>l.limits.tokensPerDay)throw new R("EXCEEDED","Ancestor daily token limit reached.");if(l.limits.tokensLifetime!==void 0&&l.limits.tokensLifetime!==null){let u=G(c.map(m=>m.state==="settled"?m.actualTokens:m.reservedTokens));if(k(u+s.reservedTokens)>l.limits.tokensLifetime)throw new R("EXCEEDED","Ancestor lifetime token limit reached.")}}t.reservations.set(s.id,structuredClone(s));return}let i=t.reservations.get(n.id);if(!i)throw new R("CONFLICT","Reservation does not exist.");if(n.kind==="dispatch"||n.kind==="void"){if(i.state!=="reserved")throw new R("CONFLICT","Reservation cannot be dispatched twice or release unknown usage.");i.state=n.kind==="dispatch"?"dispatched":"void"}else if(n.kind==="settle"){if(i.state!=="dispatched"||k(n.actualTokens)>i.reservedTokens)throw new R("CONFLICT","Invalid reservation settlement.");i.state="settled",i.actualTokens=n.actualTokens}else throw new R("CORRUPT","Unknown quota journal operation.")}async load(){let t={sequence:0,hash:"",at:0,policies:new Map,reservations:new Map},n;try{n=await uo(this.directory)}catch(o){if(o.code==="ENOENT")return t;throw o}let r=n.filter(o=>o.endsWith(".quota")).sort();if(r.length>this.maximumEntries)throw new R("CAPACITY","Quota journal requires archival maintenance.");for(let o of r){if(o!==`${String(t.sequence+1).padStart(12,"0")}.quota`)throw new R("CORRUPT","Quota journal sequence is incomplete.");let i=et(this.directory,o),s=await lo(i);if(!s.isFile()||s.isSymbolicLink()||s.size>16384)throw new R("CORRUPT","Invalid quota record file.");let a=await Ze(i,"r"),l;try{let u=Buffer.alloc(16385),m=await a.read(u,0,u.length,0);if(m.bytesRead>16384)throw new R("CORRUPT","Oversized quota record.");l=JSON.parse(u.subarray(0,m.bytesRead).toString("utf8"))}finally{await a.close()}let{hash:c,...d}=l;if(l.version!==1&&l.version!==2||l.sequence!==t.sequence+1||l.previousHash!==t.hash||c!==Te(d)||k(l.at)<t.at)throw new R("CORRUPT","Quota journal integrity failed.");if(l.version===1&&ln(l.operation))throw new R("CORRUPT","Lifetime or goal scope requires quota journal version 2.");this.apply(t,l.operation,l.at,!1),t.sequence=l.sequence,t.hash=c,t.at=l.at}return t}async append(t){await co(this.directory,{recursive:!0,mode:448});for(let n=0;n<100;n++){let r=await this.load(),o=k(this.now());if(o<r.at)throw new R("CLOCK_ROLLBACK","Quota clock moved backwards.");let i=t(r,o);if(!i)return;if(r.sequence>=this.maximumEntries)throw new R("CAPACITY","Quota journal requires archival maintenance.");this.apply(r,i,o);let a={version:ln(i)?2:1,sequence:r.sequence+1,previousHash:r.hash,at:o,operation:i},l=JSON.stringify({...a,hash:Te(a)});if(Buffer.byteLength(l)>16384)throw new R("CAPACITY","Quota record exceeds its bound.");let c=et(this.directory,`${so()}.tmp`),d=et(this.directory,`${String(a.sequence).padStart(12,"0")}.quota`),u=await Ze(c,"wx",384);try{await u.writeFile(l),await u.sync()}catch(m){throw await u.close(),await an(c).catch(()=>{}),m}await u.close();try{if(await ao(c,d),process.platform!=="win32"){let m=await Ze(this.directory,"r");try{await m.sync()}finally{await m.close()}}return}catch(m){if(m.code!=="EEXIST")throw m}finally{await an(c).catch(()=>{})}}throw new R("CONFLICT","Quota admission contention exceeded the retry bound.")}};export{Er as BUILT_IN_XENO_PROVIDER_PRESETS,Se as DualLLMProvider,un as FileQuotaAuthority,Yt as FileXenoProviderConnectionStore,x as ProviderError,Ge as QuotaAcknowledgementError,R as QuotaError,_ as ToolSchemaProjectionError,Vt as XENO_PROVIDER_CATALOG_SCHEMA_VERSION,Ye as XENO_PROVIDER_CONNECTION_STORE_SCHEMA_VERSION,ae as XenoProviderCatalog,Le as assertDirectEndpointResolution,Ie as classifyProviderHttpError,_r as createDirectProvider,Sr as createOllamaNativeProvider,Ri as createQuotaGovernedProvider,si as directProviderConfigFromConnection,oo as isQuotaControlError,j as normalizeQuotaScope,Ae as parseRetryAfter,oi as probeXenoProvider,he as projectToolDefinitionsForProvider,It as projectToolSchemaForProvider,z as providerCapabilityError,v as providerProtocolError,Ce as quotaAncestors,k as quotaInteger,q as quotaScopeKey,A as quotaText,ii as selectXenoProviderRoute,K as validateDirectEndpoint};
|
|
9
|
+
`),i=r.content.filter(a=>a.type==="tool_use").map(a=>({id:a.id,type:"function",function:{name:a.name,arguments:JSON.stringify(a.input)}}));(o||i.length)&&n.push({role:r.role,content:o||null,...i.length?{tool_calls:i}:{}});for(let a of r.content)a.type==="tool_result"&&n.push({role:"tool",tool_call_id:a.tool_use_id,content:Z(a.content)});let s=[...Dt(r.content),...r.content.flatMap(a=>a.type==="tool_result"?ie(a):[])];s.length&&n.push({role:"user",content:s.map(a=>({type:"image_url",image_url:{url:a.image_url.url,detail:a.image_url.detail??"auto"}}))})}return n}function wr(e){return e.map(t=>({name:t.name,description:t.description,parameters:t.input_schema}))}function se(e={}){let t=i=>{let s=Number(i);return Number.isFinite(s)&&s>0?s:0},n=e.input_tokens!==void 0?t(e.input_tokens)+t(e.cache_creation_input_tokens)+t(e.cache_read_input_tokens):t(e.prompt_tokens??e.promptTokenCount??e.prompt_eval_count),r=i=>typeof i=="number"&&Number.isFinite(i),o=r(e.input_tokens)||r(e.prompt_tokens)||r(e.promptTokenCount)||r(e.prompt_eval_count);return{inputTokens:n,outputTokens:t(e.output_tokens??e.completion_tokens??e.candidatesTokenCount??e.eval_count),usageReported:o}}function be(e,t,n){return{content:e,stopReason:t,...se(n)}}function D(e,t,n){if(t&&typeof t=="object"&&!Array.isArray(t))return t;if(typeof t!="string")throw v(e,`${n} arguments must be JSON`);try{let r=JSON.parse(t||"{}");if(!r||typeof r!="object"||Array.isArray(r))throw new Error("arguments are not an object");return r}catch(r){throw v(e,`${n} contains malformed tool arguments`,r)}}function vr(e,t){if(!Array.isArray(t.content))throw v(e,"content must be an array");let n=t.content.flatMap(o=>{if(o.type==="text"&&typeof o.text=="string")return[{type:"text",text:o.text}];if(o.type==="tool_use"){if(!o.id||!o.name)throw v(e,"tool_use is missing id or name");return[{type:"tool_use",id:String(o.id),name:String(o.name),input:D(e,o.input??{},"tool_use")}]}return[]}),r=t.stop_reason==="tool_use"?"tool_use":t.stop_reason==="max_tokens"?"max_tokens":"end_turn";return be(n,r,t.usage??{})}function Pr(e,t){if(!Array.isArray(t.output))throw v(e,"output must be an array");let n=[];for(let i of t.output)if(i.type==="message"){if(!Array.isArray(i.content))throw v(e,"message content must be an array");for(let s of i.content)s.type==="output_text"&&typeof s.text=="string"&&n.push({type:"text",text:s.text})}else if(i.type==="function_call"){if(!i.call_id&&!i.id)throw v(e,"function_call is missing an id");if(!i.name)throw v(e,"function_call is missing a name");n.push({type:"tool_use",id:String(i.call_id??i.id),name:String(i.name),input:D(e,i.arguments??"{}","function_call")})}let r=n.some(i=>i.type==="tool_use"),o=t.status==="incomplete"&&t.incomplete_details?.reason==="max_output_tokens";return be(n,r?"tool_use":o?"max_tokens":"end_turn",t.usage??{})}function xr(e,t){if(!Array.isArray(t.candidates)||t.candidates.length===0){let s=t.promptFeedback?.blockReason;throw s?new P(`Provider safety policy refused the request: ${String(s)}`,{providerId:e,category:"safety_refusal",code:"PROVIDER_SAFETY_REFUSAL"}):v(e,"candidates must contain at least one item")}let n=t.candidates[0]??{};if(!Array.isArray(n.content?.parts))throw v(e,"candidate parts must be an array");let r=n.content.parts.flatMap((s,a)=>{if(typeof s.text=="string")return[{type:"text",text:s.text}];if(s.functionCall){let l=s.functionCall;if(!l.name)throw v(e,"functionCall is missing a name");return[{type:"tool_use",id:String(l.id??`gemini-${a}-${Ke().slice(0,8)}`),name:String(l.name),input:D(e,l.args??{},"functionCall"),...s.thoughtSignature?{provider_metadata:{thoughtSignature:s.thoughtSignature}}:{}}]}return[]}),o=r.some(s=>s.type==="tool_use"),i=String(n.finishReason??"").includes("MAX_TOKENS");return be(r,o?"tool_use":i?"max_tokens":"end_turn",t.usageMetadata??{})}function Ut(e,t){if(!Array.isArray(t.choices)||t.choices.length===0)throw v(e,"choices must contain an item");let n=t.choices[0]??{},r=n.message;if(!r||typeof r!="object")throw v(e,"choice message is missing");let o=[];if(typeof r.content=="string"&&r.content&&o.push({type:"text",text:r.content}),Array.isArray(r.tool_calls))for(let s of r.tool_calls){if(!s.id||!s.function?.name)throw v(e,"tool call is missing id or name");o.push({type:"tool_use",id:String(s.id),name:String(s.function.name),input:D(e,s.function.arguments??"{}","tool call")})}let i=n.finish_reason==="length"?"max_tokens":o.some(s=>s.type==="tool_use")?"tool_use":"end_turn";return be(o,i,t.usage??{})}async function b(e,t){try{await e?.onEvent?.(t)}catch{}}async function Jt(e,t,n){await b(n,{type:"message.started"});let r=0;for(let o of e.content)o.type==="text"?(t?.(o.text),await b(n,{type:"text.delta",text:o.text})):o.type==="tool_use"&&(await b(n,{type:"tool_call.started",index:r,toolCallId:o.id,name:o.name}),await b(n,{type:"tool_call.completed",index:r,toolCallId:o.id,name:o.name,input:o.input}),r+=1);await b(n,{type:"usage.updated",inputTokens:e.inputTokens,outputTokens:e.outputTokens}),await b(n,{type:"message.completed",stopReason:e.stopReason})}function we(){return{content:[],inputTokens:0,outputTokens:0,usageReported:!1,stopReason:"end_turn",terminal:!1}}function ve(e,t){if(!t.terminal)throw v(e,"stream ended without a terminal event");return{content:t.content,stopReason:t.stopReason,usageReported:t.usageReported,inputTokens:t.inputTokens,outputTokens:t.outputTokens}}function Pe(e,t){try{let n=JSON.parse(t.data);if(!n||typeof n!="object"||Array.isArray(n))throw new Error("frame is not an object");return n}catch(n){throw v(e,`invalid stream JSON for ${t.event}`,n)}}async function Rr(e){let t=we(),n=new Map;return await te(e.url,{method:"POST",headers:e.headers,body:JSON.stringify({...e.body,stream:!0}),signal:e.signal},oe(e.config,e.providerId),async r=>{let o=Pe(e.providerId,r),i=String(o.type??r.event);if(i==="message_start"){let s=se(o.message?.usage);t.inputTokens=s.inputTokens,s.usageReported&&(t.usageReported=!0),await b(e.context,{type:"message.started",providerMessageId:o.message?.id})}else if(i==="content_block_start"){let s=Number(o.index??0),a=o.content_block??{};if(a.type==="tool_use"){let l={index:s,id:String(a.id),name:String(a.name),arguments:""};n.set(s,l),await b(e.context,{type:"tool_call.started",index:s,toolCallId:l.id,name:l.name})}else if(a.type==="text"&&a.text){let l=String(a.text);t.content.push({type:"text",text:l}),e.onText?.(l),await b(e.context,{type:"text.delta",text:l})}}else if(i==="content_block_delta"){let s=o.delta??{};if(s.type==="text_delta"){let a=String(s.text??"");if(a){let l=t.content.at(-1);l?.type==="text"?l.text+=a:t.content.push({type:"text",text:a}),e.onText?.(a),await b(e.context,{type:"text.delta",text:a})}}else if(s.type==="thinking_delta")await b(e.context,{type:"reasoning.delta",text:String(s.thinking??"")});else if(s.type==="input_json_delta"){let a=Number(o.index??0),l=n.get(a);if(!l)throw v(e.providerId,"tool argument delta arrived before tool start");let c=String(s.partial_json??"");l.arguments+=c,await b(e.context,{type:"tool_call.arguments.delta",index:a,toolCallId:l.id,delta:c})}}else if(i==="content_block_stop"){let s=Number(o.index??0),a=n.get(s);if(a){let l=D(e.providerId,a.arguments||"{}","streamed tool call");t.content.push({type:"tool_use",id:a.id,name:a.name,input:l}),await b(e.context,{type:"tool_call.completed",index:s,toolCallId:a.id,name:a.name,input:l})}}else if(i==="message_delta"){t.outputTokens=Number(o.usage?.output_tokens??t.outputTokens);let s=o.delta?.stop_reason;t.stopReason=s==="tool_use"?"tool_use":s==="max_tokens"?"max_tokens":"end_turn",await b(e.context,{type:"usage.updated",inputTokens:t.inputTokens,outputTokens:t.outputTokens})}else if(i==="message_stop")t.terminal=!0,await b(e.context,{type:"message.completed",stopReason:t.stopReason});else if(i==="error")throw v(e.providerId,String(o.error?.message??"stream error"))}),ve(e.providerId,t)}async function Cr(e){let t=we(),n=new Map;return await te(e.url,{method:"POST",headers:e.headers,body:JSON.stringify({...e.body,stream:!0}),signal:e.signal},oe(e.config,e.providerId),async r=>{if(r.data==="[DONE]")return;let o=Pe(e.providerId,r),i=String(o.type??r.event);if(i==="response.created")await b(e.context,{type:"message.started",providerMessageId:o.response?.id});else if(i==="response.output_text.delta"){let s=String(o.delta??""),a=t.content.at(-1);a?.type==="text"?a.text+=s:t.content.push({type:"text",text:s}),e.onText?.(s),await b(e.context,{type:"text.delta",text:s})}else if(i==="response.output_item.added"&&o.item?.type==="function_call"){let s=Number(o.output_index??n.size),a={index:s,id:String(o.item.call_id??o.item.id),name:String(o.item.name),arguments:String(o.item.arguments??"")};n.set(s,a),await b(e.context,{type:"tool_call.started",index:s,toolCallId:a.id,name:a.name})}else if(i==="response.function_call_arguments.delta"){let s=Number(o.output_index??0),a=n.get(s);if(!a)throw v(e.providerId,"tool argument delta arrived before tool start");let l=String(o.delta??"");a.arguments+=l,await b(e.context,{type:"tool_call.arguments.delta",index:s,toolCallId:a.id,delta:l})}else if(i==="response.output_item.done"&&o.item?.type==="function_call"){let s=Number(o.output_index??0),a=n.get(s)??{index:s,id:String(o.item.call_id??o.item.id),name:String(o.item.name),arguments:""},l=String(o.item.arguments??a.arguments??"{}"),c=D(e.providerId,l,"streamed function call");t.content.push({type:"tool_use",id:a.id,name:a.name,input:c}),t.stopReason="tool_use",await b(e.context,{type:"tool_call.completed",index:s,toolCallId:a.id,name:a.name,input:c})}else if(i==="response.completed"||i==="response.incomplete"){let s=o.response??{},a=se(s.usage??{});t.inputTokens=a.inputTokens,a.usageReported&&(t.usageReported=!0),t.outputTokens=a.outputTokens,i==="response.incomplete"&&(t.stopReason="max_tokens"),t.terminal=!0,await b(e.context,{type:"usage.updated",inputTokens:t.inputTokens,outputTokens:t.outputTokens}),await b(e.context,{type:"message.completed",stopReason:t.stopReason})}else if(i==="response.failed"||i==="error")throw v(e.providerId,String(o.response?.error?.message??o.error?.message??"stream failed"))}),ve(e.providerId,t)}async function Tr(e){let t=we(),n=new Map;await b(e.context,{type:"message.started"}),await te(e.url,{method:"POST",headers:e.headers,body:JSON.stringify({...e.body,stream:!0,stream_options:{include_usage:!0}}),signal:e.signal},oe(e.config,e.providerId),async r=>{if(r.data==="[DONE]"){t.terminal=!0;return}let o=Pe(e.providerId,r);if(o.usage){let i=se(o.usage);t.inputTokens=i.inputTokens,i.usageReported&&(t.usageReported=!0),t.outputTokens=i.outputTokens,await b(e.context,{type:"usage.updated",inputTokens:t.inputTokens,outputTokens:t.outputTokens})}for(let i of o.choices??[]){let s=i.delta??{};if(typeof s.content=="string"&&s.content){let a=t.content.at(-1);a?.type==="text"?a.text+=s.content:t.content.push({type:"text",text:s.content}),e.onText?.(s.content),await b(e.context,{type:"text.delta",text:s.content})}for(let a of s.tool_calls??[]){let l=Number(a.index??0),c=n.get(l);c||(c={index:l,id:String(a.id??`call-${l}`),name:"",arguments:""},n.set(l,c)),a.id&&(c.id=String(a.id)),a.function?.name&&(c.name+=String(a.function.name)),c.name&&!c.started&&(await b(e.context,{type:"tool_call.started",index:l,toolCallId:c.id,name:c.name}),c.started=!0);let d=String(a.function?.arguments??"");d&&(c.arguments+=d,await b(e.context,{type:"tool_call.arguments.delta",index:l,toolCallId:c.id,delta:d}))}i.finish_reason&&(t.stopReason=i.finish_reason==="length"?"max_tokens":n.size?"tool_use":"end_turn")}});for(let r of[...n.values()].sort((o,i)=>o.index-i.index)){let o=D(e.providerId,r.arguments||"{}","streamed tool call");t.content.push({type:"tool_use",id:r.id,name:r.name,input:o}),await b(e.context,{type:"tool_call.completed",index:r.index,toolCallId:r.id,name:r.name,input:o})}return await b(e.context,{type:"message.completed",stopReason:t.stopReason}),ve(e.providerId,t)}async function kr(e){let t=we(),n=0;return await b(e.context,{type:"message.started"}),await te(e.url,{method:"POST",headers:e.headers,body:JSON.stringify(e.body),signal:e.signal},oe(e.config,e.providerId),async r=>{let o=Pe(e.providerId,r);if(o.usageMetadata){let s=se(o.usageMetadata);t.inputTokens=s.inputTokens,s.usageReported&&(t.usageReported=!0),t.outputTokens=s.outputTokens,await b(e.context,{type:"usage.updated",inputTokens:t.inputTokens,outputTokens:t.outputTokens})}let i=o.candidates?.[0];for(let s of i?.content?.parts??[])if(typeof s.text=="string"){let a=t.content.at(-1);a?.type==="text"?a.text+=s.text:t.content.push({type:"text",text:s.text}),e.onText?.(s.text),await b(e.context,{type:"text.delta",text:s.text})}else if(s.functionCall){let a=s.functionCall,l=String(a.id??`gemini-${n}-${Ke().slice(0,8)}`),c=String(a.name??""),d=D(e.providerId,a.args??{},"streamed function call");await b(e.context,{type:"tool_call.started",index:n,toolCallId:l,name:c}),t.content.push({type:"tool_use",id:l,name:c,input:d,...s.thoughtSignature?{provider_metadata:{thoughtSignature:s.thoughtSignature}}:{}}),await b(e.context,{type:"tool_call.completed",index:n,toolCallId:l,name:c,input:d}),n+=1}i?.finishReason&&(t.stopReason=String(i.finishReason).includes("MAX_TOKENS")?"max_tokens":n?"tool_use":"end_turn",t.terminal=!0,await b(e.context,{type:"message.completed",stopReason:t.stopReason}))}),ve(e.providerId,t)}function Xt(e){return e instanceof P?{type:"provider.error",code:e.code,category:e.category,retryable:e.retryable}:{type:"provider.error",code:"PROVIDER_TRANSPORT_ERROR",category:"transport",retryable:!1}}function _r(e){if(e.maxTokens!==void 0&&(!Number.isSafeInteger(e.maxTokens)||e.maxTokens<1))throw v("direct-provider","maxTokens must be a positive safe integer");let t=`direct-${e.kind}`,n=Mt(e),r=fr(e),o={profile:e.endpointProfile,allowedHosts:e.allowedHosts,resolveHostname:e.resolveHostname},i={providerId:t,endpointPolicy:o,limits:e.transportLimits};return{id:t,capabilities:r,async complete(s,a,l,c,d,u){if(l.length>0&&!r.tools)throw z(t,"tools");if(jt(a)&&!r.imageInput)throw z(t,"image input");let m=e.kind==="openai-compatible"?"openai-chat":e.kind,p=he(l,m).map(({definition:x})=>x),g,y={"content-type":"application/json"},f;try{if(e.kind==="anthropic"){if(g=re(n,"/v1/messages"),y={...y,"x-api-key":e.apiKey,"anthropic-version":e.anthropicVersion??"2023-06-01"},f={model:s,max_tokens:e.maxTokens??8192,system:u?.systemPrompt,messages:gr(a),tools:p.map(w=>({name:w.name,description:w.description,input_schema:w.input_schema}))},e.streaming)return await Rr({providerId:t,url:g,headers:y,body:f,config:e,signal:d,onText:c,context:u})}else if(e.kind==="google"){let w=e.streaming?"streamGenerateContent":"generateContent";if(g=re(n,`/v1beta/models/${encodeURIComponent(s)}:${w}`),e.streaming&&g.searchParams.set("alt","sse"),y={...y,"x-goog-api-key":e.apiKey},f={systemInstruction:u?.systemPrompt?{parts:[{text:u.systemPrompt}]}:void 0,contents:br(a),tools:p.length>0?[{functionDeclarations:wr(p)}]:void 0,generationConfig:{maxOutputTokens:e.maxTokens??8192}},e.streaming)return await kr({providerId:t,url:g,headers:y,body:f,config:e,signal:d,onText:c,context:u})}else if(e.kind==="openai-compatible"){if(g=re(n,e.chatCompletionsPath??"/v1/chat/completions"),y={...y,...$t(e)},f={model:s,messages:qt(a,u?.systemPrompt),tools:p.length>0?p.map(w=>({type:"function",function:{name:w.name,description:w.description,parameters:w.input_schema}})):void 0,max_tokens:e.maxTokens??8192},e.streaming)return await Tr({providerId:t,url:g,headers:y,body:f,config:e,signal:d,onText:c,context:u})}else if(g=re(n,"/v1/responses"),y={...y,authorization:`Bearer ${e.apiKey}`},f={model:s,instructions:u?.systemPrompt,input:hr(a),tools:p.map(w=>({type:"function",name:w.name,description:w.description,parameters:w.input_schema})),max_output_tokens:e.maxTokens??8192,store:!1},e.streaming)return await Cr({providerId:t,url:g,headers:y,body:f,config:e,signal:d,onText:c,context:u});let x=await De(g,{method:"POST",headers:y,body:JSON.stringify(f),signal:d},i),C=e.kind==="anthropic"?vr(t,x):e.kind==="google"?xr(t,x):e.kind==="openai-compatible"?Ut(t,x):Pr(t,x);return await Jt(C,c,u),C}catch(x){throw x instanceof P&&x.category==="cancelled"?await b(u,{type:"provider.cancelled"}):(await b(u,Xt(x)),x instanceof P&&x.retryable&&await b(u,{type:"provider.retry",retryAfterMs:x.retryAfterMs,reason:x.category})),x}}}}function Sr(e){let t="direct-ollama-native";if(e.maxTokens!==void 0&&(!Number.isSafeInteger(e.maxTokens)||e.maxTokens<1))throw v(t,"maxTokens must be a positive safe integer");let n={...e,kind:"openai-compatible"},r=Mt(n);return{id:t,capabilities:{streaming:!1,textInput:!0,imageInput:!1,vision:!1,tools:!0,parallelToolCalls:!1,structuredOutput:!1,reasoningMetadata:!1,usageAccounting:!0,cancellation:!0,retryAfter:!0,promptCaching:!1},async complete(o,i,s,a,l,c){if(jt(i))throw z(t,"image input");try{let d=he(s,"openai-chat").map(({definition:y})=>y),u=qt(i,c?.systemPrompt).map(y=>({...y,content:y.content??"",...y.tool_calls?{tool_calls:y.tool_calls.map(f=>({...f,function:{...f.function,arguments:D(t,f.function.arguments,"tool call")}}))}:{}})),m=await De(re(r,"/api/chat"),{method:"POST",signal:l,headers:{"content-type":"application/json",...$t(n)},body:JSON.stringify({model:o,messages:u,stream:!1,options:{num_predict:e.maxTokens??8192},tools:d.map(y=>({type:"function",function:{name:y.name,description:y.description,parameters:y.input_schema}}))})},oe(n,t));if(m.done!==!0||!m.message||typeof m.message!="object")throw v(t,"native completion is missing its terminal message");let p=m.message,g=Ut(t,{choices:[{message:{...p,...Array.isArray(p.tool_calls)?{tool_calls:p.tool_calls.map(y=>({...y,id:y.id??Ke()}))}:{}},finish_reason:m.done_reason==="length"?"length":"stop"}],usage:m});return await Jt(g,a,c),g}catch(d){throw await b(c,d instanceof P&&d.category==="cancelled"?{type:"provider.cancelled"}:Xt(d)),d}}}}function Fe(e,t={}){for(let n of e){let r=n.codePointAt(0);if(r===127)return!0;if(!(r>31)&&!(r===9&&t.allowTab===!0)&&!((r===10||r===13)&&t.allowLineBreaks===!0))return!0}return!1}var Vt=1,B={streaming:!0,textInput:!0,imageInput:!0,tools:!0,parallelToolCalls:!0,structuredOutput:!1,reasoningMetadata:!0,usageAccounting:!0,promptCaching:!1,modelDiscovery:!0},xe={...B,reasoningMetadata:!1},Er=[O("xeno","XENO hosted","xeno","openai-compatible","https://api.xenostudio.ai","public-https","bearer-env","XENO_API_KEY","/v1/models",B),O("openai","OpenAI","direct","openai-responses","https://api.openai.com","public-https","bearer-env","OPENAI_API_KEY","/v1/models",B),O("anthropic","Anthropic","direct","anthropic","https://api.anthropic.com","public-https","header-env","ANTHROPIC_API_KEY","/v1/models",{...B,structuredOutput:!1}),O("google","Google AI Studio","direct","google","https://generativelanguage.googleapis.com","public-https","header-env","GOOGLE_API_KEY","/v1beta/models",B),O("openrouter","OpenRouter","gateway","openai-compatible","https://openrouter.ai/api","public-https","bearer-env","OPENROUTER_API_KEY","/v1/models",xe),O("xeno-rt","xeno-rt","local","openai-compatible","http://127.0.0.1:3338","local-network","none",void 0,"/v1/models",xe,["running xeno-rt endpoint"]),O("ollama","Ollama","local","openai-compatible","http://127.0.0.1:11434","local-network","none",void 0,"/v1/models",xe,["Ollama OpenAI compatibility endpoint"]),O("azure-openai","Azure OpenAI","cloud","openai-compatible",void 0,"public-https","header-env","AZURE_OPENAI_API_KEY",void 0,xe,["resource endpoint","deployment","API version","host adapter for deployment-shaped requests"]),O("aws-bedrock","Amazon Bedrock","cloud","aws-bedrock",void 0,"public-https","cloud-chain",void 0,void 0,{...B,modelDiscovery:!1},["AWS credential chain","region","Bedrock host adapter"]),O("vertex-ai","Google Vertex AI","cloud","vertex-ai",void 0,"public-https","cloud-chain",void 0,void 0,{...B,modelDiscovery:!1},["Google application-default credentials","project","region","Vertex host adapter"])],ae=class{presets=new Map;constructor(t=Er){for(let n of t)this.add(n)}add(t){Nr(t),this.presets.set(t.id,structuredClone(t))}get(t){let n=this.presets.get(t);return n?structuredClone(n):void 0}list(){return[...this.presets.values()].map(t=>structuredClone(t)).sort((t,n)=>t.displayName.localeCompare(n.displayName))}resolve(t,n){let r=this.get(t.providerId);if(!r)throw new Error(`Unknown provider preset: ${t.providerId}`);let o=[],i;try{i=Bt(t.baseUrl??r.defaultBaseUrl,r)}catch(l){o.push(l instanceof Error?l.message:String(l))}i||o.push("Provider endpoint is not configured");let s=t.secretRef?.trim()||r.auth.defaultSecretRef;(r.auth.mode==="bearer-env"||r.auth.mode==="header-env")&&!s&&o.push("Credential reference is not configured"),s&&n&&!n(s)&&o.push(`Credential reference ${s} is not available`),(r.adapterKind==="aws-bedrock"||r.adapterKind==="vertex-ai"||r.id==="azure-openai")&&o.push("Provider requires a dedicated host adapter");let a="ready";return t.enabled===!1?a="blocked":o.some(l=>l.includes("host adapter"))?a="requires-host-adapter":o.some(l=>l.includes("Credential"))?a="missing-credential":o.length&&(a="needs-configuration"),{connection:Dr(t),preset:r,...i?{endpoint:i}:{},...s?{secretRef:s}:{},readiness:a,blockers:o}}};async function oi(e){let n=(e.catalog??new ae).resolve(e.connection),r=n.preset.auth.mode,o=n.secretRef?await e.resolveSecretRef?.(n.secretRef):void 0,i=r==="none"?"not-required":r==="cloud-chain"?"external":o?"present":"missing",s={schemaVersion:1,connectionId:n.connection.id,providerId:n.preset.id,...n.endpoint?{endpoint:n.endpoint}:{},readiness:n.readiness,credentialState:i,reachable:!1,authenticated:null,models:[],capabilities:n.preset.capabilities,errors:[...n.blockers]};if(n.readiness==="requires-host-adapter"||n.readiness==="blocked"||!n.endpoint)return s;if((r==="bearer-env"||r==="header-env")&&!o)return{...s,readiness:"missing-credential",errors:Y([...s.errors,`Credential reference ${n.secretRef??"(missing)"} did not resolve`])};if(!n.preset.discoveryPath)return{...s,readiness:"ready",errors:Y(s.errors)};let a=K(n.endpoint,{profile:n.preset.endpointProfile,allowedHosts:n.preset.allowedHosts});try{await Oe(a,{profile:n.preset.endpointProfile,allowedHosts:n.preset.allowedHosts,resolveHostname:e.resolveHostname})}catch(u){return{...s,readiness:"blocked",errors:Y([...s.errors,u instanceof Error?u.message:String(u)])}}let l=Ir(a,n.preset.discoveryPath),c=Ar(n.preset,o),d=Date.now();try{let{response:u,text:m}=await Lr(e.fetchImpl??fetch,l,{headers:c},e.timeoutMs??8e3,e.maxResponseBytes??2097152),p=Date.now()-d,g=u.status===401||u.status===403?!1:u.ok?!0:null;if(!u.ok)return{...s,reachable:!0,authenticated:g,latencyMs:p,readiness:g===!1?"missing-credential":"blocked",errors:Y([...s.errors,`Provider discovery returned HTTP ${u.status}`])};let y=JSON.parse(m);return{...s,readiness:"ready",reachable:!0,authenticated:g,latencyMs:p,models:Or(y),errors:Y(s.errors)}}catch(u){return{...s,readiness:"blocked",latencyMs:Date.now()-d,errors:Y([...s.errors,jr(u)])}}}function ii(e,t={}){let n=t.allowedProviderIds?new Set(t.allowedProviderIds):null,r=new Set(t.deniedProviderIds??[]),o=new Map((t.fallbackOrder??[]).map((i,s)=>[i,s]));return e.filter(({connection:i,model:s})=>{let a=i.preset.id;return!(i.readiness!=="ready"||i.connection.enabled===!1||n&&!n.has(a)||r.has(a)||!Mr({...i.preset.capabilities,...s.capabilities??{}},t.require)||t.maxInputCostPerMillion!==void 0&&(s.inputCostPerMillion??1/0)>t.maxInputCostPerMillion||t.maxOutputCostPerMillion!==void 0&&(s.outputCostPerMillion??1/0)>t.maxOutputCostPerMillion)}).sort((i,s)=>{if(t.preferLocal&&i.connection.preset.family!==s.connection.preset.family){if(i.connection.preset.family==="local")return-1;if(s.connection.preset.family==="local")return 1}let a=o.get(i.connection.preset.id)??Number.MAX_SAFE_INTEGER,l=o.get(s.connection.preset.id)??Number.MAX_SAFE_INTEGER;return a-l||i.connection.preset.id.localeCompare(s.connection.preset.id)||i.model.id.localeCompare(s.model.id)})}function si(e,t){if(e.readiness==="requires-host-adapter")throw new Error(`${e.preset.displayName} requires a dedicated host adapter`);if(!e.endpoint)throw new Error("Provider endpoint is not configured");if(e.preset.adapterKind==="aws-bedrock"||e.preset.adapterKind==="vertex-ai")throw new Error("Cloud adapter cannot be represented as DirectProviderConfig");if((e.preset.auth.mode==="bearer-env"||e.preset.auth.mode==="header-env")&&!t)throw new Error("Provider credential did not resolve");let n=$r(e.preset.capabilities);return{kind:e.preset.adapterKind,apiKey:t??"",baseURL:e.endpoint,endpointProfile:e.preset.endpointProfile,allowedHosts:e.preset.allowedHosts,streaming:n.streaming,...e.preset.adapterKind==="openai-compatible"?{capabilityProfile:n}:{},...e.preset.auth.mode==="header-env"?{authentication:{type:"header",header:e.preset.auth.header??Qe(e.preset.id),prefix:e.preset.auth.prefix}}:{},...e.preset.auth.mode==="none"?{authentication:{type:"none"}}:{}}}function O(e,t,n,r,o,i,s,a,l,c,d=[]){return{schemaVersion:Vt,id:e,displayName:t,family:n,adapterKind:r,...o?{defaultBaseUrl:o}:{},endpointProfile:i,...o?{allowedHosts:[new URL(o).hostname]}:{},auth:{mode:s,...a?{defaultSecretRef:a}:{},...s==="header-env"?{header:Qe(e)}:{},description:s==="none"?"No credential required":s==="cloud-chain"?"Provider-owned cloud credential chain":`Environment/credential reference ${a}`},capabilities:c,...l?{discoveryPath:l}:{},requires:d}}function Qe(e){return e==="anthropic"?"x-api-key":e==="google"?"x-goog-api-key":e==="azure-openai"?"api-key":"authorization"}function Ar(e,t){return e.auth.mode==="none"||e.auth.mode==="cloud-chain"?{accept:"application/json"}:t?e.auth.mode==="bearer-env"?{accept:"application/json",authorization:`Bearer ${t}`}:{accept:"application/json",[e.auth.header??Qe(e.id)]:`${e.auth.prefix??""}${t}`}:{accept:"application/json"}}function Bt(e,t){return e?K(e.trim().replace(/\/+$/,""),{profile:t.endpointProfile,allowedHosts:t.allowedHosts}).toString().replace(/\/$/,""):void 0}function Ir(e,t){let n=new URL(e.toString());if(!t.startsWith("/")||t.includes("..")||t.includes("#"))throw new Error("Provider discovery path is invalid");return n.pathname=`${n.pathname.replace(/\/$/,"")}${t}`.replace(/\/{2,}/g,"/"),n}async function Lr(e,t,n,r,o){if(!Number.isSafeInteger(r)||r<1||r>6e4||!Number.isSafeInteger(o)||o<1||o>16*1024*1024)throw new Error("Invalid provider discovery limits");let i=new AbortController,s,a=!1,l,c=new Promise((u,m)=>{l=m}),d=setTimeout(()=>{a=!0;let u=new Error("Provider probe timed out");i.abort(u),l(u),s?.cancel().catch(()=>{})},r);try{let u=e(t,{...n,signal:i.signal,redirect:"manual"});u.then(C=>{a&&C.body?.cancel().catch(()=>{})},()=>{});let m=await Promise.race([u,c]);if(m.redirected||m.status>=300&&m.status<400)throw m.body?.cancel().catch(()=>{}),new Error("Provider discovery redirects are disabled");let p=0;if(m.headers.forEach((C,w)=>{p+=Buffer.byteLength(w)+Buffer.byteLength(C)}),p>64*1024)throw m.body?.cancel().catch(()=>{}),new Error("Provider discovery headers exceed limit");if(!m.ok||!m.body)return m.body?.cancel().catch(()=>{}),{response:m,text:""};let g=m.headers.get("content-length");if(g&&/^\d+$/.test(g)&&Number(g)>o)throw m.body.cancel().catch(()=>{}),new Error(`Provider discovery response exceeds ${o} bytes`);s=m.body.getReader();let y=new TextDecoder("utf-8",{fatal:!0}),f=0,x="";for(;;){let C=await Promise.race([s.read(),c]);if(C.done)break;if(f+=C.value.byteLength,f>o)throw new Error(`Provider discovery response exceeds ${o} bytes`);x+=y.decode(C.value,{stream:!0})}return x+=y.decode(),{response:m,text:x}}finally{clearTimeout(d),i.abort(),s&&(s.cancel().catch(()=>{}),s.releaseLock())}}function Or(e){if(!e||typeof e!="object")return[];let t=e,r=(Array.isArray(t.data)?t.data:Array.isArray(t.models)?t.models:[]).flatMap(o=>{if(!o||typeof o!="object")return[];let i=o,a=(typeof i.id=="string"?i.id:typeof i.name=="string"?i.name.replace(/^models\//,""):"").trim();return!a||a.length>300||Fe(a)?[]:[{id:a,...typeof i.displayName=="string"&&i.displayName.trim()?{displayName:i.displayName.trim().slice(0,300)}:{},...typeof i.owned_by=="string"&&i.owned_by.trim()?{ownedBy:i.owned_by.trim().slice(0,200)}:{},metadataSource:"provider"}]});return[...new Map(r.map(o=>[o.id,o])).values()].sort((o,i)=>o.id.localeCompare(i.id))}function Mr(e,t){return t?Object.entries(t).every(([n,r])=>r!==!0||e[n]===!0):!0}function $r(e){return{streaming:e.streaming,textInput:e.textInput,imageInput:e.imageInput,tools:e.tools,parallelToolCalls:e.parallelToolCalls,structuredOutput:e.structuredOutput,reasoningMetadata:e.reasoningMetadata,usageAccounting:e.usageAccounting,cancellation:!0,retryAfter:!0,promptCaching:e.promptCaching}}function Nr(e){if(e.schemaVersion!==Vt||!/^[a-z0-9][a-z0-9._-]{1,80}$/.test(e.id))throw new Error("Provider preset id is invalid");if(!e.displayName.trim())throw new Error(`Provider preset ${e.id} requires displayName`);if(e.defaultBaseUrl&&Bt(e.defaultBaseUrl,e),e.discoveryPath&&(!e.discoveryPath.startsWith("/")||e.discoveryPath.includes("..")))throw new Error(`Provider preset ${e.id} discoveryPath is invalid`);if(e.auth.header&&!/^[A-Za-z0-9-]{1,80}$/.test(e.auth.header))throw new Error(`Provider preset ${e.id} auth header is invalid`)}function Dr(e){let t=e.id.trim();if(!t||t.length>120||Fe(t))throw new Error("Provider connection id is invalid");let n=e.secretRef?.trim();if(n&&!/^[A-Za-z_][A-Za-z0-9_.:/-]{0,255}$/.test(n))throw new Error("Provider credential reference is invalid");return{id:t,providerId:e.providerId.trim(),...e.baseUrl?.trim()?{baseUrl:e.baseUrl.trim()}:{},...n?{secretRef:n}:{},...e.model?.trim()?{model:e.model.trim().slice(0,300)}:{},enabled:e.enabled!==!1,...e.metadata?{metadata:{...e.metadata}}:{}}}function Y(e){return[...new Set(e)]}function jr(e){return(e instanceof Error?e.message:String(e)).replace(/(Bearer\s+)[A-Za-z0-9._~+/=-]+/gi,"$1[redacted]").replace(/([?&#](?:token|key|secret|password|api[_-]?key)=)[^&#\s]+/gi,"$1[redacted]").slice(0,500)}import{createHash as Gt}from"node:crypto";import{chmod as Fr,mkdir as Zt,open as Qr,readFile as Wr,rename as Yr,unlink as Gr}from"node:fs/promises";import{dirname as Zr,join as Wt,resolve as eo}from"node:path";function Re(e){return JSON.stringify(We(e,new Set))}function We(e,t){if(e===null||typeof e!="object"){if(typeof e=="number"&&!Number.isFinite(e))throw new TypeError("Artifact JSON cannot contain non-finite numbers");return e}if(t.has(e))throw new TypeError("Artifact JSON cannot contain cycles");if(t.add(e),Array.isArray(e)){let r=e.map(o=>We(o,t));return t.delete(e),r}let n={};for(let r of Object.keys(e).sort((o,i)=>o.localeCompare(i))){let o=e[r];if(o===void 0)throw new TypeError(`Artifact JSON property ${r} is undefined`);n[r]=We(o,t)}return t.delete(e),n}import{mkdirSync as qr,readFileSync as Ur,rmSync as zt,writeFileSync as Jr}from"node:fs";import{hostname as Kt}from"node:os";import{dirname as Xr}from"node:path";function Vr(){return new Date().toISOString()}function Br(){return new Date(Date.now()-Math.floor(process.uptime()*1e3)).toISOString()}function Ft(e){try{return JSON.parse(Ur(e,"utf8"))}catch{return null}}function Hr(e){if(!e||e<=0)return!1;try{return process.kill(e,0),!0}catch{return!1}}function zr(e){return e.hostname!==Kt()?!0:Hr(e.pid)}function Ht(e,t){qr(Xr(e),{recursive:!0}),Jr(e,JSON.stringify(t,null,2)+`
|
|
10
|
+
`,{encoding:"utf8",flag:"wx"})}function Kr(e,t){let n=Ft(e);n?.pid!==t.pid||n.hostname!==t.hostname||zt(e,{force:!0})}function Qt(e,t,n){let r=Vr(),o={schemaVersion:1,name:t,pid:process.pid,hostname:Kt(),processStartedAt:Br(),version:n,acquiredAt:r,updatedAt:r};try{Ht(e,o)}catch(i){if(i.code!=="EEXIST")throw i;let a=Ft(e);if(a&&zr(a))throw new Error(`${t} is already locked by PID ${a.pid} on ${a.hostname}.`);zt(e,{force:!0}),Ht(e,o)}return{record:o,release:()=>{Kr(e,o)}}}var Ge=1,Yt=class{directory;snapshotPath;lockPath;catalog;now;constructor(t){this.directory=eo(t.directory),this.snapshotPath=Wt(this.directory,"providers.json"),this.lockPath=Wt(this.directory,"providers.lock"),this.catalog=t.catalog??new ae,this.now=t.now??(()=>new Date)}async upsert(t){let n=this.catalog.resolve(t).connection;return tn(n),this.mutate(r=>{let o=r.connections.filter(i=>i.id!==n.id);return o.push(n),{snapshot:Ye(r,o,r.routingPolicy,this.now()),result:n}})}async remove(t){return this.mutate(n=>{let r=n.connections.filter(o=>o.id!==t);return r.length===n.connections.length?{snapshot:n,result:!1}:{snapshot:Ye(n,r,n.routingPolicy,this.now()),result:!0}})}async setRoutingPolicy(t){let n=nn(t);return this.mutate(r=>({snapshot:Ye(r,r.connections,n,this.now()),result:n}))}async get(t){return(await this.load()).connections.find(n=>n.id===t)??null}async list(){return(await this.load()).connections}async load(){try{let t=JSON.parse(await Wr(this.snapshotPath,"utf8"));return no(t,this.catalog),t}catch(t){if(t.code==="ENOENT")return to(this.now());throw t}}async mutate(t){await Zt(this.directory,{recursive:!0,mode:448});let n=Qt(this.lockPath,"xeno provider connection store","1");try{let r=await this.load(),{snapshot:o,result:i}=t(r);return o!==r&&await ro(this.snapshotPath,`${JSON.stringify(o,null,2)}
|
|
11
|
+
`),i}finally{n.release()}}};function to(e){return en({schemaVersion:Ge,generation:0,updatedAt:e.toISOString(),connections:[],routingPolicy:{}})}function Ye(e,t,n,r){return en({schemaVersion:Ge,generation:e.generation+1,updatedAt:r.toISOString(),connections:[...t].sort((o,i)=>o.id.localeCompare(i.id)),routingPolicy:n})}function en(e){return{...e,checksum:{algorithm:"sha256",value:Gt("sha256").update(rn(e)).digest("hex")}}}function no(e,t){if(e.schemaVersion!==Ge||!Array.isArray(e.connections))throw new Error("Invalid provider connection snapshot");let{checksum:n,...r}=e;if(n?.algorithm!=="sha256"||n.value!==Gt("sha256").update(rn(r)).digest("hex"))throw new Error("Provider connection snapshot checksum mismatch");let o=new Set;for(let i of e.connections){let s=t.resolve(i).connection;if(tn(s),o.has(s.id))throw new Error(`Duplicate provider connection: ${s.id}`);o.add(s.id)}nn(e.routingPolicy)}function tn(e){let t=JSON.stringify(e);if(/\b(?:sk-[A-Za-z0-9_-]{16,}|xox[baprs]-[A-Za-z0-9-]{16,}|AKIA[0-9A-Z]{16})\b/.test(t))throw new Error("Provider connection configuration cannot contain raw credentials");if(e.baseUrl&&/[?&#](?:token|key|secret|password|api[_-]?key)=/i.test(e.baseUrl))throw new Error("Provider endpoint cannot contain credentials")}function nn(e){let t=r=>r?[...new Set(r.map(o=>o.trim()).filter(Boolean))].sort():void 0,n={...t(e.allowedProviderIds)?{allowedProviderIds:t(e.allowedProviderIds)}:{},...t(e.deniedProviderIds)?{deniedProviderIds:t(e.deniedProviderIds)}:{},...t(e.fallbackOrder)?{fallbackOrder:t(e.fallbackOrder)}:{},...e.preferLocal!==void 0?{preferLocal:!!e.preferLocal}:{},...e.require?{require:{...e.require}}:{}};for(let[r,o]of[["maxInputCostPerMillion",e.maxInputCostPerMillion],["maxOutputCostPerMillion",e.maxOutputCostPerMillion]])if(o!==void 0){if(!Number.isFinite(o)||o<0)throw new Error(`${r} must be a non-negative finite number`);n[r]=o}return n}async function ro(e,t){await Zt(Zr(e),{recursive:!0,mode:448});let n=`${e}.${process.pid}.${Date.now()}.tmp`,r;try{r=await Qr(n,"wx",384),await r.writeFile(t,"utf8"),await r.sync(),await r.close(),r=void 0,await Yr(n,e),await Fr(e,384).catch(()=>{})}finally{r&&await r.close().catch(()=>{}),await Gr(n).catch(()=>{})}}function rn(e){return Re(e)}import{createHash as sn}from"node:crypto";async function on(e,t){t?.throwIfAborted();let n=new AbortController,r=setTimeout(()=>n.abort(new DOMException("Operation acknowledgement timed out.","TimeoutError")),3e4),o=t?AbortSignal.any([t,n.signal]):n.signal,i;try{let s=await new Promise((a,l)=>{i=()=>l(o.reason),o.addEventListener("abort",i,{once:!0}),Promise.resolve().then(()=>(o.throwIfAborted(),e(o))).then(a,l)});return o.throwIfAborted(),s}finally{i&&o.removeEventListener("abort",i),clearTimeout(r)}}var R=class extends Error{constructor(n,r){super(r);this.code=n;this.name="QuotaError"}code;retryable=!1},Ze=class extends Error{constructor(n,r,o){super(`Quota ${n} did not acknowledge; reconcile reservation ${r} before retrying.`,{cause:o});this.phase=n;this.reservationId=r;this.name="QuotaAcknowledgementError"}phase;reservationId;code="ACKNOWLEDGEMENT_FAILED";retryable=!1};function oo(e){return e instanceof Error&&(e.name==="QuotaError"||e.name==="QuotaAcknowledgementError")&&"retryable"in e&&e.retryable===!1&&"code"in e&&typeof e.code=="string"}function k(e){if(typeof e!="number"||!Number.isSafeInteger(e)||e<0)throw new R("INVALID","Quota counters must be non-negative safe integers.");return e}function A(e){if(typeof e!="string"||!e.trim()||e.length>512)throw new R("INVALID","Invalid quota identity.");return e}function j(e){let t=n=>({id:A(n?.id),generation:A(n?.generation)});if(!e||e.agent&&!e.team)throw new R("INVALID","A child quota scope requires its complete ancestry.");return{workspace:t(e.workspace),...e.team?{team:t(e.team)}:{},...e.agent?{agent:t(e.agent)}:{},...e.goal!==void 0?{goal:t(e.goal)}:{}}}function q(e){return JSON.stringify(j(e))}function Ce(e){let t=j(e),n=[{workspace:t.workspace},...t.team?[{workspace:t.workspace,team:t.team}]:[],...t.agent?[{workspace:t.workspace,team:t.team,agent:t.agent}]:[]];return t.goal?n.flatMap(r=>[r,{...r,goal:t.goal}]):n}function Ri(e,t,n){let r=j(n);async function o(i,s,a,l,c,d){if(c?.throwIfAborted(),!e.prepareQuotaRequest)throw new R("UNSUPPORTED","This provider cannot guarantee per-request token bounds.");let u=A(d?.attemptId),m=sn("sha256").update(JSON.stringify([e.id,i,s,a,d?.systemPrompt??""])).digest("hex"),p=sn("sha256").update(JSON.stringify([q(r),e.id,u])).digest("hex"),g=async(C,w,I=c)=>{try{return await on(w,I)}catch(M){throw oo(M)?M:new Ze(C,p,M)}},y=await g("prepare",C=>e.prepareQuotaRequest(i,structuredClone(s),structuredClone(a),d,C)),f=k(k(y.inputTokensUpperBound)+k(y.outputTokensUpperBound));if(y.basis!=="provider-enforced")throw new R("UNSUPPORTED","Estimated token bounds cannot enforce a hard quota.");await g("reserve",()=>t.reserve({id:p,scope:r,requestHash:m,reservedTokens:f})),c?.aborted&&(await g("void",()=>t.void(p),new AbortController().signal),c.throwIfAborted()),await g("dispatch",()=>t.dispatch(p)),c?.throwIfAborted();let x=await y.execute(l,c);if(c?.throwIfAborted(),x.usageReported){let C=k(x.inputTokens),w=k(x.outputTokens);if(C>y.inputTokensUpperBound||w>y.outputTokensUpperBound)throw new R("CORRUPT","Provider exceeded its guaranteed token bound; reservation requires reconciliation.");await g("settle",()=>t.settle(p,k(C+w)))}return x}return{id:e.id,...e.model?{model:e.model}:{},...e.capabilities?{capabilities:e.capabilities}:{},complete:o,completeLocal:o}}import{createHash as io,randomUUID as so}from"node:crypto";import{link as ao,lstat as lo,mkdir as co,open as et,readdir as uo,unlink as an}from"node:fs/promises";import{join as tt,resolve as mo}from"node:path";var Te=e=>io("sha256").update(Re(e)).digest("hex"),ke=e=>new Date(e).toISOString().slice(0,10);function ln(e){return e.kind==="policy"?e.policy.limits.tokensLifetime!==void 0||e.policy.scope.goal!==void 0:e.kind==="reserve"&&e.reservation.scope.goal!==void 0}function cn(e){return{requestsPerMinute:e.requestsPerMinute===null?null:k(e.requestsPerMinute),tokensPerDay:e.tokensPerDay===null?null:k(e.tokensPerDay),...e.tokensLifetime!==void 0?{tokensLifetime:e.tokensLifetime===null?null:k(e.tokensLifetime)}:{}}}function dn(e,t){return Ce(e).some(n=>q(n)===q(t))}function G(e){return e.reduce((t,n)=>k(t+n),0)}var un=class{constructor(t,n=Date.now,r=1e5){this.now=n;this.maximumEntries=r;this.directory=mo(t),k(r)}now;maximumEntries;directory;async policy(t){return(await this.load()).policies.get(q(t))??null}async setPolicy(t,n,r){let o={scope:j(t),limits:cn(n),revision:k(r)+1};return await this.append(()=>({kind:"policy",policy:o,expectedRevision:r})),o}async reservation(t){return(await this.load()).reservations.get(A(t))??null}async reserve(t){let n={id:A(t.id),scope:j(t.scope),requestHash:A(t.requestHash),reservedTokens:k(t.reservedTokens)};return await this.append((r,o)=>{let i=r.reservations.get(n.id);if(i){if(Te([i.scope,i.requestHash,i.reservedTokens])!==Te([n.scope,n.requestHash,n.reservedTokens]))throw new R("CONFLICT","Reservation identity was reused for different work.");return null}return{kind:"reserve",reservation:{...n,admittedAt:o,state:"reserved"}}}),await this.reservation(n.id)}async dispatch(t){await this.append(()=>({kind:"dispatch",id:A(t)}))}async void(t){await this.append(n=>n.reservations.get(t)?.state==="void"?null:{kind:"void",id:A(t)})}async settle(t,n){k(n),await this.append(r=>{let o=r.reservations.get(t);return o?.state==="settled"&&o.actualTokens===n?null:{kind:"settle",id:A(t),actualTokens:n}})}async snapshot(t){let n=await this.load(),r=k(this.now()),o=j(t);if(r<n.at)throw new R("CLOCK_ROLLBACK","Quota clock moved backwards.");let i=[...n.reservations.values()].filter(a=>dn(a.scope,o)),s=i.filter(a=>ke(a.admittedAt)===ke(r));return{authority:"local-file",policies:Ce(o).flatMap(a=>n.policies.get(q(a))?[n.policies.get(q(a))]:[]),heldTokens:G(s.filter(a=>a.state==="reserved"||a.state==="dispatched").map(a=>a.reservedTokens)),usedTokens:G(s.filter(a=>a.state==="settled").map(a=>a.actualTokens)),lifetimeHeldTokens:G(i.filter(a=>a.state==="reserved"||a.state==="dispatched").map(a=>a.reservedTokens)),lifetimeUsedTokens:G(i.filter(a=>a.state==="settled").map(a=>a.actualTokens)),requestsInLastMinute:i.filter(a=>a.state!=="void"&&a.admittedAt>r-6e4).length,unresolved:i.filter(a=>a.state==="dispatched").length}}apply(t,n,r,o=!0){if(n.kind==="policy"){let s=n.policy,a=q(s.scope);if((t.policies.get(a)?.revision??0)!==n.expectedRevision||s.revision!==n.expectedRevision+1)throw new R("CONFLICT","Quota policy revision changed.");t.policies.set(a,{scope:j(s.scope),revision:k(s.revision),limits:cn(s.limits)});return}if(n.kind==="reserve"){let s=n.reservation;if(A(s.id),A(s.requestHash),j(s.scope),k(s.reservedTokens),s.state!=="reserved"||s.admittedAt!==r||t.reservations.has(s.id))throw new R("CORRUPT","Invalid reservation record.");for(let a of o?Ce(s.scope):[]){let l=t.policies.get(q(a));if(!l)continue;let c=[...t.reservations.values()].filter(u=>dn(u.scope,a)&&u.state!=="void");if(l.limits.requestsPerMinute!==null&&c.filter(u=>u.admittedAt>r-6e4).length>=l.limits.requestsPerMinute)throw new R("EXCEEDED","Ancestor request rate limit reached.");let d=G(c.filter(u=>ke(u.admittedAt)===ke(r)).map(u=>u.state==="settled"?u.actualTokens:u.reservedTokens));if(l.limits.tokensPerDay!==null&&k(d+s.reservedTokens)>l.limits.tokensPerDay)throw new R("EXCEEDED","Ancestor daily token limit reached.");if(l.limits.tokensLifetime!==void 0&&l.limits.tokensLifetime!==null){let u=G(c.map(m=>m.state==="settled"?m.actualTokens:m.reservedTokens));if(k(u+s.reservedTokens)>l.limits.tokensLifetime)throw new R("EXCEEDED","Ancestor lifetime token limit reached.")}}t.reservations.set(s.id,structuredClone(s));return}let i=t.reservations.get(n.id);if(!i)throw new R("CONFLICT","Reservation does not exist.");if(n.kind==="dispatch"||n.kind==="void"){if(i.state!=="reserved")throw new R("CONFLICT","Reservation cannot be dispatched twice or release unknown usage.");i.state=n.kind==="dispatch"?"dispatched":"void"}else if(n.kind==="settle"){if(i.state!=="dispatched"||k(n.actualTokens)>i.reservedTokens)throw new R("CONFLICT","Invalid reservation settlement.");i.state="settled",i.actualTokens=n.actualTokens}else throw new R("CORRUPT","Unknown quota journal operation.")}async load(){let t={sequence:0,hash:"",at:0,policies:new Map,reservations:new Map},n;try{n=await uo(this.directory)}catch(o){if(o.code==="ENOENT")return t;throw o}let r=n.filter(o=>o.endsWith(".quota")).sort();if(r.length>this.maximumEntries)throw new R("CAPACITY","Quota journal requires archival maintenance.");for(let o of r){if(o!==`${String(t.sequence+1).padStart(12,"0")}.quota`)throw new R("CORRUPT","Quota journal sequence is incomplete.");let i=tt(this.directory,o),s=await lo(i);if(!s.isFile()||s.isSymbolicLink()||s.size>16384)throw new R("CORRUPT","Invalid quota record file.");let a=await et(i,"r"),l;try{let u=Buffer.alloc(16385),m=await a.read(u,0,u.length,0);if(m.bytesRead>16384)throw new R("CORRUPT","Oversized quota record.");l=JSON.parse(u.subarray(0,m.bytesRead).toString("utf8"))}finally{await a.close()}let{hash:c,...d}=l;if(l.version!==1&&l.version!==2||l.sequence!==t.sequence+1||l.previousHash!==t.hash||c!==Te(d)||k(l.at)<t.at)throw new R("CORRUPT","Quota journal integrity failed.");if(l.version===1&&ln(l.operation))throw new R("CORRUPT","Lifetime or goal scope requires quota journal version 2.");this.apply(t,l.operation,l.at,!1),t.sequence=l.sequence,t.hash=c,t.at=l.at}return t}async append(t){await co(this.directory,{recursive:!0,mode:448});for(let n=0;n<100;n++){let r=await this.load(),o=k(this.now());if(o<r.at)throw new R("CLOCK_ROLLBACK","Quota clock moved backwards.");let i=t(r,o);if(!i)return;if(r.sequence>=this.maximumEntries)throw new R("CAPACITY","Quota journal requires archival maintenance.");this.apply(r,i,o);let a={version:ln(i)?2:1,sequence:r.sequence+1,previousHash:r.hash,at:o,operation:i},l=JSON.stringify({...a,hash:Te(a)});if(Buffer.byteLength(l)>16384)throw new R("CAPACITY","Quota record exceeds its bound.");let c=tt(this.directory,`${so()}.tmp`),d=tt(this.directory,`${String(a.sequence).padStart(12,"0")}.quota`),u=await et(c,"wx",384);try{await u.writeFile(l),await u.sync()}catch(m){throw await u.close(),await an(c).catch(()=>{}),m}await u.close();try{if(await ao(c,d),process.platform!=="win32"){let m=await et(this.directory,"r");try{await m.sync()}finally{await m.close()}}return}catch(m){if(m.code!=="EEXIST")throw m}finally{await an(c).catch(()=>{})}}throw new R("CONFLICT","Quota admission contention exceeded the retry bound.")}};export{Er as BUILT_IN_XENO_PROVIDER_PRESETS,Se as DualLLMProvider,un as FileQuotaAuthority,Yt as FileXenoProviderConnectionStore,P as ProviderError,Ze as QuotaAcknowledgementError,R as QuotaError,_ as ToolSchemaProjectionError,Vt as XENO_PROVIDER_CATALOG_SCHEMA_VERSION,Ge as XENO_PROVIDER_CONNECTION_STORE_SCHEMA_VERSION,ae as XenoProviderCatalog,Oe as assertDirectEndpointResolution,Le as classifyProviderHttpError,_r as createDirectProvider,Sr as createOllamaNativeProvider,Ri as createQuotaGovernedProvider,si as directProviderConfigFromConnection,oo as isQuotaControlError,j as normalizeQuotaScope,Ie as parseRetryAfter,oi as probeXenoProvider,he as projectToolDefinitionsForProvider,It as projectToolSchemaForProvider,z as providerCapabilityError,v as providerProtocolError,Ce as quotaAncestors,k as quotaInteger,q as quotaScopeKey,A as quotaText,ii as selectXenoProviderRoute,K as validateDirectEndpoint};
|