@swifty.js/swifty 0.0.4 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire as __swiftyCreateRequire } from "node:module";
3
3
  const require = __swiftyCreateRequire(import.meta.url);
4
- import{l as C}from"./chunk-DCI5RJC7.js";import{g as w}from"./chunk-H7VXSMJR.js";import{f as D,h as F,i as R}from"./chunk-KYXKZJ3Z.js";import{b as B,c as U,d as M,e as $,f as K,g as W}from"./chunk-FZPTNGTU.js";import"./chunk-7MHXMDYC.js";import{H as P,J as v,K as O,L as I,M as k,N as j,e as S,l as N}from"./chunk-4KVSJNS6.js";import"./chunk-MQ5XOYLD.js";import"./chunk-X3UA5OZL.js";var x=S({module:"llm"});var Y=3e3,q=P.object({max_input_tokens:P.coerce.number()});async function at(o){if(o.protocol!=="anthropic")return 0;let t=R(o),s=`${o.base_url.replace(/\/+$/,"")}/v1/models/${encodeURIComponent(o.model)}`,n=new AbortController,a=setTimeout(()=>{n.abort()},Y);try{let l=await fetch(s,{method:"GET",headers:{"anthropic-version":"2023-06-01",...t?{"x-api-key":t}:{}},signal:n.signal});if(!l.ok)return 0;let g=await l.json(),{success:h,error:d,data:f}=await N(q,g);if(!h)return console.error(d.message),0;let y=f.max_input_tokens;return Math.max(y,0)}catch(l){return console.error(l),0}finally{clearTimeout(a)}}function J(){return!0}function H(o){return(o??[]).map(t=>({type:"image",source:{type:"base64",media_type:t.mediaType,data:t.data}}))}function L(o){let t=[];return(o.content||!o.images?.length)&&t.push({type:"text",text:o.content}),t.push(...H(o.images)),t}function z(o){let t=[];for(let e of o)if(e.role==="assistant"){let s=[];if(e.thinkingBlocks)for(let n of e.thinkingBlocks)s.push({type:"thinking",thinking:n.thinking,signature:n.signature});if(e.content&&s.push({type:"text",text:e.content}),e.toolUses)for(let n of e.toolUses)s.push({type:"tool_use",id:n.toolUseId,name:n.toolName,input:n.arguments});s.length===0&&s.push({type:"text",text:""}),t.push({role:"assistant",content:s})}else if(e.toolResults&&e.toolResults.length>0){let s=[];for(let n of e.toolResults)s.push({type:"tool_result",tool_use_id:n.toolUseId,is_error:n.isError,content:n.images?.length?[{type:"text",text:n.content},...H(n.images)]:n.content});t.push({role:"user",content:s})}else{if(t.length===0){t.push({role:"user",content:L(e)});continue}let s=!1,n=t[t.length-1],a=n.content;n.role==="user"&&(typeof a=="string"||Array.isArray(a)&&a.length>0&&(a[0].type==="text"||a[0].type==="image"))&&(s=!0),s?(typeof a=="string"&&(a=n.content=a.trim().length>0?[{type:"text",text:a}]:[]),a.push(...L(e))):t.push({role:"user",content:L(e)})}return t}var G=class{client;model;thinking;systemPrompt;maxOutputTokens;contextWindow;constructor(t,e){let s=R(t);if(!s)throw new M("Anthropic API key not found, set ANTHROPIC_API_KEY in .swifty/config.y(a)ml, or via ANTHROPIC_API_KEY env variable.");this.client=new w({apiKey:s,baseURL:t.base_url}),this.model=t.model,this.thinking=t.thinking??!0,this.systemPrompt=e,this.maxOutputTokens=F(t),this.contextWindow=D(t)}setSystemPrompt(t){this.systemPrompt=t}setMaxOutputTokens(t){this.maxOutputTokens=t}async*stream(t,e,s){let n=z(B(t.getMessages())),a=e.map(c=>{let p=c.input_schema;return{name:c.name,description:c.description,input_schema:{type:"object",properties:p.properties,required:p.required??[]}}});a.length>0&&(a[a.length-1].cache_control={type:"ephemeral"}),Q(n);let l={model:this.model,max_tokens:this.maxOutputTokens,stream:!0,system:[{type:"text",text:this.systemPrompt,cache_control:{type:"ephemeral"}}],messages:n,...a.length>0?{tools:a}:{}};this.thinking?J()&&(l.thinking={type:"enabled",budget_tokens:C(this.contextWindow,this.maxOutputTokens)}):l.thinking={type:"enabled",budget_tokens:C(this.contextWindow,this.maxOutputTokens)};let g=0,h=0,d=0,f=0,y="end_turn",b="",A="",T=!1,E=0;try{let c=this.client.messages.stream(l,{...s?{signal:s}:{}}),p="",_="",u="";for await(let i of c)switch(i.type){case"content_block_start":{let r=i.content_block;r.type==="thinking"?(T=!0,b="",A=""):r.type==="tool_use"&&(_=r.id,p=r.name,u="",yield{type:"tool_call_start",toolName:p,toolId:_});break}case"content_block_delta":{let r=i.delta;r.type==="thinking_delta"?(b+=r.thinking,yield{type:"thinking_delta",text:r.thinking}):r.type==="signature_delta"?(x.debug({signature:r.signature},"thinking signature received"),A=r.signature):r.type==="text_delta"?yield{type:"text_delta",text:r.text}:r.type==="input_json_delta"&&(u+=r.partial_json,yield{type:"tool_call_delta",text:r.partial_json});break}case"content_block_stop":{if(T&&(yield{type:"thinking_complete",thinking:b,signature:A},T=!1),p){let r={};if(u)try{let m=JSON.parse(u);r=O(m)?I(m):{[v]:u}}catch(m){x.error({err:m},"llm operation failed"),r={[v]:u}}yield{type:"tool_call_complete",toolId:_,toolName:p,arguments:r},p="",_="",u=""}break}case"message_delta":{i.delta.stop_reason&&(y=i.delta.stop_reason),i.usage.output_tokens&&(h=i.usage.output_tokens,i.usage.input_tokens&&(g=i.usage.input_tokens),i.usage.cache_read_input_tokens&&(d=i.usage.cache_read_input_tokens),i.usage.cache_creation_input_tokens&&(f=i.usage.cache_creation_input_tokens));break}case"message_start":{E=Date.now(),g=i.message.usage.input_tokens,h=i.message.usage.output_tokens,d=i.message.usage.cache_read_input_tokens??0,f=i.message.usage.cache_creation_input_tokens??0;break}case"message_stop":{let m=Date.now()-E;x.debug({elapsedMs:m},"message stream complete");break}}yield{type:"stream_end",stopReason:y,usage:{inputTokens:g,outputTokens:h,cacheReadInputTokens:d,cacheCreationInputTokens:f}}}catch(c){throw x.error({err:c},"llm operation failed"),V(c)}}};function Q(o){for(let t=o.length-1;t>=0;t--){if(o[t].role!=="user")continue;let e=o[t].content;if(typeof e=="string"&&e.length===0||Array.isArray(e)&&e.length===0)return;typeof e=="string"&&(e=o[t].content=[{type:"text",text:e}]);let s=e[e.length-1];for(let n=e.length-1;n>=0;n--)if(e[n].type!=="image"){s=e[n];break}Reflect.set(s,"cache_control",{type:"ephemeral"})}}function V(o){if(o instanceof w.APIError){if(o.status===413||/prompts?\s+too\s+long/i.test(o.message))return new W(`Prompt too long: ${o.message}`);if(o.status===401)return new M(`Invalid API key: ${o.message}`);if(o.status===429){let t=I(o.headers)["retry-after"],e="Rate Limited";if(t){let s=Number.parseInt(k(t));Number.isNaN(s)&&(e+=", please wait."),e+=`, retry after ${k(s)}s.`}else e+=", please wait.";return new $(e,t?k(t):void 0)}return new U(`Anthropic API error (${k(o.status)}): ${o.message}`)}return new K(`Network error: ${j(o)}`)}export{G as AnthropicClient,z as buildAnthropicMessages,at as fetchModelContextWindow,Q as markLastUserTailForCache};
4
+ import{l as C}from"./chunk-DCI5RJC7.js";import{g as w}from"./chunk-H7VXSMJR.js";import{e as D,g as F,h as R}from"./chunk-HU7ELU2V.js";import{b as B,c as U,d as M,e as $,f as K,g as W}from"./chunk-FZPTNGTU.js";import"./chunk-7MHXMDYC.js";import{H as P,J as v,K as O,L as I,M as k,N as j,e as S,l as N}from"./chunk-4KVSJNS6.js";import"./chunk-MQ5XOYLD.js";import"./chunk-X3UA5OZL.js";var x=S({module:"llm"});var Y=3e3,q=P.object({max_input_tokens:P.coerce.number()});async function at(o){if(o.protocol!=="anthropic")return 0;let t=R(o),s=`${o.base_url.replace(/\/+$/,"")}/v1/models/${encodeURIComponent(o.model)}`,n=new AbortController,a=setTimeout(()=>{n.abort()},Y);try{let l=await fetch(s,{method:"GET",headers:{"anthropic-version":"2023-06-01",...t?{"x-api-key":t}:{}},signal:n.signal});if(!l.ok)return 0;let g=await l.json(),{success:h,error:d,data:f}=await N(q,g);if(!h)return console.error(d.message),0;let y=f.max_input_tokens;return Math.max(y,0)}catch(l){return console.error(l),0}finally{clearTimeout(a)}}function J(){return!0}function H(o){return(o??[]).map(t=>({type:"image",source:{type:"base64",media_type:t.mediaType,data:t.data}}))}function L(o){let t=[];return(o.content||!o.images?.length)&&t.push({type:"text",text:o.content}),t.push(...H(o.images)),t}function z(o){let t=[];for(let e of o)if(e.role==="assistant"){let s=[];if(e.thinkingBlocks)for(let n of e.thinkingBlocks)s.push({type:"thinking",thinking:n.thinking,signature:n.signature});if(e.content&&s.push({type:"text",text:e.content}),e.toolUses)for(let n of e.toolUses)s.push({type:"tool_use",id:n.toolUseId,name:n.toolName,input:n.arguments});s.length===0&&s.push({type:"text",text:""}),t.push({role:"assistant",content:s})}else if(e.toolResults&&e.toolResults.length>0){let s=[];for(let n of e.toolResults)s.push({type:"tool_result",tool_use_id:n.toolUseId,is_error:n.isError,content:n.images?.length?[{type:"text",text:n.content},...H(n.images)]:n.content});t.push({role:"user",content:s})}else{if(t.length===0){t.push({role:"user",content:L(e)});continue}let s=!1,n=t[t.length-1],a=n.content;n.role==="user"&&(typeof a=="string"||Array.isArray(a)&&a.length>0&&(a[0].type==="text"||a[0].type==="image"))&&(s=!0),s?(typeof a=="string"&&(a=n.content=a.trim().length>0?[{type:"text",text:a}]:[]),a.push(...L(e))):t.push({role:"user",content:L(e)})}return t}var G=class{client;model;thinking;systemPrompt;maxOutputTokens;contextWindow;constructor(t,e){let s=R(t);if(!s)throw new M("Anthropic API key not found, set ANTHROPIC_API_KEY in .swifty/config.y(a)ml, or via ANTHROPIC_API_KEY env variable.");this.client=new w({apiKey:s,baseURL:t.base_url}),this.model=t.model,this.thinking=t.thinking??!0,this.systemPrompt=e,this.maxOutputTokens=F(t),this.contextWindow=D(t)}setSystemPrompt(t){this.systemPrompt=t}setMaxOutputTokens(t){this.maxOutputTokens=t}async*stream(t,e,s){let n=z(B(t.getMessages())),a=e.map(c=>{let p=c.input_schema;return{name:c.name,description:c.description,input_schema:{type:"object",properties:p.properties,required:p.required??[]}}});a.length>0&&(a[a.length-1].cache_control={type:"ephemeral"}),Q(n);let l={model:this.model,max_tokens:this.maxOutputTokens,stream:!0,system:[{type:"text",text:this.systemPrompt,cache_control:{type:"ephemeral"}}],messages:n,...a.length>0?{tools:a}:{}};this.thinking?J()&&(l.thinking={type:"enabled",budget_tokens:C(this.contextWindow,this.maxOutputTokens)}):l.thinking={type:"enabled",budget_tokens:C(this.contextWindow,this.maxOutputTokens)};let g=0,h=0,d=0,f=0,y="end_turn",b="",A="",T=!1,E=0;try{let c=this.client.messages.stream(l,{...s?{signal:s}:{}}),p="",_="",u="";for await(let i of c)switch(i.type){case"content_block_start":{let r=i.content_block;r.type==="thinking"?(T=!0,b="",A=""):r.type==="tool_use"&&(_=r.id,p=r.name,u="",yield{type:"tool_call_start",toolName:p,toolId:_});break}case"content_block_delta":{let r=i.delta;r.type==="thinking_delta"?(b+=r.thinking,yield{type:"thinking_delta",text:r.thinking}):r.type==="signature_delta"?(x.debug({signature:r.signature},"thinking signature received"),A=r.signature):r.type==="text_delta"?yield{type:"text_delta",text:r.text}:r.type==="input_json_delta"&&(u+=r.partial_json,yield{type:"tool_call_delta",text:r.partial_json});break}case"content_block_stop":{if(T&&(yield{type:"thinking_complete",thinking:b,signature:A},T=!1),p){let r={};if(u)try{let m=JSON.parse(u);r=O(m)?I(m):{[v]:u}}catch(m){x.error({err:m},"llm operation failed"),r={[v]:u}}yield{type:"tool_call_complete",toolId:_,toolName:p,arguments:r},p="",_="",u=""}break}case"message_delta":{i.delta.stop_reason&&(y=i.delta.stop_reason),i.usage.output_tokens&&(h=i.usage.output_tokens,i.usage.input_tokens&&(g=i.usage.input_tokens),i.usage.cache_read_input_tokens&&(d=i.usage.cache_read_input_tokens),i.usage.cache_creation_input_tokens&&(f=i.usage.cache_creation_input_tokens));break}case"message_start":{E=Date.now(),g=i.message.usage.input_tokens,h=i.message.usage.output_tokens,d=i.message.usage.cache_read_input_tokens??0,f=i.message.usage.cache_creation_input_tokens??0;break}case"message_stop":{let m=Date.now()-E;x.debug({elapsedMs:m},"message stream complete");break}}yield{type:"stream_end",stopReason:y,usage:{inputTokens:g,outputTokens:h,cacheReadInputTokens:d,cacheCreationInputTokens:f}}}catch(c){throw x.error({err:c},"llm operation failed"),V(c)}}};function Q(o){for(let t=o.length-1;t>=0;t--){if(o[t].role!=="user")continue;let e=o[t].content;if(typeof e=="string"&&e.length===0||Array.isArray(e)&&e.length===0)return;typeof e=="string"&&(e=o[t].content=[{type:"text",text:e}]);let s=e[e.length-1];for(let n=e.length-1;n>=0;n--)if(e[n].type!=="image"){s=e[n];break}Reflect.set(s,"cache_control",{type:"ephemeral"})}}function V(o){if(o instanceof w.APIError){if(o.status===413||/prompts?\s+too\s+long/i.test(o.message))return new W(`Prompt too long: ${o.message}`);if(o.status===401)return new M(`Invalid API key: ${o.message}`);if(o.status===429){let t=I(o.headers)["retry-after"],e="Rate Limited";if(t){let s=Number.parseInt(k(t));Number.isNaN(s)&&(e+=", please wait."),e+=`, retry after ${k(s)}s.`}else e+=", please wait.";return new $(e,t?k(t):void 0)}return new U(`Anthropic API error (${k(o.status)}): ${o.message}`)}return new K(`Network error: ${j(o)}`)}export{G as AnthropicClient,z as buildAnthropicMessages,at as fetchModelContextWindow,Q as markLastUserTailForCache};
@@ -1,4 +1,4 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire as __swiftyCreateRequire } from "node:module";
3
3
  const require = __swiftyCreateRequire(import.meta.url);
