@kodax-ai/kodax 0.7.41 → 0.7.43

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.
Files changed (54) hide show
  1. package/CHANGELOG.md +119 -3
  2. package/README.md +214 -286
  3. package/README_CN.md +173 -277
  4. package/dist/chunks/chunk-7G5PSL6C.js +830 -0
  5. package/dist/chunks/{chunk-6OB4AJOM.js → chunk-IYSK7LUK.js} +1 -1
  6. package/dist/chunks/chunk-K75O2CAE.js +31 -0
  7. package/dist/chunks/chunk-UG4262JI.js +502 -0
  8. package/dist/chunks/chunk-VHKAJDQD.js +425 -0
  9. package/dist/chunks/chunk-YMRZBS4G.js +2 -0
  10. package/dist/chunks/{compaction-config-LT5PEXPT.js → compaction-config-3E57ABCT.js} +1 -1
  11. package/dist/chunks/{construction-bootstrap-HBCWJFHC.js → construction-bootstrap-JR63KI5N.js} +4 -4
  12. package/dist/chunks/dist-KWHUKXEL.js +2 -0
  13. package/dist/chunks/dist-XANXEVTU.js +2 -0
  14. package/dist/chunks/utils-HQ2QCKJA.js +2 -0
  15. package/dist/index.d.ts +15 -10
  16. package/dist/index.js +5 -5
  17. package/dist/kodax_cli.js +1084 -1054
  18. package/dist/sdk-agent.d.ts +853 -135
  19. package/dist/sdk-agent.js +1 -1
  20. package/dist/sdk-coding.d.ts +932 -981
  21. package/dist/sdk-coding.js +1 -1
  22. package/dist/sdk-llm.d.ts +8 -5
  23. package/dist/sdk-llm.js +1 -1
  24. package/dist/sdk-mcp.d.ts +17 -0
  25. package/dist/sdk-mcp.js +2 -0
  26. package/dist/sdk-repl.d.ts +343 -10
  27. package/dist/sdk-repl.js +2 -1
  28. package/dist/sdk-session.d.ts +176 -0
  29. package/dist/sdk-session.js +2 -0
  30. package/dist/sdk-skills.d.ts +72 -4
  31. package/dist/sdk-skills.js +1 -1
  32. package/dist/types-chunks/{cost-tracker.d-C4dMlQuV.d.ts → base.d-FUJahC0i.d.ts} +22 -112
  33. package/dist/types-chunks/{bash-prefix-extractor.d-B2iliwdi.d.ts → bash-prefix-extractor.d-DMrGImMl.d.ts} +266 -228
  34. package/dist/types-chunks/capability.d-3C62G8Eq.d.ts +39 -0
  35. package/dist/types-chunks/config.d-BfJUXxC0.d.ts +41 -0
  36. package/dist/types-chunks/cost-tracker.d-wRtyEW9d.d.ts +110 -0
  37. package/dist/types-chunks/{history-cleanup.d-q1vAvCss.d.ts → file-tracker.d-zaLZeNBK.d.ts} +532 -15
  38. package/dist/types-chunks/manager.d-87belpiS.d.ts +370 -0
  39. package/dist/types-chunks/{resolver.d-BwD6TKz7.d.ts → resolver.d-CA68_NeH.d.ts} +150 -5
  40. package/dist/types-chunks/storage.d-DPAEX7zS.d.ts +115 -0
  41. package/dist/types-chunks/{capability.d-BxNgd1-c.d.ts → types.d-B1uGoVTE.d.ts} +72 -40
  42. package/dist/types-chunks/{instance-discovery.d-DZhp77vb.d.ts → types.d-CKJtjo-6.d.ts} +168 -258
  43. package/dist/types-chunks/types.d-mM8vqvhT.d.ts +254 -0
  44. package/dist/types-chunks/{storage.d-Bv9T99Qu.d.ts → utils.d-DkLZD_wa.d.ts} +38 -112
  45. package/package.json +15 -6
  46. package/dist/chunks/chunk-5TFLMGER.js +0 -2
  47. package/dist/chunks/chunk-6QO6HWGU.js +0 -30
  48. package/dist/chunks/chunk-EQ5DGS2W.js +0 -14
  49. package/dist/chunks/chunk-HYWVRTFA.js +0 -1233
  50. package/dist/chunks/chunk-SX2IS5JP.js +0 -16
  51. package/dist/chunks/chunk-ZPJPNLBK.js +0 -462
  52. package/dist/chunks/dist-M57GIWR4.js +0 -2
  53. package/dist/chunks/dist-V3BS2NKB.js +0 -2
  54. package/dist/chunks/utils-FAFUQJ2A.js +0 -2
