@kodax-ai/kodax 0.7.40 → 0.7.42

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 (70) hide show
  1. package/CHANGELOG.md +146 -1
  2. package/README.md +129 -232
  3. package/README_CN.md +128 -253
  4. package/dist/chunks/chunk-3RKBXWZS.js +2 -0
  5. package/dist/chunks/chunk-7JLYVWAF.js +1033 -0
  6. package/dist/chunks/chunk-CD3R5YBH.js +16 -0
  7. package/dist/chunks/chunk-DKXUY5F2.js +209 -0
  8. package/dist/chunks/chunk-HMYEQJGT.js +31 -0
  9. package/dist/chunks/{chunk-FAVPT4P7.js → chunk-IYJ5EPRV.js} +1 -1
  10. package/dist/chunks/chunk-KUX5LRPP.js +2 -0
  11. package/dist/chunks/{chunk-EQ5DGS2W.js → chunk-OWSKU55I.js} +5 -6
  12. package/dist/chunks/chunk-ZZ4KRK2B.js +465 -0
  13. package/dist/chunks/compaction-config-FIFFP4FT.js +2 -0
  14. package/dist/chunks/{construction-bootstrap-OFPUZTXQ.js → construction-bootstrap-J2WOCYEK.js} +1 -1
  15. package/dist/chunks/dist-2ZHWDXMQ.js +2 -0
  16. package/dist/chunks/dist-W4CJWLIH.js +2 -0
  17. package/dist/chunks/utils-A5MWDTWZ.js +2 -0
  18. package/dist/index.d.ts +237 -7
  19. package/dist/index.js +5 -5
  20. package/dist/kodax_cli.js +935 -917
  21. package/dist/sdk-agent.d.ts +1375 -10
  22. package/dist/sdk-agent.js +1 -1
  23. package/dist/sdk-coding.d.ts +4608 -14
  24. package/dist/sdk-coding.js +1 -1
  25. package/dist/sdk-llm.d.ts +210 -10
  26. package/dist/sdk-llm.js +1 -1
  27. package/dist/sdk-mcp.d.ts +17 -0
  28. package/dist/sdk-mcp.js +2 -0
  29. package/dist/sdk-repl.d.ts +3026 -13
  30. package/dist/sdk-repl.js +2 -1
  31. package/dist/sdk-session.d.ts +164 -0
  32. package/dist/sdk-session.js +2 -0
  33. package/dist/sdk-skills.d.ts +553 -9
  34. package/dist/sdk-skills.js +1 -1
  35. package/dist/types-chunks/bash-prefix-extractor.d-CkhaqKkg.d.ts +2571 -0
  36. package/dist/types-chunks/capability.d-3C62G8Eq.d.ts +39 -0
  37. package/dist/types-chunks/config.d-BfJUXxC0.d.ts +41 -0
  38. package/dist/types-chunks/cost-tracker.d-B6vMoLLF.d.ts +360 -0
  39. package/dist/types-chunks/history-cleanup.d-DznrzEiU.d.ts +1475 -0
  40. package/dist/types-chunks/instance-discovery.d-BsKnIwpg.d.ts +990 -0
  41. package/dist/types-chunks/resolver.d-DX9au4NJ.d.ts +263 -0
  42. package/dist/types-chunks/session-storage.d-Cci897iM.d.ts +68 -0
  43. package/dist/types-chunks/storage.d-Bc5DoAwp.d.ts +532 -0
  44. package/dist/types-chunks/transport.d-DuyjG30t.d.ts +180 -0
  45. package/dist/types-chunks/types.d-B1uGoVTE.d.ts +400 -0
  46. package/dist/types-chunks/types.d-C5mHR87z.d.ts +119 -0
  47. package/dist/types-chunks/types.d-mM8vqvhT.d.ts +254 -0
  48. package/package.json +16 -3
  49. package/dist/acp_events.d.ts +0 -109
  50. package/dist/acp_logger.d.ts +0 -20
  51. package/dist/acp_server.d.ts +0 -92
  52. package/dist/chunks/chunk-6QO6HWGU.js +0 -30
  53. package/dist/chunks/chunk-CLS57NPX.js +0 -460
  54. package/dist/chunks/chunk-NDNILSTR.js +0 -2
  55. package/dist/chunks/chunk-QZEDWITG.js +0 -1226
  56. package/dist/chunks/chunk-Z5EBDA6R.js +0 -15
  57. package/dist/chunks/compaction-config-A7XZ6H5Y.js +0 -2
  58. package/dist/chunks/dist-M57GIWR4.js +0 -2
  59. package/dist/chunks/dist-OTUF22DA.js +0 -2
  60. package/dist/chunks/utils-DFMYJUTE.js +0 -2
  61. package/dist/cli_commands.d.ts +0 -17
  62. package/dist/cli_option_helpers.d.ts +0 -49
  63. package/dist/cli_option_helpers.test.d.ts +0 -1
  64. package/dist/constructed_cli.d.ts +0 -82
  65. package/dist/constructed_cli.test.d.ts +0 -1
  66. package/dist/kodax_cli.d.ts +0 -7
  67. package/dist/self_modify_cli.d.ts +0 -81
  68. package/dist/self_modify_cli.test.d.ts +0 -9
  69. package/dist/skill_cli.d.ts +0 -15
  70. package/dist/skill_cli.test.d.ts +0 -1