4
- import{a as S}from"./chunk-7MHXMDYC.js";import{H as o,e as x,g as u,h as m}from"./chunk-4KVSJNS6.js";import{existsSync as E,readFileSync as I}from"fs";import{homedir as N}from"os";import{join as d}from"path";function p(e){return!!e._zod}function f(e,n){return p(e)?u(e,n):e.safeParse(n)}async function ee(e,n){return p(e)?await m(e,n):await e.safeParseAsync(n)}function oe(e){if(!e)return;let n;if(p(e)?n=e._zod?.def?.shape:n=e.shape,!!n){if(typeof n=="function")try{return n()}catch{return}return n}}function ne(e){if(p(e)){let s=e._zod?.def;if(s){if(s.value!==void 0)return s.value;if(Array.isArray(s.values)&&s.values.length>0)return s.values[0]}}let t=e._def;if(t){if(t.value!==void 0)return t.value;if(Array.isArray(t.values)&&t.values.length>0)return t.values[0]}let r=e.value;if(r!==void 0)return r}var g=x({module:"config"}),A={anthropic:"ANTHROPIC_API_KEY",openai:"OPENAI_API_KEY","openai-compat":"OPENAI_API_KEY"};function V(e){return _.has(e)}var _=new Set(Object.keys(A)),l=class extends Error{constructor(n){super(n),this.name="ConfigError"}},P=o.object({name:o.string(),protocol:o.enum(["anthropic","openai","openai-compat"]),base_url:o.string(),model:o.string(),api_key:o.string().optional(),thinking:o.boolean().optional(),context_window:o.coerce.number().optional(),max_output_tokens:o.coerce.number().optional()}),T=[["1m",1e6],["gpt-4.1",1e6],["gpt-4o",128e3],["gpt-4-turbo",128e3],["o1",2e5],["o3",2e5],["o4",2e5],["gpt-3.5",16385],["claude",2e5]];function j(e){let n=e.toLowerCase();for(let[t,r]of T)if(n.includes(t))return r;return n.includes("claude")?2e5:128e3}function le(e){return e.context_window&&e.context_window>0?e.context_window:j(e.model)}var w=new Map;async function pe(e,n){if(e.context_window&&e.context_window>0)return e.context_window;if(e.protocol==="anthropic"){let t=`${e.name}-${e.model}`,r=w.get(t);if(r===void 0){try{r=await(n??(await import("./anthropic-4E5EEQM6.js")).fetchModelContextWindow)(e)}catch(i){g.error({err:i},"config operation failed"),r=0}w.set(t,r)}if(r&&r>0)return r}return j(e.model)}function ue(e){return e.max_output_tokens&&e.max_output_tokens>0?e.max_output_tokens:e.thinking?64e3:8192}function me(e){if(e.api_key)return e.api_key;let n=V(e.protocol)?A[e.protocol]:"";return n?process.env[n]??"":""}var z=o.object({name:o.string(),command:o.string().optional(),args:o.array(o.string()).optional(),url:o.string().optional(),transport:o.string().optional(),headers:o.record(o.string(),o.string()).optional(),env:o.record(o.string(),o.string()).optional()}),O=o.object({id:o.string().optional(),event:o.string(),condition:o.string().optional(),action:o.object({type:o.string(),command:o.string().optional(),url:o.string().optional(),method:o.string().optional(),prompt:o.string().optional()}),reject:o.boolean().optional(),once:o.boolean().optional(),async:o.boolean().optional(),on_error:o.string().optional()}),M=o.object({enabled:o.boolean().optional(),auto_allow:o.boolean().optional(),network_enabled:o.boolean().optional()}),Y=o.object({providers:o.array(P),permission_mode:o.string().optional(),mcp_servers:o.array(z).default([]),hooks:o.array(O).default([]),sandbox:M.optional(),enable_coordinator_mode:o.boolean().optional(),enable_fork:o.boolean().optional()});function ge(e){return e.enable_fork!==!1}function K(e){return typeof e=="object"&&e!==null}function C(e){let n=I(e,"utf-8"),t=S.load(n);if(!K(t))return g.error({path:e},"invalid yaml"),{providers:[],mcp_servers:[],hooks:[]};let r=f(Y,t);if(r.success){let a=r.data;return{providers:a.providers,permission_mode:a.permission_mode,mcp_servers:a.mcp_servers,hooks:a.hooks}}g.error({error:r.error},"config error");let i=[],s,c=[],y=[],v,b=!1,h=!0;if("providers"in t){let a=f(o.array(P),t.providers);a.success&&(i=a.data)}if("permission_mode"in t&&typeof t.permission_mode=="string"&&(s=t.permission_mode),"mcp_servers"in t){let a=f(o.array(z),t.mcp_servers);a.success&&(c=a.data)}if("hooks"in t){let a=f(o.array(O),t.hooks);a.success&&(y=a.data)}if("sandbox"in t){let a=f(M,t.sandbox);a.success&&(v=a.data)}return"enable_coordinator_mode"in t&&(b=!!t.enable_coordinator_mode),"enable_fork"in t&&(h=!!t.enable_fork),{providers:i,permission_mode:s,mcp_servers:c,hooks:y,sandbox:v,enable_coordinator_mode:b,enable_fork:h}}function W(e,n){if(n.providers.length>0&&(e.providers=n.providers),n.permission_mode&&(e.permission_mode=n.permission_mode),n.mcp_servers.length>0){let t=new Map;for(let r=0;r<e.mcp_servers.length;r++){let i=e.mcp_servers[r];t.set(i.name,r)}for(let r of n.mcp_servers){let i=t.get(r.name);i!==void 0?e.mcp_servers[i]=r:(e.mcp_servers.push(r),t.set(r.name,e.mcp_servers.length-1))}}return e.hooks=[...e.hooks,...n.hooks],n.sandbox&&(e.sandbox={...e.sandbox,...n.sandbox}),n.enable_coordinator_mode&&(e.enable_coordinator_mode=!0),n.enable_fork!==void 0&&(e.enable_fork=n.enable_fork),e}function k(e){if(e.providers.length===0)throw new l("At least one provider MUST be configured.");let n=["name","protocol","base_url","model"];for(let t=0;t<e.providers.length;t++){let r=e.providers[t],i={name:r.name,protocol:r.protocol,base_url:r.base_url,model:r.model},s=n.filter(c=>!(c in i));if(s.length>0)throw new l(`Provider #${String(t+1)}: missing fields: ${s.join(", ")}`);if(!_.has(r.protocol))throw new l(`Provider #${String(t+1)}: invalid protocol '${r.protocol}', MUST be one of: ${Array.from(_).join(", ")}`)}}function _e(e){if(e){let s=C(e);return k(s),s}let n=process.cwd(),t=N(),r=[d(t,".swifty","config.yml"),d(t,".swifty","config.yaml"),d(n,".swifty","config.yml"),d(n,".swifty","config.yaml"),d(n,".swifty","config.local.yml"),d(n,".swifty","config.local.yaml")],i=null;for(let s of r){if(!E(s))continue;let c=C(s);i?i=W(i,c):i=c}if(!i)throw new l("No config file found, expected .swifty/config.y(a)ml under project or $HOME/.swifty/config.y(a)ml.");return k(i),i}export{p as a,f as b,ee as c,oe as d,ne as e,le as f,pe as g,ue as h,me as i,ge as j,_e as k};
4
+ import{a as S}from"./chunk-7MHXMDYC.js";import{H as o,e as x,g as u,h as m}from"./chunk-4KVSJNS6.js";import{existsSync as E,readFileSync as $}from"fs";import{homedir as I}from"os";import{join as d}from"path";function p(e){return!!e._zod}function c(e,n){return p(e)?u(e,n):e.safeParse(n)}async function ee(e,n){return p(e)?await m(e,n):await e.safeParseAsync(n)}function oe(e){if(!e)return;let n;if(p(e)?n=e._zod?.def?.shape:n=e.shape,!!n){if(typeof n=="function")try{return n()}catch{return}return n}}function ne(e){if(p(e)){let s=e._zod?.def;if(s){if(s.value!==void 0)return s.value;if(Array.isArray(s.values)&&s.values.length>0)return s.values[0]}}let t=e._def;if(t){if(t.value!==void 0)return t.value;if(Array.isArray(t.values)&&t.values.length>0)return t.values[0]}let r=e.value;if(r!==void 0)return r}var g=x({module:"config"}),A={anthropic:"ANTHROPIC_API_KEY",openai:"OPENAI_API_KEY","openai-compat":"OPENAI_API_KEY"};function N(e){return _.has(e)}var _=new Set(Object.keys(A)),l=class extends Error{constructor(n){super(n),this.name="ConfigError"}},P=o.object({name:o.string(),protocol:o.enum(["anthropic","openai","openai-compat"]),base_url:o.string(),model:o.string(),api_key:o.string().optional(),thinking:o.boolean().optional(),context_window:o.coerce.number().optional(),max_output_tokens:o.coerce.number().optional()}),V=[["1m",1e6],["gpt-4.1",1e6],["gpt-4o",128e3],["gpt-4-turbo",128e3],["o1",2e5],["o3",2e5],["o4",2e5],["gpt-3.5",16385],["claude",2e5]];function j(e){let n=e.toLowerCase();for(let[t,r]of V)if(n.includes(t))return r;return n.includes("claude")?2e5:128e3}function le(e){return e.context_window&&e.context_window>0?e.context_window:j(e.model)}var w=new Map;async function pe(e,n){if(e.context_window&&e.context_window>0)return e.context_window;if(e.protocol==="anthropic"){let t=`${e.name}-${e.model}`,r=w.get(t);if(r===void 0){try{r=await(n??(await import("./anthropic-25O6Y2EC.js")).fetchModelContextWindow)(e)}catch(i){g.error({err:i},"config operation failed"),r=0}w.set(t,r)}if(r&&r>0)return r}return j(e.model)}function ue(e){return e.max_output_tokens&&e.max_output_tokens>0?e.max_output_tokens:e.thinking?64e3:8192}function me(e){if(e.api_key)return e.api_key;let n=N(e.protocol)?A[e.protocol]:"";return n?process.env[n]??"":""}var z=o.object({name:o.string(),command:o.string().optional(),args:o.array(o.string()).optional(),url:o.string().optional(),transport:o.string().optional(),headers:o.record(o.string(),o.string()).optional(),env:o.record(o.string(),o.string()).optional()}),O=o.object({id:o.string().optional(),event:o.string(),condition:o.string().optional(),action:o.object({type:o.string(),command:o.string().optional(),url:o.string().optional(),method:o.string().optional(),prompt:o.string().optional()}),reject:o.boolean().optional(),once:o.boolean().optional(),async:o.boolean().optional(),on_error:o.string().optional()}),M=o.object({enabled:o.boolean().optional(),auto_allow:o.boolean().optional(),network_enabled:o.boolean().optional()}),T=o.object({providers:o.array(P),permission_mode:o.string().optional(),mcp_servers:o.array(z).default([]),hooks:o.array(O).default([]),sandbox:M.optional(),enable_coordinator_mode:o.boolean().optional(),enable_fork:o.boolean().optional()});function ge(e){return e.enable_fork!==!1}function Y(e){return typeof e=="object"&&e!==null}function C(e){let n=$(e,"utf-8"),t=S.load(n);if(!Y(t))return g.error({path:e},"invalid yaml"),{providers:[],mcp_servers:[],hooks:[]};let r=c(T,t);if(r.success){let a=r.data;return{providers:a.providers,permission_mode:a.permission_mode,mcp_servers:a.mcp_servers,hooks:a.hooks}}g.error({error:r.error},"config error");let i=[],s,f=[],y=[],v,b=!1,h=!0;if("providers"in t){let a=c(o.array(P),t.providers);a.success&&(i=a.data)}if("permission_mode"in t&&typeof t.permission_mode=="string"&&(s=t.permission_mode),"mcp_servers"in t){let a=c(o.array(z),t.mcp_servers);a.success&&(f=a.data)}if("hooks"in t){let a=c(o.array(O),t.hooks);a.success&&(y=a.data)}if("sandbox"in t){let a=c(M,t.sandbox);a.success&&(v=a.data)}return"enable_coordinator_mode"in t&&(b=!!t.enable_coordinator_mode),"enable_fork"in t&&(h=!!t.enable_fork),{providers:i,permission_mode:s,mcp_servers:f,hooks:y,sandbox:v,enable_coordinator_mode:b,enable_fork:h}}function K(e,n){if(n.providers.length>0&&(e.providers=n.providers),n.permission_mode&&(e.permission_mode=n.permission_mode),n.mcp_servers.length>0){let t=new Map;for(let r=0;r<e.mcp_servers.length;r++){let i=e.mcp_servers[r];t.set(i.name,r)}for(let r of n.mcp_servers){let i=t.get(r.name);i!==void 0?e.mcp_servers[i]=r:(e.mcp_servers.push(r),t.set(r.name,e.mcp_servers.length-1))}}return e.hooks=[...e.hooks,...n.hooks],n.sandbox&&(e.sandbox={...e.sandbox,...n.sandbox}),n.enable_coordinator_mode&&(e.enable_coordinator_mode=!0),n.enable_fork!==void 0&&(e.enable_fork=n.enable_fork),e}function k(e){if(e.providers.length===0)throw new l("At least one provider MUST be configured.");let n=["name","protocol","base_url","model"];for(let t=0;t<e.providers.length;t++){let r=e.providers[t],i={name:r.name,protocol:r.protocol,base_url:r.base_url,model:r.model},s=n.filter(f=>!(f in i));if(s.length>0)throw new l(`Provider #${String(t+1)}: missing fields: ${s.join(", ")}`);if(!_.has(r.protocol))throw new l(`Provider #${String(t+1)}: invalid protocol '${r.protocol}', MUST be one of: ${Array.from(_).join(", ")}`)}}function _e(e){if(e){let s=C(e);return k(s),s}let n=process.cwd(),t=I(),r=[d(t,".swifty","config.yml"),d(t,".swifty","config.yaml"),d(n,".swifty","config.yml"),d(n,".swifty","config.yaml"),d(n,".swifty","config.local.yml"),d(n,".swifty","config.local.yaml")],i=null;for(let s of r){if(!E(s))continue;let f=C(s);i?i=K(i,f):i=f}if(!i)throw new l("No config file found, expected .swifty/config.y(a)ml under project or $HOME/.swifty/config.y(a)ml.");return k(i),i}export{c as a,ee as b,oe as c,ne as d,le as e,pe as f,ue as g,me as h,ge as i,_e as j};