@@ -1,30 +0,0 @@
1
- // @kodax-ai/kodax — bundled distribution. See docs/ADR.md ADR-022 + ADR-024.
2
- import{a as i}from"./chunk-V4WSBIXB.js";var H=class extends Error{static{i(this,"KodaXError")}code;constructor(e,n="KODAX_ERROR"){super(e),this.code=n,this.name="KodaXError"}},R=class extends H{static{i(this,"KodaXProviderError")}provider;constructor(e,n){super(e,"PROVIDER_ERROR"),this.provider=n,this.name="KodaXProviderError"}},de=class extends H{static{i(this,"KodaXRateLimitError")}retryAfter;constructor(e,n){super(e,"RATE_LIMIT_ERROR"),this.retryAfter=n,this.name="KodaXRateLimitError"}},Fe=class extends H{static{i(this,"KodaXNetworkError")}isTimeout;constructor(e,n=!1){super(e,"NETWORK_ERROR"),this.isTimeout=n,this.name="KodaXNetworkError"}},Ue=class extends H{static{i(this,"KodaXToolCallIdError")}constructor(e){super(e,"TOOL_CALL_ID_ERROR"),this.name="KodaXToolCallIdError"}};var Xe=32768,J=32e3,We=64e3,un=.5;var pn=["off","auto","quick","balanced","deep"],Rt={low:6e3,medium:1e4,high:2e4},At=4096;function $e(t){return t.reasoningCapability?t.reasoningCapability:t.supportsThinking?"native-toggle":"prompt-only"}i($e,"getReasoningCapability");function Q(t){return ke(t).enabled}i(Q,"isReasoningEnabled");function ke(t){if(typeof t=="boolean")return{enabled:t,mode:t?"auto":"off",depth:t?"medium":"off",taskType:"unknown",executionMode:"implementation"};let e=t?.mode??"off",n=t?.depth??St(e),o=t?.enabled??(e!=="off"&&n!=="off");return{enabled:o&&e!=="off"&&n!=="off",mode:e,depth:o?n:"off",taskType:t?.taskType??"unknown",executionMode:t?.executionMode??"implementation"}}i(ke,"normalizeReasoningRequest");function St(t){switch(t){case"quick":return"low";case"balanced":case"auto":return"medium";case"deep":return"high";default:return"off"}}i(St,"getDefaultThinkingDepthForMode");function q(t,e,n="unknown"){if(e==="off")return 0;let o={...Rt,...t.defaultThinkingBudgets??{}},s=t.taskBudgetOverrides?.[n]?.[e]??o[e];return t.thinkingBudgetCap?Math.min(s,t.thinkingBudgetCap):s}i(q,"resolveThinkingBudget");function Z(t,e,n=At){let o=Math.max(1024,e-n);return Math.max(1024,Math.min(t,o))}i(Z,"clampThinkingBudget");function je(t){switch(t){case"low":return"low";case"medium":return"medium";case"high":return"high";default:return}}i(je,"mapDepthToOpenAIReasoningEffort");import xe from"fs";import dn from"os";import He from"path";var Ge=null;function mn(t){return t==="budget"||t==="effort"||t==="toggle"||t==="none"}i(mn,"isReasoningOverride");function fn(t){if(!t||typeof t!="object"||Array.isArray(t))return!1;let e=t.providerReasoningOverrides;return e===void 0?!0:!e||typeof e!="object"||Array.isArray(e)?!1:Object.values(e).every(mn)}i(fn,"isStoredConfig");function gn(){return process.env.KODAX_HOME??He.join(dn.homedir(),".kodax")}i(gn,"getKodaxDir");function Ot(){return process.env.KODAX_CONFIG_FILE??He.join(gn(),"config.json")}i(Ot,"getConfigFilePath");function ze(t,e){return Ge={filePath:t,config:e},e}i(ze,"updateStoredConfigCache");function hn(t){let e=JSON.parse(xe.readFileSync(t,"utf-8"));return fn(e)?e:{}}i(hn,"readStoredConfigFromDisk");function Ve(t){switch(t){case"native-budget":return"budget";case"native-effort":return"effort";case"native-toggle":return"toggle";case"none":return"none";default:return}}i(Ve,"reasoningCapabilityToOverride");function Ye(t){switch(t){case"budget":return"native-budget";case"effort":return"native-effort";case"toggle":return"native-toggle";default:return"none"}}i(Ye,"reasoningOverrideToCapability");function ee(t,e,n){return[t,e.baseUrl??"",n??e.model].join("|")}i(ee,"buildReasoningOverrideKey");function Je(){let t=Ot();if(Ge?.filePath===t)return Ge.config;try{if(xe.existsSync(t))return ze(t,hn(t))}catch{}return ze(t,{})}i(Je,"loadStoredConfig");function It(t){let e=Ot();try{xe.mkdirSync(He.dirname(e),{recursive:!0}),xe.writeFileSync(e,JSON.stringify(t,null,2)),ze(e,t)}catch(n){process.env.KODAX_DEBUG_OVERRIDES&&console.error("[ReasoningOverride] Failed to save config:",n)}}i(It,"saveStoredConfig");function be(t,e,n){let o=Je(),r=ee(t,e,n);return o.providerReasoningOverrides?.[r]}i(be,"loadReasoningOverride");function Qe(t,e,n,o){let r=Je(),s=ee(t,e,o);r.providerReasoningOverrides={...r.providerReasoningOverrides??{},[s]:n},It(r)}i(Qe,"saveReasoningOverride");function yn(t,e,n){let o=Je(),r=ee(t,e,n);if(!o.providerReasoningOverrides?.[r])return;let s={...o.providerReasoningOverrides};delete s[r],o.providerReasoningOverrides=Object.keys(s).length>0?s:void 0,It(o)}i(yn,"clearReasoningOverride");function Dt(t,e){if(!t)return;if(typeof t.get=="function")return t.get(e)??void 0;let n=t,o=e.toLowerCase(),r=n[e]??n[o]??n[o.replace(/\b\w/g,s=>s.toUpperCase())];if(r!==void 0)return Array.isArray(r)?r[0]:r}i(Dt,"readHeader");function Kt(t){if(!t)return;let e=t.trim();if(e.length===0)return;let n=Number(e);if(!(!Number.isFinite(n)||n<=0))return n}i(Kt,"parsePositiveNumber");function _n(t,e){if(!t)return;let n=t.trim();if(n.length===0)return;let o=Date.parse(n);if(!Number.isFinite(o))return;let r=o-e;return r>0?r:void 0}i(_n,"parseHttpDate");function ve(t,e){let n=e.baseBackoffMs??1e3,o=e.maxBackoffMs??3e4,r=e.maxHeaderWaitMs??12e4,s=e.now?e.now():Date.now(),a=Kt(Dt(t,"retry-after-ms"));if(a!==void 0){let _=Math.min(a,r);return{type:"header",waitMs:Math.round(_),source:"retry-after-ms",cappedFromHeader:_!==a}}let l=Dt(t,"retry-after");if(l!==void 0&&l.trim().length>0){let _=Kt(l);if(_!==void 0){let x=_*1e3,u=Math.min(x,r);return{type:"header",waitMs:Math.round(u),source:"retry-after-seconds",cappedFromHeader:u!==x}}let M=_n(l,s);if(M!==void 0){let x=Math.min(M,r);return{type:"header",waitMs:Math.round(x),source:"retry-after-date",cappedFromHeader:x!==M}}}let c=n*Math.pow(2,Math.max(0,e.attempt)),m=Math.min(c,o),f=e.withJitter!==!1?Math.random()*.25*m:0;return{type:"backoff",waitMs:Math.round(m+f),source:"exponential-backoff",attempt:e.attempt}}i(ve,"parseRetryAfter");function Me(t){if(!t||typeof t!="object")return;let e=t;return e.headers??e.response?.headers??e.cause?.headers??e.cause?.response?.headers}i(Me,"extractHeadersFromError");var me={transport:"native-api",conversationSemantics:"full-history",mcpSupport:"none",contextFidelity:"full",toolCallingFidelity:"full",sessionSupport:"full",longRunningSupport:"full",multimodalSupport:"none",evidenceSupport:"full"},L={...me,multimodalSupport:"image-input"},fe={transport:"cli-bridge",conversationSemantics:"last-user-message",mcpSupport:"none",contextFidelity:"lossy",toolCallingFidelity:"limited",sessionSupport:"stateless",longRunningSupport:"limited",multimodalSupport:"none",evidenceSupport:"limited"},Lt={...fe,multimodalSupport:"image-input"};function Ce(t){return{transport:t.transport,conversationSemantics:t.conversationSemantics,mcpSupport:t.mcpSupport,contextFidelity:t.contextFidelity??"full",toolCallingFidelity:t.toolCallingFidelity??"full",sessionSupport:t.sessionSupport??"full",longRunningSupport:t.longRunningSupport??"full",multimodalSupport:t.multimodalSupport??"none",evidenceSupport:t.evidenceSupport??"full"}}i(Ce,"normalizeCapabilityProfile");function F(t){return{...Ce(t)}}i(F,"cloneCapabilityProfile");function kn(t){if(!t)return;let e=parseInt(t,10);return Number.isFinite(e)&&e>0?e:void 0}i(kn,"parseEnvInt");var G=class{static{i(this,"KodaXBaseProvider")}maxOutputTokensOverride;setMaxOutputTokensOverride(e){this.maxOutputTokensOverride=e}getEffectiveMaxOutputTokens(e){if(this.maxOutputTokensOverride!==void 0)return this.maxOutputTokensOverride;let n=kn(process.env.KODAX_MAX_OUTPUT_TOKENS);if(n!==void 0)return n;let o=this.getModelDescriptor(e)?.maxOutputTokens;return o!==void 0?o:this.config.maxOutputTokens??32768}getStreamMaxDurationMs(){return this.config.streamMaxDurationMs}supportsNonStreamingFallback(){return!1}async complete(e,n,o,r,s,a){throw new R(`${this.name} does not support non-streaming fallback`)}isConfigured(){return!!process.env[this.config.apiKeyEnv]}getModel(){return this.config.model}getAvailableModels(){return this.config.models?.length?[...new Set([this.config.model,...this.config.models.map(e=>e.id)])]:[this.config.model]}getModelDescriptor(e){return!e||e===this.config.model?{id:this.config.model}:this.config.models?.find(n=>n.id===e)}getBaseUrl(){return this.config.baseUrl}getApiKeyEnv(){return this.config.apiKeyEnv}getCapabilityProfile(){return F(this.config.capabilityProfile??me)}getConfiguredReasoningCapability(e){let n=this.getModelDescriptor(e);return n?.reasoningCapability?n.reasoningCapability:$e(this.config)}getReasoningCapability(e){let n=be(this.name,this.config,e);return n?Ye(n):this.getConfiguredReasoningCapability(e)}getReasoningOverride(e){return be(this.name,this.config,e)}getReasoningOverrideKey(e){return ee(this.name,this.config,e)}persistReasoningCapabilityOverride(e,n){let o=Ve(e);o&&Qe(this.name,this.config,o,n)}shouldFallbackForReasoningError(e,...n){let o=e instanceof Error?e.message.toLowerCase():String(e).toLowerCase(),s=n.map(l=>l.toLowerCase()).some(l=>o.includes(l)),a=o.includes("parameter")||s;return o.includes("unknown parameter")||o.includes("invalid parameter")||o.includes("unsupported")&&a}shouldFallbackForSpecificReasoningError(e,...n){let o=e instanceof Error?e.message.toLowerCase():String(e).toLowerCase();return n.map(a=>a.toLowerCase()).some(a=>o.includes(a))?o.includes("unknown parameter")||o.includes("invalid parameter")||o.includes("unsupported"):!1}getReasoningFallbackChain(e){switch(e){case"native-budget":return["native-budget","native-toggle","none"];case"native-effort":return["native-effort","none"];case"native-toggle":return["native-toggle","none"];default:return["none"]}}getContextWindow(){return this.getEffectiveContextWindow()}getEffectiveContextWindow(e){let n=this.getModelDescriptor(e)?.contextWindow;return n!==void 0?n:this.config.contextWindow??2e5}getApiKey(){let e=process.env[this.config.apiKeyEnv];if(!e)throw new Error(`${this.config.apiKeyEnv} not set`);return e}shouldLogStreamDiagnostics(){return!!process.env.KODAX_DEBUG_STREAM}logStreamDiagnostic(...e){this.shouldLogStreamDiagnostics()&&console.error(...e)}normalizeReasoning(e){return ke(e)}onStaleConnection(){}isRateLimitError(e){if(!(e instanceof Error))return!1;let n=e.message.toLowerCase();return["rate","limit","\u901F\u7387","\u9891\u7387","1302","429","too many","overload","overwhelmed","503","529","busy"].some(o=>n.includes(o))}classifyRateLimitReason(e){let n=e instanceof Error?e.message.toLowerCase():String(e).toLowerCase();return n.includes("overload")||n.includes("overwhelmed")||n.includes("503")||n.includes("529")||n.includes("busy")?"overloaded":"rate-limit"}extractRetryAfterMs(e){let n=Me(e);if(!n)return;let o=ve(n,{attempt:0,withJitter:!1});return o.type==="header"?o.waitMs:void 0}parseContextOverflow(e){let n=String(e?.message??""),o=[/(\d[\d,]*)\s*tokens?.*?(\d[\d,]*)\s*(?:maximum|limit|context)/i,/maximum.*?(\d[\d,]*)\s*tokens?.*?requested.*?(\d[\d,]*)/i,/exceeds?\s+.*?(\d[\d,]*)\s*.*?(?:limit|max|上限).*?(\d[\d,]*)/i];for(let r of o){let s=n.match(r);if(s){let a=Number(s[1].replace(/,/g,"")),l=Number(s[2].replace(/,/g,"")),c=Math.min(a,l),m=Math.max(a,l);return Math.max(3e3,m-c-1e3)}}}isContextOverflowError(e){let n=String(e?.message??"").toLowerCase();return n.includes("prompt is too long")||n.includes("prompt too long")||n.includes("context length")||n.includes("context_length_exceeded")||n.includes("context window")||n.includes("\u4E0A\u4E0B\u6587\u957F\u5EA6")}async withRateLimit(e,n,o=3,r,s){for(let a=0;a<o;a++)try{let l=await e();return this.maxOutputTokensOverride=void 0,l}catch(l){if(this.isContextOverflowError(l)&&!this.maxOutputTokensOverride){let c=this.parseContextOverflow(l);if(c){this.maxOutputTokensOverride=c,r?.(a+1,o,0);continue}}if(this.isRateLimitError(l)){if(a===o-1)throw new de(`API rate limit exceeded after ${o} retries. Please wait and try again later.`,6e4);let c=Me(l)??{},m=ve(c,{attempt:a,baseBackoffMs:500,maxBackoffMs:32e3,withJitter:!0}),v=m.waitMs,f=this.classifyRateLimitReason(l);if(s?.({provider:this.name,waitMs:v,reason:f,source:m.source,attempt:a+1,maxAttempts:o}),r?r(a+1,o,v):s||console.log(`[Rate Limit] Retrying in ${v/1e3}s (${a+1}/${o})...`),n?.aborted)throw new DOMException("Request aborted","AbortError");if(await new Promise(_=>setTimeout(_,v)),n?.aborted)throw new DOMException("Request aborted","AbortError");continue}if(l instanceof Error){if((l.name==="AbortError"||l.name==="APIUserAbortError")&&n?.aborted)throw l.name==="AbortError"?l:new DOMException(l.message||"Request aborted","AbortError");let c=l?.cause?.code??l?.code??"";throw(c==="ECONNRESET"||c==="EPIPE")&&this.onStaleConnection(),new R(`${this.name} API error: ${l.message}`,this.name)}throw l}throw new H("Unexpected end of withRateLimit")}};import Cn from"@anthropic-ai/sdk";import{parse as xn}from"partial-json";function te(t){if(!t)return{};try{let e=JSON.parse(t);return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}catch{}try{let e=xn(t);return process.env.KODAX_DEBUG_TOOL_STREAM&&console.warn("[Tool Block Salvaged] partial JSON recovered, rawLength=",t.length),e&&typeof e=="object"&&!Array.isArray(e)?e:{}}catch{return{}}}i(te,"parseToolInputWithSalvage");function qe(t,e){let n=t[t.length-1];if(n&&ne(n)&&n.hint===e)return t;let o=e?{type:"cache-boundary",hint:e}:{type:"cache-boundary"};return[...t,o]}i(qe,"insertCacheBoundary");function ne(t){if(typeof t!="object"||t===null||t.type!=="cache-boundary")return!1;let e=Object.keys(t);return e.length<=2&&e.every(n=>n==="type"||n==="hint")}i(ne,"isCacheBoundary");function Ze(t,e){let n=[];for(let o of t){if(ne(o)){if(e==="attach"&&n.length>0){let r=n[n.length-1];n[n.length-1]={...r,cache_control:{type:"ephemeral"}}}continue}n.push(o)}return n}i(Ze,"lowerCacheBoundaries");function ge(t){return t.filter(e=>!ne(e))}i(ge,"stripCacheBoundaries");import{readFile as bn}from"node:fs/promises";import vn from"node:path";var Mn={".gif":"image/gif",".jpeg":"image/jpeg",".jpg":"image/jpeg",".png":"image/png",".webp":"image/webp"};function et(t,e){return e??Mn[vn.extname(t).toLowerCase()]??"image/png"}i(et,"resolveImageMediaType");async function tt(t){return(await bn(t)).toString("base64")}i(tt,"readImageFileAsBase64");async function Nt(t,e){let n=et(t,e),o=await tt(t);return`data:${n};base64,${o}`}i(Nt,"buildImageDataUrl");var Tn="KodaX";function En(t){return t.userAgentMode==="sdk"?void 0:{"User-Agent":Tn}}i(En,"getAnthropicCompatDefaultHeaders");function nt(t,e){if(!t)return e;let n=t.input_tokens!==void 0&&t.input_tokens!==null||t.cache_creation_input_tokens!==void 0&&t.cache_creation_input_tokens!==null||t.cache_read_input_tokens!==void 0&&t.cache_read_input_tokens!==null,o=typeof t.input_tokens=="number"?t.input_tokens:n?0:e?.inputTokens??0,r=typeof t.cache_creation_input_tokens=="number"?t.cache_creation_input_tokens:n?0:e?.cachedWriteTokens??0,s=typeof t.cache_read_input_tokens=="number"?t.cache_read_input_tokens:n?0:e?.cachedReadTokens??0,a=typeof t.output_tokens=="number"?t.output_tokens:e?.outputTokens??0,l=n?o+r+s:e?.inputTokens??0;if(![l,a].some(c=>!Number.isFinite(c)||c<0))return{inputTokens:l,outputTokens:a,totalTokens:l+a,cachedReadTokens:s||void 0,cachedWriteTokens:r||void 0}}i(nt,"normalizeAnthropicUsage");var K=class extends G{static{i(this,"KodaXAnthropicCompatProvider")}supportsThinking=!0;client;initClient(){let e=En(this.config);this.client=new Cn({apiKey:this.getApiKey(),baseURL:this.config.baseUrl,...e?{defaultHeaders:e}:{}})}onStaleConnection(){this.initClient()}applyCacheControlToSystem(e){if(!e.trim()||process.env.KODAX_DISABLE_PROMPT_CACHE==="1")return e;let n=qe([{type:"text",text:e}],"system");return Ze(n,"attach")}applyCacheControlToTools(e){if(e.length===0||process.env.KODAX_DISABLE_PROMPT_CACHE==="1")return e;let n=e.slice(),o=n[n.length-1];return n[n.length-1]={...o,cache_control:{type:"ephemeral"}},n}async stream(e,n,o,r,s,a){return this.withRateLimit(async()=>{let l=this.normalizeReasoning(r),c=s?.modelOverride??this.config.model,m=this.getEffectiveMaxOutputTokens(c),v=await this.convertMessages(e),f=l.enabled?this.getReasoningCapability(c):"none",_=l.enabled?this.getReasoningFallbackChain(f).filter(k=>k==="native-budget"||k==="native-toggle"||k==="none"):["none"],M=i(k=>{let P={model:c,max_tokens:m,system:this.applyCacheControlToSystem(this.buildSystemPrompt(o,e)),messages:v,tools:this.applyCacheControlToTools(n),stream:!0};if(k==="native-budget"){let S=q(this.config,l.depth,l.taskType);P.thinking={type:"enabled",budget_tokens:Z(S,m)}}else k==="native-toggle"&&(P.thinking={type:"enabled"});return P},"buildRequest");if(a?.aborted)throw new DOMException("Request aborted","AbortError");let x=[],u=[],y=[],g,b=null,p="",d="",T="",w="",W="",O="",$="",E=!1,j,A=Date.now(),_e=Date.now(),le,ue;for(let k of _)try{le=await this.client.messages.create(M(k),a?{signal:a}:{}),k!==f&&this.persistReasoningCapabilityOverride(k,c);break}catch(P){ue=P;let S=k==="native-budget"?["budget_tokens","thinking"]:k==="native-toggle"?["thinking"]:[];if(!this.shouldFallbackForReasoningError(P,...S))throw P}if(!le)throw ue??new R("All reasoning capability attempts failed without a captured error",this.name);let pe=Date.now(),C=0,I=0,D=3e4;for await(let k of le){if(a?.aborted)throw new DOMException("Request aborted","AbortError");let P=Date.now(),S=P-pe;if(S>D&&(C++,I+=S,this.logStreamDiagnostic(`[Stream] stall detected: ${Math.round(S/1e3)}s gap before ${k.type}`,{stallCount:C,totalStallMs:I,eventType:k.type})),pe=P,k.type==="content_block_start"||k.type==="content_block_stop"?s?.onHeartbeat?.(!0):s?.onHeartbeat?.(),k.type==="content_block_start"){A=Date.now();let h=k.content_block;b=h.type,process.env.KODAX_DEBUG_TOOL_STREAM&&h.type==="tool_use"&&console.error("[ToolStream] content_block_start:",{type:h.type,id:h.id,name:h.name}),h.type==="thinking"?(d="",T=h.signature??""):h.type==="redacted_thinking"?(b="redacted_thinking",w=h.data??""):h.type==="text"?p="":h.type==="tool_use"&&(W=h.id,O=h.name,$="")}else if(k.type==="content_block_delta"){A=Date.now();let h=k.delta;h.type==="thinking_delta"?(d+=h.thinking??"",s?.onThinkingDelta?.(h.thinking??"")):h.type==="text_delta"?(p+=h.text??"",s?.onTextDelta?.(h.text??"")):h.type==="input_json_delta"&&($+=h.partial_json??"",s?.onToolInputDelta?.(O,h.partial_json??"",W?{toolId:W}:void 0))}else if(k.type==="content_block_stop")A=Date.now(),b==="thinking"?d&&(y.push({type:"thinking",thinking:d,signature:T}),s?.onThinkingEnd?.(d)):b==="redacted_thinking"?(w&&y.push({type:"redacted_thinking",data:w}),w=""):b==="text"?p&&x.push({type:"text",text:p}):b==="tool_use"&&(!W||!O?console.error("[Tool Block Invalid] Missing tool id or name:",{id:JSON.stringify(W),name:JSON.stringify(O),input:$.slice(0,100)}):u.push({type:"tool_use",id:W,name:O,input:te($)})),b=null;else if(k.type==="message_stop"){if(E=!0,A=Date.now(),process.env.KODAX_DEBUG_STREAM){let h=Date.now()-_e;this.logStreamDiagnostic(`[Stream] message_stop received after ${h}ms`)}}else if(k.type==="message_delta"){A=Date.now(),g=nt(k.usage,g);let h=k.delta;h?.stop_reason&&(j=h.stop_reason,process.env.KODAX_DEBUG_STREAM&&this.logStreamDiagnostic(`[Stream] message_delta with stop_reason: ${j}`))}else k.type==="message_start"&&(A=Date.now(),g=nt(k.message?.usage,g),process.env.KODAX_DEBUG_STREAM&&this.logStreamDiagnostic("[Stream] message_start received"))}if(!E){let k=Date.now()-_e,P=Date.now()-A;if(a?.aborted){let h=a.reason instanceof Error?a.reason.message:typeof a.reason=="string"?a.reason:"Request aborted";throw this.logStreamDiagnostic("[Stream] Stream ended after abort before message_stop:",{duration:k,lastEventAge:P,reason:h,textBlocks:x.length,toolBlocks:u.length,thinkingBlocks:y.length}),new DOMException(h,"AbortError")}let S=new Error(`Stream incomplete: message_stop event not received. Duration: ${k}ms, Last event: ${P}ms ago. This may indicate a network disconnection or API timeout.`);throw S.name="StreamIncompleteError",this.logStreamDiagnostic("[Stream] Incomplete stream detected:",{duration:k,lastEventAge:P,textBlocks:x.length,toolBlocks:u.length,thinkingBlocks:y.length}),S}return{textBlocks:x,toolBlocks:u,thinkingBlocks:y,usage:g,stopReason:j}},a,3,s?.onRateLimit,s?.onRetryAfter)}supportsNonStreamingFallback(){return!0}async complete(e,n,o,r,s,a){return this.withRateLimit(async()=>{let l=this.normalizeReasoning(r),c=s?.modelOverride??this.config.model,m=this.getEffectiveMaxOutputTokens(c),v=await this.convertMessages(e),f=l.enabled?this.getReasoningCapability(c):"none",_=l.enabled?this.getReasoningFallbackChain(f).filter(p=>p==="native-budget"||p==="native-toggle"||p==="none"):["none"],M=i(p=>{let d={model:c,max_tokens:m,system:this.applyCacheControlToSystem(this.buildSystemPrompt(o,e)),messages:v,tools:this.applyCacheControlToTools(n)};if(p==="native-budget"){let T=q(this.config,l.depth,l.taskType);d.thinking={type:"enabled",budget_tokens:Z(T,m)}}else p==="native-toggle"&&(d.thinking={type:"enabled"});return d},"buildRequest"),x,u;for(let p of _)try{x=await this.client.messages.create(M(p),a?{signal:a}:{}),p!==f&&this.persistReasoningCapabilityOverride(p,c);break}catch(d){u=d;let T=p==="native-budget"?["budget_tokens","thinking"]:p==="native-toggle"?["thinking"]:[];if(!this.shouldFallbackForReasoningError(d,...T))throw d}if(!x)throw u??new R("All reasoning capability attempts failed without a captured error",this.name);let y=[],g=[],b=[];for(let p of x.content)p.type==="text"?(y.push({type:"text",text:p.text}),s?.onTextDelta?.(p.text)):p.type==="thinking"?(b.push({type:"thinking",thinking:p.thinking,signature:p.signature??""}),s?.onThinkingDelta?.(p.thinking),s?.onThinkingEnd?.(p.thinking)):p.type==="redacted_thinking"?b.push({type:"redacted_thinking",data:p.data}):p.type==="tool_use"&&g.push({type:"tool_use",id:p.id,name:p.name,input:typeof p.input=="object"&&p.input!==null?p.input:{}});return{textBlocks:y,toolBlocks:g,thinkingBlocks:b,usage:nt(x.usage),stopReason:x.stop_reason??void 0}},a,3,s?.onRateLimit,s?.onRetryAfter)}serializeSystemMessageContent(e){if(typeof e=="string")return e.trim();for(let n of e)if(ne(n))throw new R("cache-boundary marker reached system message serialization unlowered. Provider base class lowering must run before any wire-level serialization.",this.name);return e.filter(n=>n.type==="text").map(n=>n.text.trim()).filter(Boolean).join(`
3
- `)}buildSystemPrompt(e,n){let o=n.filter(r=>r.role==="system").map(r=>this.serializeSystemMessageContent(r.content)).filter(Boolean);return[e,...o].filter(r=>typeof r=="string"&&r.trim().length>0).join(`
4
-
5
- `)}async convertMessages(e){let n=[];for(let o of e.filter(r=>r.role!=="system")){let r=o.role==="user"?"user":"assistant";if(typeof o.content=="string"){n.push({role:r,content:o.content});continue}let s=[],a=[];for(let c of o.content)c.type==="thinking"?!this.config.strictThinkingSignature||typeof c.signature=="string"&&c.signature.length>0?s.push({type:"thinking",thinking:c.thinking,signature:c.signature??""}):c.thinking&&a.push(c.thinking):c.type==="redacted_thinking"&&(this.config.strictThinkingSignature||s.push({type:"redacted_thinking",data:c.data}));a.length>0&&o.role==="assistant"&&s.push({type:"text",text:`<prior_reasoning>
6
- ${a.join(`
7
-
8
- `)}
9
- </prior_reasoning>`});for(let c of o.content)c.type==="tool_result"&&o.role==="user"&&s.push({type:"tool_result",tool_use_id:c.tool_use_id,content:c.content,...c.is_error===!0?{is_error:!0}:{}});for(let c of o.content)c.type==="tool_use"&&o.role==="assistant"&&s.push({type:"tool_use",id:c.id,name:c.name,input:c.input});for(let c of o.content)c.type==="text"?s.push({type:"text",text:c.text}):c.type==="image"&&o.role==="user"&&s.push({type:"image",source:{type:"base64",media_type:et(c.path,c.mediaType),data:await tt(c.path)}});if(r==="assistant"&&this.config.supportsThinking&&!this.config.strictThinkingSignature){let c=s.some(v=>v.type==="tool_use"),m=s.some(v=>v.type==="thinking"||v.type==="redacted_thinking");c&&!m&&s.unshift({type:"thinking",thinking:"...",signature:""})}let l=s.length===0||r==="assistant"&&s.every(c=>{let m=c;return m.type==="thinking"&&!m.thinking||m.type==="text"&&!m.text});n.push({role:o.role,content:l?[{type:"text",text:"..."}]:s})}return n}};import Pn from"openai";var wn="KodaX";function Rn(t){return t.userAgentMode==="sdk"?void 0:{"User-Agent":wn}}i(Rn,"getOpenAICompatDefaultHeaders");function Bt(t){if(!t)return;let e=typeof t.prompt_tokens=="number"?t.prompt_tokens:0,n=typeof t.completion_tokens=="number"?t.completion_tokens:0,o=typeof t.total_tokens=="number"?t.total_tokens:e+n;if([e,n,o].some(s=>!Number.isFinite(s)||s<0)||o<e||o<n)return;let r=typeof t.prompt_tokens_details?.cached_tokens=="number"&&t.prompt_tokens_details.cached_tokens>=0?t.prompt_tokens_details.cached_tokens:typeof t.prompt_cache_hit_tokens=="number"&&t.prompt_cache_hit_tokens>=0?t.prompt_cache_hit_tokens:void 0;return{inputTokens:e,outputTokens:n,totalTokens:o,...r!==void 0?{cachedReadTokens:r}:{}}}i(Bt,"normalizeOpenAIUsage");function An(t){return t?t.type==="function"&&"function"in t:!1}i(An,"isOpenAIFunctionToolCall");function Sn(t){return typeof t=="string"?t:Array.isArray(t)?t.map(e=>{if(!e||typeof e!="object")return"";let n=Reflect.get(e,"text");if(typeof n=="string")return n;if(n&&typeof n=="object"){let o=Reflect.get(n,"value");return typeof o=="string"?o:""}return""}).filter(Boolean).join(""):""}i(Sn,"extractOpenAIMessageText");function On(t){if(!t||typeof t!="object")return"";let e=Reflect.get(t,"reasoning_content");return typeof e=="string"?e:Array.isArray(e)?e.map(n=>typeof n=="string"?n:n&&typeof n=="object"&&"text"in n&&typeof n.text=="string"?n.text:"").join(""):""}i(On,"extractOpenAIMessageReasoning");var N=class extends G{static{i(this,"KodaXOpenAICompatProvider")}supportsThinking=!0;client;initClient(){let e=Rn(this.config);this.client=new Pn({apiKey:this.getApiKey(),baseURL:this.config.baseUrl,...e?{defaultHeaders:e}:{}})}onStaleConnection(){this.initClient()}stripCacheBoundariesFromMessages(e){return e.map(n=>{if(typeof n.content=="string")return n;let o=ge(n.content);return o.length===n.content.length?n:{...n,content:o}})}normalizeSystemForWire(e,n){let o=[];e&&e.trim().length>0&&o.push(e);let r=[];for(let s of n){if(s.role!=="system"){r.push(s);continue}let a=typeof s.content=="string"?s.content:Array.isArray(s.content)?s.content.filter(l=>typeof l=="object"&&l!==null&&l.type==="text"&&typeof l.text=="string").map(l=>l.text).join(`
10
- `):"";a.trim().length>0&&o.push(a)}return{system:o.join(`
11
-
12
- `),rest:r}}appendExtraBody(e,n){let o=typeof e.extra_body=="object"&&e.extra_body!==null?e.extra_body:{};e.extra_body={...o,...n}}resetReasoningCapabilityParams(e){delete e.reasoning_effort,delete e.thinking;let n=typeof e.extra_body=="object"&&e.extra_body!==null?{...e.extra_body}:void 0;if(n){if(delete n.enable_thinking,delete n.thinking_budget,delete n.thinking,Object.keys(n).length===0){delete e.extra_body;return}e.extra_body=n}}applyReasoningCapability(e,n,o){let r=e,s=this.getEffectiveMaxOutputTokens(e.model),a=Z(q(this.config,o.depth,o.taskType),s);switch(n){case"native-effort":{let l=je(o.depth);l&&(r.reasoning_effort=l);break}case"native-budget":{this.name==="qwen"?this.appendExtraBody(r,{enable_thinking:!0,thinking_budget:a}):this.name==="zhipu"&&(r.thinking={type:"enabled",budget_tokens:a});break}case"native-toggle":{this.name==="qwen"?this.appendExtraBody(r,{enable_thinking:!0}):this.name==="zhipu"&&(r.thinking={type:"enabled"});break}default:break}}getFallbackTerms(e){switch(e){case"native-budget":return["thinking_budget","budget_tokens","thinking"];case"native-effort":return["reasoning_effort"];case"native-toggle":return["enable_thinking","thinking"];default:return[]}}async stream(e,n,o,r,s,a){return this.withRateLimit(async()=>{let l=this.stripCacheBoundariesFromMessages(e),{system:c,rest:m}=this.normalizeSystemForWire(o,l),v=[{role:"system",content:c},...await this.convertMessages(m)],f=n.map(C=>({type:"function",function:{name:C.name,description:C.description,parameters:C.input_schema}}));if(a?.aborted)throw new DOMException("Request aborted","AbortError");let _=new Map,M="",x="",u,y=!0,g=null,b=Date.now(),p=this.normalizeReasoning(r),d=s?.modelOverride??this.config.model,T=Q(p)?this.getReasoningCapability(d):"none",w=Q(p)?this.getReasoningFallbackChain(T).filter(C=>C==="native-budget"||C==="native-effort"||C==="native-toggle"||C==="none"):["none"],W={model:d,messages:v,tools:f,max_completion_tokens:this.getEffectiveMaxOutputTokens(d),stream:!0},O,$;for(let C of w){for(;!O;){let I={...W};y&&(I.stream_options={include_usage:!0}),this.resetReasoningCapabilityParams(I),this.applyReasoningCapability(I,C,p);try{O=await this.client.chat.completions.create(I,a?{signal:a}:{}),C!==T&&this.persistReasoningCapabilityOverride(C,d)}catch(D){if($=D,y&&this.shouldFallbackForSpecificReasoningError(D,"stream_options","include_usage")){y=!1;continue}if(!this.shouldFallbackForReasoningError(D,...this.getFallbackTerms(C)))throw D;break}}if(O)break}if(!O)throw $??new R("All reasoning capability attempts failed without a captured error",this.name);let E=Date.now(),j=0,A=0,_e=3e4;for await(let C of O){if(a?.aborted)throw new DOMException("Request aborted","AbortError");let I=Date.now(),D=I-E;D>_e&&(j++,A+=D,this.logStreamDiagnostic(`[Stream] stall detected: ${Math.round(D/1e3)}s gap`,{stallCount:j,totalStallMs:A})),E=I,s?.onHeartbeat?.(),u=Bt(C.usage)??u;let k=C.choices[0],P=k?.delta;if(k?.finish_reason&&(g=k.finish_reason,process.env.KODAX_DEBUG_STREAM)){let h=Date.now()-b;this.logStreamDiagnostic(`[Stream] finish_reason: ${g} after ${h}ms`)}P?.content&&(M+=P.content,s?.onTextDelta?.(P.content));let S=this.extractReasoningDelta(P);if(S&&(x+=S,s?.onThinkingDelta?.(S)),P?.tool_calls)for(let h of P.tool_calls){let Y=_.get(h.index)??{id:"",name:"",arguments:""};h.id&&(Y.id=h.id),h.function?.name&&(Y.name=h.function.name),h.function?.arguments&&(Y.arguments+=h.function.arguments,s?.onToolInputDelta?.(Y.name,h.function.arguments,Y.id?{toolId:Y.id}:void 0)),_.set(h.index,Y)}}if(!g){let C=Date.now()-b;if(a?.aborted){let D=a.reason instanceof Error?a.reason.message:typeof a.reason=="string"?a.reason:"Request aborted";throw this.logStreamDiagnostic("[Stream] Stream ended after abort before finish_reason:",{duration:C,reason:D,textContentLength:M.length,toolCallsCount:_.size}),new DOMException(D,"AbortError")}let I=new Error(`Stream incomplete: finish_reason not received. Duration: ${C}ms. This may indicate a network disconnection or API timeout.`);throw I.name="StreamIncompleteError",this.logStreamDiagnostic("[Stream] Incomplete stream detected:",{duration:C,textContentLength:M.length,toolCallsCount:_.size}),I}let le=M?[{type:"text",text:M}]:[],ue=[],pe=[];x&&(pe.push({type:"thinking",thinking:x}),s?.onThinkingEnd?.(x));for(let[,C]of _)C.id&&C.name&&ue.push({type:"tool_use",id:C.id,name:C.name,input:te(C.arguments)});return{textBlocks:le,toolBlocks:ue,thinkingBlocks:pe,usage:u,stopReason:g??void 0}},a,3,s?.onRateLimit,s?.onRetryAfter)}supportsNonStreamingFallback(){return!0}async complete(e,n,o,r,s,a){return this.withRateLimit(async()=>{let l=this.stripCacheBoundariesFromMessages(e),{system:c,rest:m}=this.normalizeSystemForWire(o,l),v=[{role:"system",content:c},...await this.convertMessages(m)],f=n.map(E=>({type:"function",function:{name:E.name,description:E.description,parameters:E.input_schema}})),_=this.normalizeReasoning(r),M=s?.modelOverride??this.config.model,x=Q(_)?this.getReasoningCapability(M):"none",u=Q(_)?this.getReasoningFallbackChain(x).filter(E=>E==="native-budget"||E==="native-effort"||E==="native-toggle"||E==="none"):["none"],y={model:M,messages:v,tools:f,max_completion_tokens:this.getEffectiveMaxOutputTokens(M)},g,b;for(let E of u){let j={...y};this.resetReasoningCapabilityParams(j),this.applyReasoningCapability(j,E,_);try{g=await this.client.chat.completions.create(j,a?{signal:a}:{}),E!==x&&this.persistReasoningCapabilityOverride(E,M);break}catch(A){if(b=A,!this.shouldFallbackForReasoningError(A,...this.getFallbackTerms(E)))throw A}}if(!g)throw b??new R("All reasoning capability attempts failed without a captured error",this.name);let p=g.choices[0],d=p?.message,T=Sn(d?.content),w=On(d),W=(d?.tool_calls??[]).filter(An).map(E=>({type:"tool_use",id:E.id,name:E.function.name,input:te(E.function.arguments)}));T&&s?.onTextDelta?.(T);let O=T?[{type:"text",text:T}]:[],$=[];return w&&($.push({type:"thinking",thinking:w}),s?.onThinkingDelta?.(w),s?.onThinkingEnd?.(w)),{textBlocks:O,toolBlocks:W,thinkingBlocks:$,usage:Bt(g.usage),stopReason:p?.finish_reason??void 0}},a,3,s?.onRateLimit,s?.onRetryAfter)}extractReasoningDelta(e){let n=e?.reasoning_content;return typeof n=="string"?n:Array.isArray(n)?n.map(o=>typeof o=="string"?o:typeof o=="object"&&o!==null&&"text"in o&&typeof o.text=="string"?o.text:"").join(""):""}serializeAssistantMessage(e){let n=e.filter(c=>c.type==="text").map(c=>c.text).join(`
13
- `),o=e.filter(c=>c.type==="tool_use").map(c=>({id:c.id,type:"function",function:{name:c.name,arguments:JSON.stringify(c.input??{})}})),r=e.filter(c=>c.type==="thinking"||c.type==="redacted_thinking").map(c=>c.type==="thinking"?c.thinking:"").filter(Boolean).join(`
14
-
15
- `),s=e.some(c=>c.type==="thinking"||c.type==="redacted_thinking");if(!n&&o.length===0&&!s)return[];let a;n?a=n:o.length>0?a=null:a="...";let l={role:"assistant",content:a};return o.length>0&&(l.tool_calls=o),this.config.replayReasoningContent&&(l.reasoning_content=r||""),[l]}async serializeUserMessage(e){let n=[],o=e.filter(a=>a.type==="text").map(a=>a.text).join(`
16
- `),r=e.filter(a=>a.type==="image");for(let a of e)a.type==="tool_result"&&n.push({role:"tool",tool_call_id:a.tool_use_id,content:a.content});if(r.length===0)return o&&n.push({role:"user",content:o}),n;let s=[];o&&s.push({type:"text",text:o});for(let a of r)s.push({type:"image_url",image_url:{url:await Nt(a.path,a.mediaType)}});return n.push({role:"user",content:s}),n}serializeSystemMessage(e){if(typeof e=="string")return[{role:"system",content:e}];let n=e.filter(o=>o.type==="text").map(o=>o.text).join(`
17
- `);return n?[{role:"system",content:n}]:[]}async convertMessages(e){let n=[];for(let o of e){if(o.role==="system"){n.push(...this.serializeSystemMessage(o.content));continue}if(typeof o.content=="string"){n.push({role:o.role,content:o.content});continue}if(o.role==="assistant"){n.push(...this.serializeAssistantMessage(o.content));continue}n.push(...await this.serializeUserMessage(o.content))}return n}};import{spawn as In}from"node:child_process";import{Readable as Dn,Writable as Kn}from"node:stream";import ot from"node:process";import{ClientSideConnection as Ln,PROTOCOL_VERSION as Nn,ndJsonStream as Bn}from"@agentclientprotocol/sdk";var Te=class{static{i(this,"AcpClient")}client=null;agentProcess=null;options;constructor(e){this.options=e}async connect(){let e,n;if(this.options.inputStream&&this.options.outputStream)e=this.options.inputStream,n=this.options.outputStream;else if(this.options.command){let s=ot.platform==="win32"&&!this.options.command.endsWith(".cmd")?`${this.options.command}.cmd`:this.options.command;if(this.agentProcess=In(s,this.options.args??[],{cwd:this.options.cwd??ot.cwd(),stdio:["pipe","pipe","inherit"]}),!this.agentProcess.stdin||!this.agentProcess.stdout)throw new Error("Failed to create ACP stdio pipes");n=Kn.toWeb(this.agentProcess.stdin),e=Dn.toWeb(this.agentProcess.stdout)}else throw new Error("AcpClient requires either a command or I/O streams");let o=Bn(n,e);this.client=new Ln(()=>({sessionUpdate:i(async r=>{this.options.onSessionUpdate?.(r)},"sessionUpdate"),requestPermission:i(async r=>{let s=r.options??[],a=s.find(l=>l.kind==="allow_once"||l.kind==="allow_always")??s[0];return a?{outcome:{outcome:"selected",optionId:a.optionId}}:{outcome:{outcome:"cancelled"}}},"requestPermission")}),o),await this.client.initialize({protocolVersion:Nn,clientCapabilities:{},clientInfo:{name:"kodax-ai-acp-client",version:"1.0.0"}})}async createNewSession(){if(!this.client)throw new Error("Client not connected");return(await this.client.newSession({cwd:this.options.cwd??ot.cwd(),mcpServers:[]})).sessionId}async prompt(e,n,o,r){if(!this.client)throw new Error("Client not connected");let s={sessionId:n,prompt:[{type:"text",text:e}]};r?.model&&(s.model=r.model);let a=this.client.prompt(s);if(o){let l=i(()=>{this.client?.cancel({sessionId:n}).catch(()=>{})},"onAbort");o.addEventListener("abort",l),a=a.finally(()=>{o.removeEventListener("abort",l)})}return await a}disconnect(){this.agentProcess?.kill(),this.options.abort?.();try{this.client?.close?.()}catch{}this.client=null}};function Fn(t){if(!t||typeof t!="object")return;let e=t,n=typeof e.inputTokens=="number"?e.inputTokens:0,o=typeof e.outputTokens=="number"?e.outputTokens:0,r=typeof e.totalTokens=="number"?e.totalTokens:n+o;if(![n,o,r].some(s=>!Number.isFinite(s)||s<0)&&!(r<n||r<o))return{inputTokens:n,outputTokens:o,totalTokens:r,cachedReadTokens:typeof e.cachedReadTokens=="number"?e.cachedReadTokens:void 0,cachedWriteTokens:typeof e.cachedWriteTokens=="number"?e.cachedWriteTokens:void 0,thoughtTokens:typeof e.thoughtTokens=="number"?e.thoughtTokens:void 0}}i(Fn,"normalizeAcpUsage");var oe=class extends G{static{i(this,"KodaXAcpProvider")}_client=null;_sessionMap=new Map;_activeStreams=new Map;isConfigured(){return!0}getCapabilityProfile(){return F(fe)}serializeImageBlockToPromptToken(e){return null}stripCacheBoundariesFromMessages(e){return e.map(n=>{if(typeof n.content=="string")return n;let o=ge(n.content);return o.length===n.content.length?n:{...n,content:o}})}async stream(e,n,o,r,s,a){if(e=this.stripCacheBoundariesFromMessages(e),this.acpClientOptions.executor&&typeof this.acpClientOptions.executor.isInstalled=="function"&&!await this.acpClientOptions.executor.isInstalled())throw new Error(`${this.name} requires a local CLI environment, but the CLI was not found or is not configured correctly.`);let l=[],c=[],m=e[e.length-1],v="";if(m&&typeof m.content=="string")v=m.content;else if(m&&Array.isArray(m.content)){let y=[];for(let g of m.content)if(g.type==="text")y.push(g.text);else if(g.type==="image"){let b=this.serializeImageBlockToPromptToken(g);b&&y.push(b)}v=y.join(`
18
- `)}let f={...this.acpClientOptions,onSessionUpdate:i(y=>{let g=y.update,b=y.sessionId;if(!("sessionUpdate"in g))return;let p=b?this._activeStreams.get(b):void 0;if(p)switch(g.sessionUpdate){case"agent_message_chunk":if(g.content?.type==="text"){let d=g.content.text;p.output.text+=d,p.streamOptions?.onTextDelta?.(d)}break;case"tool_call":{let d="{}",T=g.arguments??g.parameters;T&&(d=typeof T=="string"?T:JSON.stringify(T)),p.streamOptions?.onToolInputDelta?.(g.title,d);let w=`
19
- > [Tool Use] ${g.title}: ${d}
20
- `;p.output.text+=w,p.streamOptions?.onTextDelta?.(w);break}case"tool_call_update":if(g.status){let d=`> [Tool Result] ${g.status}
21
-
22
- `;p.output.text+=d,p.streamOptions?.onTextDelta?.(d)}break}},"onSessionUpdate")},_=s?.sessionId??"default";this._client||(this._client=new Te(f),await this._client.connect());let M=this._sessionMap.get(_);M||(M=await this._client.createNewSession(),this._sessionMap.set(_,M));let x={text:""};this._activeStreams.set(M,{streamOptions:s,output:x});let u;try{u=await this._client.prompt(v,M,a,{model:s?.modelOverride})}catch(y){if(!(y instanceof Error&&y.name==="AbortError"))throw y}finally{this._activeStreams.delete(M)}return x.text&&l.push({type:"text",text:x.text}),{textBlocks:l,toolBlocks:c,thinkingBlocks:[],usage:Fn(u?.usage)}}disconnect(){this._client&&(this._client.disconnect(),this._client=null),this._activeStreams.clear(),this._sessionMap.clear()}};import{spawn as Un}from"node:child_process";import it from"node:process";var ie=class{static{i(this,"CLIExecutor")}config;_installedCache=null;constructor(e){this.config=e}async isInstalled(){return this._installedCache!==null?this._installedCache:(this._installedCache=await this.checkInstalled(),this._installedCache)}async*execute(e){let n=this.buildArgs(e),o={...it.env,...this.config.env},s=it.platform==="win32"&&!this.config.command.endsWith(".cmd")?`${this.config.command}.cmd`:this.config.command,a=Un(s,n,{cwd:this.config.cwd??it.cwd(),env:o,stdio:["ignore","pipe","pipe"]}),l="";a.stderr?.on("data",v=>{l+=v.toString()});let c=!1,m=i(()=>{c||a.kill("SIGTERM")},"abortHandler");e.signal?.addEventListener("abort",m),a.on("exit",()=>{c=!0});try{yield*this.parseOutputStream(a.stdout,e.signal),l.trim()&&console.error(`[CLIExecutor] stderr: ${l.trim()}`)}finally{e.signal?.removeEventListener("abort",m),c||a.kill()}}async*parseOutputStream(e,n){let o="";for await(let r of e){if(n?.aborted)break;o+=r.toString();let s=o.split(`
23
- `);o=s.pop()??"";for(let a of s){if(!a.trim())continue;let l=this.parseLine(a.trim());l&&(yield l)}}if(o.trim()&&!n?.aborted){let r=this.parseLine(o.trim());r&&(yield r)}}};import{spawn as Xn}from"node:child_process";import Wn from"node:process";async function Ee(t){try{let e=Wn.platform==="win32",n=Xn(e?`${t}.cmd`:t,["--version"]);return await new Promise(o=>{n.on("close",r=>o(r===0)),n.on("error",()=>o(!1))})}catch{return!1}}i(Ee,"checkCliCommandInstalled");var Pe=class extends ie{static{i(this,"GeminiCLIExecutor")}model;constructor(e){super({command:"gemini",baseArgs:["--output-format","stream-json","--approval-mode","yolo"],timeout:3e5,...e}),this.model=e?.model??"gemini-2.5-pro"}async checkInstalled(){return Ee("gemini")}buildArgs(e){let n=["-m",e.model??this.model];return e.sessionId?(n.push("-r",e.sessionId),n.push(e.prompt)):n.push("-p",e.prompt),[...n,...this.config.baseArgs]}parseLine(e){if(!e.startsWith("{"))return null;try{let n=JSON.parse(e);return this.convertEvent(n)}catch{return null}}convertEvent(e){let n=e.timestamp?Date.parse(e.timestamp):Date.now();switch(e.type){case"init":return{type:"session_start",timestamp:n,sessionId:e.session_id??"",model:e.model??this.model,raw:e};case"message":return{type:"message",timestamp:n,role:e.role,content:e.content??"",delta:e.delta,raw:e};case"tool_use":return{type:"tool_use",timestamp:n,toolId:e.tool_id??"",toolName:e.tool_name??"",parameters:e.parameters??{},raw:e};case"tool_result":return{type:"tool_result",timestamp:n,toolId:e.tool_id??"",status:e.status==="success"?"success":"error",output:e.output??"",raw:e};case"error":return{type:"error",timestamp:n,errorType:"error",message:e.message??"Unknown error",raw:e};case"result":return{type:"complete",timestamp:n,status:e.status==="success"?"success":"failed",usage:e.stats?{inputTokens:e.stats.input_tokens??0,outputTokens:e.stats.output_tokens??0,totalTokens:e.stats.total_tokens??0}:void 0,raw:e};default:return null}}};import{TransformStream as Ft}from"node:stream/web";import{randomUUID as rt}from"node:crypto";function we(t){let e=new Ft,n=new Ft,o=e.readable.getReader(),r=n.writable.getWriter(),s=new TextDecoder,a=new TextEncoder,l="",c=rt(),m=new AbortController,v=new Map;(async()=>{try{for(;;){let{done:u,value:y}=await o.read();if(u)break;l+=s.decode(y,{stream:!0});let g=l.split(`
24
- `);l=g.pop()??"";for(let b of g)if(b.trim())try{let p=JSON.parse(b);_(p).catch(d=>{console.error("[PseudoAcpServer] Failed to handle request:",d)})}catch{console.error("[PseudoAcpServer] Failed to parse message:",b)}}}catch(u){console.error("[PseudoAcpServer] Stream read error:",u)}})();let f=i(async u=>{let y=JSON.stringify(u)+`
25
- `;await r.write(a.encode(y))},"sendMsg");async function _(u){if(u.method==="initialize")await f({jsonrpc:"2.0",id:u.id,result:{protocolVersion:u.params.protocolVersion,serverInfo:{name:"pseudo-acp-server",version:"1.0.0"},serverCapabilities:{}}});else if(u.method==="session/new"||u.method==="sessions/new")c=u.params?.sessionId??rt(),await f({jsonrpc:"2.0",id:u.id,result:{sessionId:c}});else if(u.method==="session/prompt"||u.method==="chat/prompt"){let y=new AbortController,g=u.params.sessionId;v.set(g,y);let b=i(()=>y.abort(),"onGlobalAbort");m.signal.addEventListener("abort",b);let d=await M(g,u.params.prompt,typeof u.params.model=="string"?u.params.model:void 0,y.signal).finally(()=>{v.delete(g),m.signal.removeEventListener("abort",b)});await f({jsonrpc:"2.0",id:u.id,result:d.usage?{stopReason:d.stopReason,usage:d.usage}:{stopReason:d.stopReason}})}else if(u.method==="session/cancel"||u.method==="chat/cancel"){let y=v.get(u.params.sessionId);y&&y.abort(),u.id!==void 0&&await f({jsonrpc:"2.0",id:u.id,result:{}})}else u.id!==void 0&&await f({jsonrpc:"2.0",id:u.id,result:{}})}i(_,"handleRequest");let M=i(async(u,y,g,b)=>{let p=y.find(d=>d.type==="text")?.text??"";try{let d=t.execute({prompt:p,model:g,sessionId:u==="default"?void 0:u,signal:b});for await(let T of d){let w=x(T);if(w&&await f({jsonrpc:"2.0",method:"session/update",params:{sessionId:u,update:w}}),T.type==="complete")return{stopReason:b.aborted?"cancelled":"end_turn",usage:T.usage}}return{stopReason:b.aborted?"cancelled":"end_turn"}}catch(d){return b.aborted||d instanceof Error&&d.name==="AbortError"?{stopReason:"cancelled"}:(console.error("[PseudoAcpServer] Error executing prompt:",d),await f({jsonrpc:"2.0",method:"session/update",params:{sessionId:u,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:`
26
- [Fatal Error: ${d}]
27
- `}}}}),{stopReason:"end_turn"})}},"executePrompt"),x=i(u=>{switch(u.type){case"message":if(u.role==="assistant"&&u.content)return{sessionUpdate:"agent_message_chunk",content:{type:"text",text:u.content}};break;case"tool_use":return{sessionUpdate:"tool_call",title:u.toolName,arguments:u.parameters,status:"running",toolCallId:u.toolId||rt()};case"tool_result":return{sessionUpdate:"tool_call_update",toolCallId:u.toolId,status:u.status};case"error":return{sessionUpdate:"agent_message_chunk",content:{type:"text",text:`
28
- [Error: ${u.message}]
29
- `}};case"complete":break}return null},"mapToAcpNotification");return{inputStream:n.readable,outputStream:e.writable,abort:i(()=>{m.abort(),e.readable.cancel().catch(()=>{}),n.writable.abort().catch(()=>{})},"abort"),executor:t}}i(we,"createPseudoAcpServer");import Ut from"node:fs";import Xt from"node:os";import Wt from"node:path";var $n="gpt-5.4",jn="auto-gemini-3",Gn=["gpt-5.4","gpt-5.3-codex","gpt-5.3-codex-spark"],zn=["auto-gemini-3","gemini-3.1-pro-preview","gemini-3-flash-preview","gemini-2.5-pro","gemini-2.5-flash"];function $t(t){let e=new Set,n=[];for(let o of t){let r=o.trim();if(!r)continue;let s=r.toLowerCase();e.has(s)||(e.add(s),n.push(r))}return n}i($t,"dedupePreserveOrder");function Hn(){let t=Wt.join(Xt.homedir(),".codex","config.toml");try{return Ut.readFileSync(t,"utf8").match(/^\s*model\s*=\s*"([^"]+)"/m)?.[1]?.trim()||null}catch{return null}}i(Hn,"readCodexConfiguredModel");function Vn(){let t=Wt.join(Xt.homedir(),".gemini","settings.json");try{let e=JSON.parse(Ut.readFileSync(t,"utf8")),n=typeof e.model=="string"?e.model.trim():"";return n||(typeof e.general?.model=="string"?e.general.model.trim():"")||null}catch{return null}}i(Vn,"readGeminiConfiguredModel");function re(){return Hn()||$n}i(re,"getCodexCliDefaultModel");function se(){return Vn()||jn}i(se,"getGeminiCliDefaultModel");function he(){return $t([re(),...Gn])}i(he,"getCodexCliKnownModels");function ye(){return $t([se(),...zn])}i(ye,"getGeminiCliKnownModels");var st=se(),Yn=ye(),Jn={transport:"cli-bridge",conversationSemantics:"last-user-message",mcpSupport:"none",contextFidelity:"lossy",toolCallingFidelity:"limited",sessionSupport:"stateless",longRunningSupport:"limited",multimodalSupport:"image-input",evidenceSupport:"limited"},Re=class extends oe{static{i(this,"KodaXGeminiCliProvider")}name="gemini-cli";supportsThinking=!1;config={apiKeyEnv:"GEMINI_CLI_API_KEY",model:st,models:Yn.filter(e=>e!==st).map(e=>({id:e,displayName:e})),supportsThinking:!1,reasoningCapability:"prompt-only",contextWindow:1048576};acpClientOptions;constructor(){super();let e=new Pe({model:st});this.acpClientOptions=we(e)}getCapabilityProfile(){return F(Jn)}serializeImageBlockToPromptToken(e){return/\s/.test(e.path)?(console.warn(`[gemini-cli] Image path contains whitespace and cannot be safely passed via @<path> syntax \u2014 dropping image block. Path: ${JSON.stringify(e.path)}`),null):`@${e.path}`}};var Ae=class extends ie{static{i(this,"CodexCLIExecutor")}model;constructor(e){super({command:"codex",baseArgs:["exec","--json","--full-auto"],timeout:3e5,...e}),this.model=e?.model??"gpt-5.4"}async checkInstalled(){return Ee("codex")}buildArgs(e){this.model=e.model??this.model;let n=e.model?["-m",e.model]:[];return e.sessionId?["exec","resume",e.sessionId,...n,e.prompt,...this.config.baseArgs.filter(o=>o!=="exec")]:[...this.config.baseArgs,...n,e.prompt]}parseLine(e){if(!e.startsWith("{"))return null;try{let n=JSON.parse(e);return this.convertEvent(n)}catch{return null}}convertEvent(e){let n=Date.now();switch(e.type){case"thread.started":return{type:"session_start",timestamp:n,sessionId:e.thread_id??"",model:this.model,raw:e};case"item.completed":return e.item?.type==="agent_message"?{type:"message",timestamp:n,role:"assistant",content:e.item.text??"",raw:e}:e.item?.type==="command_execution"?{type:"tool_use",timestamp:n,toolId:e.item.id,toolName:"Bash",parameters:{command:e.item.command},raw:e}:null;case"turn.completed":return{type:"complete",timestamp:n,status:"success",usage:e.usage?{inputTokens:e.usage.input_tokens,outputTokens:e.usage.output_tokens,totalTokens:e.usage.input_tokens+e.usage.output_tokens}:void 0,raw:e};case"error":case"turn.failed":return{type:"error",timestamp:n,errorType:e.type,message:e.message??"Unknown error",raw:e};default:return null}}};var at=re(),Qn=he(),Se=class extends oe{static{i(this,"KodaXCodexCliProvider")}name="codex-cli";supportsThinking=!1;config={apiKeyEnv:"CODEX_CLI_API_KEY",model:at,models:Qn.filter(e=>e!==at).map(e=>({id:e,displayName:e})),supportsThinking:!1,reasoningCapability:"prompt-only",contextWindow:128e3};acpClientOptions;constructor(){super();let e=new Ae({model:at});this.acpClientOptions=we(e)}};import qn from"@anthropic-ai/sdk";var jt=se(),Zn=ye(),Gt=re(),eo=he(),z={anthropic:{apiKeyEnv:"ANTHROPIC_API_KEY",model:"claude-sonnet-4-6",models:["claude-opus-4-6","claude-haiku-4-5"],reasoningCapability:"native-budget",capabilityProfile:L},openai:{apiKeyEnv:"OPENAI_API_KEY",model:"gpt-5.3-codex",models:["gpt-5.4","gpt-5.3-codex-spark"],reasoningCapability:"native-effort",capabilityProfile:L},deepseek:{apiKeyEnv:"DEEPSEEK_API_KEY",model:"deepseek-v4-flash",models:["deepseek-v4-pro"],reasoningCapability:"native-effort",capabilityProfile:L},kimi:{apiKeyEnv:"KIMI_API_KEY",model:"kimi-k2.6",models:["k2.5"],reasoningCapability:"native-effort",capabilityProfile:L},"kimi-code":{apiKeyEnv:"KIMI_API_KEY",model:"kimi-for-coding",reasoningCapability:"native-budget",capabilityProfile:L},qwen:{apiKeyEnv:"QWEN_API_KEY",model:"qwen3.5-plus",reasoningCapability:"native-budget",capabilityProfile:L},zhipu:{apiKeyEnv:"ZHIPU_API_KEY",model:"glm-5",models:["glm-5.1","glm-5-turbo"],reasoningCapability:"native-budget",capabilityProfile:L},"zhipu-coding":{apiKeyEnv:"ZHIPU_API_KEY",model:"glm-5",models:["glm-5.1","glm-5-turbo"],reasoningCapability:"native-budget",capabilityProfile:L},"minimax-coding":{apiKeyEnv:"MINIMAX_API_KEY",model:"MiniMax-M2.7",models:["MiniMax-M2.7-highspeed","MiniMax-M2.5","MiniMax-M2.5-highspeed","MiniMax-M2.1","MiniMax-M2.1-highspeed","MiniMax-M2"],reasoningCapability:"native-budget",capabilityProfile:L},"mimo-coding":{apiKeyEnv:"MIMO_API_KEY",model:"mimo-v2.5-pro",models:["mimo-v2.5"],reasoningCapability:"native-budget",capabilityProfile:L},"ark-coding":{apiKeyEnv:"ARK_API_KEY",model:"glm-5.1",models:["glm-4.7","kimi-k2.6","kimi-k2.5","minimax-latest","deepseek-v3.2","doubao-seed-2.0-code","doubao-seed-2.0-pro","doubao-seed-2.0-lite"],reasoningCapability:"native-budget",capabilityProfile:L},"gemini-cli":{apiKeyEnv:"GEMINI_API_KEY",model:jt,models:Zn.filter(t=>t!==jt),reasoningCapability:"prompt-only",capabilityProfile:Lt},"codex-cli":{apiKeyEnv:"OPENAI_API_KEY",model:Gt,models:eo.filter(t=>t!==Gt),reasoningCapability:"prompt-only",capabilityProfile:fe}};function X(t,e){let n=z[t];return{apiKeyEnv:n.apiKeyEnv,model:n.model,reasoningCapability:n.reasoningCapability,...e}}i(X,"buildProviderConfig");var ct=class extends K{static{i(this,"AnthropicProvider")}name="anthropic";config=X("anthropic",{models:[{id:"claude-opus-4-6",displayName:"Opus 4.6",thinkingBudgetCap:28e3},{id:"claude-haiku-4-5",displayName:"Haiku 4.5",thinkingBudgetCap:1e4}],supportsThinking:!0,contextWindow:2e5,maxOutputTokens:64e3,thinkingBudgetCap:28e3,strictThinkingSignature:!0});constructor(){super(),this.client=new qn({apiKey:this.getApiKey()})}},lt=class extends K{static{i(this,"ZhipuCodingProvider")}name="zhipu-coding";config=X("zhipu-coding",{baseUrl:"https://open.bigmodel.cn/api/anthropic",models:[{id:"glm-5.1",displayName:"GLM-5.1"},{id:"glm-5-turbo",displayName:"GLM-5 Turbo",contextWindow:128e3}],supportsThinking:!0,contextWindow:2e5,maxOutputTokens:16e3,thinkingBudgetCap:16e3,streamMaxDurationMs:3e5});constructor(){super(),this.initClient()}},ut=class extends K{static{i(this,"KimiCodeProvider")}name="kimi-code";config=X("kimi-code",{baseUrl:"https://api.kimi.com/coding/",supportsThinking:!0,contextWindow:256e3,maxOutputTokens:32e3});constructor(){super(),this.initClient()}},pt=class extends K{static{i(this,"MiniMaxCodingProvider")}name="minimax-coding";config=X("minimax-coding",{baseUrl:"https://api.minimaxi.com/anthropic",models:[{id:"MiniMax-M2.7",displayName:"MiniMax M2.7"},{id:"MiniMax-M2.7-highspeed",displayName:"MiniMax M2.7 Highspeed (higher-tier plan)"},{id:"MiniMax-M2.5",displayName:"MiniMax M2.5"},{id:"MiniMax-M2.5-highspeed",displayName:"MiniMax M2.5 Highspeed (higher-tier plan)"},{id:"MiniMax-M2.1",displayName:"MiniMax M2.1"},{id:"MiniMax-M2.1-highspeed",displayName:"MiniMax M2.1 Highspeed (higher-tier plan)"},{id:"MiniMax-M2",displayName:"MiniMax M2"}],supportsThinking:!0,contextWindow:204800,maxOutputTokens:32e3});constructor(){super(),this.initClient()}},dt=class extends K{static{i(this,"MimoCodingProvider")}name="mimo-coding";config=X("mimo-coding",{baseUrl:"https://token-plan-cn.xiaomimimo.com/anthropic",models:[{id:"mimo-v2.5",displayName:"MiMo V2.5"}],supportsThinking:!0,contextWindow:1e6,maxOutputTokens:32e3,thinkingBudgetCap:16e3});constructor(){super(),this.initClient()}},mt=class extends K{static{i(this,"ArkCodingProvider")}name="ark-coding";config=X("ark-coding",{baseUrl:"https://ark.cn-beijing.volces.com/api/coding",models:[{id:"glm-4.7",displayName:"GLM-4.7"},{id:"kimi-k2.6",displayName:"Kimi K2.6",contextWindow:256e3},{id:"kimi-k2.5",displayName:"Kimi K2.5",contextWindow:256e3},{id:"minimax-latest",displayName:"MiniMax Latest",contextWindow:204800},{id:"deepseek-v3.2",displayName:"DeepSeek V3.2",contextWindow:128e3},{id:"doubao-seed-2.0-code",displayName:"Doubao Seed 2.0 Code",contextWindow:256e3},{id:"doubao-seed-2.0-pro",displayName:"Doubao Seed 2.0 Pro",contextWindow:256e3},{id:"doubao-seed-2.0-lite",displayName:"Doubao Seed 2.0 Lite",contextWindow:256e3}],supportsThinking:!0,contextWindow:2e5,maxOutputTokens:32e3});constructor(){super(),this.initClient()}},ft=class extends N{static{i(this,"OpenAIProvider")}name="openai";config=X("openai",{models:[{id:"gpt-5.4",displayName:"GPT-5.4"},{id:"gpt-5.3-codex-spark",displayName:"GPT-5.3 Codex Spark"}],supportsThinking:!0,contextWindow:4e5,maxOutputTokens:32768});constructor(){super(),this.initClient()}},gt=class extends N{static{i(this,"DeepSeekProvider")}name="deepseek";config=X("deepseek",{baseUrl:"https://api.deepseek.com",models:[{id:"deepseek-v4-pro",displayName:"DeepSeek V4 Pro"}],supportsThinking:!0,contextWindow:1e6,maxOutputTokens:64e3,replayReasoningContent:!0});constructor(){super(),this.initClient()}},ht=class extends N{static{i(this,"KimiProvider")}name="kimi";config=X("kimi",{baseUrl:"https://api.moonshot.cn/v1",models:[{id:"k2.5",displayName:"K2.5"}],supportsThinking:!0,contextWindow:256e3,maxOutputTokens:32768,replayReasoningContent:!0});constructor(){super(),this.initClient()}},yt=class extends N{static{i(this,"QwenProvider")}name="qwen";config=X("qwen",{baseUrl:"https://dashscope.aliyuncs.com/compatible-mode/v1",supportsThinking:!0,contextWindow:256e3,maxOutputTokens:32768,replayReasoningContent:!0});constructor(){super(),this.initClient()}},_t=class extends N{static{i(this,"ZhipuProvider")}name="zhipu";config=X("zhipu",{baseUrl:"https://open.bigmodel.cn/api/paas/v4",models:[{id:"glm-5.1",displayName:"GLM-5.1"},{id:"glm-5-turbo",displayName:"GLM-5 Turbo",contextWindow:128e3}],supportsThinking:!0,contextWindow:2e5,maxOutputTokens:32768,replayReasoningContent:!0});constructor(){super(),this.initClient()}},U={anthropic:i(()=>new ct,"anthropic"),openai:i(()=>new ft,"openai"),deepseek:i(()=>new gt,"deepseek"),kimi:i(()=>new ht,"kimi"),"kimi-code":i(()=>new ut,"kimi-code"),qwen:i(()=>new yt,"qwen"),zhipu:i(()=>new _t,"zhipu"),"zhipu-coding":i(()=>new lt,"zhipu-coding"),"minimax-coding":i(()=>new pt,"minimax-coding"),"mimo-coding":i(()=>new dt,"mimo-coding"),"ark-coding":i(()=>new mt,"ark-coding"),"gemini-cli":i(()=>new Re,"gemini-cli"),"codex-cli":i(()=>new Se,"codex-cli")},kt=process.env.KODAX_PROVIDER??"zhipu-coding",zt=new Map;function to(t){if(B(t))return z[t].apiKeyEnv}i(to,"resolveApiKeyEnvForProvider");function Ht(t){let e=t??kt,n=U[e];if(!n)throw new R(`Unknown provider: ${e}. Available: ${Object.keys(U).join(", ")}`,e);let o=to(e),r=o?process.env[o]:void 0,s=zt.get(e);if(s&&s.apiKey===r)return s.instance;let a=n();return zt.set(e,{apiKey:r,instance:a}),a}i(Ht,"getProvider");function Vt(t){return B(t)?!!process.env[z[t].apiKeyEnv]:!1}i(Vt,"isProviderConfigured");function Yt(t){return B(t)?z[t].model:null}i(Yt,"getProviderModel");function Jt(t,e){if(!B(t))return"unknown";let n=z[t],o=e??n.model;return n.modelReasoningCapabilities?.[o]??n.reasoningCapability}i(Jt,"getProviderConfiguredReasoningCapability");function Qt(t){return B(t)?F(z[t].capabilityProfile):null}i(Qt,"getProviderConfiguredCapabilityProfile");function qt(){let t=[];for(let e of Object.keys(U)){let n=z[e];t.push({name:e,model:n.model,models:n.models?[n.model,...n.models]:[n.model],configured:!!process.env[n.apiKeyEnv],reasoningCapability:n.reasoningCapability,capabilityProfile:F(n.capabilityProfile)})}return t}i(qt,"getProviderList");function Zt(t){let e=z[t];return e?e.models?[e.model,...e.models]:[e.model]:[]}i(Zt,"getProviderModels");function B(t){return t in U}i(B,"isProviderName");var no=new Set(["compat","sdk"]);function vt(t){if(!t.name||!t.baseUrl||!t.apiKeyEnv||!t.model)throw new Error(`Custom provider requires name, baseUrl, apiKeyEnv, and model. Got: ${JSON.stringify({name:t.name,baseUrl:t.baseUrl,apiKeyEnv:t.apiKeyEnv,model:t.model})}`);if(t.protocol!=="anthropic"&&t.protocol!=="openai")throw new Error(`Unknown protocol "${t.protocol}" for custom provider "${t.name}". Must be "anthropic" or "openai".`);if(t.userAgentMode!==void 0&&!no.has(t.userAgentMode))throw new Error(`Unknown userAgentMode "${t.userAgentMode}" for custom provider "${t.name}". Must be "compat" or "sdk".`)}i(vt,"validateCustomProviderConfig");function oo(t){let e=t.models?.length?t.models.map(n=>typeof n=="string"?{id:n}:n):void 0;return{apiKeyEnv:t.apiKeyEnv,model:t.model,baseUrl:t.baseUrl,models:e,userAgentMode:t.userAgentMode,supportsThinking:t.supportsThinking??!1,reasoningCapability:t.reasoningCapability??"none",capabilityProfile:t.capabilityProfile,contextWindow:t.contextWindow,maxOutputTokens:t.maxOutputTokens,thinkingBudgetCap:t.thinkingBudgetCap}}i(oo,"buildProviderConfig");function Oe(t){vt(t);let e=oo(t);return t.protocol==="anthropic"?new xt(t.name,e):new bt(t.name,e)}i(Oe,"createCustomProvider");var xt=class extends K{static{i(this,"DynamicAnthropicProvider")}name;config;constructor(e,n){super(),this.name=e,this.config=n,this.initClient()}},bt=class extends N{static{i(this,"DynamicOpenAIProvider")}name;config;constructor(e,n){super(),this.name=e,this.config=n,this.initClient()}};var ae=new Map,Mt=new Map;function en(t){let e=new Set,n=new Map,o=new Map;for(let r of t){if(vt(r),e.has(r.name))throw new Error(`Duplicate custom provider name: "${r.name}". Each custom provider must have a unique name.`);r.name in U&&console.warn(`[kodax] Custom provider "${r.name}" shadows a built-in provider. The built-in provider will be used. Choose a different name to use your custom provider.`),e.add(r.name),n.set(r.name,r),o.set(r.name,()=>Oe(r))}ae.clear(),Mt.clear();for(let[r,s]of n)ae.set(r,s);for(let[r,s]of o)Mt.set(r,s)}i(en,"registerCustomProviders");function Ie(t){let e=Mt.get(t);return e?e():void 0}i(Ie,"getCustomProvider");function ce(t){return ae.has(t)}i(ce,"isCustomProviderName");function De(){return[...ae.keys()]}i(De,"getCustomProviderNames");function tn(){let t=[];for(let[e,n]of ae){let o=!!process.env[n.apiKeyEnv],r=(n.models??[]).map(a=>typeof a=="string"?a:a.id),s=n.model&&r.length?[...new Set([n.model,...r])]:[n.model];t.push({name:e,model:n.model,models:s,configured:o,reasoningCapability:n.reasoningCapability??"none",capabilityProfile:F(n.capabilityProfile??me),custom:!0})}return t}i(tn,"getCustomProviderList");function nn(t){let e=ae.get(t);if(!e)return;let n=(e.models??[]).map(o=>typeof o=="string"?o:o.id);return e.model&&n.length?[...new Set([e.model,...n])]:[e.model]}i(nn,"getCustomProviderModels");var V=new Map,io=0;function Ct(t){let e=V.get(t);if(!(!e||e.length===0))return e[e.length-1]}i(Ct,"getActiveRuntimeProviderRegistration");function ro(t){for(let[e,n]of V){let o=n.filter(r=>r.id!==t);if(o.length!==n.length){o.length===0?V.delete(e):V.set(e,o);return}}}i(ro,"removeRuntimeProviderRegistration");function on(t,e){let n=t.trim();if(!n)throw new Error("Model provider name cannot be empty.");if(B(n))throw new Error(`Runtime model provider "${n}" conflicts with a built-in provider.`);if(ce(n))throw new Error(`Runtime model provider "${n}" conflicts with an existing config-defined custom provider.`);let o={id:`runtime-provider:${++io}`,name:n,factory:e},r=V.get(n)??[];return V.set(n,[...r,o]),()=>{ro(o.id)}}i(on,"registerModelProvider");function Ke(t){let e=Ct(t);return e?e.factory():void 0}i(Ke,"getRuntimeModelProvider");function Le(t){return Ct(t)!==void 0}i(Le,"isRuntimeModelProviderName");function Ne(){return Array.from(V.keys()).filter(t=>Ct(t)!==void 0)}i(Ne,"getRuntimeModelProviderNames");function rn(){V.clear()}i(rn,"clearRuntimeModelProviders");function sn(t){if(B(t))return U[t]();let e=Ke(t);if(e)return e;let n=Ie(t);if(n)return n;let o=Tt();throw new Error(`Unknown provider: ${t}. Available: ${o.join(", ")}`)}i(sn,"resolveProvider");function an(t){return B(t)||Le(t)||ce(t)}i(an,"isKnownProvider");function Tt(){let t=Object.keys(U),e=Ne(),n=De();return[...new Set([...t,...e,...n])]}i(Tt,"getAvailableProviderNames");var cn={anthropic:{"claude-opus-4-6":{inputPer1M:15,outputPer1M:75,cachePer1M:1.875},"claude-sonnet-4-6":{inputPer1M:3,outputPer1M:15,cachePer1M:.375},"claude-haiku-4-5":{inputPer1M:.8,outputPer1M:4,cachePer1M:.08}},openai:{"gpt-5.4":{inputPer1M:30,outputPer1M:120},"gpt-5.3-codex-spark":{inputPer1M:10,outputPer1M:40}},deepseek:{"deepseek-v4-flash":{inputPer1M:.14,outputPer1M:.28,cachePer1M:.028},"deepseek-v4-pro":{inputPer1M:1.68,outputPer1M:3.36,cachePer1M:.14}},kimi:{"k2.5":{inputPer1M:.005,outputPer1M:.015},"kimi-k2.6":{inputPer1M:.005,outputPer1M:.015}},"kimi-code":{"kimi-for-coding":{inputPer1M:.005,outputPer1M:.015}},qwen:{"qwen3.5-plus":{inputPer1M:.003,outputPer1M:.006}},zhipu:{"glm-5":{inputPer1M:.05,outputPer1M:.1},"glm-5.1":{inputPer1M:.05,outputPer1M:.1},"glm-5-turbo":{inputPer1M:.01,outputPer1M:.03}},"zhipu-coding":{"glm-5":{inputPer1M:.05,outputPer1M:.1},"glm-5.1":{inputPer1M:.05,outputPer1M:.1},"glm-5-turbo":{inputPer1M:.01,outputPer1M:.03}},"minimax-coding":{"MiniMax-M2.7":{inputPer1M:.01,outputPer1M:.03},"MiniMax-M2.7-highspeed":{inputPer1M:.01,outputPer1M:.03},"MiniMax-M2.5":{inputPer1M:.01,outputPer1M:.03},"MiniMax-M2.5-highspeed":{inputPer1M:.01,outputPer1M:.03},"MiniMax-M2.1":{inputPer1M:.01,outputPer1M:.03},"MiniMax-M2.1-highspeed":{inputPer1M:.01,outputPer1M:.03},"MiniMax-M2":{inputPer1M:.01,outputPer1M:.03}},"mimo-coding":{"mimo-v2.5-pro":{inputPer1M:.01,outputPer1M:.03},"mimo-v2.5":{inputPer1M:.01,outputPer1M:.03}},"ark-coding":{"glm-5.1":{inputPer1M:.005,outputPer1M:.015},"glm-4.7":{inputPer1M:.005,outputPer1M:.015},"kimi-k2.6":{inputPer1M:.005,outputPer1M:.015},"kimi-k2.5":{inputPer1M:.005,outputPer1M:.015},"minimax-latest":{inputPer1M:.005,outputPer1M:.015},"deepseek-v3.2":{inputPer1M:.005,outputPer1M:.015},"doubao-seed-2.0-code":{inputPer1M:.005,outputPer1M:.015},"doubao-seed-2.0-pro":{inputPer1M:.005,outputPer1M:.015},"doubao-seed-2.0-lite":{inputPer1M:.005,outputPer1M:.015}},"gemini-cli":{},"codex-cli":{}};function Et(t,e,n){let o=n?.[t]?.[e];return o||cn[t]?.[e]}i(Et,"getCostRate");function Pt(t,e,n,o=0){let r=e/1e6*t.inputPer1M,s=n/1e6*t.outputPer1M,a=t.cachePer1M?o/1e6*t.cachePer1M:0;return r+s+a}i(Pt,"calculateCost");function so(){return{records:[],retries:[]}}i(so,"createCostTracker");function ao(t,e){let n={timestamp:Date.now(),provider:e.provider,waitMs:e.waitMs,reason:e.reason,source:e.source};return{records:t.records,retries:[...t.retries,n]}}i(ao,"recordRetry");function wt(t,e,n){let o=Et(e.provider,e.model,n),r=(e.cacheReadTokens??0)+(e.cacheWriteTokens??0),s=o?Pt(o,e.inputTokens,e.outputTokens,r):0,a={timestamp:Date.now(),provider:e.provider,model:e.model,inputTokens:e.inputTokens,outputTokens:e.outputTokens,cacheReadTokens:e.cacheReadTokens??0,cacheWriteTokens:e.cacheWriteTokens??0,cost:s,role:e.role};return{records:[...t.records,a],retries:t.retries}}i(wt,"recordUsage");function co(t){let e=0,n=0,o=0,r=0,s=0,a=0,l={},c={};for(let f of t.records){e+=f.cost,n+=f.inputTokens,o+=f.outputTokens,r+=f.cacheReadTokens+f.cacheWriteTokens,s+=f.cacheReadTokens,a+=f.cacheWriteTokens;let _=l[f.provider];l[f.provider]={cost:(_?.cost??0)+f.cost,calls:(_?.calls??0)+1,inputTokens:(_?.inputTokens??0)+f.inputTokens,outputTokens:(_?.outputTokens??0)+f.outputTokens};let M=f.role??"default",x=c[M];c[M]={cost:(x?.cost??0)+f.cost,calls:(x?.calls??0)+1,inputTokens:(x?.inputTokens??0)+f.inputTokens,outputTokens:(x?.outputTokens??0)+f.outputTokens}}let m=0;for(let f of t.retries)m+=f.waitMs;let v=r>0?s/r:0;return{totalCost:e,totalInputTokens:n,totalOutputTokens:o,totalCacheTokens:r,totalCacheReadTokens:s,totalCacheWriteTokens:a,cacheHitRate:v,callCount:t.records.length,retryCount:t.retries.length,retryWaitMs:m,byProvider:l,byRole:c}}i(co,"getSummary");function Be(t){return t<.01?`$${t.toFixed(4)}`:t<1?`$${t.toFixed(3)}`:`$${t.toFixed(2)}`}i(Be,"formatCost");function lo(t){let e=[];if(e.push(`Session Cost: ${Be(t.totalCost)} (${t.callCount} calls)`),e.push(`Tokens: ${t.totalInputTokens.toLocaleString()} in / ${t.totalOutputTokens.toLocaleString()} out`),t.totalCacheTokens>0){let r=(t.cacheHitRate*100).toFixed(0);e.push(`Cache: ${t.totalCacheTokens.toLocaleString()} tokens (${t.totalCacheReadTokens.toLocaleString()} read / ${t.totalCacheWriteTokens.toLocaleString()} write, ${r}% hit rate)`)}if(t.retryCount>0){let r=(t.retryWaitMs/1e3).toFixed(1);e.push(`Retries: ${t.retryCount} (${r}s total wait)`)}e.push("");let n=Object.entries(t.byProvider).sort((r,s)=>s[1].cost-r[1].cost);if(n.length>0){e.push("By Provider:");for(let[r,s]of n)e.push(` ${r}: ${Be(s.cost)} (${s.calls} calls, ${s.inputTokens.toLocaleString()} in / ${s.outputTokens.toLocaleString()} out)`);e.push("")}let o=Object.entries(t.byRole).sort((r,s)=>s[1].cost-r[1].cost);if(o.length>1){e.push("By Role:");for(let[r,s]of o)e.push(` ${r}: ${Be(s.cost)} (${s.calls} calls)`)}return e.join(`
30
- `)}i(lo,"formatCostReport");var ln={inputTokens:0,outputTokens:0,totalTokens:0},uo=3e4;async function po(t){let e=new AbortController,n=t.timeoutMs??uo,o,r=i(l=>{o||(o=l),e.abort()},"recordAbort"),s=setTimeout(()=>r("timeout"),n),a=i(()=>r("parent"),"onParentAbort");t.abortSignal&&(t.abortSignal.aborted?r("parent"):t.abortSignal.addEventListener("abort",a,{once:!0}));try{let l=await t.provider.stream([...t.messages],[],t.system,t.reasoning??{mode:"off"},{modelOverride:t.model},e.signal),c=l.usage??ln,m=l.textBlocks??[],v=l.toolBlocks??[],f=m.map(M=>M.text).join("");if(v.length>0)return{text:f,usage:c,costTracker:t.costTracker,stopReason:"error",error:new Error(`sideQuery: provider returned ${v.length} tool_use block(s); sideQuery expects text-only output`)};let _=t.costTracker;return _&&(_=wt(_,{provider:t.provider.name,model:t.model,inputTokens:c.inputTokens,outputTokens:c.outputTokens,cacheReadTokens:c.cachedReadTokens,cacheWriteTokens:c.cachedWriteTokens,role:t.querySource})),{text:f,usage:c,costTracker:_,stopReason:mo(l.stopReason)}}catch(l){let c=l instanceof Error?l:new Error(String(l)),m="error";return e.signal.aborted&&(m=o==="timeout"?"timeout":"aborted"),{text:"",usage:ln,costTracker:t.costTracker,stopReason:m,error:c}}finally{clearTimeout(s),t.abortSignal&&t.abortSignal.removeEventListener("abort",a)}}i(po,"sideQuery");function mo(t){return t==="max_tokens"?"max_tokens":"end_turn"}i(mo,"mapStopReason");export{H as a,R as b,de as c,Fe as d,Ue as e,Xe as f,J as g,We as h,un as i,pn as j,Rt as k,At as l,$e as m,Q as n,ke as o,St as p,q,Z as r,je as s,Ve as t,Ye as u,ee as v,be as w,Qe as x,yn as y,ve as z,Me as A,Ce as B,G as C,te as D,qe as E,ne as F,Ze as G,ge as H,K as I,N as J,re as K,se as L,he as M,ye as N,z as O,U as P,kt as Q,Ht as R,Vt as S,Yt as T,Jt as U,Qt as V,qt as W,Zt as X,B as Y,Oe as Z,en as _,Ie as $,ce as aa,De as ba,tn as ca,nn as da,on as ea,Ke as fa,Le as ga,Ne as ha,rn as ia,sn as ja,an as ka,Tt as la,cn as ma,Et as na,Pt as oa,so as pa,ao as qa,wt as ra,co as sa,Be as ta,lo as ua,po as va};
@@ -1,14 +0,0 @@
1
- // @kodax-ai/kodax — bundled distribution. See docs/ADR.md ADR-022 + ADR-024.
2
- import{a as i}from"./chunk-V4WSBIXB.js";import W from"path";var k=new Set;function N(r){let t=r.trim();if(!t)throw new Error("Plugin skill path cannot be empty.");return W.resolve(t)}i(N,"normalizePluginSkillPath");function U(r){let t=N(r);return k.add(t),()=>{k.delete(t)}}i(U,"registerPluginSkillPath");function Y(r){return k.delete(N(r))}i(Y,"unregisterPluginSkillPath");function b(){return Array.from(k.values())}i(b,"listPluginSkillPaths");function H(){k.clear()}i(H,"clearPluginSkillPaths");import{homedir as q}from"os";import p from"path";import{fileURLToPath as X}from"url";import{dirname as V}from"path";var G=X(import.meta.url),Z=V(G);function Q(){return process.env.KODAX_BUNDLED==="true"?p.join(p.dirname(process.execPath),"builtin"):p.join(Z,"builtin")}i(Q,"resolveBuiltinPath");function I(r){let t=q();return{projectPaths:r?[p.join(r,".kodax","skills")]:[],userPaths:[p.join(t,".kodax","skills"),p.join(t,".agents","skills")],pluginPaths:b(),builtinPath:Q()}}i(I,"getDefaultSkillPaths");function A(r){let t=[];for(let e of r.projectPaths)t.push({path:e,source:"project"});for(let e of r.userPaths)t.push({path:e,source:"user"});for(let e of r.pluginPaths)t.push({path:e,source:"plugin"});return t.push({path:r.builtinPath,source:"builtin"}),t}i(A,"getSkillPathsFlat");import{readFile as E,readdir as nt}from"fs/promises";import{join as m,relative as ot}from"path";import $ from"yaml";var J=["SessionStart","UserPromptSubmit","PreToolUse","PostToolUse","Stop","SubagentStop","Notification"];function tt(r){let t=r.split(`
3
- `),e=[];for(let n of t){let o=n.indexOf(":");if(o>0){let s=n.slice(0,o).trim(),l=n.slice(o+1).trim();if(l.includes(":")&&!l.startsWith('"')&&!l.startsWith("'")&&!l.startsWith("[")&&!l.startsWith("|")&&!l.startsWith(">")){e.push(`${s}: |-`),e.push(` ${l}`);continue}}e.push(n)}return e.join(`
4
- `)}i(tt,"sanitizeYaml");function T(r,t={}){let e=r.replace(/^/,"").replace(/\r\n/g,`
5
- `).replace(/\r/g,`
6
- `).trimStart();if(!e.startsWith(`---
7
- `)){if(t.throwOnMissing)throw new Error("Invalid markdown: missing YAML frontmatter");return[null,r]}let n=e.indexOf(`
8
- ---
9
- `,4);if(n===-1){let a=e.indexOf(`
10
- ---`,4);a!==-1&&a===e.length-4&&(n=a)}if(n===-1){if(t.throwOnMissing)throw new Error("Invalid markdown: unclosed YAML frontmatter");return[null,r]}let o=e.slice(4,n),s=e.slice(n+5).trim(),l;try{l=$.parse(o)??{}}catch{l=$.parse(tt(o))??{}}if(l==null||typeof l!="object"||Array.isArray(l)){if(t.throwOnMissing)throw new Error("Invalid markdown: YAML frontmatter must be an object");return[null,s]}return[l,s]}i(T,"parseYamlFrontmatter");function j(r){if(typeof r=="string"){let t=r.trim();return t.length>0?t:void 0}if(Array.isArray(r)){let t=r.map(e=>String(e).trim()).filter(e=>e.length>0);return t.length>0?t.join(", "):void 0}}i(j,"normalizeAllowedToolsString");function et(r){if(typeof r=="string"){let t=r.trim();return t?{command:t}:void 0}if(r&&typeof r=="object"&&!Array.isArray(r)){let t=r,e=typeof t.command=="string"?t.command.trim():"";if(!e)return;let n=typeof t.matcher=="string"&&t.matcher.trim()?t.matcher.trim():void 0;return{command:e,matcher:n}}}i(et,"normalizeYamlHookEntry");function rt(r){if(r==null)return;let e=(Array.isArray(r)?r:[r]).map(n=>et(n)).filter(n=>n!==void 0);return e.length>0?e:void 0}i(rt,"normalizeYamlHookEntryList");function z(r){if(!r||typeof r!="object"||Array.isArray(r))return;let t=r,e={};for(let n of J){let o=rt(t[n]);o&&(e[n]=o)}return Object.keys(e).length>0?e:void 0}i(z,"normalizeYamlHookMap");function M(r){let[t,e]=T(r,{throwOnMissing:!0});if(!t)throw new Error("Invalid SKILL.md: YAML frontmatter must be an object");if(!t.name||typeof t.name!="string")throw new Error('Invalid SKILL.md: missing required "name" field');if(!t.description||typeof t.description!="string")throw new Error('Invalid SKILL.md: missing required "description" field');return{frontmatter:{name:t.name,description:t.description,disableModelInvocation:t["disable-model-invocation"]===!0,userInvocable:t["user-invocable"]!==!1,allowedTools:j(t["allowed-tools"]),context:t.context==="fork"?"fork":void 0,agent:typeof t.agent=="string"?t.agent:void 0,argumentHint:typeof t["argument-hint"]=="string"?t["argument-hint"]:void 0,model:typeof t.model=="string"?t.model:void 0,hooks:z(t.hooks),license:typeof t.license=="string"?t.license:void 0,compatibility:typeof t.compatibility=="string"?t.compatibility:void 0,metadata:t.metadata&&typeof t.metadata=="object"&&!Array.isArray(t.metadata)?t.metadata:void 0},body:e}}i(M,"parseSkillMarkdown");async function C(r,t){let e=m(r,"SKILL.md");try{let n=await E(e,"utf-8"),{frontmatter:o}=M(n);return{name:o.name,description:o.description,userInvocable:o.userInvocable??!0,argumentHint:o.argumentHint,path:r,source:t,disableModelInvocation:o.disableModelInvocation??!1}}catch(n){return console.error(`Failed to load skill metadata from ${r}:`,n),null}}i(C,"loadSkillMetadata");async function L(r,t){let e=m(r,"SKILL.md");try{let n=await E(e,"utf-8"),{frontmatter:o,body:s}=M(n),[l,a,c,u,f]=await Promise.all([h(m(r,"scripts")),h(m(r,"references")),h(m(r,"assets")),h(m(r,"templates")),h(m(r,"resources"))]);return{...o,path:r,skillFilePath:e,content:s,rawContent:s,loaded:!0,source:t,...l.length>0&&{scripts:l},...a.length>0&&{references:a},...c.length>0&&{assets:c},...u.length>0&&{templates:u},...f.length>0&&{resources:f}}}catch(n){return console.error(`Failed to load skill from ${r}:`,n),null}}i(L,"loadFullSkill");async function h(r,t=r){let e=[];try{let n=await nt(r,{withFileTypes:!0});n.sort((o,s)=>o.name.localeCompare(s.name));for(let o of n){let s=m(r,o.name);if(o.isDirectory()){e.push(...await h(s,t));continue}o.isFile()&&e.push({name:o.name,path:s,relativePath:ot(t,s).replace(/\\/g,"/")})}}catch{}return e}i(h,"loadSkillFiles");async function st(r){if(r.content)return r.content;let t=await E(r.path,"utf-8");return r.content=t,t}i(st,"loadSkillFileContent");import{readdir as it,stat as F}from"fs/promises";import{join as w,dirname as B}from"path";async function x(r,t){let e=new Map,n=[],s={...I(r),...t},l=A(s);for(let{path:a,source:c}of l)try{let u=await lt(a,c);for(let f of u)e.has(f.name)||e.set(f.name,f)}catch(u){n.push({path:a,error:u instanceof Error?u.message:String(u)})}return{skills:e,errors:n}}i(x,"discoverSkills");async function lt(r,t){let e=[];try{if(!(await F(r)).isDirectory())return e;let o=await it(r);for(let s of o){let l=w(r,s);try{if((await F(l)).isDirectory()){let c=w(l,"SKILL.md");try{if((await F(c)).isFile()){let f=await C(l,t);f&&e.push(f)}}catch{}}}catch{}}}catch{}return e}i(lt,"scanSkillDirectory");function _(r,t){let e=[],n=[".kodax/skills"],o=r,s=B(t);for(;o!==s&&o!=="/"&&o.length>3;){for(let a of n)e.push(w(o,a));let l=B(o);if(l===o)break;o=l}return e}i(_,"getNestedSkillPaths");async function at(r,t){let e=_(r,t),n={projectPaths:[w(t,".kodax","skills"),...e]};return x(t,n)}i(at,"discoverSkillsWithMonorepo");import{execSync as ct}from"child_process";import ut from"path";var ft=new Set(["ls","cat","pwd","echo","whoami","date","which","whereis","tree","dir","type","get-childitem","get-content","select-string","get-location","grep","find","awk","sed","head","tail","less","more","wc","git status","git diff","git log","git show","git branch","git remote","git ls-files","git rev-parse","git grep","node","npm","yarn","pnpm","tsc","python","pip","go","cargo","rustc"]);function O(r){if(!r||!r.trim())return!1;let t=r.trim().replace(/\s+/g," ").toLowerCase();for(let e of ft)if(t===e||t.startsWith(`${e} `)){if(e==="sed"&&t.split(/\s+/).some(s=>s.startsWith("-i")||s==="--in-place"))return!1;if(e==="awk"){let o=t.split(/\s+/);if(o.includes("-f")||o.includes("--file"))return!1}if(["node","npm","yarn","pnpm","tsc","python","pip","go","cargo","rustc"].includes(e)){let o=t.split(/\s+/).slice(1);if(o.length>0&&!o.every(s=>/^(-v|--version|-h|--help)$/.test(s)))return!1}return!0}return!1}i(O,"isSingleSafeDynamicContextCommand");function mt(r){if(!r||!r.trim())return!1;let t=r.trim().replace(/\\\r?\n/g," ");if(/[<>|;`]|\$\(|(?<!&)&(?!&)/.test(t)||t.includes("\\")&&ut.sep!=="\\"&&t.replace(/\\ /g,"").includes("\\"))return!1;let n=t.split(/\s*&&\s*/);if(n.length===1)return O(n[0]);for(let o of n){let s=o?.trim();if(s&&!/^cd\s+/.test(s.toLowerCase())&&!O(s))return!1}return!0}i(mt,"isSafeDynamicContextCommand");function D(r){let t=[],e="",n=!1,o="";for(let s=0;s<r.length;s++){let l=r[s];n?l===o?n=!1:e+=l:l==='"'||l==="'"?(n=!0,o=l):l===" "?e&&(t.push(e),e=""):e+=l}return e&&t.push(e),t}i(D,"parseArguments");var y=class{static{i(this,"VariableResolver")}context;constructor(t){this.context=t}async resolve(t,e){let n=t,o=D(e);return n=this.resolvePositionalArgs(n,o),n=this.resolveArguments(n,e),n=this.resolveEnvVars(n),n=await this.resolveDynamicContext(n),n}resolvePositionalArgs(t,e){return t.replace(/\$(\d+)(?![a-zA-Z0-9_])/g,(n,o)=>{let s=parseInt(o,10);return e[s]??""})}resolveArguments(t,e){return t.replace(/\$ARGUMENTS/g,e)}resolveEnvVars(t){let e={...this.context.environment,CLAUDE_SESSION_ID:this.context.sessionId,KODAX_SESSION_ID:this.context.sessionId,KODAX_WORKING_DIR:this.context.workingDirectory};return t.replace(/\$\{([A-Za-z_][A-Za-z0-9_]*)\}/g,(n,o)=>e[o]??n)}async resolveDynamicContext(t){let e=/!`([^`]+)`/g,n=[],o;for(;(o=e.exec(t))!==null;)n.push({match:o[0],command:o[1]});if(n.length===0)return t;let s=t;for(let{match:l,command:a}of n)try{let c=this.executeDynamicCommand(a);s=s.replace(l,c)}catch(c){let u=c instanceof Error?c.message:String(c);s=s.replace(l,`[Error: ${u}]`)}return s}executeDynamicCommand(t){if(!mt(t))throw new Error("Unsafe dynamic context command blocked. Only simple read-only commands are allowed in !`...` blocks.");try{return ct(t,{cwd:this.context.workingDirectory,encoding:"utf-8",timeout:5e3,maxBuffer:1048576,windowsHide:!0}).trim()}catch(e){throw e instanceof Error?new Error(`Command failed: ${e.message}`):e}}};function dt(r){return new y(r)}i(dt,"createResolver");async function d(r,t,e){return new y(e).resolve(r,t)}i(d,"resolveSkillContent");var v=class{static{i(this,"SkillRegistry")}skillsByName=new Map;fullSkillsByName=new Map;projectRoot;customPaths;constructor(t,e){this.projectRoot=t,this.customPaths=e}async discover(){let t=await x(this.projectRoot,this.customPaths);this.skillsByName.clear();for(let[e,n]of t.skills)this.skillsByName.set(e,n);if(t.errors.length>0)for(let{path:e,error:n}of t.errors)console.warn(`[Skills] Error scanning ${e}: ${n}`)}get skills(){return this.skillsByName}get(t){return this.skillsByName.get(t)}async loadFull(t){let e=this.fullSkillsByName.get(t);if(e)return e;let n=this.skillsByName.get(t);if(!n)throw new Error(`Skill not found: ${t}`);let o=await L(n.path,n.source);if(!o)throw new Error(`Failed to load skill: ${t}`);return this.fullSkillsByName.set(t,o),o}async invoke(t,e,n){try{let o=await this.loadFull(t);return o.disableModelInvocation?{success:!1,content:"",error:`Skill "${t}" has model invocation disabled`}:{success:!0,content:await d(o.content,e,n)}}catch(o){return{success:!1,content:"",error:o instanceof Error?o.message:String(o)}}}async reload(){this.skillsByName.clear(),this.fullSkillsByName.clear(),await this.discover()}list(){return Array.from(this.skillsByName.values())}listUserInvocable(){return this.list().filter(t=>t.userInvocable)}getSystemPromptSnippet(){let t=this.list().filter(n=>!n.disableModelInvocation);if(t.length===0)return"";let e=["## Available Skills","","When users ask you to perform tasks, check if any of the available skills below match the request. Skills provide specialized capabilities and step-by-step instructions for specific workflows.","",'When users reference a "slash command" or "/<something>" (e.g. "/feature-list-tracker", "/skill:foo"), they are referring to a skill. Use the read tool to load the skill\'s `SKILL.md` and follow its instructions.',"","**BLOCKING REQUIREMENT**: When a skill matches the user's request, you MUST read the relevant skill's `SKILL.md` BEFORE generating any other response about the task. Loading the skill is not optional and not something to defer \u2014 it is the FIRST action you take.","","NEVER mention a skill without actually reading its `SKILL.md`. Do not guess at skill names \u2014 only use skills listed below.",""];for(let n of t){let o=n.argumentHint?` ${n.argumentHint}`:"",s=`${n.path}/SKILL.md`.replace(/\\/g,"/");e.push(`- ${n.name}:${o} ${n.description}
11
- (Location: ${s})`)}return e.push(""),e.join(`
12
- `)}has(t){return this.skillsByName.has(t)}get size(){return this.skillsByName.size}},g=null,R;function P(r,t){return g&&r!==void 0&&R!==r&&(g=null),g||(g=new v(r,t),R=r),g}i(P,"getSkillRegistry");async function pt(r,t){let e=P(r,t);return await e.discover(),e}i(pt,"initializeSkillRegistry");function ht(){g=null}i(ht,"resetSkillRegistry");var S=class{static{i(this,"SkillExecutor")}context;constructor(t){this.context=t}async execute(t,e,n){let o=P();if(!o.has(t))return{success:!1,content:"",error:`Skill not found: ${t}`};try{let s=await o.loadFull(t),l=n?.mode??(s.context==="fork"?"fork":"inline"),a=await d(s.content,e,this.context);return l==="fork"?this.executeFork(s,a,n):this.executeInline(s,a,n)}catch(s){return{success:!1,content:"",error:s instanceof Error?s.message:String(s)}}}async executeInline(t,e,n){let o=this.buildPrompt(t,e);if(n?.onExecute)try{return{success:!0,content:await n.onExecute(o,t)}}catch(s){return{success:!1,content:"",error:s instanceof Error?s.message:String(s)}}return{success:!0,content:o}}async executeFork(t,e,n){return{success:!0,content:this.buildPrompt(t,e),artifacts:[{type:"text",name:"fork-config",content:JSON.stringify({agent:n?.agent??t.agent??"general-purpose",model:n?.model??t.model??"haiku",allowedTools:n?.allowedTools??this.parseAllowedTools(t.allowedTools)})}]}}buildPrompt(t,e){let n=[];return n.push(`[Using Skill: ${t.name}]`),n.push(""),t.allowedTools&&(n.push(`**Allowed Tools**: ${t.allowedTools}`),n.push("")),n.push(e),n.join(`
13
- `)}parseAllowedTools(t){return t?t.split(",").map(e=>e.trim()).filter(Boolean):[]}};function gt(r){return new S(r)}i(gt,"createExecutor");async function kt(r,t,e,n){return new S(e).execute(r,t,n)}i(kt,"executeSkill");function K(r){return r.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;")}i(K,"escapeXml");function yt(r,t,e){let n=[];return n.push(`<skill name="${K(r.name)}" location="${K(r.path)}">`),n.push(""),r.source==="builtin"?n.push("This is a built-in KodaX skill."):r.source==="project"?n.push("References are relative to the project root."):r.source==="user"&&n.push("This is a user-defined skill."),n.push(""),n.push(t),e.trim()&&(n.push(""),n.push(`User provided arguments: ${e}`)),n.push(""),n.push("</skill>"),n.join(`
14
- `)}i(yt,"buildSkillBlock");async function St(r,t,e){let n=await d(r.content,t,e);return{content:yt(r,n,t),disableModelInvocation:r.disableModelInvocation??!1,skill:r}}i(St,"expandSkillForLLM");function wt(r,t){let e=`Skill activated: ${r}`;return t.trim()&&(e+=` with arguments: ${t}`),e}i(wt,"formatSkillActivationMessage");export{U as a,Y as b,b as c,H as d,I as e,A as f,T as g,j as h,z as i,M as j,C as k,L as l,st as m,x as n,_ as o,at as p,D as q,y as r,dt as s,d as t,v as u,P as v,pt as w,ht as x,S as y,gt as z,kt as A,St as B,wt as C};