@@ -0,0 +1,31 @@
1
+ // @kodax-ai/kodax — bundled distribution. See docs/ADR.md ADR-022 + ADR-024.
2
+ import{a as i}from"./chunk-V4WSBIXB.js";var V=class extends Error{static{i(this,"KodaXError")}code;constructor(e,n="KODAX_ERROR"){super(e),this.code=n,this.name="KodaXError"}},w=class extends V{static{i(this,"KodaXProviderError")}provider;constructor(e,n){super(e,"PROVIDER_ERROR"),this.provider=n,this.name="KodaXProviderError"}},de=class extends V{static{i(this,"KodaXRateLimitError")}retryAfter;constructor(e,n){super(e,"RATE_LIMIT_ERROR"),this.retryAfter=n,this.name="KodaXRateLimitError"}},We=class extends V{static{i(this,"KodaXNetworkError")}isTimeout;constructor(e,n=!1){super(e,"NETWORK_ERROR"),this.isTimeout=n,this.name="KodaXNetworkError"}},$e=class extends V{static{i(this,"KodaXToolCallIdError")}constructor(e){super(e,"TOOL_CALL_ID_ERROR"),this.name="KodaXToolCallIdError"}};var je=32768,J=32e3,ze=64e3,un=.5;var pn=["off","auto","quick","balanced","deep"],wt={low:6e3,medium:1e4,high:2e4},At=4096;function Ge(t){return t.reasoningCapability?t.reasoningCapability:t.supportsThinking?"native-toggle":"prompt-only"}i(Ge,"getReasoningCapability");function Q(t){return xe(t).enabled}i(Q,"isReasoningEnabled");function xe(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(xe,"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={...wt,...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 Ve(t){switch(t){case"low":return"low";case"medium":return"medium";case"high":return"high";default:return}}i(Ve,"mapDepthToOpenAIReasoningEffort");import ve from"fs";import dn from"os";import Je from"path";var He=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??Je.join(dn.homedir(),".kodax")}i(gn,"getKodaxDir");function Ot(){return process.env.KODAX_CONFIG_FILE??Je.join(gn(),"config.json")}i(Ot,"getConfigFilePath");function Ye(t,e){return He={filePath:t,config:e},e}i(Ye,"updateStoredConfigCache");function hn(t){let e=JSON.parse(ve.readFileSync(t,"utf-8"));return fn(e)?e:{}}i(hn,"readStoredConfigFromDisk");function Qe(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(Qe,"reasoningCapabilityToOverride");function qe(t){switch(t){case"budget":return"native-budget";case"effort":return"native-effort";case"toggle":return"native-toggle";default:return"none"}}i(qe,"reasoningOverrideToCapability");function ee(t,e,n){return[t,e.baseUrl??"",n??e.model].join("|")}i(ee,"buildReasoningOverrideKey");function Ze(){let t=Ot();if(He?.filePath===t)return He.config;try{if(ve.existsSync(t))return Ye(t,hn(t))}catch{}return Ye(t,{})}i(Ze,"loadStoredConfig");function It(t){let e=Ot();try{ve.mkdirSync(Je.dirname(e),{recursive:!0}),ve.writeFileSync(e,JSON.stringify(t,null,2)),Ye(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=Ze(),r=ee(t,e,n);return o.providerReasoningOverrides?.[r]}i(be,"loadReasoningOverride");function et(t,e,n,o){let r=Ze(),s=ee(t,e,o);r.providerReasoningOverrides={...r.providerReasoningOverrides??{},[s]:n},It(r)}i(et,"saveReasoningOverride");function yn(t,e,n){let o=Ze(),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 Me(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 c=Dt(t,"retry-after");if(c!==void 0&&c.trim().length>0){let _=Kt(c);if(_!==void 0){let b=_*1e3,p=Math.min(b,r);return{type:"header",waitMs:Math.round(p),source:"retry-after-seconds",cappedFromHeader:p!==b}}let k=_n(c,s);if(k!==void 0){let b=Math.min(k,r);return{type:"header",waitMs:Math.round(b),source:"retry-after-date",cappedFromHeader:b!==k}}}let u=n*Math.pow(2,Math.max(0,e.attempt)),d=Math.min(u,o),m=e.withJitter!==!1?Math.random()*.25*d:0;return{type:"backoff",waitMs:Math.round(d+m),source:"exponential-backoff",attempt:e.attempt}}i(Me,"parseRetryAfter");function Ce(t){if(!t||typeof t!="object")return;let e=t;return e.headers??e.response?.headers??e.cause?.headers??e.cause?.response?.headers}i(Ce,"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 Te(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(Te,"normalizeCapabilityProfile");function F(t){return{...Te(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 z=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(e){let n=this.getModelDescriptor(e)?.streamMaxDurationMs;return n!==void 0?n:this.config.streamMaxDurationMs}getEffectiveReplayReasoningContent(e){let n=this.getModelDescriptor(e)?.replayReasoningContent;return n!==void 0?n:this.config.replayReasoningContent??!1}getEffectiveStrictThinkingSignature(e){let n=this.getModelDescriptor(e)?.strictThinkingSignature;return n!==void 0?n:this.config.strictThinkingSignature??!1}supportsNonStreamingFallback(){return!1}async complete(e,n,o,r,s,a){throw new w(`${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:Ge(this.config)}getReasoningCapability(e){let n=be(this.name,this.config,e);return n?qe(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=Qe(e);o&&et(this.name,this.config,o,n)}shouldFallbackForReasoningError(e,...n){let o=e instanceof Error?e.message.toLowerCase():String(e).toLowerCase(),s=n.map(c=>c.toLowerCase()).some(c=>o.includes(c)),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 xe(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=Ce(e);if(!n)return;let o=Me(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,"")),c=Number(s[2].replace(/,/g,"")),u=Math.min(a,c),d=Math.max(a,c);return Math.max(3e3,d-u-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 c=await e();return this.maxOutputTokensOverride=void 0,c}catch(c){if(this.isContextOverflowError(c)&&!this.maxOutputTokensOverride){let u=this.parseContextOverflow(c);if(u){this.maxOutputTokensOverride=u,r?.(a+1,o,0);continue}}if(this.isRateLimitError(c)){if(a===o-1)throw new de(`API rate limit exceeded after ${o} retries. Please wait and try again later.`,6e4);let u=Ce(c)??{},d=Me(u,{attempt:a,baseBackoffMs:500,maxBackoffMs:32e3,withJitter:!0}),l=d.waitMs,m=this.classifyRateLimitReason(c);if(s?.({provider:this.name,waitMs:l,reason:m,source:d.source,attempt:a+1,maxAttempts:o}),r?r(a+1,o,l):s||console.log(`[Rate Limit] Retrying in ${l/1e3}s (${a+1}/${o})...`),n?.aborted)throw new DOMException("Request aborted","AbortError");if(await new Promise(_=>setTimeout(_,l)),n?.aborted)throw new DOMException("Request aborted","AbortError");continue}if(c instanceof Error){if((c.name==="AbortError"||c.name==="APIUserAbortError")&&n?.aborted)throw c.name==="AbortError"?c:new DOMException(c.message||"Request aborted","AbortError");let u=c?.cause?.code??c?.code??"";throw(u==="ECONNRESET"||u==="EPIPE")&&this.onStaleConnection(),new w(`${this.name} API error: ${c.message}`,this.name)}throw c}throw new V("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 tt(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(tt,"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 nt(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(nt,"lowerCacheBoundaries");function ge(t){return t.filter(e=>!ne(e))}i(ge,"stripCacheBoundaries");import{readFile as vn}from"node:fs/promises";import bn from"node:path";var Mn={".gif":"image/gif",".jpeg":"image/jpeg",".jpg":"image/jpeg",".png":"image/png",".webp":"image/webp"};function Ee(t,e){return e??Mn[bn.extname(t).toLowerCase()]??"image/png"}i(Ee,"resolveImageMediaType");async function Pe(t){return(await vn(t)).toString("base64")}i(Pe,"readImageFileAsBase64");async function Nt(t,e){let n=Ee(t,e),o=await Pe(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 ot(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,c=n?o+r+s:e?.inputTokens??0;if(![c,a].some(u=>!Number.isFinite(u)||u<0))return{inputTokens:c,outputTokens:a,totalTokens:c+a,cachedReadTokens:s||void 0,cachedWriteTokens:r||void 0}}i(ot,"normalizeAnthropicUsage");var K=class extends z{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=tt([{type:"text",text:e}],"system");return nt(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 c=this.normalizeReasoning(r),u=s?.modelOverride??this.config.model,d=this.getEffectiveMaxOutputTokens(u),l=await this.convertMessages(e,u),m=c.enabled?this.getReasoningCapability(u):"none",_=c.enabled?this.getReasoningFallbackChain(m).filter(M=>M==="native-budget"||M==="native-toggle"||M==="none"):["none"],k=i(M=>{let P={model:u,max_tokens:d,system:this.applyCacheControlToSystem(this.buildSystemPrompt(o,e)),messages:l,tools:this.applyCacheControlToTools(n),stream:!0};if(M==="native-budget"){let S=q(this.config,c.depth,c.taskType);P.thinking={type:"enabled",budget_tokens:Z(S,d)}}else M==="native-toggle"&&(P.thinking={type:"enabled"});return P},"buildRequest");if(a?.aborted)throw new DOMException("Request aborted","AbortError");let b=[],p=[],x=[],y,v=null,f="",g="",T="",R="",W="",O="",$="",E=!1,j,A=Date.now(),ke=Date.now(),le,ue;for(let M of _)try{le=await this.client.messages.create(k(M),a?{signal:a}:{}),M!==m&&this.persistReasoningCapabilityOverride(M,u);break}catch(P){ue=P;let S=M==="native-budget"?["budget_tokens","thinking"]:M==="native-toggle"?["thinking"]:[];if(!this.shouldFallbackForReasoningError(P,...S))throw P}if(!le)throw ue??new w("All reasoning capability attempts failed without a captured error",this.name);let pe=Date.now(),C=0,I=0,D=3e4;for await(let M 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 ${M.type}`,{stallCount:C,totalStallMs:I,eventType:M.type})),pe=P,M.type==="content_block_start"||M.type==="content_block_stop"?s?.onHeartbeat?.(!0):s?.onHeartbeat?.(),M.type==="content_block_start"){A=Date.now();let h=M.content_block;v=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"?(g="",T=h.signature??""):h.type==="redacted_thinking"?(v="redacted_thinking",R=h.data??""):h.type==="text"?f="":h.type==="tool_use"&&(W=h.id,O=h.name,$="")}else if(M.type==="content_block_delta"){A=Date.now();let h=M.delta;h.type==="thinking_delta"?(g+=h.thinking??"",s?.onThinkingDelta?.(h.thinking??"")):h.type==="text_delta"?(f+=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(M.type==="content_block_stop")A=Date.now(),v==="thinking"?g&&(x.push({type:"thinking",thinking:g,signature:T}),s?.onThinkingEnd?.(g)):v==="redacted_thinking"?(R&&x.push({type:"redacted_thinking",data:R}),R=""):v==="text"?f&&b.push({type:"text",text:f}):v==="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)}):p.push({type:"tool_use",id:W,name:O,input:te($)})),v=null;else if(M.type==="message_stop"){if(E=!0,A=Date.now(),process.env.KODAX_DEBUG_STREAM){let h=Date.now()-ke;this.logStreamDiagnostic(`[Stream] message_stop received after ${h}ms`)}}else if(M.type==="message_delta"){A=Date.now(),y=ot(M.usage,y);let h=M.delta;h?.stop_reason&&(j=h.stop_reason,process.env.KODAX_DEBUG_STREAM&&this.logStreamDiagnostic(`[Stream] message_delta with stop_reason: ${j}`))}else M.type==="message_start"&&(A=Date.now(),y=ot(M.message?.usage,y),process.env.KODAX_DEBUG_STREAM&&this.logStreamDiagnostic("[Stream] message_start received"))}if(!E){let M=Date.now()-ke,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:M,lastEventAge:P,reason:h,textBlocks:b.length,toolBlocks:p.length,thinkingBlocks:x.length}),new DOMException(h,"AbortError")}let S=new Error(`Stream incomplete: message_stop event not received. Duration: ${M}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:M,lastEventAge:P,textBlocks:b.length,toolBlocks:p.length,thinkingBlocks:x.length}),S}return{textBlocks:b,toolBlocks:p,thinkingBlocks:x,usage:y,stopReason:j}},a,3,s?.onRateLimit,s?.onRetryAfter)}supportsNonStreamingFallback(){return!0}async complete(e,n,o,r,s,a){return this.withRateLimit(async()=>{let c=this.normalizeReasoning(r),u=s?.modelOverride??this.config.model,d=this.getEffectiveMaxOutputTokens(u),l=await this.convertMessages(e,u),m=c.enabled?this.getReasoningCapability(u):"none",_=c.enabled?this.getReasoningFallbackChain(m).filter(f=>f==="native-budget"||f==="native-toggle"||f==="none"):["none"],k=i(f=>{let g={model:u,max_tokens:d,system:this.applyCacheControlToSystem(this.buildSystemPrompt(o,e)),messages:l,tools:this.applyCacheControlToTools(n)};if(f==="native-budget"){let T=q(this.config,c.depth,c.taskType);g.thinking={type:"enabled",budget_tokens:Z(T,d)}}else f==="native-toggle"&&(g.thinking={type:"enabled"});return g},"buildRequest"),b,p;for(let f of _)try{b=await this.client.messages.create(k(f),a?{signal:a}:{}),f!==m&&this.persistReasoningCapabilityOverride(f,u);break}catch(g){p=g;let T=f==="native-budget"?["budget_tokens","thinking"]:f==="native-toggle"?["thinking"]:[];if(!this.shouldFallbackForReasoningError(g,...T))throw g}if(!b)throw p??new w("All reasoning capability attempts failed without a captured error",this.name);let x=[],y=[],v=[];for(let f of b.content)f.type==="text"?(x.push({type:"text",text:f.text}),s?.onTextDelta?.(f.text)):f.type==="thinking"?(v.push({type:"thinking",thinking:f.thinking,signature:f.signature??""}),s?.onThinkingDelta?.(f.thinking),s?.onThinkingEnd?.(f.thinking)):f.type==="redacted_thinking"?v.push({type:"redacted_thinking",data:f.data}):f.type==="tool_use"&&y.push({type:"tool_use",id:f.id,name:f.name,input:typeof f.input=="object"&&f.input!==null?f.input:{}});return{textBlocks:x,toolBlocks:y,thinkingBlocks:v,usage:ot(b.usage),stopReason:b.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 w("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,n){let o=[],r=this.getEffectiveStrictThinkingSignature(n);for(let s of e.filter(a=>a.role!=="system")){let a=s.role==="user"?"user":"assistant";if(typeof s.content=="string"){o.push({role:a,content:s.content});continue}let c=[],u=[];for(let l of s.content)l.type==="thinking"?!r||typeof l.signature=="string"&&l.signature.length>0?c.push({type:"thinking",thinking:l.thinking,signature:l.signature??""}):l.thinking&&u.push(l.thinking):l.type==="redacted_thinking"&&(r||c.push({type:"redacted_thinking",data:l.data}));u.length>0&&s.role==="assistant"&&c.push({type:"text",text:`<prior_reasoning>
6
+ ${u.join(`
7
+
8
+ `)}
9
+ </prior_reasoning>`});for(let l of s.content)if(l.type==="tool_result"&&s.role==="user"){let m;if(typeof l.content=="string")m=l.content;else{let _=[];for(let k of l.content)k.type==="text"?_.push({type:"text",text:k.text}):k.type==="image"&&_.push({type:"image",source:{type:"base64",media_type:Ee(k.path,k.mediaType),data:await Pe(k.path)}});m=_}c.push({type:"tool_result",tool_use_id:l.tool_use_id,content:m,...l.is_error===!0?{is_error:!0}:{}})}for(let l of s.content)l.type==="tool_use"&&s.role==="assistant"&&c.push({type:"tool_use",id:l.id,name:l.name,input:l.input});for(let l of s.content)l.type==="text"?c.push({type:"text",text:l.text}):l.type==="image"&&s.role==="user"&&c.push({type:"image",source:{type:"base64",media_type:Ee(l.path,l.mediaType),data:await Pe(l.path)}});if(a==="assistant"&&this.config.supportsThinking&&!r){let l=c.some(_=>_.type==="tool_use"),m=c.some(_=>_.type==="thinking"||_.type==="redacted_thinking");l&&!m&&c.unshift({type:"thinking",thinking:"...",signature:""})}let d=c.length===0||a==="assistant"&&c.every(l=>{let m=l;return m.type==="thinking"&&!m.thinking||m.type==="text"&&!m.text});o.push({role:s.role,content:d?[{type:"text",text:"..."}]:c})}return o}};import Pn from"openai";var Rn="KodaX";function wn(t){return t.userAgentMode==="sdk"?void 0:{"User-Agent":Rn}}i(wn,"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 z{static{i(this,"KodaXOpenAICompatProvider")}supportsThinking=!0;client;initClient(){let e=wn(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(c=>typeof c=="object"&&c!==null&&c.type==="text"&&typeof c.text=="string").map(c=>c.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 c=Ve(o.depth);c&&(r.reasoning_effort=c);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 c=this.stripCacheBoundariesFromMessages(e),{system:u,rest:d}=this.normalizeSystemForWire(o,c),l=s?.modelOverride??this.config.model,m=[{role:"system",content:u},...await this.convertMessages(d,l)],_=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 k=new Map,b="",p="",x,y=!0,v=null,f=Date.now(),g=this.normalizeReasoning(r),T=Q(g)?this.getReasoningCapability(l):"none",R=Q(g)?this.getReasoningFallbackChain(T).filter(C=>C==="native-budget"||C==="native-effort"||C==="native-toggle"||C==="none"):["none"],W={model:l,messages:m,tools:_,max_completion_tokens:this.getEffectiveMaxOutputTokens(l),stream:!0},O,$;for(let C of R){for(;!O;){let I={...W};y&&(I.stream_options={include_usage:!0}),this.resetReasoningCapabilityParams(I),this.applyReasoningCapability(I,C,g);try{O=await this.client.chat.completions.create(I,a?{signal:a}:{}),C!==T&&this.persistReasoningCapabilityOverride(C,l)}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 w("All reasoning capability attempts failed without a captured error",this.name);let E=Date.now(),j=0,A=0,ke=3e4;for await(let C of O){if(a?.aborted)throw new DOMException("Request aborted","AbortError");let I=Date.now(),D=I-E;D>ke&&(j++,A+=D,this.logStreamDiagnostic(`[Stream] stall detected: ${Math.round(D/1e3)}s gap`,{stallCount:j,totalStallMs:A})),E=I,s?.onHeartbeat?.(),x=Bt(C.usage)??x;let M=C.choices[0],P=M?.delta;if(M?.finish_reason&&(v=M.finish_reason,process.env.KODAX_DEBUG_STREAM)){let h=Date.now()-f;this.logStreamDiagnostic(`[Stream] finish_reason: ${v} after ${h}ms`)}P?.content&&(b+=P.content,s?.onTextDelta?.(P.content));let S=this.extractReasoningDelta(P);if(S&&(p+=S,s?.onThinkingDelta?.(S)),P?.tool_calls)for(let h of P.tool_calls){let Y=k.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)),k.set(h.index,Y)}}if(!v){let C=Date.now()-f;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:b.length,toolCallsCount:k.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:b.length,toolCallsCount:k.size}),I}let le=b?[{type:"text",text:b}]:[],ue=[],pe=[];p&&(pe.push({type:"thinking",thinking:p}),s?.onThinkingEnd?.(p));for(let[,C]of k)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:x,stopReason:v??void 0}},a,3,s?.onRateLimit,s?.onRetryAfter)}supportsNonStreamingFallback(){return!0}async complete(e,n,o,r,s,a){return this.withRateLimit(async()=>{let c=this.stripCacheBoundariesFromMessages(e),{system:u,rest:d}=this.normalizeSystemForWire(o,c),l=s?.modelOverride??this.config.model,m=[{role:"system",content:u},...await this.convertMessages(d,l)],_=n.map(E=>({type:"function",function:{name:E.name,description:E.description,parameters:E.input_schema}})),k=this.normalizeReasoning(r),b=Q(k)?this.getReasoningCapability(l):"none",p=Q(k)?this.getReasoningFallbackChain(b).filter(E=>E==="native-budget"||E==="native-effort"||E==="native-toggle"||E==="none"):["none"],x={model:l,messages:m,tools:_,max_completion_tokens:this.getEffectiveMaxOutputTokens(l)},y,v;for(let E of p){let j={...x};this.resetReasoningCapabilityParams(j),this.applyReasoningCapability(j,E,k);try{y=await this.client.chat.completions.create(j,a?{signal:a}:{}),E!==b&&this.persistReasoningCapabilityOverride(E,l);break}catch(A){if(v=A,!this.shouldFallbackForReasoningError(A,...this.getFallbackTerms(E)))throw A}}if(!y)throw v??new w("All reasoning capability attempts failed without a captured error",this.name);let f=y.choices[0],g=f?.message,T=Sn(g?.content),R=On(g),W=(g?.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 R&&($.push({type:"thinking",thinking:R}),s?.onThinkingDelta?.(R),s?.onThinkingEnd?.(R)),{textBlocks:O,toolBlocks:W,thinkingBlocks:$,usage:Bt(y.usage),stopReason:f?.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,n){let o=e.filter(d=>d.type==="text").map(d=>d.text).join(`
13
+ `),r=e.filter(d=>d.type==="tool_use").map(d=>({id:d.id,type:"function",function:{name:d.name,arguments:JSON.stringify(d.input??{})}})),s=e.filter(d=>d.type==="thinking"||d.type==="redacted_thinking").map(d=>d.type==="thinking"?d.thinking:"").filter(Boolean).join(`
14
+
15
+ `),a=e.some(d=>d.type==="thinking"||d.type==="redacted_thinking");if(!o&&r.length===0&&!a)return[];let c;o?c=o:r.length>0?c=null:c="...";let u={role:"assistant",content:c};return r.length>0&&(u.tool_calls=r),this.getEffectiveReplayReasoningContent(n)&&(u.reasoning_content=s||""),[u]}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)if(a.type==="tool_result"){let c;typeof a.content=="string"?c=a.content:c=a.content.map(u=>u.type==="text"?u.text:`[Image at ${u.path}${u.mediaType?` (${u.mediaType})`:""}] (provider does not support image content in tool_result; if the image was previously visible to you in the conversation, refer to it directly via native vision)`).join(`
17
+ `),n.push({role:"tool",tool_call_id:a.tool_use_id,content:c})}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(`
18
+ `);return n?[{role:"system",content:n}]:[]}async convertMessages(e,n){let o=[];for(let r of e){if(r.role==="system"){o.push(...this.serializeSystemMessage(r.content));continue}if(typeof r.content=="string"){o.push({role:r.role,content:r.content});continue}if(r.role==="assistant"){o.push(...this.serializeAssistantMessage(r.content,n));continue}o.push(...await this.serializeUserMessage(r.content))}return o}};import{spawn as In}from"node:child_process";import{Readable as Dn,Writable as Kn}from"node:stream";import it from"node:process";import{ClientSideConnection as Ln,PROTOCOL_VERSION as Nn,ndJsonStream as Bn}from"@agentclientprotocol/sdk";var Re=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=it.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??it.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(c=>c.kind==="allow_once"||c.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??it.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 c=i(()=>{this.client?.cancel({sessionId:n}).catch(()=>{})},"onAbort");o.addEventListener("abort",c),a=a.finally(()=>{o.removeEventListener("abort",c)})}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 z{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 c=[],u=[],d=e[e.length-1],l="";if(d&&typeof d.content=="string")l=d.content;else if(d&&Array.isArray(d.content)){let x=[];for(let y of d.content)if(y.type==="text")x.push(y.text);else if(y.type==="image"){let v=this.serializeImageBlockToPromptToken(y);v&&x.push(v)}l=x.join(`
19
+ `)}let m={...this.acpClientOptions,onSessionUpdate:i(x=>{let y=x.update,v=x.sessionId;if(!("sessionUpdate"in y))return;let f=v?this._activeStreams.get(v):void 0;if(f)switch(y.sessionUpdate){case"agent_message_chunk":if(y.content?.type==="text"){let g=y.content.text;f.output.text+=g,f.streamOptions?.onTextDelta?.(g)}break;case"tool_call":{let g="{}",T=y.arguments??y.parameters;T&&(g=typeof T=="string"?T:JSON.stringify(T)),f.streamOptions?.onToolInputDelta?.(y.title,g);let R=`
20
+ > [Tool Use] ${y.title}: ${g}
21
+ `;f.output.text+=R,f.streamOptions?.onTextDelta?.(R);break}case"tool_call_update":if(y.status){let g=`> [Tool Result] ${y.status}
22
+
23
+ `;f.output.text+=g,f.streamOptions?.onTextDelta?.(g)}break}},"onSessionUpdate")},_=s?.sessionId??"default";this._client||(this._client=new Re(m),await this._client.connect());let k=this._sessionMap.get(_);k||(k=await this._client.createNewSession(),this._sessionMap.set(_,k));let b={text:""};this._activeStreams.set(k,{streamOptions:s,output:b});let p;try{p=await this._client.prompt(l,k,a,{model:s?.modelOverride})}catch(x){if(!(x instanceof Error&&x.name==="AbortError"))throw x}finally{this._activeStreams.delete(k)}return b.text&&c.push({type:"text",text:b.text}),{textBlocks:c,toolBlocks:u,thinkingBlocks:[],usage:Fn(p?.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 rt 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={...rt.env,...this.config.env},s=rt.platform==="win32"&&!this.config.command.endsWith(".cmd")?`${this.config.command}.cmd`:this.config.command,a=Un(s,n,{cwd:this.config.cwd??rt.cwd(),env:o,stdio:["ignore","pipe","pipe"]}),c="";a.stderr?.on("data",l=>{c+=l.toString()});let u=!1,d=i(()=>{u||a.kill("SIGTERM")},"abortHandler");e.signal?.addEventListener("abort",d),a.on("exit",()=>{u=!0});try{yield*this.parseOutputStream(a.stdout,e.signal),c.trim()&&console.error(`[CLIExecutor] stderr: ${c.trim()}`)}finally{e.signal?.removeEventListener("abort",d),u||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(`
24
+ `);o=s.pop()??"";for(let a of s){if(!a.trim())continue;let c=this.parseLine(a.trim());c&&(yield c)}}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 we(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(we,"checkCliCommandInstalled");var Ae=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 we("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 st}from"node:crypto";function Se(t){let e=new Ft,n=new Ft,o=e.readable.getReader(),r=n.writable.getWriter(),s=new TextDecoder,a=new TextEncoder,c="",u=st(),d=new AbortController,l=new Map;(async()=>{try{for(;;){let{done:p,value:x}=await o.read();if(p)break;c+=s.decode(x,{stream:!0});let y=c.split(`
25
+ `);c=y.pop()??"";for(let v of y)if(v.trim())try{let f=JSON.parse(v);_(f).catch(g=>{console.error("[PseudoAcpServer] Failed to handle request:",g)})}catch{console.error("[PseudoAcpServer] Failed to parse message:",v)}}}catch(p){console.error("[PseudoAcpServer] Stream read error:",p)}})();let m=i(async p=>{let x=JSON.stringify(p)+`
26
+ `;await r.write(a.encode(x))},"sendMsg");async function _(p){if(p.method==="initialize")await m({jsonrpc:"2.0",id:p.id,result:{protocolVersion:p.params.protocolVersion,serverInfo:{name:"pseudo-acp-server",version:"1.0.0"},serverCapabilities:{}}});else if(p.method==="session/new"||p.method==="sessions/new")u=p.params?.sessionId??st(),await m({jsonrpc:"2.0",id:p.id,result:{sessionId:u}});else if(p.method==="session/prompt"||p.method==="chat/prompt"){let x=new AbortController,y=p.params.sessionId;l.set(y,x);let v=i(()=>x.abort(),"onGlobalAbort");d.signal.addEventListener("abort",v);let g=await k(y,p.params.prompt,typeof p.params.model=="string"?p.params.model:void 0,x.signal).finally(()=>{l.delete(y),d.signal.removeEventListener("abort",v)});await m({jsonrpc:"2.0",id:p.id,result:g.usage?{stopReason:g.stopReason,usage:g.usage}:{stopReason:g.stopReason}})}else if(p.method==="session/cancel"||p.method==="chat/cancel"){let x=l.get(p.params.sessionId);x&&x.abort(),p.id!==void 0&&await m({jsonrpc:"2.0",id:p.id,result:{}})}else p.id!==void 0&&await m({jsonrpc:"2.0",id:p.id,result:{}})}i(_,"handleRequest");let k=i(async(p,x,y,v)=>{let f=x.find(g=>g.type==="text")?.text??"";try{let g=t.execute({prompt:f,model:y,sessionId:p==="default"?void 0:p,signal:v});for await(let T of g){let R=b(T);if(R&&await m({jsonrpc:"2.0",method:"session/update",params:{sessionId:p,update:R}}),T.type==="complete")return{stopReason:v.aborted?"cancelled":"end_turn",usage:T.usage}}return{stopReason:v.aborted?"cancelled":"end_turn"}}catch(g){return v.aborted||g instanceof Error&&g.name==="AbortError"?{stopReason:"cancelled"}:(console.error("[PseudoAcpServer] Error executing prompt:",g),await m({jsonrpc:"2.0",method:"session/update",params:{sessionId:p,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:`
27
+ [Fatal Error: ${g}]
28
+ `}}}}),{stopReason:"end_turn"})}},"executePrompt"),b=i(p=>{switch(p.type){case"message":if(p.role==="assistant"&&p.content)return{sessionUpdate:"agent_message_chunk",content:{type:"text",text:p.content}};break;case"tool_use":return{sessionUpdate:"tool_call",title:p.toolName,arguments:p.parameters,status:"running",toolCallId:p.toolId||st()};case"tool_result":return{sessionUpdate:"tool_call_update",toolCallId:p.toolId,status:p.status};case"error":return{sessionUpdate:"agent_message_chunk",content:{type:"text",text:`
29
+ [Error: ${p.message}]
30
+ `}};case"complete":break}return null},"mapToAcpNotification");return{inputStream:n.readable,outputStream:e.writable,abort:i(()=>{d.abort(),e.readable.cancel().catch(()=>{}),n.writable.abort().catch(()=>{})},"abort"),executor:t}}i(Se,"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",zn=["gpt-5.4","gpt-5.3-codex","gpt-5.3-codex-spark"],Gn=["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 Vn(){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(Vn,"readCodexConfiguredModel");function Hn(){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(Hn,"readGeminiConfiguredModel");function re(){return Vn()||$n}i(re,"getCodexCliDefaultModel");function se(){return Hn()||jn}i(se,"getGeminiCliDefaultModel");function he(){return $t([re(),...zn])}i(he,"getCodexCliKnownModels");function ye(){return $t([se(),...Gn])}i(ye,"getGeminiCliKnownModels");var at=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"},Oe=class extends oe{static{i(this,"KodaXGeminiCliProvider")}name="gemini-cli";supportsThinking=!1;config={apiKeyEnv:"GEMINI_CLI_API_KEY",model:at,models:Yn.filter(e=>e!==at).map(e=>({id:e,displayName:e})),supportsThinking:!1,reasoningCapability:"prompt-only",contextWindow:1048576};acpClientOptions;constructor(){super();let e=new Ae({model:at});this.acpClientOptions=Se(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 Ie=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 we("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 ct=re(),Qn=he(),De=class extends oe{static{i(this,"KodaXCodexCliProvider")}name="codex-cli";supportsThinking=!1;config={apiKeyEnv:"CODEX_CLI_API_KEY",model:ct,models:Qn.filter(e=>e!==ct).map(e=>({id:e,displayName:e})),supportsThinking:!1,reasoningCapability:"prompt-only",contextWindow:128e3};acpClientOptions;constructor(){super();let e=new Ie({model:ct});this.acpClientOptions=Se(e)}};import qn from"@anthropic-ai/sdk";var jt=se(),Zn=ye(),zt=re(),eo=he(),G={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","deepseek-v4-pro","deepseek-v4-flash","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:zt,models:eo.filter(t=>t!==zt),reasoningCapability:"prompt-only",capabilityProfile:fe}};function X(t,e){let n=G[t];return{apiKeyEnv:n.apiKeyEnv,model:n.model,reasoningCapability:n.reasoningCapability,...e}}i(X,"buildProviderConfig");var lt=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()})}},ut=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"}],supportsThinking:!0,contextWindow:2e5,maxOutputTokens:16e3,thinkingBudgetCap:16e3,streamMaxDurationMs:3e5});constructor(){super(),this.initClient()}},pt=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()}},dt=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()}},mt=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()}},ft=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:"deepseek-v4-pro",displayName:"DeepSeek V4 Pro",contextWindow:1e6},{id:"deepseek-v4-flash",displayName:"DeepSeek V4 Flash",contextWindow:1e6},{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()}},gt=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()}},ht=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()}},yt=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()}},_t=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()}},kt=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"}],supportsThinking:!0,contextWindow:2e5,maxOutputTokens:32768,replayReasoningContent:!0});constructor(){super(),this.initClient()}},U={anthropic:i(()=>new lt,"anthropic"),openai:i(()=>new gt,"openai"),deepseek:i(()=>new ht,"deepseek"),kimi:i(()=>new yt,"kimi"),"kimi-code":i(()=>new pt,"kimi-code"),qwen:i(()=>new _t,"qwen"),zhipu:i(()=>new kt,"zhipu"),"zhipu-coding":i(()=>new ut,"zhipu-coding"),"minimax-coding":i(()=>new dt,"minimax-coding"),"mimo-coding":i(()=>new mt,"mimo-coding"),"ark-coding":i(()=>new ft,"ark-coding"),"gemini-cli":i(()=>new Oe,"gemini-cli"),"codex-cli":i(()=>new De,"codex-cli")},xt=process.env.KODAX_PROVIDER??"zhipu-coding",Gt=new Map;function to(t){if(B(t))return G[t].apiKeyEnv}i(to,"resolveApiKeyEnvForProvider");function Vt(t){let e=t??xt,n=U[e];if(!n)throw new w(`Unknown provider: ${e}. Available: ${Object.keys(U).join(", ")}`,e);let o=to(e),r=o?process.env[o]:void 0,s=Gt.get(e);if(s&&s.apiKey===r)return s.instance;let a=n();return Gt.set(e,{apiKey:r,instance:a}),a}i(Vt,"getProvider");function Ht(t){return B(t)?!!process.env[G[t].apiKeyEnv]:!1}i(Ht,"isProviderConfigured");function Yt(t){return B(t)?G[t].model:null}i(Yt,"getProviderModel");function Jt(t,e){if(!B(t))return"unknown";let n=G[t],o=e??n.model;return n.modelReasoningCapabilities?.[o]??n.reasoningCapability}i(Jt,"getProviderConfiguredReasoningCapability");function Qt(t){return B(t)?F(G[t].capabilityProfile):null}i(Qt,"getProviderConfiguredCapabilityProfile");function qt(){let t=[];for(let e of Object.keys(U)){let n=G[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=G[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 _e(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(_e,"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,replayReasoningContent:t.replayReasoningContent??!1,strictThinkingSignature:t.strictThinkingSignature??!1,streamMaxDurationMs:t.streamMaxDurationMs}}i(oo,"buildProviderConfig");function Ke(t){_e(t);let e=oo(t);return t.protocol==="anthropic"?new vt(t.name,e):new bt(t.name,e)}i(Ke,"createCustomProvider");var vt=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(_e(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,()=>Ke(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 Le(t){let e=Mt.get(t);return e?e():void 0}i(Le,"getCustomProvider");function ce(t){return ae.has(t)}i(ce,"isCustomProviderName");function Ne(){return[...ae.keys()]}i(Ne,"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 H=new Map,io=0;function Ct(t){let e=H.get(t);if(!(!e||e.length===0))return e[e.length-1]}i(Ct,"getActiveRuntimeProviderRegistration");function ro(t){for(let[e,n]of H){let o=n.filter(r=>r.id!==t);if(o.length!==n.length){o.length===0?H.delete(e):H.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=H.get(n)??[];return H.set(n,[...r,o]),()=>{ro(o.id)}}i(on,"registerModelProvider");function Be(t){let e=Ct(t);return e?e.factory():void 0}i(Be,"getRuntimeModelProvider");function Fe(t){return Ct(t)!==void 0}i(Fe,"isRuntimeModelProviderName");function Ue(){return Array.from(H.keys()).filter(t=>Ct(t)!==void 0)}i(Ue,"getRuntimeModelProviderNames");function rn(){H.clear()}i(rn,"clearRuntimeModelProviders");function sn(t){if(B(t))return U[t]();let e=Be(t);if(e)return e;let n=Le(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)||Fe(t)||ce(t)}i(an,"isKnownProvider");function Tt(){let t=Object.keys(U),e=Ue(),n=Ne();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},"deepseek-v4-pro":{inputPer1M:.005,outputPer1M:.015},"deepseek-v4-flash":{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 Rt(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(Rt,"recordUsage");function co(t){let e=0,n=0,o=0,r=0,s=0,a=0,c={},u={};for(let m of t.records){e+=m.cost,n+=m.inputTokens,o+=m.outputTokens,r+=m.cacheReadTokens+m.cacheWriteTokens,s+=m.cacheReadTokens,a+=m.cacheWriteTokens;let _=c[m.provider];c[m.provider]={cost:(_?.cost??0)+m.cost,calls:(_?.calls??0)+1,inputTokens:(_?.inputTokens??0)+m.inputTokens,outputTokens:(_?.outputTokens??0)+m.outputTokens};let k=m.role??"default",b=u[k];u[k]={cost:(b?.cost??0)+m.cost,calls:(b?.calls??0)+1,inputTokens:(b?.inputTokens??0)+m.inputTokens,outputTokens:(b?.outputTokens??0)+m.outputTokens}}let d=0;for(let m of t.retries)d+=m.waitMs;let l=r>0?s/r:0;return{totalCost:e,totalInputTokens:n,totalOutputTokens:o,totalCacheTokens:r,totalCacheReadTokens:s,totalCacheWriteTokens:a,cacheHitRate:l,callCount:t.records.length,retryCount:t.retries.length,retryWaitMs:d,byProvider:c,byRole:u}}i(co,"getSummary");function Xe(t){return t<.01?`$${t.toFixed(4)}`:t<1?`$${t.toFixed(3)}`:`$${t.toFixed(2)}`}i(Xe,"formatCost");function lo(t){let e=[];if(e.push(`Session Cost: ${Xe(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}: ${Xe(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}: ${Xe(s.cost)} (${s.calls} calls)`)}return e.join(`
31
+ `)}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(c=>{o||(o=c),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 c=await t.provider.stream([...t.messages],[],t.system,t.reasoning??{mode:"off"},{modelOverride:t.model},e.signal),u=c.usage??ln,d=c.textBlocks??[],l=c.toolBlocks??[],m=d.map(k=>k.text).join("");if(l.length>0)return{text:m,usage:u,costTracker:t.costTracker,stopReason:"error",error:new Error(`sideQuery: provider returned ${l.length} tool_use block(s); sideQuery expects text-only output`)};let _=t.costTracker;return _&&(_=Rt(_,{provider:t.provider.name,model:t.model,inputTokens:u.inputTokens,outputTokens:u.outputTokens,cacheReadTokens:u.cachedReadTokens,cacheWriteTokens:u.cachedWriteTokens,role:t.querySource})),{text:m,usage:u,costTracker:_,stopReason:mo(c.stopReason)}}catch(c){let u=c instanceof Error?c:new Error(String(c)),d="error";return e.signal.aborted&&(d=o==="timeout"?"timeout":"aborted"),{text:"",usage:ln,costTracker:t.costTracker,stopReason:d,error:u}}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{V as a,w as b,de as c,We as d,$e as e,je as f,J as g,ze as h,un as i,pn as j,wt as k,At as l,Ge as m,Q as n,xe as o,St as p,q,Z as r,Ve as s,Qe as t,qe as u,ee as v,be as w,et as x,yn as y,Me as z,Ce as A,Te as B,z as C,te as D,tt as E,ne as F,nt as G,ge as H,K as I,N as J,re as K,se as L,he as M,ye as N,G as O,U as P,xt as Q,Vt as R,Ht as S,Yt as T,Jt as U,Qt as V,qt as W,Zt as X,B as Y,_e as Z,Ke as _,en as $,Le as aa,ce as ba,Ne as ca,tn as da,nn as ea,on as fa,Be as ga,Fe as ha,Ue as ia,rn as ja,sn as ka,an as la,Tt as ma,cn as na,Et as oa,Pt as pa,so as qa,ao as ra,Rt as sa,co as ta,Xe as ua,lo as va,po as wa};
@@ -1,2 +1,2 @@
1
1
  // @kodax-ai/kodax — bundled distribution. See docs/ADR.md ADR-022 + ADR-024.
2
- import{ja as e}from"./chunk-Z5EBDA6R.js";import{a as n}from"./chunk-V4WSBIXB.js";import{readFile as i}from"fs/promises";var c={enabled:!0,triggerPercent:75};async function g(o){let t=e("config.json");try{let r=await a(t);if(r?.compaction)return{...c,...r.compaction}}catch{}return c}n(g,"loadCompactionConfig");async function a(o){try{let t=await i(o,"utf-8");return JSON.parse(t)}catch{return null}}n(a,"readConfigFile");export{g as a};
2
+ import{ja as e}from"./chunk-CD3R5YBH.js";import{a as n}from"./chunk-V4WSBIXB.js";import{readFile as i}from"fs/promises";var c={enabled:!0,triggerPercent:75};async function g(o){let t=e("config.json");try{let r=await a(t);if(r?.compaction)return{...c,...r.compaction}}catch{}return c}n(g,"loadCompactionConfig");async function a(o){try{let t=await i(o,"utf-8");return JSON.parse(t)}catch{return null}}n(a,"readConfigFile");export{g as a};
@@ -0,0 +1,2 @@
1
+ // @kodax-ai/kodax — bundled distribution. See docs/ADR.md ADR-022 + ADR-024.
2
+ import{rc as A,tc as M}from"./chunk-7JLYVWAF.js";import{ia as O}from"./chunk-CD3R5YBH.js";import{$ as k,S as w,T as S,U as x,V as I,W as L,X as h,aa as m,da as b,ka as R}from"./chunk-HMYEQJGT.js";import{a as i}from"./chunk-V4WSBIXB.js";import a from"fs";import c from"path";import{exec as F,spawnSync as G}from"child_process";import{promisify as V}from"util";import{fileURLToPath as q}from"url";var E="en";function U(){return(process.env.LC_ALL||process.env.LC_MESSAGES||process.env.LANG||"").toLowerCase().startsWith("zh")?"zh":"en"}i(U,"detectSystemLocale");function N(e){if(!e||e==="auto"){E=U();return}E=e.toLowerCase().replace(/[-_].*/,"")==="zh"?"zh":"en"}i(N,"setLocale");var T={en:{"dialog.confirm":"[Confirm]","dialog.select":"[Select]","dialog.input":"[Input]","confirm.instruction.basic":"Press (y) yes, (n) no","confirm.instruction.always":"Press (y) yes, (a) always yes for this tool, (n) no","confirm.instruction.protected":"Press (y) to confirm, (n) to cancel (protected path)","confirm.result.approved":"Approved","confirm.result.approved_always":"Approved (always)","confirm.result.denied":"Denied","tool.bash.title":"Execute bash command?","tool.shell.title":"Execute shell command?","tool.write.title":"Write to file?","tool.edit.title":"Edit file?","tool.generic.title":"Execute {tool}?","field.reason":"Reason","field.intent":"Intent","field.target":"Target","field.scope":"Scope","field.risk":"Risk","field.summary":"Summary","intent.read":"Read project files","intent.delete":"Delete files","intent.deps":"Modify dependencies or environment","intent.modify":"Modify files","intent.execute":"Execute command","intent.write_file":"Write file","intent.edit_file":"Edit file","intent.use_tool":"Use {tool}","risk.destructive":"Destructive change","risk.deps":"May change dependencies or local tools","risk.modify":"May modify files","risk.unknown":"Command effects depend on its arguments","risk.network":"May access network","scope.outside":"Outside project","scope.protected":"Protected path","waiting.confirm":"Waiting: approval required","waiting.select":"Waiting: choose an option","waiting.input":"Waiting: answer the prompt","placeholder.confirm":"Respond to the approval prompt above...","placeholder.select":"Choose an option above...","placeholder.input":"Answer the prompt above...","placeholder.busy":"Agent is busy...","placeholder.queue":"Queue a follow-up for the next round...","placeholder.idle":"Type a message...","select.choice":"Choice:","select.type_number":"(type a number)","select.more":"{count} more choices...","select.more_above":"\u2191 {count} more above","select.more_below":"\u2193 {count} more below","select.confirm_hint":"Press Enter to confirm, Esc to cancel","select.navigate_hint":"Use \u2191\u2193 to navigate, Enter to confirm, Esc to cancel","select.multiselect_hint":"Use \u2191\u2193 to navigate, Space to toggle, Enter to confirm, Esc to cancel","select.multiselect_empty":"Select at least one option with Space before confirming.","select.back_prev":"\u2190 Back to previous question","input.default":"Default:","input.value":"Value:","input.type_response":"(type your response)","managed.completed":"Task completed","managed.completed.blocked":"Task blocked","managed.completed.continuation":"Task needs continuation",cancelled:"[Cancelled] Operation cancelled by user"},zh:{"dialog.confirm":"[\u786E\u8BA4]","dialog.select":"[\u9009\u62E9]","dialog.input":"[\u8F93\u5165]","confirm.instruction.basic":"\u6309 (y) \u786E\u8BA4, (n) \u62D2\u7EDD","confirm.instruction.always":"\u6309 (y) \u786E\u8BA4, (a) \u59CB\u7EC8\u5141\u8BB8\u6B64\u5DE5\u5177, (n) \u62D2\u7EDD","confirm.instruction.protected":"\u6309 (y) \u786E\u8BA4, (n) \u53D6\u6D88 (\u53D7\u4FDD\u62A4\u8DEF\u5F84)","confirm.result.approved":"\u5DF2\u6279\u51C6","confirm.result.approved_always":"\u5DF2\u6279\u51C6 (\u59CB\u7EC8\u5141\u8BB8)","confirm.result.denied":"\u5DF2\u62D2\u7EDD","tool.bash.title":"\u6267\u884C bash \u547D\u4EE4\uFF1F","tool.shell.title":"\u6267\u884C shell \u547D\u4EE4\uFF1F","tool.write.title":"\u5199\u5165\u6587\u4EF6\uFF1F","tool.edit.title":"\u7F16\u8F91\u6587\u4EF6\uFF1F","tool.generic.title":"\u6267\u884C {tool}\uFF1F","field.reason":"\u539F\u56E0","field.intent":"\u610F\u56FE","field.target":"\u76EE\u6807","field.scope":"\u8303\u56F4","field.risk":"\u98CE\u9669","field.summary":"\u6458\u8981","intent.read":"\u8BFB\u53D6\u9879\u76EE\u6587\u4EF6","intent.delete":"\u5220\u9664\u6587\u4EF6","intent.deps":"\u4FEE\u6539\u4F9D\u8D56\u6216\u73AF\u5883","intent.modify":"\u4FEE\u6539\u6587\u4EF6","intent.execute":"\u6267\u884C\u547D\u4EE4","intent.write_file":"\u5199\u5165\u6587\u4EF6","intent.edit_file":"\u7F16\u8F91\u6587\u4EF6","intent.use_tool":"\u4F7F\u7528 {tool}","risk.destructive":"\u7834\u574F\u6027\u53D8\u66F4","risk.deps":"\u53EF\u80FD\u4FEE\u6539\u4F9D\u8D56\u6216\u672C\u5730\u5DE5\u5177","risk.modify":"\u53EF\u80FD\u4FEE\u6539\u6587\u4EF6","risk.unknown":"\u547D\u4EE4\u6548\u679C\u53D6\u51B3\u4E8E\u53C2\u6570","risk.network":"\u53EF\u80FD\u8BBF\u95EE\u7F51\u7EDC","scope.outside":"\u9879\u76EE\u5916\u90E8","scope.protected":"\u53D7\u4FDD\u62A4\u8DEF\u5F84","waiting.confirm":"\u7B49\u5F85\u4E2D\uFF1A\u9700\u8981\u5BA1\u6279","waiting.select":"\u7B49\u5F85\u4E2D\uFF1A\u8BF7\u9009\u62E9","waiting.input":"\u7B49\u5F85\u4E2D\uFF1A\u8BF7\u56DE\u7B54","placeholder.confirm":"\u8BF7\u56DE\u5E94\u4E0A\u65B9\u7684\u5BA1\u6279\u63D0\u793A...","placeholder.select":"\u8BF7\u5728\u4E0A\u65B9\u9009\u62E9\u4E00\u4E2A\u9009\u9879...","placeholder.input":"\u8BF7\u56DE\u7B54\u4E0A\u65B9\u7684\u63D0\u793A...","placeholder.busy":"\u4EE3\u7406\u6B63\u5728\u5DE5\u4F5C\u4E2D...","placeholder.queue":"\u6392\u961F\u7B49\u5F85\u4E0B\u4E00\u8F6E\u8DDF\u8FDB...","placeholder.idle":"\u8F93\u5165\u6D88\u606F...","select.choice":"\u9009\u9879\uFF1A","select.type_number":"(\u8F93\u5165\u7F16\u53F7)","select.more":"\u8FD8\u6709 {count} \u4E2A\u9009\u9879...","select.more_above":"\u2191 \u4E0A\u65B9\u8FD8\u6709 {count} \u4E2A","select.more_below":"\u2193 \u4E0B\u65B9\u8FD8\u6709 {count} \u4E2A","select.confirm_hint":"\u6309 Enter \u786E\u8BA4\uFF0CEsc \u53D6\u6D88","select.navigate_hint":"\u4F7F\u7528 \u2191\u2193 \u5BFC\u822A\uFF0CEnter \u786E\u8BA4\uFF0CEsc \u53D6\u6D88","select.multiselect_hint":"\u4F7F\u7528 \u2191\u2193 \u5BFC\u822A\uFF0C\u7A7A\u683C \u5207\u6362\u9009\u4E2D\uFF0CEnter \u786E\u8BA4\uFF0CEsc \u53D6\u6D88","select.multiselect_empty":"\u8BF7\u5148\u4F7F\u7528\u7A7A\u683C\u9009\u62E9\u81F3\u5C11\u4E00\u4E2A\u9009\u9879\u3002","select.back_prev":"\u2190 \u8FD4\u56DE\u4E0A\u4E00\u9898","input.default":"\u9ED8\u8BA4\u503C\uFF1A","input.value":"\u503C\uFF1A","input.type_response":"(\u8F93\u5165\u4F60\u7684\u56DE\u7B54)","managed.completed":"\u4EFB\u52A1\u5B8C\u6210","managed.completed.blocked":"\u4EFB\u52A1\u53D7\u963B","managed.completed.continuation":"\u4EFB\u52A1\u9700\u8981\u7EE7\u7EED",cancelled:"[\u5DF2\u53D6\u6D88] \u64CD\u4F5C\u5DF2\u88AB\u7528\u6237\u53D6\u6D88"}};function pe(e,t){let o=T[E][e]??T.en[e]??e;if(t)for(let[r,l]of Object.entries(t))o=o.replace(`{${r}}`,String(l));return o}i(pe,"t");var W=V(F),X=O(),Ce=c.join(X,"sessions"),d=c.join(X,"config.json"),we=60,s=null,_=!1,J="dumb";function Q(e){let t=c.basename(e).toLowerCase(),n="__KODAX_SHELL_ENV_START__",o=`printf '%s\\0' '${n}'; env -0`;return t==="fish"?{args:["-i","-c",o],sentinel:n}:{args:t==="bash"||t==="zsh"?["-ic",o]:["-lc",o],sentinel:n}}i(Q,"buildShellEnvCommand");function Y(e,t){let n=`${t}\0`,o=e.lastIndexOf(n);if(o===-1)return{};let r=e.slice(o+n.length),l={};for(let u of r.split("\0")){if(!u)continue;let p=u.indexOf("=");p<=0||(l[u.slice(0,p)]=u.slice(p+1))}return l}i(Y,"parseNullDelimitedShellEnv");function Z(e={}){let t=e.env??process.env;if((e.platform??process.platform)==="win32"||t.KODAX_DISABLE_SHELL_ENV_HYDRATION==="1")return!1;let o=e.shell??t.SHELL;if(!o||!c.isAbsolute(o))return!1;let{args:r,sentinel:l}=Q(o),u=e.run??G,p={...t,TERM:J},f=u(o,r,{encoding:"utf8",env:p,maxBuffer:1024*1024,timeout:5e3,windowsHide:!0,detached:!0,stdio:["ignore","pipe","pipe"]});if(f.status!==0||!f.stdout)return!1;let H=typeof f.stdout=="string"?f.stdout:f.stdout.toString("utf8"),j=Y(H,l),C=!1;for(let[v,z]of Object.entries(j))v!=="TERM"&&t[v]===void 0&&(t[v]=z,C=!0);return C}i(Z,"hydrateProcessEnvFromShell");function ee(){if(!_){_=!0;try{Z()}catch{}}}i(ee,"ensureShellEnvironmentHydrated");function Se(){_=!1}i(Se,"resetShellEnvironmentHydrationForTesting");function te(e){k(e.customProviders??[])}i(te,"registerConfiguredCustomProviders");function $(e){if(!Array.isArray(e))return;let t=e.filter(n=>typeof n=="string").map(n=>n.trim()).filter(n=>n.length>0);return t.length>0?t:[]}i($,"normalizeConfiguredExtensions");function ne(e){if(e.permissionMode!=="default")return e;let t={...e,permissionMode:"accept-edits"};try{a.mkdirSync(c.dirname(d),{recursive:!0}),a.writeFileSync(d,JSON.stringify(t,null,2))}catch{}return t}i(ne,"migrateLegacyPermissionModeInConfig");function oe(){if(s)return s;let e="0.7.42";if(e)return s=e,s;let t=c.join(c.dirname(q(import.meta.url)),"../../package.json");if(a.existsSync(t))try{return s=JSON.parse(a.readFileSync(t,"utf-8")).version??"0.0.0",s??"0.0.0"}catch{}return s="0.0.0",s}i(oe,"getVersion");var xe=oe();function Ie(e){return S(e)}i(Ie,"getProviderModel");function P(e,t){let n=new Set(e.map(r=>r.toLowerCase())),o=[...e];for(let r of t)n.has(r.toLowerCase())||o.push(r);return o}i(P,"mergeModels");function ie(e,t){t||(t=y().providerModels);let n=t?.[e];if(n&&n.length>0){try{let o=h(e);if(o.length>0)return P(n,o)}catch{}try{let o=m(e);if(o)return P(n,o.getAvailableModels())}catch{}return n}try{let o=h(e);if(o.length>0)return o}catch{}try{let o=m(e);if(o)return o.getAvailableModels()}catch{}return[]}i(ie,"getProviderAvailableModels");function re(e,t){let n=x(e,t);if(n!=="unknown")return n;try{let o=m(e);if(o)return o.getReasoningCapability(t)}catch{}return"unknown"}i(re,"getProviderReasoningCapability");function se(e){let t=I(e);if(t)return t;try{return b().find(o=>o.name===e)?.capabilityProfile??null}catch{return null}}i(se,"getProviderCapabilityProfile");function B(e,t){let n=se(e),o=re(e,t);if(n)return{capabilityProfile:n,reasoningCapability:o};try{let r=R(e);return{capabilityProfile:r.getCapabilityProfile(),reasoningCapability:r.getReasoningCapability(t)}}catch{return null}}i(B,"getProviderCapabilityMetadata");function Le(e,t){let n=B(e,t);return n?A({providerName:e,model:t,capabilityProfile:n.capabilityProfile,reasoningCapability:n.reasoningCapability==="unknown"?void 0:n.reasoningCapability}):null}i(Le,"getProviderCapabilitySnapshot");function ae(e,t,n,o){let r=B(e,t);return r?M({providerName:e,model:t,capabilityProfile:r.capabilityProfile,reasoningCapability:r.reasoningCapability==="unknown"?void 0:r.reasoningCapability,reasoningMode:n,hints:o}):null}i(ae,"getProviderPolicyDecision");function ke(e){let t=e.transport==="cli-bridge"?"CLI bridge":"Native API",n=e.conversationSemantics==="last-user-message"?"forwards only the latest user message":"preserves full conversation history",o=e.mcpSupport==="native"?"MCP available":"MCP unavailable";return`${t}; ${n}; ${o}`}i(ke,"describeProviderCapabilitySummary");function Re(e){switch(e){case"native-budget":return"B";case"native-effort":return"E";case"native-toggle":return"T";default:return"-"}}i(Re,"formatReasoningCapabilityShort");function ce(e){switch(e){case"native-budget":return"budget";case"native-effort":return"effort";case"native-toggle":return"toggle";default:return"none"}}i(ce,"describeReasoningCapabilityControl");function Oe(e,t){if(e==="off")return"Reasoning disabled";switch(t){case"native-budget":return"Uses native thinking budget control";case"native-effort":return"Uses native reasoning effort control";case"native-toggle":return"Uses provider-native thinking toggle only";case"none":return"Runs without native reasoning parameters";case"prompt-only":return"Uses prompt overlays only; no native reasoning parameter";default:return"Runs without native reasoning parameters"}}i(Oe,"describeReasoningExecution");function Ae(e){let t=[];e||(e=y().providerModels);for(let n of L())t.push({name:n.name,model:n.model,models:ie(n.name,e),configured:n.capabilityProfile.transport==="cli-bridge"?!0:n.configured,reasoningCapability:n.reasoningCapability,capabilityProfile:n.capabilityProfile});try{let n=b().map(o=>({...o,models:(()=>{let r=e?.[o.name];return r&&r.length>0?P(r,o.models):o.models})()}));t.push(...n)}catch{}return t}i(Ae,"getProviderList");function Me(e){if(w(e))return!0;try{return m(e)?.isConfigured()??!1}catch{return!1}}i(Me,"isProviderConfigured");function y(){try{if(a.existsSync(d)){let e=JSON.parse(a.readFileSync(d,"utf-8")),t=e.reasoningCeiling??e.reasoningMode;return ne({...e,reasoningMode:t,extensions:$(e.extensions)})}}catch{}return{}}i(y,"loadConfig");function le(e){e.streamIdleTimeoutMs&&!process.env.KODAX_STREAM_IDLE_TIMEOUT_MS&&(process.env.KODAX_STREAM_IDLE_TIMEOUT_MS=String(e.streamIdleTimeoutMs))}i(le,"applyResilienceRuntimeEnv");function ue(e){e.repoIntelligenceMode&&!process.env.KODAX_REPO_INTELLIGENCE_MODE&&(process.env.KODAX_REPO_INTELLIGENCE_MODE=e.repoIntelligenceMode),e.repointelEndpoint&&!process.env.KODAX_REPOINTEL_ENDPOINT&&(process.env.KODAX_REPOINTEL_ENDPOINT=e.repointelEndpoint),e.repointelBin&&!process.env.KODAX_REPOINTEL_BIN&&(process.env.KODAX_REPOINTEL_BIN=e.repointelBin),e.repoIntelligenceTrace===!0&&!process.env.KODAX_REPO_INTELLIGENCE_TRACE&&(process.env.KODAX_REPO_INTELLIGENCE_TRACE="1")}i(ue,"applyRepoIntelligenceRuntimeEnv");function Te(){ee();let e=y();return le(e),ue(e),te(e),N(e.locale),e}i(Te,"prepareRuntimeConfig");function Ne(e){let n={...y(),...e},o=$(n.extensions);o!==void 0&&(n.extensions=o);for(let r of Object.keys(e))e[r]===void 0&&delete n[r];a.mkdirSync(c.dirname(d),{recursive:!0}),a.writeFileSync(d,JSON.stringify(n,null,2))}i(Ne,"saveConfig");async function De(){try{let{stdout:e}=await W("git rev-parse --show-toplevel");return e.trim()}catch{return null}}i(De,"getGitRoot");function de(e){switch(e){case"builtin":return"Built-in";case"runtime":return"Runtime extension";case"custom":return"Custom config";default:return"Unknown"}}i(de,"formatProviderSourceKind");function Ke(e){let t=e.transport==="cli-bridge"?"CLI bridge":"Native API",n=e.conversationSemantics==="last-user-message"?"latest-user-message only":"full conversation history";return[`Source: ${de(e.sourceKind)}`,`Transport: ${t}`,`Conversation semantics: ${n}`,`Context fidelity: ${e.contextFidelity}`,`Tool calling: ${e.toolCallingFidelity}`,`Session behavior: ${e.sessionSupport}`,`Long-running support: ${e.longRunningSupport}`,`Evidence-heavy flows: ${e.evidenceSupport}`,`Multimodal support: ${e.multimodalSupport}`,`MCP support: ${e.mcpSupport}`,`Reasoning control: ${ce(e.reasoningCapability)}`]}i(Ke,"formatProviderCapabilityDetailLines");function Xe(e,t,n){return[{label:"General coding",hints:{}},{label:"Evidence-heavy review",hints:{evidenceHeavy:!0}},{label:"Long-running task",hints:{longRunning:!0}}].map(r=>({label:r.label,decision:ae(e,t,n,r.hints)})).filter(r=>r.decision!==null)}i(Xe,"getProviderCommonPolicyScenarios");var D=.5,K=0,g={locked:!1,queue:[]};async function $e(e){for(;g.locked;)await new Promise(t=>g.queue.push(t));g.locked=!0;try{let t=(Date.now()-K)/1e3;t<D&&await new Promise(o=>setTimeout(o,(D-t)*1e3));let n=await e();return K=Date.now(),n}finally{g.locked=!1;let t=g.queue.shift();t&&t()}}i($e,"rateLimitedCall");export{pe as a,X as b,Ce as c,d,we as e,Z as f,Se as g,te as h,oe as i,xe as j,Ie as k,ie as l,re as m,se as n,Le as o,ae as p,ke as q,Re as r,ce as s,Oe as t,Ae as u,Me as v,y as w,Te as x,Ne as y,De as z,de as A,Ke as B,Xe as C,$e as D};
@@ -1,5 +1,5 @@
1
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(`
2
+ import{a as i}from"./chunk-V4WSBIXB.js";import K from"path";var k=new Set;function L(r){let t=r.trim();if(!t)throw new Error("Plugin skill path cannot be empty.");return K.resolve(t)}i(L,"normalizePluginSkillPath");function U(r){let t=L(r);return k.add(t),()=>{k.delete(t)}}i(U,"registerPluginSkillPath");function Y(r){return k.delete(L(r))}i(Y,"unregisterPluginSkillPath");function P(){return Array.from(k.values())}i(P,"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 E(r){let t=q();return{projectPaths:r?[p.join(r,".kodax","skills")]:[],userPaths:[p.join(t,".kodax","skills"),p.join(t,".agents","skills")],pluginPaths:P(),builtinPath:Q()}}i(E,"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 I,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
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
4
  `)}i(tt,"sanitizeYaml");function T(r,t={}){let e=r.replace(/^/,"").replace(/\r\n/g,`
5
5
  `).replace(/\r/g,`
@@ -7,8 +7,7 @@ import{a as i}from"./chunk-V4WSBIXB.js";import W from"path";var k=new Set;functi
7
7
  `)){if(t.throwOnMissing)throw new Error("Invalid markdown: missing YAML frontmatter");return[null,r]}let n=e.indexOf(`
8
8
  ---
9
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};
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 D(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(D,"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 j(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(j,"normalizeYamlHookMap");function C(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:D(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:j(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(C,"parseSkillMarkdown");async function M(r,t){let e=m(r,"SKILL.md");try{let n=await I(e,"utf-8"),{frontmatter:o}=C(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(M,"loadSkillMetadata");async function F(r,t){let e=m(r,"SKILL.md");try{let n=await I(e,"utf-8"),{frontmatter:o,body:s}=C(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(F,"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 I(r.path,"utf-8");return r.content=t,t}i(st,"loadSkillFileContent");import{readdir as it,stat as N}from"fs/promises";import{join as w,dirname as z}from"path";async function x(r,t){let e=new Map,n=[],s={...E(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 N(r)).isDirectory())return e;let o=await it(r);for(let s of o){let l=w(r,s);try{if((await N(l)).isDirectory()){let c=w(l,"SKILL.md");try{if((await N(c)).isFile()){let f=await M(l,t);f&&e.push(f)}}catch{}}}catch{}}}catch{}return e}i(lt,"scanSkillDirectory");function B(r,t){let e=[],n=[".kodax/skills"],o=r,s=z(t);for(;o!==s&&o!=="/"&&o.length>3;){for(let a of n)e.push(w(o,a));let l=z(o);if(l===o)break;o=l}return e}i(B,"getNestedSkillPaths");async function at(r,t){let e=B(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 _(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(_,"parseArguments");var y=class{static{i(this,"VariableResolver")}context;constructor(t){this.context=t}async resolve(t,e){let n=t,o=_(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=await 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}async executeDynamicCommand(t){if(this.context.disableDynamicContext)throw new Error("Dynamic context disabled by host. Skill `!`cmd`` blocks are not allowed in this environment.");if(this.context.executeDynamicContext){let e=await this.context.executeDynamicContext(t,this.context.workingDirectory);return typeof e=="string"?e.trim():""}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 F(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. Invoke it via the `skill` tool with the skill name.',"","**BLOCKING REQUIREMENT**: When a skill matches the user's request, you MUST invoke it via the `skill` tool 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 calling the `skill` tool. Do not guess at skill names \u2014 only use skills listed below. Do NOT call `read` on a `SKILL.md` path to load a skill \u2014 that is the legacy path and bypasses the resolver.",""];for(let n of t){let o=n.argumentHint?` ${n.argumentHint}`:"";e.push(`- ${n.name}:${o} ${n.description}`)}return e.push(""),e.join(`
11
+ `)}has(t){return this.skillsByName.has(t)}get size(){return this.skillsByName.size}},g=null,R;function b(r,t){return g&&r!==void 0&&R!==r&&(g=null),g||(g=new v(r,t),R=r),g}i(b,"getSkillRegistry");async function pt(r,t){let e=b(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=b();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(`
12
+ `)}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 W(r){return r.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;")}i(W,"escapeXml");function yt(r,t,e){let n=[];return n.push(`<skill name="${W(r.name)}" location="${W(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(`
13
+ `)}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,P as c,H as d,E as e,A as f,T as g,D as h,j as i,C as j,M as k,F as l,st as m,x as n,B as o,at as p,_ as q,y as r,dt as s,d as t,v as u,b as v,pt as w,ht as x,S as y,gt as z,kt as A,St as B,wt as C};