@kodax-ai/kodax 0.7.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1350 -0
- package/LICENSE +191 -0
- package/README.md +1170 -0
- package/README_CN.md +659 -0
- package/dist/acp_events.d.ts +109 -0
- package/dist/acp_logger.d.ts +20 -0
- package/dist/acp_server.d.ts +92 -0
- package/dist/builtin/code-review/SKILL.md +63 -0
- package/dist/builtin/git-workflow/SKILL.md +84 -0
- package/dist/builtin/skill-creator/SKILL.md +122 -0
- package/dist/builtin/skill-creator/agents/analyzer.md +12 -0
- package/dist/builtin/skill-creator/agents/comparator.md +13 -0
- package/dist/builtin/skill-creator/agents/grader.md +13 -0
- package/dist/builtin/skill-creator/references/schemas.md +227 -0
- package/dist/builtin/skill-creator/scripts/aggregate-benchmark.d.ts +46 -0
- package/dist/builtin/skill-creator/scripts/aggregate-benchmark.js +209 -0
- package/dist/builtin/skill-creator/scripts/analyze-benchmark.d.ts +46 -0
- package/dist/builtin/skill-creator/scripts/analyze-benchmark.js +289 -0
- package/dist/builtin/skill-creator/scripts/compare-runs.d.ts +62 -0
- package/dist/builtin/skill-creator/scripts/compare-runs.js +333 -0
- package/dist/builtin/skill-creator/scripts/generate-review.d.ts +33 -0
- package/dist/builtin/skill-creator/scripts/generate-review.js +415 -0
- package/dist/builtin/skill-creator/scripts/grade-evals.d.ts +73 -0
- package/dist/builtin/skill-creator/scripts/grade-evals.js +405 -0
- package/dist/builtin/skill-creator/scripts/improve-description.d.ts +23 -0
- package/dist/builtin/skill-creator/scripts/improve-description.js +161 -0
- package/dist/builtin/skill-creator/scripts/init-skill.d.ts +14 -0
- package/dist/builtin/skill-creator/scripts/init-skill.js +153 -0
- package/dist/builtin/skill-creator/scripts/install-skill.d.ts +29 -0
- package/dist/builtin/skill-creator/scripts/install-skill.js +176 -0
- package/dist/builtin/skill-creator/scripts/package-skill.d.ts +38 -0
- package/dist/builtin/skill-creator/scripts/package-skill.js +124 -0
- package/dist/builtin/skill-creator/scripts/quick-validate.d.ts +8 -0
- package/dist/builtin/skill-creator/scripts/quick-validate.js +166 -0
- package/dist/builtin/skill-creator/scripts/run-eval.d.ts +66 -0
- package/dist/builtin/skill-creator/scripts/run-eval.js +356 -0
- package/dist/builtin/skill-creator/scripts/run-loop.d.ts +49 -0
- package/dist/builtin/skill-creator/scripts/run-loop.js +243 -0
- package/dist/builtin/skill-creator/scripts/run-trigger-eval.d.ts +58 -0
- package/dist/builtin/skill-creator/scripts/run-trigger-eval.js +225 -0
- package/dist/builtin/skill-creator/scripts/utils.js +273 -0
- package/dist/builtin/tdd/SKILL.md +56 -0
- package/dist/chunks/chunk-4E76FLZ3.js +2 -0
- package/dist/chunks/chunk-7LQ2NCHF.js +1221 -0
- package/dist/chunks/chunk-HUAU4KB3.js +2 -0
- package/dist/chunks/chunk-N2VZ2MJF.js +11 -0
- package/dist/chunks/chunk-SF7WD7E5.js +2 -0
- package/dist/chunks/chunk-SONW6AC7.js +14 -0
- package/dist/chunks/chunk-WEEQZYZS.js +460 -0
- package/dist/chunks/chunk-XI75LZIO.js +30 -0
- package/dist/chunks/compaction-config-YL4SWWII.js +2 -0
- package/dist/chunks/construction-bootstrap-XSE7ZABG.js +5 -0
- package/dist/chunks/devtools-MOFU7YQF.js +2 -0
- package/dist/chunks/dist-AMUYI7R5.js +2 -0
- package/dist/chunks/dist-WKW4CBG6.js +2 -0
- package/dist/chunks/utils-3HW4KOGE.js +2 -0
- package/dist/cli_commands.d.ts +17 -0
- package/dist/cli_option_helpers.d.ts +49 -0
- package/dist/cli_option_helpers.test.d.ts +1 -0
- package/dist/constructed_cli.d.ts +82 -0
- package/dist/constructed_cli.test.d.ts +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +9 -0
- package/dist/kodax_cli.d.ts +7 -0
- package/dist/kodax_cli.js +1882 -0
- package/dist/sdk-agent.d.ts +15 -0
- package/dist/sdk-agent.js +2 -0
- package/dist/sdk-coding.d.ts +20 -0
- package/dist/sdk-coding.js +2 -0
- package/dist/sdk-llm.d.ts +15 -0
- package/dist/sdk-llm.js +2 -0
- package/dist/sdk-repl.d.ts +21 -0
- package/dist/sdk-repl.js +2 -0
- package/dist/sdk-skills.d.ts +16 -0
- package/dist/sdk-skills.js +2 -0
- package/dist/self_modify_cli.d.ts +81 -0
- package/dist/self_modify_cli.test.d.ts +9 -0
- package/dist/skill_cli.d.ts +15 -0
- package/dist/skill_cli.test.d.ts +1 -0
- package/package.json +143 -0
- package/scripts/kodax-bin.cjs +27 -0
- package/scripts/production-env.cjs +16 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// @kodax-ai/kodax — bundled distribution. See docs/ADR.md ADR-022 + ADR-024.
|
|
2
|
+
import{a as i}from"./chunk-4E76FLZ3.js";var G=class extends Error{static{i(this,"KodaXError")}code;constructor(e,n="KODAX_ERROR"){super(e),this.code=n,this.name="KodaXError"}},R=class extends G{static{i(this,"KodaXProviderError")}provider;constructor(e,n){super(e,"PROVIDER_ERROR"),this.provider=n,this.name="KodaXProviderError"}},pe=class extends G{static{i(this,"KodaXRateLimitError")}retryAfter;constructor(e,n){super(e,"RATE_LIMIT_ERROR"),this.retryAfter=n,this.name="KodaXRateLimitError"}},Be=class extends G{static{i(this,"KodaXNetworkError")}isTimeout;constructor(e,n=!1){super(e,"NETWORK_ERROR"),this.isTimeout=n,this.name="KodaXNetworkError"}},Fe=class extends G{static{i(this,"KodaXToolCallIdError")}constructor(e){super(e,"TOOL_CALL_ID_ERROR"),this.name="KodaXToolCallIdError"}};var Ue=32768,J=32e3,Xe=64e3,ln=.5;var un=["off","auto","quick","balanced","deep"],Rt={low:6e3,medium:1e4,high:2e4},At=4096;function We(t){return t.reasoningCapability?t.reasoningCapability:t.supportsThinking?"native-toggle":"prompt-only"}i(We,"getReasoningCapability");function Q(t){return _e(t).enabled}i(Q,"isReasoningEnabled");function _e(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??Ot(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(_e,"normalizeReasoningRequest");function Ot(t){switch(t){case"quick":return"low";case"balanced":case"auto":return"medium";case"deep":return"high";default:return"off"}}i(Ot,"getDefaultThinkingDepthForMode");function q(t,e,n="unknown"){if(e==="off")return 0;let o={...Rt,...t.defaultThinkingBudgets??{}},s=t.taskBudgetOverrides?.[n]?.[e]??o[e];return t.thinkingBudgetCap?Math.min(s,t.thinkingBudgetCap):s}i(q,"resolveThinkingBudget");function Z(t,e,n=At){let o=Math.max(1024,e-n);return Math.max(1024,Math.min(t,o))}i(Z,"clampThinkingBudget");function $e(t){switch(t){case"low":return"low";case"medium":return"medium";case"high":return"high";default:return}}i($e,"mapDepthToOpenAIReasoningEffort");import ke from"fs";import dn from"os";import Ge from"path";var je=null;function pn(t){return t==="budget"||t==="effort"||t==="toggle"||t==="none"}i(pn,"isReasoningOverride");function mn(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(pn)}i(mn,"isStoredConfig");function fn(){return process.env.KODAX_HOME??Ge.join(dn.homedir(),".kodax")}i(fn,"getKodaxDir");function St(){return process.env.KODAX_CONFIG_FILE??Ge.join(fn(),"config.json")}i(St,"getConfigFilePath");function ze(t,e){return je={filePath:t,config:e},e}i(ze,"updateStoredConfigCache");function gn(t){let e=JSON.parse(ke.readFileSync(t,"utf-8"));return mn(e)?e:{}}i(gn,"readStoredConfigFromDisk");function He(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(He,"reasoningCapabilityToOverride");function Ve(t){switch(t){case"budget":return"native-budget";case"effort":return"native-effort";case"toggle":return"native-toggle";default:return"none"}}i(Ve,"reasoningOverrideToCapability");function ee(t,e,n){return[t,e.baseUrl??"",n??e.model].join("|")}i(ee,"buildReasoningOverrideKey");function Ye(){let t=St();if(je?.filePath===t)return je.config;try{if(ke.existsSync(t))return ze(t,gn(t))}catch{}return ze(t,{})}i(Ye,"loadStoredConfig");function Dt(t){let e=St();try{ke.mkdirSync(Ge.dirname(e),{recursive:!0}),ke.writeFileSync(e,JSON.stringify(t,null,2)),ze(e,t)}catch(n){process.env.KODAX_DEBUG_OVERRIDES&&console.error("[ReasoningOverride] Failed to save config:",n)}}i(Dt,"saveStoredConfig");function xe(t,e,n){let o=Ye(),r=ee(t,e,n);return o.providerReasoningOverrides?.[r]}i(xe,"loadReasoningOverride");function Je(t,e,n,o){let r=Ye(),s=ee(t,e,o);r.providerReasoningOverrides={...r.providerReasoningOverrides??{},[s]:n},Dt(r)}i(Je,"saveReasoningOverride");function hn(t,e,n){let o=Ye(),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,Dt(o)}i(hn,"clearReasoningOverride");function It(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(It,"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 yn(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(yn,"parseHttpDate");function ve(t,e){let n=e.baseBackoffMs??1e3,o=e.maxBackoffMs??3e4,r=e.maxHeaderWaitMs??12e4,s=e.now?e.now():Date.now(),a=Kt(It(t,"retry-after-ms"));if(a!==void 0){let _=Math.min(a,r);return{type:"header",waitMs:Math.round(_),source:"retry-after-ms",cappedFromHeader:_!==a}}let l=It(t,"retry-after");if(l!==void 0&&l.trim().length>0){let _=Kt(l);if(_!==void 0){let x=_*1e3,u=Math.min(x,r);return{type:"header",waitMs:Math.round(u),source:"retry-after-seconds",cappedFromHeader:u!==x}}let b=yn(l,s);if(b!==void 0){let x=Math.min(b,r);return{type:"header",waitMs:Math.round(x),source:"retry-after-date",cappedFromHeader:x!==b}}}let c=n*Math.pow(2,Math.max(0,e.attempt)),m=Math.min(c,o),f=e.withJitter!==!1?Math.random()*.25*m:0;return{type:"backoff",waitMs:Math.round(m+f),source:"exponential-backoff",attempt:e.attempt}}i(ve,"parseRetryAfter");function be(t){if(!t||typeof t!="object")return;let e=t;return e.headers??e.response?.headers??e.cause?.headers??e.cause?.response?.headers}i(be,"extractHeadersFromError");var A={transport:"native-api",conversationSemantics:"full-history",mcpSupport:"none",contextFidelity:"full",toolCallingFidelity:"full",sessionSupport:"full",longRunningSupport:"full",multimodalSupport:"none",evidenceSupport:"full"},Qe={...A,multimodalSupport:"image-input"},me={transport:"cli-bridge",conversationSemantics:"last-user-message",mcpSupport:"none",contextFidelity:"lossy",toolCallingFidelity:"limited",sessionSupport:"stateless",longRunningSupport:"limited",multimodalSupport:"none",evidenceSupport:"limited"};function Me(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(Me,"normalizeCapabilityProfile");function H(t){return{...Me(t)}}i(H,"cloneCapabilityProfile");function _n(t){if(!t)return;let e=parseInt(t,10);return Number.isFinite(e)&&e>0?e:void 0}i(_n,"parseEnvInt");var j=class{static{i(this,"KodaXBaseProvider")}maxOutputTokensOverride;setMaxOutputTokensOverride(e){this.maxOutputTokensOverride=e}getEffectiveMaxOutputTokens(e){if(this.maxOutputTokensOverride!==void 0)return this.maxOutputTokensOverride;let n=_n(process.env.KODAX_MAX_OUTPUT_TOKENS);if(n!==void 0)return n;let o=this.getModelDescriptor(e)?.maxOutputTokens;return o!==void 0?o:this.config.maxOutputTokens??32768}getStreamMaxDurationMs(){return this.config.streamMaxDurationMs}supportsNonStreamingFallback(){return!1}async complete(e,n,o,r,s,a){throw new R(`${this.name} does not support non-streaming fallback`)}isConfigured(){return!!process.env[this.config.apiKeyEnv]}getModel(){return this.config.model}getAvailableModels(){return this.config.models?.length?[...new Set([this.config.model,...this.config.models.map(e=>e.id)])]:[this.config.model]}getModelDescriptor(e){return!e||e===this.config.model?{id:this.config.model}:this.config.models?.find(n=>n.id===e)}getBaseUrl(){return this.config.baseUrl}getApiKeyEnv(){return this.config.apiKeyEnv}getCapabilityProfile(){return H(this.config.capabilityProfile??A)}getConfiguredReasoningCapability(e){let n=this.getModelDescriptor(e);return n?.reasoningCapability?n.reasoningCapability:We(this.config)}getReasoningCapability(e){let n=xe(this.name,this.config,e);return n?Ve(n):this.getConfiguredReasoningCapability(e)}getReasoningOverride(e){return xe(this.name,this.config,e)}getReasoningOverrideKey(e){return ee(this.name,this.config,e)}persistReasoningCapabilityOverride(e,n){let o=He(e);o&&Je(this.name,this.config,o,n)}shouldFallbackForReasoningError(e,...n){let o=e instanceof Error?e.message.toLowerCase():String(e).toLowerCase(),s=n.map(l=>l.toLowerCase()).some(l=>o.includes(l)),a=o.includes("parameter")||s;return o.includes("unknown parameter")||o.includes("invalid parameter")||o.includes("unsupported")&&a}shouldFallbackForSpecificReasoningError(e,...n){let o=e instanceof Error?e.message.toLowerCase():String(e).toLowerCase();return n.map(a=>a.toLowerCase()).some(a=>o.includes(a))?o.includes("unknown parameter")||o.includes("invalid parameter")||o.includes("unsupported"):!1}getReasoningFallbackChain(e){switch(e){case"native-budget":return["native-budget","native-toggle","none"];case"native-effort":return["native-effort","none"];case"native-toggle":return["native-toggle","none"];default:return["none"]}}getContextWindow(){return this.getEffectiveContextWindow()}getEffectiveContextWindow(e){let n=this.getModelDescriptor(e)?.contextWindow;return n!==void 0?n:this.config.contextWindow??2e5}getApiKey(){let e=process.env[this.config.apiKeyEnv];if(!e)throw new Error(`${this.config.apiKeyEnv} not set`);return e}shouldLogStreamDiagnostics(){return!!process.env.KODAX_DEBUG_STREAM}logStreamDiagnostic(...e){this.shouldLogStreamDiagnostics()&&console.error(...e)}normalizeReasoning(e){return _e(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=be(e);if(!n)return;let o=ve(n,{attempt:0,withJitter:!1});return o.type==="header"?o.waitMs:void 0}parseContextOverflow(e){let n=String(e?.message??""),o=[/(\d[\d,]*)\s*tokens?.*?(\d[\d,]*)\s*(?:maximum|limit|context)/i,/maximum.*?(\d[\d,]*)\s*tokens?.*?requested.*?(\d[\d,]*)/i,/exceeds?\s+.*?(\d[\d,]*)\s*.*?(?:limit|max|上限).*?(\d[\d,]*)/i];for(let r of o){let s=n.match(r);if(s){let a=Number(s[1].replace(/,/g,"")),l=Number(s[2].replace(/,/g,"")),c=Math.min(a,l),m=Math.max(a,l);return Math.max(3e3,m-c-1e3)}}}isContextOverflowError(e){let n=String(e?.message??"").toLowerCase();return n.includes("prompt is too long")||n.includes("prompt too long")||n.includes("context length")||n.includes("context_length_exceeded")||n.includes("context window")||n.includes("\u4E0A\u4E0B\u6587\u957F\u5EA6")}async withRateLimit(e,n,o=3,r,s){for(let a=0;a<o;a++)try{let l=await e();return this.maxOutputTokensOverride=void 0,l}catch(l){if(this.isContextOverflowError(l)&&!this.maxOutputTokensOverride){let c=this.parseContextOverflow(l);if(c){this.maxOutputTokensOverride=c,r?.(a+1,o,0);continue}}if(this.isRateLimitError(l)){if(a===o-1)throw new pe(`API rate limit exceeded after ${o} retries. Please wait and try again later.`,6e4);let c=be(l)??{},m=ve(c,{attempt:a,baseBackoffMs:500,maxBackoffMs:32e3,withJitter:!0}),v=m.waitMs,f=this.classifyRateLimitReason(l);if(s?.({provider:this.name,waitMs:v,reason:f,source:m.source,attempt:a+1,maxAttempts:o}),r?r(a+1,o,v):s||console.log(`[Rate Limit] Retrying in ${v/1e3}s (${a+1}/${o})...`),n?.aborted)throw new DOMException("Request aborted","AbortError");if(await new Promise(_=>setTimeout(_,v)),n?.aborted)throw new DOMException("Request aborted","AbortError");continue}if(l instanceof Error){if((l.name==="AbortError"||l.name==="APIUserAbortError")&&n?.aborted)throw l.name==="AbortError"?l:new DOMException(l.message||"Request aborted","AbortError");let c=l?.cause?.code??l?.code??"";throw(c==="ECONNRESET"||c==="EPIPE")&&this.onStaleConnection(),new R(`${this.name} API error: ${l.message}`,this.name)}throw l}throw new G("Unexpected end of withRateLimit")}};import Mn from"@anthropic-ai/sdk";import{parse as kn}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=kn(t);return process.env.KODAX_DEBUG_TOOL_STREAM&&console.warn("[Tool Block Salvaged] partial JSON recovered, rawLength=",t.length),e&&typeof e=="object"&&!Array.isArray(e)?e:{}}catch{return{}}}i(te,"parseToolInputWithSalvage");function qe(t,e){let n=t[t.length-1];if(n&&ne(n)&&n.hint===e)return t;let o=e?{type:"cache-boundary",hint:e}:{type:"cache-boundary"};return[...t,o]}i(qe,"insertCacheBoundary");function ne(t){if(typeof t!="object"||t===null||t.type!=="cache-boundary")return!1;let e=Object.keys(t);return e.length<=2&&e.every(n=>n==="type"||n==="hint")}i(ne,"isCacheBoundary");function Ze(t,e){let n=[];for(let o of t){if(ne(o)){if(e==="attach"&&n.length>0){let r=n[n.length-1];n[n.length-1]={...r,cache_control:{type:"ephemeral"}}}continue}n.push(o)}return n}i(Ze,"lowerCacheBoundaries");function fe(t){return t.filter(e=>!ne(e))}i(fe,"stripCacheBoundaries");import{readFile as xn}from"node:fs/promises";import vn from"node:path";var bn={".gif":"image/gif",".jpeg":"image/jpeg",".jpg":"image/jpeg",".png":"image/png",".webp":"image/webp"};function et(t,e){return e??bn[vn.extname(t).toLowerCase()]??"image/png"}i(et,"resolveImageMediaType");async function tt(t){return(await xn(t)).toString("base64")}i(tt,"readImageFileAsBase64");async function Nt(t,e){let n=et(t,e),o=await tt(t);return`data:${n};base64,${o}`}i(Nt,"buildImageDataUrl");var Cn="KodaX";function Tn(t){return t.userAgentMode==="sdk"?void 0:{"User-Agent":Cn}}i(Tn,"getAnthropicCompatDefaultHeaders");function nt(t,e){if(!t)return e;let n=t.input_tokens!==void 0&&t.input_tokens!==null||t.cache_creation_input_tokens!==void 0&&t.cache_creation_input_tokens!==null||t.cache_read_input_tokens!==void 0&&t.cache_read_input_tokens!==null,o=typeof t.input_tokens=="number"?t.input_tokens:n?0:e?.inputTokens??0,r=typeof t.cache_creation_input_tokens=="number"?t.cache_creation_input_tokens:n?0:e?.cachedWriteTokens??0,s=typeof t.cache_read_input_tokens=="number"?t.cache_read_input_tokens:n?0:e?.cachedReadTokens??0,a=typeof t.output_tokens=="number"?t.output_tokens:e?.outputTokens??0,l=n?o+r+s:e?.inputTokens??0;if(![l,a].some(c=>!Number.isFinite(c)||c<0))return{inputTokens:l,outputTokens:a,totalTokens:l+a,cachedReadTokens:s||void 0,cachedWriteTokens:r||void 0}}i(nt,"normalizeAnthropicUsage");var N=class extends j{static{i(this,"KodaXAnthropicCompatProvider")}supportsThinking=!0;client;initClient(){let e=Tn(this.config);this.client=new Mn({apiKey:this.getApiKey(),baseURL:this.config.baseUrl,...e?{defaultHeaders:e}:{}})}onStaleConnection(){this.initClient()}applyCacheControlToSystem(e){if(!e.trim()||process.env.KODAX_DISABLE_PROMPT_CACHE==="1")return e;let n=qe([{type:"text",text:e}],"system");return Ze(n,"attach")}applyCacheControlToTools(e){if(e.length===0||process.env.KODAX_DISABLE_PROMPT_CACHE==="1")return e;let n=e.slice(),o=n[n.length-1];return n[n.length-1]={...o,cache_control:{type:"ephemeral"}},n}async stream(e,n,o,r,s,a){return this.withRateLimit(async()=>{let l=this.normalizeReasoning(r),c=s?.modelOverride??this.config.model,m=this.getEffectiveMaxOutputTokens(c),v=await this.convertMessages(e),f=l.enabled?this.getReasoningCapability(c):"none",_=l.enabled?this.getReasoningFallbackChain(f).filter(k=>k==="native-budget"||k==="native-toggle"||k==="none"):["none"],b=i(k=>{let P={model:c,max_tokens:m,system:this.applyCacheControlToSystem(this.buildSystemPrompt(o,e)),messages:v,tools:this.applyCacheControlToTools(n),stream:!0};if(k==="native-budget"){let S=q(this.config,l.depth,l.taskType);P.thinking={type:"enabled",budget_tokens:Z(S,m)}}else k==="native-toggle"&&(P.thinking={type:"enabled"});return P},"buildRequest");if(a?.aborted)throw new DOMException("Request aborted","AbortError");let x=[],u=[],h=[],y,M=null,d="",p="",T="",w="",X="",D="",W="",E=!1,$,O=Date.now(),ye=Date.now(),le,ue;for(let k of _)try{le=await this.client.messages.create(b(k),a?{signal:a}:{}),k!==f&&this.persistReasoningCapabilityOverride(k,c);break}catch(P){ue=P;let S=k==="native-budget"?["budget_tokens","thinking"]:k==="native-toggle"?["thinking"]:[];if(!this.shouldFallbackForReasoningError(P,...S))throw P}if(!le)throw ue??new R("All reasoning capability attempts failed without a captured error",this.name);let de=Date.now(),C=0,I=0,K=3e4;for await(let k of le){if(a?.aborted)throw new DOMException("Request aborted","AbortError");let P=Date.now(),S=P-de;if(S>K&&(C++,I+=S,this.logStreamDiagnostic(`[Stream] stall detected: ${Math.round(S/1e3)}s gap before ${k.type}`,{stallCount:C,totalStallMs:I,eventType:k.type})),de=P,k.type==="content_block_start"||k.type==="content_block_stop"?s?.onHeartbeat?.(!0):s?.onHeartbeat?.(),k.type==="content_block_start"){O=Date.now();let g=k.content_block;M=g.type,process.env.KODAX_DEBUG_TOOL_STREAM&&g.type==="tool_use"&&console.error("[ToolStream] content_block_start:",{type:g.type,id:g.id,name:g.name}),g.type==="thinking"?(p="",T=g.signature??""):g.type==="redacted_thinking"?(M="redacted_thinking",w=g.data??""):g.type==="text"?d="":g.type==="tool_use"&&(X=g.id,D=g.name,W="")}else if(k.type==="content_block_delta"){O=Date.now();let g=k.delta;g.type==="thinking_delta"?(p+=g.thinking??"",s?.onThinkingDelta?.(g.thinking??"")):g.type==="text_delta"?(d+=g.text??"",s?.onTextDelta?.(g.text??"")):g.type==="input_json_delta"&&(W+=g.partial_json??"",s?.onToolInputDelta?.(D,g.partial_json??"",X?{toolId:X}:void 0))}else if(k.type==="content_block_stop")O=Date.now(),M==="thinking"?p&&(h.push({type:"thinking",thinking:p,signature:T}),s?.onThinkingEnd?.(p)):M==="redacted_thinking"?(w&&h.push({type:"redacted_thinking",data:w}),w=""):M==="text"?d&&x.push({type:"text",text:d}):M==="tool_use"&&(!X||!D?console.error("[Tool Block Invalid] Missing tool id or name:",{id:JSON.stringify(X),name:JSON.stringify(D),input:W.slice(0,100)}):u.push({type:"tool_use",id:X,name:D,input:te(W)})),M=null;else if(k.type==="message_stop"){if(E=!0,O=Date.now(),process.env.KODAX_DEBUG_STREAM){let g=Date.now()-ye;this.logStreamDiagnostic(`[Stream] message_stop received after ${g}ms`)}}else if(k.type==="message_delta"){O=Date.now(),y=nt(k.usage,y);let g=k.delta;g?.stop_reason&&($=g.stop_reason,process.env.KODAX_DEBUG_STREAM&&this.logStreamDiagnostic(`[Stream] message_delta with stop_reason: ${$}`))}else k.type==="message_start"&&(O=Date.now(),y=nt(k.message?.usage,y),process.env.KODAX_DEBUG_STREAM&&this.logStreamDiagnostic("[Stream] message_start received"))}if(!E){let k=Date.now()-ye,P=Date.now()-O;if(a?.aborted){let g=a.reason instanceof Error?a.reason.message:typeof a.reason=="string"?a.reason:"Request aborted";throw this.logStreamDiagnostic("[Stream] Stream ended after abort before message_stop:",{duration:k,lastEventAge:P,reason:g,textBlocks:x.length,toolBlocks:u.length,thinkingBlocks:h.length}),new DOMException(g,"AbortError")}let S=new Error(`Stream incomplete: message_stop event not received. Duration: ${k}ms, Last event: ${P}ms ago. This may indicate a network disconnection or API timeout.`);throw S.name="StreamIncompleteError",this.logStreamDiagnostic("[Stream] Incomplete stream detected:",{duration:k,lastEventAge:P,textBlocks:x.length,toolBlocks:u.length,thinkingBlocks:h.length}),S}return{textBlocks:x,toolBlocks:u,thinkingBlocks:h,usage:y,stopReason:$}},a,3,s?.onRateLimit,s?.onRetryAfter)}supportsNonStreamingFallback(){return!0}async complete(e,n,o,r,s,a){return this.withRateLimit(async()=>{let l=this.normalizeReasoning(r),c=s?.modelOverride??this.config.model,m=this.getEffectiveMaxOutputTokens(c),v=await this.convertMessages(e),f=l.enabled?this.getReasoningCapability(c):"none",_=l.enabled?this.getReasoningFallbackChain(f).filter(d=>d==="native-budget"||d==="native-toggle"||d==="none"):["none"],b=i(d=>{let p={model:c,max_tokens:m,system:this.applyCacheControlToSystem(this.buildSystemPrompt(o,e)),messages:v,tools:this.applyCacheControlToTools(n)};if(d==="native-budget"){let T=q(this.config,l.depth,l.taskType);p.thinking={type:"enabled",budget_tokens:Z(T,m)}}else d==="native-toggle"&&(p.thinking={type:"enabled"});return p},"buildRequest"),x,u;for(let d of _)try{x=await this.client.messages.create(b(d),a?{signal:a}:{}),d!==f&&this.persistReasoningCapabilityOverride(d,c);break}catch(p){u=p;let T=d==="native-budget"?["budget_tokens","thinking"]:d==="native-toggle"?["thinking"]:[];if(!this.shouldFallbackForReasoningError(p,...T))throw p}if(!x)throw u??new R("All reasoning capability attempts failed without a captured error",this.name);let h=[],y=[],M=[];for(let d of x.content)d.type==="text"?(h.push({type:"text",text:d.text}),s?.onTextDelta?.(d.text)):d.type==="thinking"?(M.push({type:"thinking",thinking:d.thinking,signature:d.signature??""}),s?.onThinkingDelta?.(d.thinking),s?.onThinkingEnd?.(d.thinking)):d.type==="redacted_thinking"?M.push({type:"redacted_thinking",data:d.data}):d.type==="tool_use"&&y.push({type:"tool_use",id:d.id,name:d.name,input:typeof d.input=="object"&&d.input!==null?d.input:{}});return{textBlocks:h,toolBlocks:y,thinkingBlocks:M,usage:nt(x.usage),stopReason:x.stop_reason??void 0}},a,3,s?.onRateLimit,s?.onRetryAfter)}serializeSystemMessageContent(e){if(typeof e=="string")return e.trim();for(let n of e)if(ne(n))throw new R("cache-boundary marker reached system message serialization unlowered. Provider base class lowering must run before any wire-level serialization.",this.name);return e.filter(n=>n.type==="text").map(n=>n.text.trim()).filter(Boolean).join(`
|
|
3
|
+
`)}buildSystemPrompt(e,n){let o=n.filter(r=>r.role==="system").map(r=>this.serializeSystemMessageContent(r.content)).filter(Boolean);return[e,...o].filter(r=>typeof r=="string"&&r.trim().length>0).join(`
|
|
4
|
+
|
|
5
|
+
`)}async convertMessages(e){let n=[];for(let o of e.filter(r=>r.role!=="system")){let r=o.role==="user"?"user":"assistant";if(typeof o.content=="string"){n.push({role:r,content:o.content});continue}let s=[],a=[];for(let c of o.content)c.type==="thinking"?!this.config.strictThinkingSignature||typeof c.signature=="string"&&c.signature.length>0?s.push({type:"thinking",thinking:c.thinking,signature:c.signature??""}):c.thinking&&a.push(c.thinking):c.type==="redacted_thinking"&&(this.config.strictThinkingSignature||s.push({type:"redacted_thinking",data:c.data}));a.length>0&&o.role==="assistant"&&s.push({type:"text",text:`<prior_reasoning>
|
|
6
|
+
${a.join(`
|
|
7
|
+
|
|
8
|
+
`)}
|
|
9
|
+
</prior_reasoning>`});for(let c of o.content)c.type==="tool_result"&&o.role==="user"&&s.push({type:"tool_result",tool_use_id:c.tool_use_id,content:c.content,...c.is_error===!0?{is_error:!0}:{}});for(let c of o.content)c.type==="tool_use"&&o.role==="assistant"&&s.push({type:"tool_use",id:c.id,name:c.name,input:c.input});for(let c of o.content)c.type==="text"?s.push({type:"text",text:c.text}):c.type==="image"&&o.role==="user"&&s.push({type:"image",source:{type:"base64",media_type:et(c.path,c.mediaType),data:await tt(c.path)}});if(r==="assistant"&&this.config.supportsThinking&&!this.config.strictThinkingSignature){let c=s.some(v=>v.type==="tool_use"),m=s.some(v=>v.type==="thinking"||v.type==="redacted_thinking");c&&!m&&s.unshift({type:"thinking",thinking:"...",signature:""})}let l=s.length===0||r==="assistant"&&s.every(c=>{let m=c;return m.type==="thinking"&&!m.thinking||m.type==="text"&&!m.text});n.push({role:o.role,content:l?[{type:"text",text:"..."}]:s})}return n}};import En from"openai";var Pn="KodaX";function wn(t){return t.userAgentMode==="sdk"?void 0:{"User-Agent":Pn}}i(wn,"getOpenAICompatDefaultHeaders");function Lt(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(Lt,"normalizeOpenAIUsage");function Rn(t){return t?t.type==="function"&&"function"in t:!1}i(Rn,"isOpenAIFunctionToolCall");function An(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(An,"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 L=class extends j{static{i(this,"KodaXOpenAICompatProvider")}supportsThinking=!0;client;initClient(){let e=wn(this.config);this.client=new En({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=fe(n.content);return o.length===n.content.length?n:{...n,content:o}})}normalizeSystemForWire(e,n){let o=[];e&&e.trim().length>0&&o.push(e);let r=[];for(let s of n){if(s.role!=="system"){r.push(s);continue}let a=typeof s.content=="string"?s.content:Array.isArray(s.content)?s.content.filter(l=>typeof l=="object"&&l!==null&&l.type==="text"&&typeof l.text=="string").map(l=>l.text).join(`
|
|
10
|
+
`):"";a.trim().length>0&&o.push(a)}return{system:o.join(`
|
|
11
|
+
|
|
12
|
+
`),rest:r}}appendExtraBody(e,n){let o=typeof e.extra_body=="object"&&e.extra_body!==null?e.extra_body:{};e.extra_body={...o,...n}}resetReasoningCapabilityParams(e){delete e.reasoning_effort,delete e.thinking;let n=typeof e.extra_body=="object"&&e.extra_body!==null?{...e.extra_body}:void 0;if(n){if(delete n.enable_thinking,delete n.thinking_budget,delete n.thinking,Object.keys(n).length===0){delete e.extra_body;return}e.extra_body=n}}applyReasoningCapability(e,n,o){let r=e,s=this.getEffectiveMaxOutputTokens(e.model),a=Z(q(this.config,o.depth,o.taskType),s);switch(n){case"native-effort":{let l=$e(o.depth);l&&(r.reasoning_effort=l);break}case"native-budget":{this.name==="qwen"?this.appendExtraBody(r,{enable_thinking:!0,thinking_budget:a}):this.name==="zhipu"&&(r.thinking={type:"enabled",budget_tokens:a});break}case"native-toggle":{this.name==="qwen"?this.appendExtraBody(r,{enable_thinking:!0}):this.name==="zhipu"&&(r.thinking={type:"enabled"});break}default:break}}getFallbackTerms(e){switch(e){case"native-budget":return["thinking_budget","budget_tokens","thinking"];case"native-effort":return["reasoning_effort"];case"native-toggle":return["enable_thinking","thinking"];default:return[]}}async stream(e,n,o,r,s,a){return this.withRateLimit(async()=>{let l=this.stripCacheBoundariesFromMessages(e),{system:c,rest:m}=this.normalizeSystemForWire(o,l),v=[{role:"system",content:c},...await this.convertMessages(m)],f=n.map(C=>({type:"function",function:{name:C.name,description:C.description,parameters:C.input_schema}}));if(a?.aborted)throw new DOMException("Request aborted","AbortError");let _=new Map,b="",x="",u,h=!0,y=null,M=Date.now(),d=this.normalizeReasoning(r),p=s?.modelOverride??this.config.model,T=Q(d)?this.getReasoningCapability(p):"none",w=Q(d)?this.getReasoningFallbackChain(T).filter(C=>C==="native-budget"||C==="native-effort"||C==="native-toggle"||C==="none"):["none"],X={model:p,messages:v,tools:f,max_completion_tokens:this.getEffectiveMaxOutputTokens(p),stream:!0},D,W;for(let C of w){for(;!D;){let I={...X};h&&(I.stream_options={include_usage:!0}),this.resetReasoningCapabilityParams(I),this.applyReasoningCapability(I,C,d);try{D=await this.client.chat.completions.create(I,a?{signal:a}:{}),C!==T&&this.persistReasoningCapabilityOverride(C,p)}catch(K){if(W=K,h&&this.shouldFallbackForSpecificReasoningError(K,"stream_options","include_usage")){h=!1;continue}if(!this.shouldFallbackForReasoningError(K,...this.getFallbackTerms(C)))throw K;break}}if(D)break}if(!D)throw W??new R("All reasoning capability attempts failed without a captured error",this.name);let E=Date.now(),$=0,O=0,ye=3e4;for await(let C of D){if(a?.aborted)throw new DOMException("Request aborted","AbortError");let I=Date.now(),K=I-E;K>ye&&($++,O+=K,this.logStreamDiagnostic(`[Stream] stall detected: ${Math.round(K/1e3)}s gap`,{stallCount:$,totalStallMs:O})),E=I,s?.onHeartbeat?.(),u=Lt(C.usage)??u;let k=C.choices[0],P=k?.delta;if(k?.finish_reason&&(y=k.finish_reason,process.env.KODAX_DEBUG_STREAM)){let g=Date.now()-M;this.logStreamDiagnostic(`[Stream] finish_reason: ${y} after ${g}ms`)}P?.content&&(b+=P.content,s?.onTextDelta?.(P.content));let S=this.extractReasoningDelta(P);if(S&&(x+=S,s?.onThinkingDelta?.(S)),P?.tool_calls)for(let g of P.tool_calls){let Y=_.get(g.index)??{id:"",name:"",arguments:""};g.id&&(Y.id=g.id),g.function?.name&&(Y.name=g.function.name),g.function?.arguments&&(Y.arguments+=g.function.arguments,s?.onToolInputDelta?.(Y.name,g.function.arguments,Y.id?{toolId:Y.id}:void 0)),_.set(g.index,Y)}}if(!y){let C=Date.now()-M;if(a?.aborted){let K=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:K,textContentLength:b.length,toolCallsCount:_.size}),new DOMException(K,"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:_.size}),I}let le=b?[{type:"text",text:b}]:[],ue=[],de=[];x&&(de.push({type:"thinking",thinking:x}),s?.onThinkingEnd?.(x));for(let[,C]of _)C.id&&C.name&&ue.push({type:"tool_use",id:C.id,name:C.name,input:te(C.arguments)});return{textBlocks:le,toolBlocks:ue,thinkingBlocks:de,usage:u,stopReason:y??void 0}},a,3,s?.onRateLimit,s?.onRetryAfter)}supportsNonStreamingFallback(){return!0}async complete(e,n,o,r,s,a){return this.withRateLimit(async()=>{let l=this.stripCacheBoundariesFromMessages(e),{system:c,rest:m}=this.normalizeSystemForWire(o,l),v=[{role:"system",content:c},...await this.convertMessages(m)],f=n.map(E=>({type:"function",function:{name:E.name,description:E.description,parameters:E.input_schema}})),_=this.normalizeReasoning(r),b=s?.modelOverride??this.config.model,x=Q(_)?this.getReasoningCapability(b):"none",u=Q(_)?this.getReasoningFallbackChain(x).filter(E=>E==="native-budget"||E==="native-effort"||E==="native-toggle"||E==="none"):["none"],h={model:b,messages:v,tools:f,max_completion_tokens:this.getEffectiveMaxOutputTokens(b)},y,M;for(let E of u){let $={...h};this.resetReasoningCapabilityParams($),this.applyReasoningCapability($,E,_);try{y=await this.client.chat.completions.create($,a?{signal:a}:{}),E!==x&&this.persistReasoningCapabilityOverride(E,b);break}catch(O){if(M=O,!this.shouldFallbackForReasoningError(O,...this.getFallbackTerms(E)))throw O}}if(!y)throw M??new R("All reasoning capability attempts failed without a captured error",this.name);let d=y.choices[0],p=d?.message,T=An(p?.content),w=On(p),X=(p?.tool_calls??[]).filter(Rn).map(E=>({type:"tool_use",id:E.id,name:E.function.name,input:te(E.function.arguments)}));T&&s?.onTextDelta?.(T);let D=T?[{type:"text",text:T}]:[],W=[];return w&&(W.push({type:"thinking",thinking:w}),s?.onThinkingDelta?.(w),s?.onThinkingEnd?.(w)),{textBlocks:D,toolBlocks:X,thinkingBlocks:W,usage:Lt(y.usage),stopReason:d?.finish_reason??void 0}},a,3,s?.onRateLimit,s?.onRetryAfter)}extractReasoningDelta(e){let n=e?.reasoning_content;return typeof n=="string"?n:Array.isArray(n)?n.map(o=>typeof o=="string"?o:typeof o=="object"&&o!==null&&"text"in o&&typeof o.text=="string"?o.text:"").join(""):""}serializeAssistantMessage(e){let n=e.filter(c=>c.type==="text").map(c=>c.text).join(`
|
|
13
|
+
`),o=e.filter(c=>c.type==="tool_use").map(c=>({id:c.id,type:"function",function:{name:c.name,arguments:JSON.stringify(c.input??{})}})),r=e.filter(c=>c.type==="thinking"||c.type==="redacted_thinking").map(c=>c.type==="thinking"?c.thinking:"").filter(Boolean).join(`
|
|
14
|
+
|
|
15
|
+
`),s=e.some(c=>c.type==="thinking"||c.type==="redacted_thinking");if(!n&&o.length===0&&!s)return[];let a;n?a=n:o.length>0?a=null:a="...";let l={role:"assistant",content:a};return o.length>0&&(l.tool_calls=o),this.config.replayReasoningContent&&(l.reasoning_content=r||""),[l]}async serializeUserMessage(e){let n=[],o=e.filter(a=>a.type==="text").map(a=>a.text).join(`
|
|
16
|
+
`),r=e.filter(a=>a.type==="image");for(let a of e)a.type==="tool_result"&&n.push({role:"tool",tool_call_id:a.tool_use_id,content:a.content});if(r.length===0)return o&&n.push({role:"user",content:o}),n;let s=[];o&&s.push({type:"text",text:o});for(let a of r)s.push({type:"image_url",image_url:{url:await Nt(a.path,a.mediaType)}});return n.push({role:"user",content:s}),n}serializeSystemMessage(e){if(typeof e=="string")return[{role:"system",content:e}];let n=e.filter(o=>o.type==="text").map(o=>o.text).join(`
|
|
17
|
+
`);return n?[{role:"system",content:n}]:[]}async convertMessages(e){let n=[];for(let o of e){if(o.role==="system"){n.push(...this.serializeSystemMessage(o.content));continue}if(typeof o.content=="string"){n.push({role:o.role,content:o.content});continue}if(o.role==="assistant"){n.push(...this.serializeAssistantMessage(o.content));continue}n.push(...await this.serializeUserMessage(o.content))}return n}};import{spawn as Sn}from"node:child_process";import{Readable as Dn,Writable as In}from"node:stream";import ot from"node:process";import{ClientSideConnection as Kn,PROTOCOL_VERSION as Nn,ndJsonStream as Ln}from"@agentclientprotocol/sdk";var Ce=class{static{i(this,"AcpClient")}client=null;agentProcess=null;options;constructor(e){this.options=e}async connect(){let e,n;if(this.options.inputStream&&this.options.outputStream)e=this.options.inputStream,n=this.options.outputStream;else if(this.options.command){let s=ot.platform==="win32"&&!this.options.command.endsWith(".cmd")?`${this.options.command}.cmd`:this.options.command;if(this.agentProcess=Sn(s,this.options.args??[],{cwd:this.options.cwd??ot.cwd(),stdio:["pipe","pipe","inherit"]}),!this.agentProcess.stdin||!this.agentProcess.stdout)throw new Error("Failed to create ACP stdio pipes");n=In.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=Ln(n,e);this.client=new Kn(()=>({sessionUpdate:i(async r=>{this.options.onSessionUpdate?.(r)},"sessionUpdate"),requestPermission:i(async r=>{let s=r.options??[],a=s.find(l=>l.kind==="allow_once"||l.kind==="allow_always")??s[0];return a?{outcome:{outcome:"selected",optionId:a.optionId}}:{outcome:{outcome:"cancelled"}}},"requestPermission")}),o),await this.client.initialize({protocolVersion:Nn,clientCapabilities:{},clientInfo:{name:"kodax-ai-acp-client",version:"1.0.0"}})}async createNewSession(){if(!this.client)throw new Error("Client not connected");return(await this.client.newSession({cwd:this.options.cwd??ot.cwd(),mcpServers:[]})).sessionId}async prompt(e,n,o,r){if(!this.client)throw new Error("Client not connected");let s={sessionId:n,prompt:[{type:"text",text:e}]};r?.model&&(s.model=r.model);let a=this.client.prompt(s);if(o){let l=i(()=>{this.client?.cancel({sessionId:n}).catch(()=>{})},"onAbort");o.addEventListener("abort",l),a=a.finally(()=>{o.removeEventListener("abort",l)})}return await a}disconnect(){this.agentProcess?.kill(),this.options.abort?.();try{this.client?.close?.()}catch{}this.client=null}};function Bn(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(Bn,"normalizeAcpUsage");var oe=class extends j{static{i(this,"KodaXAcpProvider")}_client=null;_sessionMap=new Map;_activeStreams=new Map;isConfigured(){return!0}getCapabilityProfile(){return H(me)}stripCacheBoundariesFromMessages(e){return e.map(n=>{if(typeof n.content=="string")return n;let o=fe(n.content);return o.length===n.content.length?n:{...n,content:o}})}async stream(e,n,o,r,s,a){if(e=this.stripCacheBoundariesFromMessages(e),this.acpClientOptions.executor&&typeof this.acpClientOptions.executor.isInstalled=="function"&&!await this.acpClientOptions.executor.isInstalled())throw new Error(`${this.name} requires a local CLI environment, but the CLI was not found or is not configured correctly.`);let l=[],c=[],m=e[e.length-1],v="";m&&typeof m.content=="string"?v=m.content:m&&Array.isArray(m.content)&&(v=m.content.filter(h=>h.type==="text").map(h=>h.text).join(`
|
|
18
|
+
`));let f={...this.acpClientOptions,onSessionUpdate:i(h=>{let y=h.update,M=h.sessionId;if(!("sessionUpdate"in y))return;let d=M?this._activeStreams.get(M):void 0;if(d)switch(y.sessionUpdate){case"agent_message_chunk":if(y.content?.type==="text"){let p=y.content.text;d.output.text+=p,d.streamOptions?.onTextDelta?.(p)}break;case"tool_call":{let p="{}",T=y.arguments??y.parameters;T&&(p=typeof T=="string"?T:JSON.stringify(T)),d.streamOptions?.onToolInputDelta?.(y.title,p);let w=`
|
|
19
|
+
> [Tool Use] ${y.title}: ${p}
|
|
20
|
+
`;d.output.text+=w,d.streamOptions?.onTextDelta?.(w);break}case"tool_call_update":if(y.status){let p=`> [Tool Result] ${y.status}
|
|
21
|
+
|
|
22
|
+
`;d.output.text+=p,d.streamOptions?.onTextDelta?.(p)}break}},"onSessionUpdate")},_=s?.sessionId??"default";this._client||(this._client=new Ce(f),await this._client.connect());let b=this._sessionMap.get(_);b||(b=await this._client.createNewSession(),this._sessionMap.set(_,b));let x={text:""};this._activeStreams.set(b,{streamOptions:s,output:x});let u;try{u=await this._client.prompt(v,b,a,{model:s?.modelOverride})}catch(h){if(!(h instanceof Error&&h.name==="AbortError"))throw h}finally{this._activeStreams.delete(b)}return x.text&&l.push({type:"text",text:x.text}),{textBlocks:l,toolBlocks:c,thinkingBlocks:[],usage:Bn(u?.usage)}}disconnect(){this._client&&(this._client.disconnect(),this._client=null),this._activeStreams.clear(),this._sessionMap.clear()}};import{spawn as Fn}from"node:child_process";import it from"node:process";var ie=class{static{i(this,"CLIExecutor")}config;_installedCache=null;constructor(e){this.config=e}async isInstalled(){return this._installedCache!==null?this._installedCache:(this._installedCache=await this.checkInstalled(),this._installedCache)}async*execute(e){let n=this.buildArgs(e),o={...it.env,...this.config.env},s=it.platform==="win32"&&!this.config.command.endsWith(".cmd")?`${this.config.command}.cmd`:this.config.command,a=Fn(s,n,{cwd:this.config.cwd??it.cwd(),env:o,stdio:["ignore","pipe","pipe"]}),l="";a.stderr?.on("data",v=>{l+=v.toString()});let c=!1,m=i(()=>{c||a.kill("SIGTERM")},"abortHandler");e.signal?.addEventListener("abort",m),a.on("exit",()=>{c=!0});try{yield*this.parseOutputStream(a.stdout,e.signal),l.trim()&&console.error(`[CLIExecutor] stderr: ${l.trim()}`)}finally{e.signal?.removeEventListener("abort",m),c||a.kill()}}async*parseOutputStream(e,n){let o="";for await(let r of e){if(n?.aborted)break;o+=r.toString();let s=o.split(`
|
|
23
|
+
`);o=s.pop()??"";for(let a of s){if(!a.trim())continue;let l=this.parseLine(a.trim());l&&(yield l)}}if(o.trim()&&!n?.aborted){let r=this.parseLine(o.trim());r&&(yield r)}}};import{spawn as Un}from"node:child_process";import Xn from"node:process";async function Te(t){try{let e=Xn.platform==="win32",n=Un(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(Te,"checkCliCommandInstalled");var Ee=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 Te("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 Bt}from"node:stream/web";import{randomUUID as rt}from"node:crypto";function Pe(t){let e=new Bt,n=new Bt,o=e.readable.getReader(),r=n.writable.getWriter(),s=new TextDecoder,a=new TextEncoder,l="",c=rt(),m=new AbortController,v=new Map;(async()=>{try{for(;;){let{done:u,value:h}=await o.read();if(u)break;l+=s.decode(h,{stream:!0});let y=l.split(`
|
|
24
|
+
`);l=y.pop()??"";for(let M of y)if(M.trim())try{let d=JSON.parse(M);_(d).catch(p=>{console.error("[PseudoAcpServer] Failed to handle request:",p)})}catch{console.error("[PseudoAcpServer] Failed to parse message:",M)}}}catch(u){console.error("[PseudoAcpServer] Stream read error:",u)}})();let f=i(async u=>{let h=JSON.stringify(u)+`
|
|
25
|
+
`;await r.write(a.encode(h))},"sendMsg");async function _(u){if(u.method==="initialize")await f({jsonrpc:"2.0",id:u.id,result:{protocolVersion:u.params.protocolVersion,serverInfo:{name:"pseudo-acp-server",version:"1.0.0"},serverCapabilities:{}}});else if(u.method==="session/new"||u.method==="sessions/new")c=u.params?.sessionId??rt(),await f({jsonrpc:"2.0",id:u.id,result:{sessionId:c}});else if(u.method==="session/prompt"||u.method==="chat/prompt"){let h=new AbortController,y=u.params.sessionId;v.set(y,h);let M=i(()=>h.abort(),"onGlobalAbort");m.signal.addEventListener("abort",M);let p=await b(y,u.params.prompt,typeof u.params.model=="string"?u.params.model:void 0,h.signal).finally(()=>{v.delete(y),m.signal.removeEventListener("abort",M)});await f({jsonrpc:"2.0",id:u.id,result:p.usage?{stopReason:p.stopReason,usage:p.usage}:{stopReason:p.stopReason}})}else if(u.method==="session/cancel"||u.method==="chat/cancel"){let h=v.get(u.params.sessionId);h&&h.abort(),u.id!==void 0&&await f({jsonrpc:"2.0",id:u.id,result:{}})}else u.id!==void 0&&await f({jsonrpc:"2.0",id:u.id,result:{}})}i(_,"handleRequest");let b=i(async(u,h,y,M)=>{let d=h.find(p=>p.type==="text")?.text??"";try{let p=t.execute({prompt:d,model:y,sessionId:u==="default"?void 0:u,signal:M});for await(let T of p){let w=x(T);if(w&&await f({jsonrpc:"2.0",method:"session/update",params:{sessionId:u,update:w}}),T.type==="complete")return{stopReason:M.aborted?"cancelled":"end_turn",usage:T.usage}}return{stopReason:M.aborted?"cancelled":"end_turn"}}catch(p){return M.aborted||p instanceof Error&&p.name==="AbortError"?{stopReason:"cancelled"}:(console.error("[PseudoAcpServer] Error executing prompt:",p),await f({jsonrpc:"2.0",method:"session/update",params:{sessionId:u,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:`
|
|
26
|
+
[Fatal Error: ${p}]
|
|
27
|
+
`}}}}),{stopReason:"end_turn"})}},"executePrompt"),x=i(u=>{switch(u.type){case"message":if(u.role==="assistant"&&u.content)return{sessionUpdate:"agent_message_chunk",content:{type:"text",text:u.content}};break;case"tool_use":return{sessionUpdate:"tool_call",title:u.toolName,arguments:u.parameters,status:"running",toolCallId:u.toolId||rt()};case"tool_result":return{sessionUpdate:"tool_call_update",toolCallId:u.toolId,status:u.status};case"error":return{sessionUpdate:"agent_message_chunk",content:{type:"text",text:`
|
|
28
|
+
[Error: ${u.message}]
|
|
29
|
+
`}};case"complete":break}return null},"mapToAcpNotification");return{inputStream:n.readable,outputStream:e.writable,abort:i(()=>{m.abort(),e.readable.cancel().catch(()=>{}),n.writable.abort().catch(()=>{})},"abort"),executor:t}}i(Pe,"createPseudoAcpServer");import Ft from"node:fs";import Ut from"node:os";import Xt from"node:path";var Wn="gpt-5.4",$n="auto-gemini-3",jn=["gpt-5.4","gpt-5.3-codex","gpt-5.3-codex-spark"],zn=["auto-gemini-3","gemini-3.1-pro-preview","gemini-3-flash-preview","gemini-2.5-pro","gemini-2.5-flash"];function Wt(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(Wt,"dedupePreserveOrder");function Gn(){let t=Xt.join(Ut.homedir(),".codex","config.toml");try{return Ft.readFileSync(t,"utf8").match(/^\s*model\s*=\s*"([^"]+)"/m)?.[1]?.trim()||null}catch{return null}}i(Gn,"readCodexConfiguredModel");function Hn(){let t=Xt.join(Ut.homedir(),".gemini","settings.json");try{let e=JSON.parse(Ft.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 Gn()||Wn}i(re,"getCodexCliDefaultModel");function se(){return Hn()||$n}i(se,"getGeminiCliDefaultModel");function ge(){return Wt([re(),...jn])}i(ge,"getCodexCliKnownModels");function he(){return Wt([se(),...zn])}i(he,"getGeminiCliKnownModels");var st=se(),Vn=he(),we=class extends oe{static{i(this,"KodaXGeminiCliProvider")}name="gemini-cli";supportsThinking=!1;config={apiKeyEnv:"GEMINI_CLI_API_KEY",model:st,models:Vn.filter(e=>e!==st).map(e=>({id:e,displayName:e})),supportsThinking:!1,reasoningCapability:"prompt-only",contextWindow:1048576};acpClientOptions;constructor(){super();let e=new Ee({model:st});this.acpClientOptions=Pe(e)}};var Re=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 Te("codex")}buildArgs(e){this.model=e.model??this.model;let n=e.model?["-m",e.model]:[];return e.sessionId?["exec","resume",e.sessionId,...n,e.prompt,...this.config.baseArgs.filter(o=>o!=="exec")]:[...this.config.baseArgs,...n,e.prompt]}parseLine(e){if(!e.startsWith("{"))return null;try{let n=JSON.parse(e);return this.convertEvent(n)}catch{return null}}convertEvent(e){let n=Date.now();switch(e.type){case"thread.started":return{type:"session_start",timestamp:n,sessionId:e.thread_id??"",model:this.model,raw:e};case"item.completed":return e.item?.type==="agent_message"?{type:"message",timestamp:n,role:"assistant",content:e.item.text??"",raw:e}:e.item?.type==="command_execution"?{type:"tool_use",timestamp:n,toolId:e.item.id,toolName:"Bash",parameters:{command:e.item.command},raw:e}:null;case"turn.completed":return{type:"complete",timestamp:n,status:"success",usage:e.usage?{inputTokens:e.usage.input_tokens,outputTokens:e.usage.output_tokens,totalTokens:e.usage.input_tokens+e.usage.output_tokens}:void 0,raw:e};case"error":case"turn.failed":return{type:"error",timestamp:n,errorType:e.type,message:e.message??"Unknown error",raw:e};default:return null}}};var at=re(),Yn=ge(),Ae=class extends oe{static{i(this,"KodaXCodexCliProvider")}name="codex-cli";supportsThinking=!1;config={apiKeyEnv:"CODEX_CLI_API_KEY",model:at,models:Yn.filter(e=>e!==at).map(e=>({id:e,displayName:e})),supportsThinking:!1,reasoningCapability:"prompt-only",contextWindow:128e3};acpClientOptions;constructor(){super();let e=new Re({model:at});this.acpClientOptions=Pe(e)}};import Jn from"@anthropic-ai/sdk";var $t=se(),Qn=he(),jt=re(),qn=ge(),z={anthropic:{apiKeyEnv:"ANTHROPIC_API_KEY",model:"claude-sonnet-4-6",models:["claude-opus-4-6","claude-haiku-4-5"],reasoningCapability:"native-budget",capabilityProfile:Qe},openai:{apiKeyEnv:"OPENAI_API_KEY",model:"gpt-5.3-codex",models:["gpt-5.4","gpt-5.3-codex-spark"],reasoningCapability:"native-effort",capabilityProfile:Qe},deepseek:{apiKeyEnv:"DEEPSEEK_API_KEY",model:"deepseek-v4-flash",models:["deepseek-v4-pro"],reasoningCapability:"native-effort",capabilityProfile:A},kimi:{apiKeyEnv:"KIMI_API_KEY",model:"kimi-k2.6",models:["k2.5"],reasoningCapability:"native-effort",capabilityProfile:A},"kimi-code":{apiKeyEnv:"KIMI_API_KEY",model:"kimi-for-coding",reasoningCapability:"native-budget",capabilityProfile:A},qwen:{apiKeyEnv:"QWEN_API_KEY",model:"qwen3.5-plus",reasoningCapability:"native-budget",capabilityProfile:A},zhipu:{apiKeyEnv:"ZHIPU_API_KEY",model:"glm-5",models:["glm-5.1","glm-5-turbo"],reasoningCapability:"native-budget",capabilityProfile:A},"zhipu-coding":{apiKeyEnv:"ZHIPU_API_KEY",model:"glm-5",models:["glm-5.1","glm-5-turbo"],reasoningCapability:"native-budget",capabilityProfile:A},"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:A},"mimo-coding":{apiKeyEnv:"MIMO_API_KEY",model:"mimo-v2.5-pro",models:["mimo-v2.5"],reasoningCapability:"native-budget",capabilityProfile:A},"ark-coding":{apiKeyEnv:"ARK_API_KEY",model:"glm-5.1",models:["glm-4.7","kimi-k2.6","kimi-k2.5","minimax-latest","deepseek-v3.2","doubao-seed-2.0-code","doubao-seed-2.0-pro","doubao-seed-2.0-lite"],reasoningCapability:"native-budget",capabilityProfile:A},"gemini-cli":{apiKeyEnv:"GEMINI_API_KEY",model:$t,models:Qn.filter(t=>t!==$t),reasoningCapability:"prompt-only",capabilityProfile:me},"codex-cli":{apiKeyEnv:"OPENAI_API_KEY",model:jt,models:qn.filter(t=>t!==jt),reasoningCapability:"prompt-only",capabilityProfile:me}};function U(t,e){let n=z[t];return{apiKeyEnv:n.apiKeyEnv,model:n.model,reasoningCapability:n.reasoningCapability,...e}}i(U,"buildProviderConfig");var ct=class extends N{static{i(this,"AnthropicProvider")}name="anthropic";config=U("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 Jn({apiKey:this.getApiKey()})}},lt=class extends N{static{i(this,"ZhipuCodingProvider")}name="zhipu-coding";config=U("zhipu-coding",{baseUrl:"https://open.bigmodel.cn/api/anthropic",models:[{id:"glm-5.1",displayName:"GLM-5.1"},{id:"glm-5-turbo",displayName:"GLM-5 Turbo",contextWindow:128e3}],supportsThinking:!0,contextWindow:2e5,maxOutputTokens:16e3,thinkingBudgetCap:16e3,streamMaxDurationMs:3e5});constructor(){super(),this.initClient()}},ut=class extends N{static{i(this,"KimiCodeProvider")}name="kimi-code";config=U("kimi-code",{baseUrl:"https://api.kimi.com/coding/",supportsThinking:!0,contextWindow:256e3,maxOutputTokens:32e3});constructor(){super(),this.initClient()}},dt=class extends N{static{i(this,"MiniMaxCodingProvider")}name="minimax-coding";config=U("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()}},pt=class extends N{static{i(this,"MimoCodingProvider")}name="mimo-coding";config=U("mimo-coding",{baseUrl:"https://token-plan-cn.xiaomimimo.com/anthropic",models:[{id:"mimo-v2.5",displayName:"MiMo V2.5"}],supportsThinking:!0,contextWindow:1e6,maxOutputTokens:32e3,thinkingBudgetCap:16e3});constructor(){super(),this.initClient()}},mt=class extends N{static{i(this,"ArkCodingProvider")}name="ark-coding";config=U("ark-coding",{baseUrl:"https://ark.cn-beijing.volces.com/api/coding",models:[{id:"glm-4.7",displayName:"GLM-4.7"},{id:"kimi-k2.6",displayName:"Kimi K2.6",contextWindow:256e3},{id:"kimi-k2.5",displayName:"Kimi K2.5",contextWindow:256e3},{id:"minimax-latest",displayName:"MiniMax Latest",contextWindow:204800},{id:"deepseek-v3.2",displayName:"DeepSeek V3.2",contextWindow:128e3},{id:"doubao-seed-2.0-code",displayName:"Doubao Seed 2.0 Code",contextWindow:256e3},{id:"doubao-seed-2.0-pro",displayName:"Doubao Seed 2.0 Pro",contextWindow:256e3},{id:"doubao-seed-2.0-lite",displayName:"Doubao Seed 2.0 Lite",contextWindow:256e3}],supportsThinking:!0,contextWindow:2e5,maxOutputTokens:32e3});constructor(){super(),this.initClient()}},ft=class extends L{static{i(this,"OpenAIProvider")}name="openai";config=U("openai",{models:[{id:"gpt-5.4",displayName:"GPT-5.4"},{id:"gpt-5.3-codex-spark",displayName:"GPT-5.3 Codex Spark"}],supportsThinking:!0,contextWindow:4e5,maxOutputTokens:32768});constructor(){super(),this.initClient()}},gt=class extends L{static{i(this,"DeepSeekProvider")}name="deepseek";config=U("deepseek",{baseUrl:"https://api.deepseek.com",models:[{id:"deepseek-v4-pro",displayName:"DeepSeek V4 Pro"}],supportsThinking:!0,contextWindow:1e6,maxOutputTokens:64e3,replayReasoningContent:!0});constructor(){super(),this.initClient()}},ht=class extends L{static{i(this,"KimiProvider")}name="kimi";config=U("kimi",{baseUrl:"https://api.moonshot.cn/v1",models:[{id:"k2.5",displayName:"K2.5"}],supportsThinking:!0,contextWindow:256e3,maxOutputTokens:32768,replayReasoningContent:!0});constructor(){super(),this.initClient()}},yt=class extends L{static{i(this,"QwenProvider")}name="qwen";config=U("qwen",{baseUrl:"https://dashscope.aliyuncs.com/compatible-mode/v1",supportsThinking:!0,contextWindow:256e3,maxOutputTokens:32768,replayReasoningContent:!0});constructor(){super(),this.initClient()}},_t=class extends L{static{i(this,"ZhipuProvider")}name="zhipu";config=U("zhipu",{baseUrl:"https://open.bigmodel.cn/api/paas/v4",models:[{id:"glm-5.1",displayName:"GLM-5.1"},{id:"glm-5-turbo",displayName:"GLM-5 Turbo",contextWindow:128e3}],supportsThinking:!0,contextWindow:2e5,maxOutputTokens:32768,replayReasoningContent:!0});constructor(){super(),this.initClient()}},F={anthropic:i(()=>new ct,"anthropic"),openai:i(()=>new ft,"openai"),deepseek:i(()=>new gt,"deepseek"),kimi:i(()=>new ht,"kimi"),"kimi-code":i(()=>new ut,"kimi-code"),qwen:i(()=>new yt,"qwen"),zhipu:i(()=>new _t,"zhipu"),"zhipu-coding":i(()=>new lt,"zhipu-coding"),"minimax-coding":i(()=>new dt,"minimax-coding"),"mimo-coding":i(()=>new pt,"mimo-coding"),"ark-coding":i(()=>new mt,"ark-coding"),"gemini-cli":i(()=>new we,"gemini-cli"),"codex-cli":i(()=>new Ae,"codex-cli")},kt=process.env.KODAX_PROVIDER??"zhipu-coding",zt=new Map;function Zn(t){if(B(t))return z[t].apiKeyEnv}i(Zn,"resolveApiKeyEnvForProvider");function Gt(t){let e=t??kt,n=F[e];if(!n)throw new R(`Unknown provider: ${e}. Available: ${Object.keys(F).join(", ")}`,e);let o=Zn(e),r=o?process.env[o]:void 0,s=zt.get(e);if(s&&s.apiKey===r)return s.instance;let a=n();return zt.set(e,{apiKey:r,instance:a}),a}i(Gt,"getProvider");function Ht(t){return B(t)?!!process.env[z[t].apiKeyEnv]:!1}i(Ht,"isProviderConfigured");function Vt(t){return B(t)?z[t].model:null}i(Vt,"getProviderModel");function Yt(t,e){if(!B(t))return"unknown";let n=z[t],o=e??n.model;return n.modelReasoningCapabilities?.[o]??n.reasoningCapability}i(Yt,"getProviderConfiguredReasoningCapability");function Jt(t){return B(t)?H(z[t].capabilityProfile):null}i(Jt,"getProviderConfiguredCapabilityProfile");function Qt(){let t=[];for(let e of Object.keys(F)){let n=z[e];t.push({name:e,model:n.model,models:n.models?[n.model,...n.models]:[n.model],configured:!!process.env[n.apiKeyEnv],reasoningCapability:n.reasoningCapability,capabilityProfile:H(n.capabilityProfile)})}return t}i(Qt,"getProviderList");function qt(t){let e=z[t];return e?e.models?[e.model,...e.models]:[e.model]:[]}i(qt,"getProviderModels");function B(t){return t in F}i(B,"isProviderName");var eo=new Set(["compat","sdk"]);function bt(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&&!eo.has(t.userAgentMode))throw new Error(`Unknown userAgentMode "${t.userAgentMode}" for custom provider "${t.name}". Must be "compat" or "sdk".`)}i(bt,"validateCustomProviderConfig");function to(t){let e=t.models?.length?t.models.map(n=>typeof n=="string"?{id:n}:n):void 0;return{apiKeyEnv:t.apiKeyEnv,model:t.model,baseUrl:t.baseUrl,models:e,userAgentMode:t.userAgentMode,supportsThinking:t.supportsThinking??!1,reasoningCapability:t.reasoningCapability??"none",capabilityProfile:t.capabilityProfile,contextWindow:t.contextWindow,maxOutputTokens:t.maxOutputTokens,thinkingBudgetCap:t.thinkingBudgetCap}}i(to,"buildProviderConfig");function Oe(t){bt(t);let e=to(t);return t.protocol==="anthropic"?new xt(t.name,e):new vt(t.name,e)}i(Oe,"createCustomProvider");var xt=class extends N{static{i(this,"DynamicAnthropicProvider")}name;config;constructor(e,n){super(),this.name=e,this.config=n,this.initClient()}},vt=class extends L{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 Zt(t){let e=new Set,n=new Map,o=new Map;for(let r of t){if(bt(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 F&&console.warn(`[kodax] Custom provider "${r.name}" shadows a built-in provider. The built-in provider will be used. Choose a different name to use your custom provider.`),e.add(r.name),n.set(r.name,r),o.set(r.name,()=>Oe(r))}ae.clear(),Mt.clear();for(let[r,s]of n)ae.set(r,s);for(let[r,s]of o)Mt.set(r,s)}i(Zt,"registerCustomProviders");function Se(t){let e=Mt.get(t);return e?e():void 0}i(Se,"getCustomProvider");function ce(t){return ae.has(t)}i(ce,"isCustomProviderName");function De(){return[...ae.keys()]}i(De,"getCustomProviderNames");function en(){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:H(n.capabilityProfile??A),custom:!0})}return t}i(en,"getCustomProviderList");function tn(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(tn,"getCustomProviderModels");var V=new Map,no=0;function Ct(t){let e=V.get(t);if(!(!e||e.length===0))return e[e.length-1]}i(Ct,"getActiveRuntimeProviderRegistration");function oo(t){for(let[e,n]of V){let o=n.filter(r=>r.id!==t);if(o.length!==n.length){o.length===0?V.delete(e):V.set(e,o);return}}}i(oo,"removeRuntimeProviderRegistration");function nn(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:${++no}`,name:n,factory:e},r=V.get(n)??[];return V.set(n,[...r,o]),()=>{oo(o.id)}}i(nn,"registerModelProvider");function Ie(t){let e=Ct(t);return e?e.factory():void 0}i(Ie,"getRuntimeModelProvider");function Ke(t){return Ct(t)!==void 0}i(Ke,"isRuntimeModelProviderName");function Ne(){return Array.from(V.keys()).filter(t=>Ct(t)!==void 0)}i(Ne,"getRuntimeModelProviderNames");function on(){V.clear()}i(on,"clearRuntimeModelProviders");function rn(t){if(B(t))return F[t]();let e=Ie(t);if(e)return e;let n=Se(t);if(n)return n;let o=Tt();throw new Error(`Unknown provider: ${t}. Available: ${o.join(", ")}`)}i(rn,"resolveProvider");function sn(t){return B(t)||Ke(t)||ce(t)}i(sn,"isKnownProvider");function Tt(){let t=Object.keys(F),e=Ne(),n=De();return[...new Set([...t,...e,...n])]}i(Tt,"getAvailableProviderNames");var an={anthropic:{"claude-opus-4-6":{inputPer1M:15,outputPer1M:75,cachePer1M:1.875},"claude-sonnet-4-6":{inputPer1M:3,outputPer1M:15,cachePer1M:.375},"claude-haiku-4-5":{inputPer1M:.8,outputPer1M:4,cachePer1M:.08}},openai:{"gpt-5.4":{inputPer1M:30,outputPer1M:120},"gpt-5.3-codex-spark":{inputPer1M:10,outputPer1M:40}},deepseek:{"deepseek-v4-flash":{inputPer1M:.14,outputPer1M:.28,cachePer1M:.028},"deepseek-v4-pro":{inputPer1M:1.68,outputPer1M:3.36,cachePer1M:.14}},kimi:{"k2.5":{inputPer1M:.005,outputPer1M:.015},"kimi-k2.6":{inputPer1M:.005,outputPer1M:.015}},"kimi-code":{"kimi-for-coding":{inputPer1M:.005,outputPer1M:.015}},qwen:{"qwen3.5-plus":{inputPer1M:.003,outputPer1M:.006}},zhipu:{"glm-5":{inputPer1M:.05,outputPer1M:.1},"glm-5.1":{inputPer1M:.05,outputPer1M:.1},"glm-5-turbo":{inputPer1M:.01,outputPer1M:.03}},"zhipu-coding":{"glm-5":{inputPer1M:.05,outputPer1M:.1},"glm-5.1":{inputPer1M:.05,outputPer1M:.1},"glm-5-turbo":{inputPer1M:.01,outputPer1M:.03}},"minimax-coding":{"MiniMax-M2.7":{inputPer1M:.01,outputPer1M:.03},"MiniMax-M2.7-highspeed":{inputPer1M:.01,outputPer1M:.03},"MiniMax-M2.5":{inputPer1M:.01,outputPer1M:.03},"MiniMax-M2.5-highspeed":{inputPer1M:.01,outputPer1M:.03},"MiniMax-M2.1":{inputPer1M:.01,outputPer1M:.03},"MiniMax-M2.1-highspeed":{inputPer1M:.01,outputPer1M:.03},"MiniMax-M2":{inputPer1M:.01,outputPer1M:.03}},"mimo-coding":{"mimo-v2.5-pro":{inputPer1M:.01,outputPer1M:.03},"mimo-v2.5":{inputPer1M:.01,outputPer1M:.03}},"ark-coding":{"glm-5.1":{inputPer1M:.005,outputPer1M:.015},"glm-4.7":{inputPer1M:.005,outputPer1M:.015},"kimi-k2.6":{inputPer1M:.005,outputPer1M:.015},"kimi-k2.5":{inputPer1M:.005,outputPer1M:.015},"minimax-latest":{inputPer1M:.005,outputPer1M:.015},"deepseek-v3.2":{inputPer1M:.005,outputPer1M:.015},"doubao-seed-2.0-code":{inputPer1M:.005,outputPer1M:.015},"doubao-seed-2.0-pro":{inputPer1M:.005,outputPer1M:.015},"doubao-seed-2.0-lite":{inputPer1M:.005,outputPer1M:.015}},"gemini-cli":{},"codex-cli":{}};function Et(t,e,n){let o=n?.[t]?.[e];return o||an[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 io(){return{records:[],retries:[]}}i(io,"createCostTracker");function ro(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(ro,"recordRetry");function wt(t,e,n){let o=Et(e.provider,e.model,n),r=(e.cacheReadTokens??0)+(e.cacheWriteTokens??0),s=o?Pt(o,e.inputTokens,e.outputTokens,r):0,a={timestamp:Date.now(),provider:e.provider,model:e.model,inputTokens:e.inputTokens,outputTokens:e.outputTokens,cacheReadTokens:e.cacheReadTokens??0,cacheWriteTokens:e.cacheWriteTokens??0,cost:s,role:e.role};return{records:[...t.records,a],retries:t.retries}}i(wt,"recordUsage");function so(t){let e=0,n=0,o=0,r=0,s=0,a=0,l={},c={};for(let f of t.records){e+=f.cost,n+=f.inputTokens,o+=f.outputTokens,r+=f.cacheReadTokens+f.cacheWriteTokens,s+=f.cacheReadTokens,a+=f.cacheWriteTokens;let _=l[f.provider];l[f.provider]={cost:(_?.cost??0)+f.cost,calls:(_?.calls??0)+1,inputTokens:(_?.inputTokens??0)+f.inputTokens,outputTokens:(_?.outputTokens??0)+f.outputTokens};let b=f.role??"default",x=c[b];c[b]={cost:(x?.cost??0)+f.cost,calls:(x?.calls??0)+1,inputTokens:(x?.inputTokens??0)+f.inputTokens,outputTokens:(x?.outputTokens??0)+f.outputTokens}}let m=0;for(let f of t.retries)m+=f.waitMs;let v=r>0?s/r:0;return{totalCost:e,totalInputTokens:n,totalOutputTokens:o,totalCacheTokens:r,totalCacheReadTokens:s,totalCacheWriteTokens:a,cacheHitRate:v,callCount:t.records.length,retryCount:t.retries.length,retryWaitMs:m,byProvider:l,byRole:c}}i(so,"getSummary");function Le(t){return t<.01?`$${t.toFixed(4)}`:t<1?`$${t.toFixed(3)}`:`$${t.toFixed(2)}`}i(Le,"formatCost");function ao(t){let e=[];if(e.push(`Session Cost: ${Le(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}: ${Le(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}: ${Le(s.cost)} (${s.calls} calls)`)}return e.join(`
|
|
30
|
+
`)}i(ao,"formatCostReport");var cn={inputTokens:0,outputTokens:0,totalTokens:0},co=3e4;async function lo(t){let e=new AbortController,n=t.timeoutMs??co,o,r=i(l=>{o||(o=l),e.abort()},"recordAbort"),s=setTimeout(()=>r("timeout"),n),a=i(()=>r("parent"),"onParentAbort");t.abortSignal&&(t.abortSignal.aborted?r("parent"):t.abortSignal.addEventListener("abort",a,{once:!0}));try{let l=await t.provider.stream([...t.messages],[],t.system,t.reasoning??{mode:"off"},{modelOverride:t.model},e.signal),c=l.usage??cn,m=l.textBlocks??[],v=l.toolBlocks??[],f=m.map(b=>b.text).join("");if(v.length>0)return{text:f,usage:c,costTracker:t.costTracker,stopReason:"error",error:new Error(`sideQuery: provider returned ${v.length} tool_use block(s); sideQuery expects text-only output`)};let _=t.costTracker;return _&&(_=wt(_,{provider:t.provider.name,model:t.model,inputTokens:c.inputTokens,outputTokens:c.outputTokens,cacheReadTokens:c.cachedReadTokens,cacheWriteTokens:c.cachedWriteTokens,role:t.querySource})),{text:f,usage:c,costTracker:_,stopReason:uo(l.stopReason)}}catch(l){let c=l instanceof Error?l:new Error(String(l)),m="error";return e.signal.aborted&&(m=o==="timeout"?"timeout":"aborted"),{text:"",usage:cn,costTracker:t.costTracker,stopReason:m,error:c}}finally{clearTimeout(s),t.abortSignal&&t.abortSignal.removeEventListener("abort",a)}}i(lo,"sideQuery");function uo(t){return t==="max_tokens"?"max_tokens":"end_turn"}i(uo,"mapStopReason");export{G as a,R as b,pe as c,Be as d,Fe as e,Ue as f,J as g,Xe as h,ln as i,un as j,Rt as k,At as l,We as m,Q as n,_e as o,Ot as p,q,Z as r,$e as s,He as t,Ve as u,ee as v,xe as w,Je as x,hn as y,ve as z,be as A,Me as B,j as C,te as D,qe as E,ne as F,Ze as G,fe as H,N as I,L as J,re as K,se as L,ge as M,he as N,z as O,F as P,kt as Q,Gt as R,Ht as S,Vt as T,Yt as U,Jt as V,Qt as W,qt as X,B as Y,Oe as Z,Zt as _,Se as $,ce as aa,De as ba,en as ca,tn as da,nn as ea,Ie as fa,Ke as ga,Ne as ha,on as ia,rn as ja,sn as ka,Tt as la,an as ma,Et as na,Pt as oa,io as pa,ro as qa,wt as ra,so as sa,Le as ta,ao as ua,lo as va};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// @kodax-ai/kodax — bundled distribution. See docs/ADR.md ADR-022 + ADR-024.
|
|
2
|
+
import{Xa as i,ab as a}from"./chunk-7LQ2NCHF.js";import"./chunk-N2VZ2MJF.js";import"./chunk-SONW6AC7.js";import"./chunk-XI75LZIO.js";import{a as t}from"./chunk-4E76FLZ3.js";var n=null;function f(e){n=e}t(f,"bindAskUserForConstruction");function d(e){return e.content?.capabilities?.tools??[]}t(d,"readDeclaredTools");var u=t(async e=>{if(!n)return"reject";let o=d(e),r=o.length>0?o.join(", "):"<none>";return await n({question:`Activate constructed tool ${e.name}@${e.version}?
|
|
3
|
+
It declares capabilities.tools = [${r}].`,options:[{label:"Approve \u2014 register and make callable",description:"The tool will be added to the active tool registry and the LLM can invoke it on the next turn.",value:"approve"},{label:"Reject \u2014 do not register",description:"The artifact stays staged on disk; rerun activate_tool to retry.",value:"reject"}]})==="approve"?"approve":"reject"},"replConstructionPolicy"),p=t(async e=>{if(!n)return"reject";let o=e.llmSummary.flaggedConcerns.length>0?e.llmSummary.flaggedConcerns.map(l=>` \u2022 ${l}`).join(`
|
|
4
|
+
`):" \u2022 <none>",r=e.prevContent.instructions??"<no instructions>",s=e.nextContent.instructions??"<no instructions>",c=[`Self-modify activation: ${e.agentName}@${e.fromVersion} \u2192 ${e.toVersion}`,"",`LLM diff summary (severity=${e.llmSummary.severity}):`,` ${e.llmSummary.summary}`,"","Flagged concerns:",o,"",`Budget remaining (after approve): ${e.budgetRemaining-1}/${e.budgetLimit}`,"","\u2500\u2500 Previous instructions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500",r,"\u2500\u2500 Proposed instructions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500",s,"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500","","The LLM summary is advisory \u2014 read the proposed instructions above before approving."].join(`
|
|
5
|
+
`);return await n({question:c,options:[{label:"Approve \u2014 activate the new version on the next run",description:"Resolver swap is deferred to the next Runner.run boundary so the in-flight conversation keeps the prior reference.",value:"approve"},{label:"Reject \u2014 stay on the previous version",description:"Budget is not consumed on rejection; the staged version is left on disk for diff inspection.",value:"reject"}]})==="approve"?"approve":"reject"},"replSelfModifyAskUser");async function g(e){return i({cwd:e,policy:u,selfModifyAskUser:p}),a()}t(g,"bootstrapConstructionRuntime");export{f as bindAskUserForConstruction,g as bootstrapConstructionRuntime};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
// @kodax-ai/kodax — bundled distribution. See docs/ADR.md ADR-022 + ADR-024.
|
|
2
|
+
import{a as e}from"./chunk-4E76FLZ3.js";var l=class{static{e(this,"WebSocketStub")}},n=l;var t=global;t.WebSocket||=n;t.window||=global;t.self||=global;t.window.__REACT_DEVTOOLS_COMPONENT_FILTERS__=[{type:1,value:7,isEnabled:!0},{type:2,value:"InternalApp",isEnabled:!0,isValid:!0},{type:2,value:"InternalAppContext",isEnabled:!0,isValid:!0},{type:2,value:"InternalStdoutContext",isEnabled:!0,isValid:!0},{type:2,value:"InternalStderrContext",isEnabled:!0,isValid:!0},{type:2,value:"InternalStdinContext",isEnabled:!0,isValid:!0},{type:2,value:"InternalFocusContext",isEnabled:!0,isValid:!0}];var a=e(()=>{},"noop"),o={initialize:a,connectToDevTools:a};o.initialize();o.connectToDevTools();
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
// @kodax-ai/kodax — bundled distribution. See docs/ADR.md ADR-022 + ADR-024.
|
|
2
|
+
import{$ as db,$a as dc,$b as cd,$c as ce,$d as cf,A as Ea,Aa as Eb,Ab as Ec,Ac as Dd,Ad as De,B as Fa,Ba as Fb,Bb as Fc,Bc as Ed,Bd as Ee,C as Ga,Ca as Gb,Cb as Gc,Cc as Fd,Cd as Fe,D as Ha,Da as Hb,Db as Hc,Dc as Gd,Dd as Ge,E as Ia,Ea as Ib,Eb as Ic,Ec as Hd,Ed as He,F as Ja,Fa as Jb,Fb as Jc,Fc as Id,Fd as Ie,G as Ka,Ga as Kb,Gb as Kc,Gc as Jd,Gd as Je,H as La,Ha as Lb,Hb as Lc,Hc as Kd,Hd as Ke,I as Ma,Ia as Mb,Ib as Mc,Ic as Ld,Id as Le,J as Na,Ja as Nb,Jb as Nc,Jc as Md,Jd as Me,K as Oa,Ka as Ob,Kb as Oc,Kc as Nd,Kd as Ne,L as Pa,La as Pb,Lb as Pc,Lc as Od,Ld as Oe,M as Qa,Ma as Qb,Mb as Qc,Mc as Pd,Md as Pe,N as Ra,Na as Rb,Nb as Rc,Nc as Qd,Nd as Qe,O as Sa,Oa as Sb,Ob as Sc,Oc as Rd,Od as Re,P as Ta,Pa as Tb,Pb as Tc,Pc as Sd,Pd as Se,Q as Ua,Qa as Ub,Qb as Uc,Qc as Td,Qd as Te,R as Va,Ra as Vb,Rb as Vc,Rc as Ud,Rd as Ue,S as Wa,Sa as Wb,Sb as Wc,Sc as Vd,Sd as Ve,T as Xa,Ta as Xb,Tb as Xc,Tc as Wd,Td as We,U as Ya,Ua as Yb,Ub as Yc,Uc as Xd,Ud as Xe,V as Za,Va as Zb,Vb as Zc,Vc as Yd,Vd as Ye,W as _a,Wa as _b,Wb as _c,Wc as Zd,Wd as Ze,X as $a,Xa as $b,Xb as $c,Xc as _d,Xd as _e,Y as ab,Ya as ac,Yb as ad,Yc as $d,Yd as $e,Z as bb,Za as bc,Zc as ae,Zd as af,_ as cb,_a as cc,_b as bd,_c as be,_d as bf,a as N,aa as eb,ab as ec,ac as dd,ad as de,ae as df,b as O,ba as fb,bb as fc,bc as ed,bd as ee,be as ef,c as P,ca as gb,cb as gc,cc as fd,cd as fe,ce as ff,d as Q,da as hb,db as hc,dc as gd,dd as ge,de as gf,e as R,ea as ib,eb as ic,ec as hd,ed as he,ee as hf,f as ja,fa as jb,fb as jc,fc as id,fd as ie,fe as jf,g as ka,ga as kb,gb as kc,gc as jd,gd as je,ge as kf,h as la,ha as lb,hb as lc,hc as kd,hd as ke,he as lf,i as ma,ia as mb,ib as mc,ic as ld,id as le,ie as mf,j as na,ja as nb,jb as nc,jc as md,jd as me,je as nf,k as oa,ka as ob,kb as oc,kc as nd,kd as ne,ke as of,l as pa,la as pb,lb as pc,lc as od,ld as oe,le as pf,m as qa,ma as qb,mb as qc,mc as pd,md as pe,me as qf,n as ra,na as rb,nb as rc,nc as qd,nd as qe,ne as rf,o as sa,oa as sb,ob as sc,oc as rd,od as re,p as ta,pa as tb,pb as tc,pc as sd,pd as se,q as ua,qa as ub,qb as uc,qc as td,qd as te,r as va,ra as vb,rb as vc,rc as ud,rd as ue,s as wa,sa as wb,sb as wc,sc as vd,sd as ve,t as xa,ta as xb,tb as xc,tc as wd,td as we,u as ya,ua as yb,ub as yc,uc as xd,ud as xe,v as za,va as zb,vb as zc,vc as yd,vd as ye,w as Aa,wa as Ab,wb as Ac,wc as zd,wd as ze,x as Ba,xa as Bb,xb as Bc,xc as Ad,xd as Ae,y as Ca,ya as Cb,yb as Cc,yc as Bd,yd as Be,z as Da,za as Db,zb as Dc,zc as Cd,zd as Ce}from"./chunk-7LQ2NCHF.js";import{Ca as ha,Da as ia,Z as fa,a as S,aa as ga,b as T,c as U,d as V,e as W,f as X,h as Y,i as Z,j as _,k as $,l as aa,m as ba,n as ca,o as da,p as ea}from"./chunk-N2VZ2MJF.js";import"./chunk-SONW6AC7.js";import{$ as A,C as k,I as l,J as m,O as n,P as o,Q as p,R as q,S as r,T as s,U as t,V as u,W as v,X as w,Y as x,Z as y,_ as z,a,aa as B,b,ba as C,c,ca as D,da as E,ea as F,fa as G,ga as H,ha as I,ia as J,j as d,ja as K,ka as L,la as M,t as e,u as f,v as g,w as h,x as i,y as j}from"./chunk-XI75LZIO.js";import"./chunk-4E76FLZ3.js";export{Ve as AUTO_MODE_DENIAL_CONSECUTIVE_THRESHOLD,We as AUTO_MODE_DENIAL_CUMULATIVE_THRESHOLD,pf as BASH_POLICY_SPEC,$e as BREAKER_ERROR_THRESHOLD,af as BREAKER_WINDOW_MS,ka as CANCELLED_TOOL_RESULT_MESSAGE,ja as CANCELLED_TOOL_RESULT_PREFIX,Le as CODING_AGENTS,Ge as CODING_AGENT_MARKER,Nd as CODING_INVARIANTS,Dd as CODING_SUMMARY_PROMPT,Ed as CODING_UPDATE_SUMMARY_PROMPT,yb as CapabilityDeniedError,Pd as Client,zb as ConstructionManifestError,Fd as DEFAULT_CODING_AGENT_NAME,ye as DEFAULT_DANGEROUS_PATTERNS,wb as DEFAULT_HANDLER_TIMEOUT_MS,fd as DEFAULT_RESILIENCE_CONFIG,xe as DEFAULT_SAFE_PATTERNS,Vb as DEFAULT_SELF_MODIFY_BUDGET,lf as DEFAULT_SPECULATIVE_WINDOW_MS,ma as DEFAULT_TOOL_OUTPUT_MAX_BYTES,la as DEFAULT_TOOL_OUTPUT_MAX_LINES,ea as DefaultSummaryCompaction,Zd as EMIT_CONTRACT_TOOL_NAME,_d as EMIT_HANDOFF_TOOL_NAME,Yd as EMIT_SCOUT_VERDICT_TOOL_NAME,$d as EMIT_VERDICT_TOOL_NAME,Db as EVALUATOR_AGENT_NAME,Q as ErrorCategory,Cb as GENERATOR_AGENT_NAME,Z as KODAX_API_MIN_INTERVAL,p as KODAX_DEFAULT_PROVIDER,T as KODAX_DEFAULT_TIMEOUT,U as KODAX_HARD_TIMEOUT,X as KODAX_MAX_INCOMPLETE_RETRIES,V as KODAX_MAX_RETRIES,S as KODAX_MAX_TOKENS,o as KODAX_PROVIDERS,n as KODAX_PROVIDER_SNAPSHOTS,d as KODAX_REASONING_MODE_SEQUENCE,W as KODAX_RETRY_BASE_DELAY,Y as KODAX_STAGGER_DELAY,mc as KODAX_TOOLS,l as KodaXAnthropicCompatProvider,k as KodaXBaseProvider,Pd as KodaXClient,a as KodaXError,zd as KodaXExtensionRuntime,m as KodaXOpenAICompatProvider,b as KodaXProviderError,c as KodaXRateLimitError,O as KodaXSessionError,P as KodaXTerminalError,N as KodaXToolError,Jc as LINEAGE_ENTRY_TYPES,Lc as LineageCompaction,Kc as LineageExtension,pe as McpCapabilityProvider,oe as McpServerRuntime,Bb as PLANNER_AGENT_NAME,_ as PROMISE_PATTERN,Bc as PROMPT_SECTION_REGISTRY,ee as PROTOCOL_EMITTER_TOOLS,kd as ProviderRecoveryCoordinator,na as READ_DEFAULT_LIMIT,pa as READ_MAX_LINE_CHARS,oa as READ_PREFLIGHT_SIZE_BYTES,Ta as REPOINTEL_DEFAULT_ENDPOINT,ga as Runner,Ab as SCOUT_AGENT_NAME,Ac as SYSTEM_PROMPT,id as StableBoundaryTracker,Ib as TASK_ENGINE_ROLE_AGENTS,fe as TOOL_RESULT_TRUNCATION_GUARDRAIL_NAME,ac as _resetRuntimeForTesting,dc as activate,Ka as analyzeChangedScope,Tb as appendAuditEntry,Tc as appendSessionLineageLabel,Ud as applyFanoutBranchTransition,Uc as applySessionCompaction,ib as applyToolResultGuardrail,_c as archiveOldIslands,Vd as assignFanoutBranchWorker,_e as autoModeDenialShouldFallback,hf as bashSignalCollector,Id as boundedRevise,df as breakerShouldFallback,Jd as budgetCeiling,td as buildAmaControllerDecision,Gc as buildCapabilityContextSections,Me as buildClassifierPrompt,rd as buildFallbackRoutingDecision,Rd as buildFanoutSchedulerPlan,Qb as buildLlmReviewPrompt,cd as buildPromptMessageContent,ud as buildPromptOverlay,Fc as buildPromptSnapshot,ld as buildProviderCapabilitySnapshot,sd as buildProviderPolicyHintsForDecision,md as buildProviderPolicyPromptNotes,g as buildReasoningOverrideKey,Ja as buildRepoIntelligenceContext,Ya as buildRepoIntelligenceIndex,Ga as buildRepoOverview,Yc as buildSessionTree,Ic as buildSystemPrompt,Hc as buildSystemPromptSnapshot,gf as checkAbsoluteDeny,bd as checkIncompleteToolCalls,wd as checkPromiseSignal,Oe as classify,Ae as classifyBashCommand,R as classifyError,hd as classifyResilienceError,ia as cleanupIncompleteToolCalls,j as clearReasoningOverride,J as clearRuntimeModelProviders,kf as collectAllSignals,Ce as computeInputSignature,Pe as computeRulesFingerprint,$b as configureRuntime,mb as convertCapabilityReadResult,lb as convertProviderSearchResults,Td as countActiveFanoutBranches,Zc as countActiveLineageMessages,aa as countTokens,ba as createAgent,Xe as createAutoModeDenialTracker,of as createAutoModeToolGuardrail,ze as createBashClassifierConfig,rf as createBashPrefixExtractor,uc as createBuiltinToolDefinition,bf as createCircuitBreaker,Mb as createCtxProxy,y as createCustomProvider,Gd as createDefaultCodingAgent,Be as createDenialTracker,Ad as createExtensionRuntime,Qd as createFanoutSchedulerInput,ca as createHandoff,da as createInMemorySession,te as createKodaXTaskRunner,je as createMcpCapabilityId,ne as createMcpTransport,Cc as createPromptSection,vd as createReasoningPlan,Oc as createSessionLineage,ge as createToolResultTruncationGuardrail,ie as defaultMcpCacheDir,xb as defaultPolicy,_b as disableSelfModify,Lb as drainPendingSwaps,be as emitContract,ce as emitHandoff,ae as emitScoutVerdict,de as emitVerdict,$ as estimateTokens,nd as evaluateProviderPolicy,Hb as evaluatorAgent,Ke as evaluatorCodingAgent,xd as exec,zc as executeTool,$c as extractArtifactLedger,qf as extractCommandPrefix,ed as extractComparableUserMessageText,kb as extractHtmlTitle,dd as extractPromptComparableText,Nc as extractTitleFromMessages,jf as fileSignalCollector,ob as finalizeRetrievalResult,jc as findByVersion,Vc as findPreviousUserEntryId,Xc as forkSessionLineage,vb as formatAgentsForPrompt,ve as formatParallelDispatchResult,qa as formatSize,Mc as generateSessionId,Gb as generatorAgent,Je as generatorCodingAgent,Cd as getActiveExtensionRuntime,M as getAvailableProviderNames,tc as getBuiltinRegisteredToolDefinition,sc as getBuiltinToolDefinition,A as getCustomProvider,D as getCustomProviderList,E as getCustomProviderModels,C as getCustomProviderNames,Fe as getDenialContext,Sd as getFanoutBranch,bb as getImpactEstimate,tb as getKodaxGlobalDir,me as getMcpCachePaths,_a as getModuleContext,ab as getProcessContext,q as getProvider,u as getProviderConfiguredCapabilityProfile,t as getProviderConfiguredReasoningCapability,v as getProviderList,s as getProviderModel,w as getProviderModels,qc as getRegisteredToolDefinition,Za as getRepoIntelligenceIndex,Ha as getRepoOverview,cb as getRepoRoutingSignals,wc as getRequiredToolParams,G as getRuntimeModelProvider,I as getRuntimeModelProviderNames,Pc as getSessionLineagePath,Qc as getSessionMessagesFromLineage,$a as getSymbolContext,oc as getTool,pc as getToolDefinition,rc as getToolRegistrations,hb as getToolResultPolicy,Kb as hasPendingSwap,Kd as independentReview,qd as inferTaskType,za as inspectEditFailure,Wa as inspectRepoIntelligenceRuntime,B as isCustomProviderName,Ee as isDeniedRecently,L as isKnownProvider,ue as isParallelDispatchDirective,r as isProviderConfigured,x as isProviderName,H as isRuntimeModelProviderName,kc as listAll,gc as listArtifacts,vc as listBuiltinToolDefinitions,ic as listConstructed,yc as listToolDefinitions,xc as listTools,ub as loadAgentsFiles,Te as loadAutoRules,Nb as loadHandler,h as loadReasoningOverride,Xd as markFanoutBranchCancelled,Wd as markFanoutBranchCompleted,ad as mergeArtifactLedger,Dc as orderPromptSections,Se as parseAutoRules,Ne as parseClassifierOutput,ya as parseEditToolError,Rb as parseLlmReviewVerdict,ke as parseMcpCapabilityId,ef as parseModelSpec,ua as persistToolOutput,Fb as plannerAgent,Ie as plannerCodingAgent,hc as readArtifact,Ub as readAuditEntries,Wb as readBudget,Zb as readDisableState,mf as readSpeculativeWindowFromEnv,Qe as readTrustState,e as reasoningCapabilityToOverride,pd as reasoningModeToDepth,f as reasoningOverrideToCapability,jd as reconstructMessagesWithToolGuard,Ze as recordAutoModeAllow,Ye as recordAutoModeBlock,cf as recordBreakerError,De as recordDenial,Od as registerCodingInvariants,qe as registerConfiguredMcpCapabilityProvider,z as registerCustomProviders,F as registerModelProvider,re as registerOfficialSandboxExtension,fa as registerPresetDispatcher,nc as registerTool,ec as rehydrateActiveArtifacts,Xb as remainingSelfModifyBudget,La as renderChangedScope,Sa as renderImpactEstimate,Pa as renderModuleContext,Ra as renderProcessContext,Ec as renderPromptSections,Ia as renderRepoOverview,nb as renderRetrievalResult,Qa as renderSymbolContext,Yb as resetBudget,ff as resolveClassifierModel,Jb as resolveConstructedAgent,K as resolveProvider,od as resolveReasoningMode,Va as resolveRepoIntelligenceMode,Ua as resolveRepoIntelligenceRuntimeConfig,gd as resolveResilienceConfig,Rc as resolveSessionLineageTarget,Ld as resolveToolCapability,fc as revoke,Wc as rewindSessionLineage,lc as rollbackSelfModify,Ob as runAstRules,Hd as runKodaX,Sb as runLlmReview,he as runManagedTask,se as runOrchestration,i as saveReasoningOverride,Eb as scoutAgent,He as scoutCodingAgent,le as searchMcpCatalog,Bd as setActiveExtensionRuntime,Sc as setSessionLineageActiveEntry,nf as speculativeRace,bc as stage,Ue as stripAssistantText,jb as stripHtmlToText,cc as testArtifact,Fa as toolAskUserQuestion,Ba as toolBash,Oa as toolChangedDiff,Na as toolChangedScope,rb as toolCodeSearch,xa as toolEdit,Ca as toolGlob,Da as toolGrep,gb as toolImpactEstimate,Aa as toolInsertAfterAnchor,db as toolModuleContext,Md as toolPermission,fb as toolProcessContext,va as toolRead,Ma as toolRepoOverview,sb as toolSemanticLookup,eb as toolSymbolContext,Ea as toolUndo,qb as toolWebFetch,pb as toolWebSearch,wa as toolWrite,ra as truncateHead,ta as truncateLine,sa as truncateTail,Re as trustProjectRules,ha as validateAndFixToolHistory,we as validateSubtaskIndependence,Pb as validateToolSchemaForProvider,Xa as warmRepoIntelligenceRuntime,yd as webhook};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
// @kodax-ai/kodax — bundled distribution. See docs/ADR.md ADR-022 + ADR-024.
|
|
2
|
+
import{$,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,_,a,aa,b,ba,c,ca,d,da,e,ea,f,fa,g,ga,h,ha,i,ia,j,ja,k,ka,l,la,m,ma,n,na,o,oa,p,pa,q,qa,r,ra,s,sa,t,ta,u,ua,v,va,w,x,y,z}from"./chunk-XI75LZIO.js";import"./chunk-4E76FLZ3.js";export{ma as DEFAULT_COST_RATES,i as KODAX_API_MIN_INTERVAL,g as KODAX_CAPPED_MAX_OUTPUT_TOKENS,Q as KODAX_DEFAULT_PROVIDER,k as KODAX_DEFAULT_THINKING_BUDGETS,h as KODAX_ESCALATED_MAX_OUTPUT_TOKENS,f as KODAX_MAX_TOKENS,P as KODAX_PROVIDERS,O as KODAX_PROVIDER_SNAPSHOTS,j as KODAX_REASONING_MODE_SEQUENCE,l as KODAX_REASONING_SAFETY_RESERVE,I as KodaXAnthropicCompatProvider,C as KodaXBaseProvider,a as KodaXError,d as KodaXNetworkError,J as KodaXOpenAICompatProvider,b as KodaXProviderError,c as KodaXRateLimitError,e as KodaXToolCallIdError,v as buildReasoningOverrideKey,oa as calculateCost,r as clampThinkingBudget,y as clearReasoningOverride,ia as clearRuntimeModelProviders,pa as createCostTracker,Z as createCustomProvider,A as extractHeadersFromError,ta as formatCost,ua as formatCostReport,la as getAvailableProviderNames,K as getCodexCliDefaultModel,M as getCodexCliKnownModels,na as getCostRate,$ as getCustomProvider,ca as getCustomProviderList,da as getCustomProviderModels,ba as getCustomProviderNames,p as getDefaultThinkingDepthForMode,L as getGeminiCliDefaultModel,N as getGeminiCliKnownModels,R as getProvider,V as getProviderConfiguredCapabilityProfile,U as getProviderConfiguredReasoningCapability,W as getProviderList,T as getProviderModel,X as getProviderModels,m as getReasoningCapability,fa as getRuntimeModelProvider,ha as getRuntimeModelProviderNames,sa as getSummary,E as insertCacheBoundary,F as isCacheBoundary,aa as isCustomProviderName,ka as isKnownProvider,S as isProviderConfigured,Y as isProviderName,n as isReasoningEnabled,ga as isRuntimeModelProviderName,w as loadReasoningOverride,G as lowerCacheBoundaries,s as mapDepthToOpenAIReasoningEffort,B as normalizeCapabilityProfile,o as normalizeReasoningRequest,z as parseRetryAfter,D as parseToolInputWithSalvage,t as reasoningCapabilityToOverride,u as reasoningOverrideToCapability,qa as recordRetry,ra as recordUsage,_ as registerCustomProviders,ea as registerModelProvider,ja as resolveProvider,q as resolveThinkingBudget,x as saveReasoningOverride,va as sideQuery,H as stripCacheBoundaries};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
// @kodax-ai/kodax — bundled distribution. See docs/ADR.md ADR-022 + ADR-024.
|
|
2
|
+
import{A as z,B as A,C as B,D as C,b as a,c as b,d as c,e as d,f as e,g as f,h as g,i as h,j as i,k as j,l as k,m as l,n as m,o as n,p as o,q as p,r as q,s as r,t as s,u as t,v as u,w as v,x as w,y as x,z as y}from"./chunk-SF7WD7E5.js";import"./chunk-7LQ2NCHF.js";import"./chunk-N2VZ2MJF.js";import"./chunk-SONW6AC7.js";import"./chunk-XI75LZIO.js";import"./chunk-4E76FLZ3.js";export{c as KODAX_CONFIG_FILE,a as KODAX_DIR,b as KODAX_SESSIONS_DIR,i as KODAX_VERSION,d as PREVIEW_MAX_LENGTH,p as describeProviderCapabilitySummary,r as describeReasoningCapabilityControl,s as describeReasoningExecution,A as formatProviderCapabilityDetailLines,z as formatProviderSourceKind,q as formatReasoningCapabilityShort,y as getGitRoot,k as getProviderAvailableModels,m as getProviderCapabilityProfile,n as getProviderCapabilitySnapshot,B as getProviderCommonPolicyScenarios,t as getProviderList,j as getProviderModel,o as getProviderPolicyDecision,l as getProviderReasoningCapability,h as getVersion,e as hydrateProcessEnvFromShell,u as isProviderConfigured,v as loadConfig,w as prepareRuntimeConfig,C as rateLimitedCall,g as registerConfiguredCustomProviders,f as resetShellEnvironmentHydrationForTesting,x as saveConfig};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { KodaXResult } from '@kodax-ai/coding';
|
|
2
|
+
export declare const KODAX_COMMANDS_DIR: string;
|
|
3
|
+
export interface KodaXCommand {
|
|
4
|
+
name: string;
|
|
5
|
+
description: string;
|
|
6
|
+
content: string;
|
|
7
|
+
type: 'prompt' | 'programmable';
|
|
8
|
+
execute?: (context: KodaXCommandContext) => Promise<string>;
|
|
9
|
+
}
|
|
10
|
+
export interface KodaXCommandContext {
|
|
11
|
+
args?: string;
|
|
12
|
+
runAgent: (prompt: string) => Promise<KodaXResult>;
|
|
13
|
+
}
|
|
14
|
+
export declare function getDefaultCommandDir(): string;
|
|
15
|
+
export declare function loadCommands(commandDir?: string): Promise<Map<string, KodaXCommand>>;
|
|
16
|
+
export declare function processCommandCall(commandName: string, args: string | undefined, commands: Map<string, KodaXCommand>, runAgent: (prompt: string) => Promise<KodaXResult>): Promise<string | null>;
|
|
17
|
+
export declare function parseCommandCall(input: string): [string, string?] | null;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { KodaXAgentMode, KodaXOptions, KodaXExtensionRuntime, KodaXReasoningMode } from '@kodax-ai/coding';
|
|
3
|
+
import { FileSessionStorage } from '@kodax-ai/repl';
|
|
4
|
+
import type { AcpPermissionMode } from './acp_server.js';
|
|
5
|
+
export declare const ACP_PERMISSION_MODES: AcpPermissionMode[];
|
|
6
|
+
export declare const CLI_OUTPUT_MODES: readonly ["text", "json"];
|
|
7
|
+
export declare const KODAX_AGENT_MODES: readonly ["ama", "sa"];
|
|
8
|
+
export type CliOutputMode = typeof CLI_OUTPUT_MODES[number];
|
|
9
|
+
export interface CliOptions {
|
|
10
|
+
provider: string;
|
|
11
|
+
model?: string;
|
|
12
|
+
thinking: boolean;
|
|
13
|
+
reasoningMode: KodaXReasoningMode;
|
|
14
|
+
agentMode: KodaXAgentMode;
|
|
15
|
+
outputMode: CliOutputMode;
|
|
16
|
+
extensions?: string[];
|
|
17
|
+
extensionRuntime?: KodaXExtensionRuntime;
|
|
18
|
+
session?: string;
|
|
19
|
+
maxIter?: number;
|
|
20
|
+
prompt: string[];
|
|
21
|
+
continue?: boolean;
|
|
22
|
+
resume?: string;
|
|
23
|
+
noSession: boolean;
|
|
24
|
+
print?: boolean;
|
|
25
|
+
}
|
|
26
|
+
export declare function parseOutputModeOption(value: string): CliOutputMode;
|
|
27
|
+
export declare function validateCliModeSelection(cliOptions: CliOptions, extras?: {
|
|
28
|
+
resumeWithoutId?: boolean;
|
|
29
|
+
}): void;
|
|
30
|
+
export declare function parsePermissionModeOption(value: string): AcpPermissionMode;
|
|
31
|
+
export declare function parseAgentModeOption(value: string): KodaXAgentMode;
|
|
32
|
+
export declare function resolveCliReasoningMode(program: Command, opts: Record<string, unknown>, config: {
|
|
33
|
+
reasoningMode?: KodaXReasoningMode;
|
|
34
|
+
thinking?: boolean;
|
|
35
|
+
}): KodaXReasoningMode;
|
|
36
|
+
export declare function resolveCliAgentMode(program: Command, opts: Record<string, unknown>, config: {
|
|
37
|
+
agentMode?: KodaXAgentMode;
|
|
38
|
+
}): KodaXAgentMode;
|
|
39
|
+
export declare function resolveCliModelSelection(requestedProvider: string | undefined, requestedModel: string | undefined, configuredProvider: string | undefined, configuredModel: string | undefined): string | undefined;
|
|
40
|
+
export declare function mergeConfiguredExtensions(cliExtensions?: string[], configExtensions?: string[]): string[];
|
|
41
|
+
export declare function parseOptionalNonNegativeInt(value: string | undefined): number | undefined;
|
|
42
|
+
export declare function createKodaXOptions(cliOptions: CliOptions, isPrintMode?: boolean): KodaXOptions;
|
|
43
|
+
export declare function buildSessionOptions(cliOptions: CliOptions): {
|
|
44
|
+
id?: string;
|
|
45
|
+
resume?: boolean;
|
|
46
|
+
storage: FileSessionStorage;
|
|
47
|
+
autoResume?: boolean;
|
|
48
|
+
scope: 'user';
|
|
49
|
+
} | undefined;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI surface for constructed tools (FEATURE_088 follow-on, v0.7.28).
|
|
3
|
+
*
|
|
4
|
+
* Two entry points:
|
|
5
|
+
*
|
|
6
|
+
* 1. `kodax <constructed-tool-name> [args...]`
|
|
7
|
+
* Direct dispatch to a previously-activated constructed tool, without
|
|
8
|
+
* opening the REPL. Args map onto the artifact's `inputSchema` via
|
|
9
|
+
* `--key=value` / `--key value` / single positional → first required
|
|
10
|
+
* string field. The handler's return value is printed to stdout.
|
|
11
|
+
*
|
|
12
|
+
* 2. `kodax tools list | revoke <name>@<version> | inspect <name>[@<version>]`
|
|
13
|
+
* Inventory and lifecycle management of constructed tools from the
|
|
14
|
+
* shell, no REPL required.
|
|
15
|
+
*
|
|
16
|
+
* Bootstrap policy: the CLI binds a non-interactive 'reject' policy via
|
|
17
|
+
* `configureRuntime`. activate() cannot succeed from this surface — that
|
|
18
|
+
* is by design (REPL dialog is the one approved-activation path; CLI is
|
|
19
|
+
* for *invoking* tools that are already activated). Rehydrate then runs,
|
|
20
|
+
* making every `status='active'` artifact callable.
|
|
21
|
+
*/
|
|
22
|
+
/**
|
|
23
|
+
* Decide whether the current argv targets a constructed tool. Called
|
|
24
|
+
* BEFORE commander parses, so it must be conservative — only fire when:
|
|
25
|
+
*
|
|
26
|
+
* - argv[0] is non-empty
|
|
27
|
+
* - argv[0] is NOT a reserved subcommand
|
|
28
|
+
* - argv[0] is NOT a global flag (starts with '-')
|
|
29
|
+
* - bootstrap completes and the registry contains a tool with that name
|
|
30
|
+
* whose source.kind === 'constructed'
|
|
31
|
+
*
|
|
32
|
+
* Returns the resolved tool name on a match, or null to defer to commander.
|
|
33
|
+
*/
|
|
34
|
+
export declare function detectConstructedToolDispatch(argv: readonly string[], cwd: string): Promise<string | null>;
|
|
35
|
+
/**
|
|
36
|
+
* Translate `--key=value` / `--key value` / `--flag` / single positional
|
|
37
|
+
* into a typed input object suitable for an inputSchema-validated tool.
|
|
38
|
+
*
|
|
39
|
+
* Type coercion is driven by `inputSchema.properties[key].type`:
|
|
40
|
+
* - 'string' → as-is
|
|
41
|
+
* - 'integer' → parseInt with NaN guard
|
|
42
|
+
* - 'number' → parseFloat with NaN guard
|
|
43
|
+
* - 'boolean' → standalone `--flag` → true; `--flag=false` → false; etc.
|
|
44
|
+
* - other → JSON.parse fallback (arrays / nested objects via JSON
|
|
45
|
+
* strings, e.g. `--items='["a","b"]'`)
|
|
46
|
+
*
|
|
47
|
+
* A single bare positional argument maps onto the first required string
|
|
48
|
+
* property — convenient for one-arg tools (`kodax count_lines /tmp/x`).
|
|
49
|
+
*
|
|
50
|
+
* Throws on shape errors with a message the caller prints verbatim.
|
|
51
|
+
*/
|
|
52
|
+
export declare function parseArgsByInputSchema(argv: readonly string[], inputSchema: Record<string, unknown> | undefined): Record<string, unknown>;
|
|
53
|
+
/**
|
|
54
|
+
* Direct-dispatch entry point. Resolves the tool, parses args, runs the
|
|
55
|
+
* handler with a minimal execution context, prints the result string, and
|
|
56
|
+
* exits with status 0. Errors abort with status 1 and a message on stderr.
|
|
57
|
+
*/
|
|
58
|
+
export declare function runConstructedToolDispatch(toolName: string, argv: readonly string[], cwd: string): Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* Pretty-print the constructed-tool inventory. Builtin tools are NOT
|
|
61
|
+
* listed by default — `--all` toggles that for diagnostics.
|
|
62
|
+
*/
|
|
63
|
+
export declare function runToolsList(opts: {
|
|
64
|
+
all?: boolean;
|
|
65
|
+
cwd: string;
|
|
66
|
+
}): Promise<void>;
|
|
67
|
+
/**
|
|
68
|
+
* Revoke a constructed tool by `name@version`. Idempotent: revoking an
|
|
69
|
+
* unknown spec exits 0 with a noop message (matches runtime semantics).
|
|
70
|
+
*/
|
|
71
|
+
export declare function runToolsRevoke(spec: string, opts: {
|
|
72
|
+
cwd: string;
|
|
73
|
+
}): Promise<void>;
|
|
74
|
+
/**
|
|
75
|
+
* Print the full manifest JSON for a constructed artifact. Without a
|
|
76
|
+
* version, prints the currently-active entry (the last-wins top of the
|
|
77
|
+
* registry stack); with a version, locates that exact entry on disk
|
|
78
|
+
* regardless of status (active / staged / revoked).
|
|
79
|
+
*/
|
|
80
|
+
export declare function runToolsInspect(spec: string, opts: {
|
|
81
|
+
cwd: string;
|
|
82
|
+
}): Promise<void>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KodaX - 极致轻量化 Coding Agent
|
|
3
|
+
*
|
|
4
|
+
* 根入口文件 - 代理到 monorepo packages
|
|
5
|
+
*/
|
|
6
|
+
export * from '@kodax-ai/coding';
|
|
7
|
+
export { ACP_LOG_LEVELS, AcpLogger, resolveAcpLogLevel, type AcpLogLevel, } from './acp_logger.js';
|
|
8
|
+
export { AcpEventEmitter, type AcpEventSink, type AcpRuntimeEvent, } from './acp_events.js';
|
|
9
|
+
export { KodaXAcpServer, runAcpServer, type KodaXAcpServerOptions } from './acp_server.js';
|
|
10
|
+
export { runInkInteractiveMode, type InkREPLOptions, runInteractiveMode, processSpecialSyntax, type RepLOptions, InteractiveContext, createInteractiveContext, touchContext, parseCommand, executeCommand, BUILTIN_COMMANDS, type Command, type CommandCallbacks, type CurrentConfig, getVersion, KODAX_VERSION, getProviderModel, getProviderList, isProviderConfigured, hydrateProcessEnvFromShell, loadConfig, prepareRuntimeConfig, registerConfiguredCustomProviders, saveConfig, getGitRoot, rateLimitedCall, KODAX_DIR, KODAX_SESSIONS_DIR, KODAX_CONFIG_FILE, FileSessionStorage, } from '@kodax-ai/repl';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// @kodax-ai/kodax — bundled distribution. See docs/ADR.md ADR-022 + ADR-024.
|
|
2
|
+
import{Nb as me,Ob as ge,Pb as w,X as x,_ as E,aa as L,ba as T,ca as O,da as q,ea as F,fa as K,ga as D,ka as ae,kb as ce,la as de,lb as pe,ma as le,vb as ue}from"./chunks/chunk-WEEQZYZS.js";import{D as re,b as W,c as G,d as Q,f as H,h as J,i as Y,j as Z,k as ee,u as te,v as se,w as oe,x as A,y as ne,z as ie}from"./chunks/chunk-SF7WD7E5.js";import"./chunks/chunk-HUAU4KB3.js";import{$ as Ls,$a as To,$b as Tn,$c as Ei,$d as xr,A as is,Aa as io,Ab as an,Ac as ii,Ad as or,B as rs,Ba as ro,Bb as dn,Bc as ri,Bd as nr,C as as,Ca as ao,Cb as ln,Cc as ai,Cd as ir,D as ds,Da as lo,Db as cn,Dc as di,Dd as rr,E as ls,Ea as co,Eb as pn,Ec as M,Ed as ar,F as cs,Fa as po,Fb as un,Fc as li,Fd as dr,G as ps,Ga as uo,Gb as mn,Gc as ci,Gd as lr,H as us,Ha as mo,Hb as gn,Hc as pi,Hd as cr,I as ms,Ia as go,Ib as fn,Ic as ui,Id as pr,J as gs,Ja as fo,Jb as hn,Jc as mi,Jd as ur,K as fs,Ka as ho,Kb as vn,Kc as gi,Kd as mr,L as hs,La as vo,Lb as yn,Lc as fi,Ld as gr,M as vs,Ma as yo,Mb as _n,Mc as hi,Md as fr,N as ys,Na as _o,Nb as In,Nc as vi,Nd as hr,O as _s,Oa as Io,Ob as An,Oc as yi,Od as vr,P as Is,Pa as Ao,Pb as wn,Pc as _i,Pd as yr,Q as As,Qa as wo,Qb as Sn,Qc as Ii,Qd as _r,R as ws,Ra as So,Rb as Cn,Rc as Ai,Rd as Ir,S as Ss,Sa as Co,Sb as Pn,Sc as wi,Sd as Ar,T as Cs,Ta as Po,Tb as bn,Tc as Si,Td as wr,U as Ps,Ua as bo,Ub as kn,Uc as Ci,Ud as Sr,V as bs,Va as ko,Vb as Mn,Vc as Pi,Vd as Cr,W as ks,Wa as Mo,Wb as Rn,Wc as bi,Wd as Pr,X as Ms,Xa as Ro,Xb as xn,Xc as ki,Xd as br,Y as Rs,Ya as xo,Yb as En,Yc as Mi,Yd as kr,Z as xs,Za as Eo,Zc as Ri,Zd as Mr,_ as Es,_a as Lo,_b as Ln,_c as xi,_d as Rr,a as gt,aa as Ts,ab as Oo,ac as On,ad as Li,ae as Er,b as ft,ba as Os,bb as qo,bc as qn,bd as Ti,be as Lr,c as ht,ca as qs,cb as Fo,cc as Fn,cd as Oi,ce as Tr,d as vt,da as Fs,db as Ko,dc as Kn,dd as qi,de as Or,e as yt,ea as Ks,eb as Do,ec as Dn,ed as Fi,ee as qr,f as Dt,fa as Ds,fb as Xo,fc as Xn,fd as Ki,fe as Fr,g as Xt,ga as Xs,gb as jo,gc as jn,gd as Di,ge as Kr,h as jt,ha as js,hb as Uo,hc as Un,hd as Xi,he as Dr,i as Ut,ia as Us,ib as Vo,ic as Vn,id as ji,ie as Xr,j as Vt,ja as Vs,jb as $o,jc as $n,jd as Ui,je as jr,k as $t,ka as $s,kb as zo,kc as zn,kd as Vi,ke as Ur,l as zt,la as zs,lb as Bo,lc as Bn,ld as $i,le as Vr,m as Bt,ma as Bs,mb as No,mc as Nn,md as zi,me as $r,n as Nt,na as Ns,nb as Wo,nc as Wn,nd as I,ne as R,o as Wt,oa as Ws,ob as Go,oc as Gn,od as Bi,p as Gt,pa as Gs,pb as Qo,pc as Qn,pd as Ni,q as Qt,qa as Qs,qb as Ho,qc as Hn,qd as Wi,r as Ht,ra as Hs,rb as Jo,rc as Jn,rd as Gi,s as Jt,sa as Js,sb as Yo,sc as Yn,sd as Qi,t as Yt,ta as Ys,tb as Zo,tc as Zn,td as Hi,u as Zt,ua as Zs,ub as en,uc as ei,ud as Ji,v as es,va as eo,vb as tn,vc as ti,vd as Yi,w as ts,wa as to,wb as sn,wc as si,wd as Zi,x as ss,xa as so,xb as on,xc as _,xd as er,y as os,ya as oo,yb as nn,yc as oi,yd as tr,z as ns,za as no,zb as rn,zc as ni,zd as sr}from"./chunks/chunk-7LQ2NCHF.js";import{Ca as Ft,Da as Kt,Z as Ot,a as _t,aa as qt,b as It,c as At,d as wt,e as St,f as Ct,h as Pt,i as bt,j as kt,k as Mt,l as Rt,m as xt,n as Et,o as Lt,p as Tt}from"./chunks/chunk-N2VZ2MJF.js";import"./chunks/chunk-SONW6AC7.js";import{$ as st,C as ze,I as Be,J as Ne,O as We,P as Ge,Q as b,R as Qe,U as He,V as Je,X as Ye,Y as Ze,Z as et,_ as tt,a as Oe,aa as ot,b as qe,ba as nt,c as Fe,ca as it,da as rt,ea as at,fa as dt,ga as lt,ha as ct,ia as pt,j as Ke,ja as k,ka as ut,la as mt,t as De,u as Xe,v as je,w as Ue,x as Ve,y as $e}from"./chunks/chunk-XI75LZIO.js";import{a as r}from"./chunks/chunk-4E76FLZ3.js";import fe from"node:process";var j=["off","error","info","debug"],X={off:0,error:1,info:2,debug:3};function S(o,e="info"){if(!o)return e;let t=o.trim().toLowerCase();return j.includes(t)?t:e}r(S,"resolveAcpLogLevel");var m=class{static{r(this,"AcpLogger")}level;sink;constructor(e={}){this.level=e.level??"info",this.sink=e.sink??(t=>{fe.stderr.write(`${t}
|
|
3
|
+
`)})}handleEvent(e){let t=he(e);t&&this.log(t.level,t.message,t.fields)}error(e,t){this.log("error",e,t)}info(e,t){this.log("info",e,t)}debug(e,t){this.log("debug",e,t)}log(e,t,s){if(X[this.level]<X[e])return;let n=new Date().toISOString(),i=s?ye(s):"",a=i?` ${i}`:"";this.sink(`[ACP][${e.toUpperCase()}][${n}] ${t}${a}`)}};function he(o){switch(o.type){case"server_attached":return{level:"info",message:"ACP server attached",fields:c(o)};case"connection_closed":return{level:"info",message:"ACP connection closed",fields:c(o)};case"initialize_completed":return{level:"info",message:"ACP initialize completed",fields:c(o)};case"session_created":return{level:"info",message:"ACP session created",fields:c(o)};case"session_mode_changed":return{level:"info",message:"ACP session mode changed",fields:c(o)};case"prompt_skipped":return{level:"info",message:"ACP prompt skipped because session was already aborted",fields:c(o)};case"prompt_started":return{level:"info",message:"ACP prompt started",fields:c(o)};case"prompt_preview":return{level:"debug",message:"ACP prompt preview",fields:c(o)};case"prompt_finished":return{level:"info",message:"ACP prompt finished",fields:c(o)};case"prompt_cancelled":return{level:"info",message:"ACP prompt cancelled during execution",fields:c(o)};case"prompt_failed":return{level:"error",message:"ACP prompt failed",fields:c(o)};case"cancel_requested":return{level:"info",message:"ACP cancel requested",fields:c(o)};case"tool_permission_evaluated":return{level:"debug",message:"ACP evaluating tool permission",fields:c(o)};case"tool_permission_resolved":return ve(o);case"permission_requested":return{level:"info",message:"ACP permission requested",fields:c(o)};case"notification_failed":return{level:"error",message:`Failed to send ${o.label}`,fields:{sessionId:o.sessionId,error:o.error}};case"repo_intelligence_trace":return{level:"debug",message:"ACP repo intelligence trace",fields:c(o)};default:return null}}r(he,"mapEventToLogEntry");function c(o){let{type:e,...t}=o;return t}r(c,"toLogFields");function ve(o){let e={sessionId:o.sessionId,tool:o.tool,toolId:o.toolId};switch(o.outcome){case"auto_allowed_read_only_bash":return{level:"debug",message:"ACP tool permission auto-allowed for read-only bash",fields:e};case"auto_allowed_remembered":return{level:"info",message:"ACP tool permission reused remembered allowance",fields:e};case"blocked_plan_mode":return{level:"info",message:"ACP tool blocked by plan mode",fields:e};case"auto_allowed_plan_mode":return{level:"debug",message:"ACP tool auto-allowed in plan mode",fields:e};case"auto_allowed_policy":return{level:"debug",message:"ACP tool auto-allowed by permission policy",fields:e};case"request_failed_disconnected":return{level:"error",message:"ACP permission request failed because client is disconnected",fields:e};case"request_failed_incomplete":return{level:"error",message:"ACP permission request did not complete",fields:e};case"request_dismissed":return{level:"info",message:"ACP permission request dismissed",fields:e};case"request_rejected":return{level:"info",message:"ACP permission rejected",fields:e};case"request_granted":return{level:"info",message:"ACP permission granted",fields:{...e,remember:o.remember??!1}}}}r(ve,"mapPermissionOutcomeToLogEntry");function ye(o){return Object.entries(o).flatMap(([e,t])=>t===void 0?[]:`${e}=${_e(t)}`).join(" ")}r(ye,"formatFields");function _e(o){return o===null?"null":typeof o=="string"?JSON.stringify(o.length>160?`${o.slice(0,157)}...`:o):String(o)}r(_e,"formatFieldValue");var g=class{static{r(this,"AcpEventEmitter")}sinks;constructor(e={}){this.sinks=[...e.sinks??[]]}emit(e){for(let t of this.sinks)try{t.handleEvent(e)}catch{}}};import{randomUUID as U}from"node:crypto";import f from"node:path";import v from"node:process";import{Readable as Ie,Writable as Ae}from"node:stream";import{AgentSideConnection as we,PROTOCOL_VERSION as V,RequestError as h,ndJsonStream as Se}from"@agentclientprotocol/sdk";var N=["plan","accept-edits","auto-in-project"],C=new Set(["write","edit"]),Ce={read:"read",write:"edit",edit:"edit",undo:"edit",bash:"execute",grep:"search",glob:"search",think:"think",fetch:"fetch"},Pe=[{id:"plan",name:"Plan",description:"Read-only planning mode. File modifications are blocked except the plan-mode whitelist."},{id:"accept-edits",name:"Accept Edits",description:"File edits are auto-approved. Shell commands still require confirmation unless explicitly remembered."},{id:"auto-in-project",name:"Auto In Project",description:"Project-scoped changes are auto-approved. Protected paths and risky out-of-project operations still require confirmation."}];function be(o){let e={};for(let t of o)if("command"in t){let s={};for(let n of t.env??[])s[n.name]=n.value;e[t.name]={type:"stdio",command:t.command,args:t.args??[],env:Object.keys(s).length>0?s:void 0}}else if("type"in t&&t.type==="sse"){let s={};for(let n of t.headers??[])s[n.name]=n.value;e[t.name]={type:"sse",url:t.url,headers:Object.keys(s).length>0?s:void 0}}else if("type"in t&&t.type==="http"){let s={};for(let n of t.headers??[])s[n.name]=n.value;e[t.name]={type:"streamable-http",url:t.url,headers:Object.keys(s).length>0?s:void 0}}return e}r(be,"convertAcpMcpServers");function ke(o,e="accept-edits"){return o&&N.includes(o)?o:e}r(ke,"normalizeAcpPermissionMode");function Me(o){if(o&&N.includes(o))return o;throw h.invalidParams({modeId:o},"Invalid session mode. Expected one of: plan, accept-edits, auto-in-project.")}r(Me,"parseSessionMode");function Re(o){return{availableModes:Pe,currentModeId:o}}r(Re,"buildModeState");function $(o){return Ce[o]??"other"}r($,"inferToolKind");function z(o,e){if(C.has(o)){let t=typeof e.path=="string"?e.path:void 0;return t?[{path:t}]:void 0}if(o==="bash"){let t=typeof e.command=="string"?e.command:"",s=F(t);if(s.length>0)return s.map(n=>({path:n}))}}r(z,"inferToolLocations");function xe(o){let e=[];for(let t of o){let s=t,n=typeof s.type=="string"?s.type:"";if(n==="text"&&typeof s.text=="string"){e.push(s.text);continue}if(n==="resource_link"&&typeof s.uri=="string"){e.push(`[Resource] ${s.uri}`);continue}if(n==="resource"&&s.resource&&typeof s.resource=="object"){let i=s.resource;if(typeof i.text=="string"){e.push(i.text);continue}typeof i.uri=="string"&&e.push(`[Resource] ${i.uri}`)}}return e.join(`
|
|
4
|
+
|
|
5
|
+
`).trim()}r(xe,"extractPromptText");function Ee(o){return/^\[(?:Tool Error|Cancelled|Blocked|Error)\]/.test(o)}r(Ee,"isToolResultFailure");function Le(o){return o instanceof Error?o.name==="AbortError"||o.message.includes("aborted")||o.message.includes("ABORTED"):!1}r(Le,"isAbortLikeError");function B(o){let e=o?.usage;if(e)return{inputTokens:e.inputTokens,outputTokens:e.outputTokens,totalTokens:e.totalTokens,...e.cachedReadTokens!==void 0?{cachedReadTokens:e.cachedReadTokens}:{},...e.cachedWriteTokens!==void 0?{cachedWriteTokens:e.cachedWriteTokens}:{},...e.thoughtTokens!==void 0?{thoughtTokens:e.thoughtTokens}:{}}}r(B,"toAcpUsage");var y=class{static{r(this,"KodaXAcpServer")}provider;model;thinking;reasoningMode;defaultPermissionMode;defaultCwd;hasFixedCwd;agentName;agentVersion;storage;events;bashPrefixExtractor;connection=null;sessions=new Map;promptQueue=Promise.resolve();extensionRuntime;extensionRuntimeReady;constructor(e={}){let t=A();this.provider=e.provider??t.provider??b,this.model=e.model,this.thinking=e.thinking??t.thinking??!1,this.reasoningMode=e.reasoningMode??t.reasoningMode??"auto",this.defaultPermissionMode=ke(e.permissionMode??t.permissionMode,"accept-edits"),this.defaultCwd=f.resolve(e.cwd??v.cwd()),this.hasFixedCwd=e.cwd!==void 0,this.agentName=e.agentName??"kodax-acp-server",this.agentVersion=e.agentVersion??"0.0.0",this.storage=e.storage??new w,this.events=new g({sinks:[...e.eventSinks??[],new m({level:S(e.logLevel??v.env.KODAX_ACP_LOG,"info")})]}),this.bashPrefixExtractor=R({getProvider:r(()=>k(this.provider),"getProvider"),getModel:r(()=>this.model??"","getModel")});let s=t.mcpServers;if(s&&Object.values(s).some(i=>(i.connect??"lazy")!=="disabled")){let i=_({config:t});this.extensionRuntimeReady=I(i,s).then(()=>{i.activate(),this.extensionRuntime=i}).catch(a=>{let d=a instanceof Error?a.message:String(a);console.warn(`[kodax:acp] MCP initialization failed: ${d}`)})}}attach(e,t){let s=Se(t,e),n=new we(()=>this,s);return this.connection=n,this.events.emit({type:"server_attached",agent:this.agentName,version:this.agentVersion,provider:this.provider,model:this.model??"(default)",cwd:this.defaultCwd,permissionMode:this.defaultPermissionMode,reasoningMode:this.reasoningMode,thinking:this.thinking,fixedCwd:this.hasFixedCwd}),n.signal.addEventListener("abort",()=>{this.sessions.forEach(i=>{i.activeController?.abort(),i.extensionRuntime?.dispose()}),this.events.emit({type:"connection_closed",activeSessions:this.sessions.size}),this.sessions.clear(),this.connection=null,this.extensionRuntime?.dispose(),this.extensionRuntime=void 0}),n}async waitForClose(){await this.connection?.closed}async initialize(e){return this.events.emit({type:"initialize_completed",protocolVersion:V}),{protocolVersion:V,agentInfo:{name:this.agentName,version:this.agentVersion},agentCapabilities:{promptCapabilities:{embeddedContext:!0,image:!1,audio:!1},sessionCapabilities:{}}}}async newSession(e){let t=this.hasFixedCwd?this.defaultCwd:e.cwd??this.defaultCwd;if(!f.isAbsolute(t))throw h.invalidParams({cwd:t},"Session cwd must be an absolute path.");let s=U(),n=e.mcpServers??[],i={sessionId:s,cwd:f.resolve(t),permissionMode:this.defaultPermissionMode,mcpServers:n,alwaysAllowTools:[],activeController:null};if(n.length>0){let a=be(n),d=_({});await I(d,a).catch(p=>{let l=p instanceof Error?p.message:String(p);console.warn(`[kodax:acp] Per-session MCP init failed for ${s}: ${l}`)}),d.activate(),i.extensionRuntime=d}return this.sessions.set(s,i),this.events.emit({type:"session_created",sessionId:s,cwd:i.cwd,permissionMode:i.permissionMode,mcpServers:i.mcpServers.length}),{sessionId:s,modes:Re(i.permissionMode)}}async authenticate(){}async setSessionMode(e){let t=this.requireSession(e.sessionId),s=t.permissionMode,n=Me(e.modeId);return t.permissionMode=n,this.events.emit({type:"session_mode_changed",sessionId:t.sessionId,from:s,to:n}),await this.sendSessionUpdate({sessionId:t.sessionId,update:{sessionUpdate:"current_mode_update",currentModeId:n}}),{}}async prompt(e){let t=this.requireSession(e.sessionId),s=xe(e.prompt);if(!s)throw h.invalidParams({prompt:e.prompt},"Prompt must include at least one text or resource block with content.");let n=new AbortController;t.activeController=n;let i=Date.now(),a=r(async()=>{if(n.signal.aborted)return this.events.emit({type:"prompt_skipped",sessionId:t.sessionId}),{stopReason:"cancelled",userMessageId:e.messageId??void 0};let p=Date.now();this.events.emit({type:"prompt_started",sessionId:t.sessionId,messageId:e.messageId??null,chars:s.length,cwd:t.cwd,queueDelayMs:p-i}),this.events.emit({type:"prompt_preview",sessionId:t.sessionId,prompt:s});try{this.extensionRuntimeReady&&await this.extensionRuntimeReady;let l=await M(this.buildKodaXOptions(t,n.signal),s);t.contextTokenSnapshot=l.contextTokenSnapshot;let u=!!l.interrupted,P=n.signal.aborted||u?"cancelled":"end_turn";return this.events.emit({type:"prompt_finished",sessionId:t.sessionId,stopReason:P,interrupted:u,durationMs:Date.now()-p}),{stopReason:P,userMessageId:e.messageId??void 0,...B(l.contextTokenSnapshot)?{usage:B(l.contextTokenSnapshot)}:{}}}catch(l){if(n.signal.aborted||Le(l))return this.events.emit({type:"prompt_cancelled",sessionId:t.sessionId,durationMs:Date.now()-p}),{stopReason:"cancelled",userMessageId:e.messageId??void 0};let u=l instanceof Error?l.message:String(l);return this.events.emit({type:"prompt_failed",sessionId:t.sessionId,durationMs:Date.now()-p,error:u}),await this.sendTextChunk(t.sessionId,`
|
|
6
|
+
[ACP Server Error] ${u}
|
|
7
|
+
`),{stopReason:n.signal.aborted?"cancelled":"end_turn",userMessageId:e.messageId??void 0}}finally{t.activeController=null}},"task"),d=this.promptQueue.then(a,a);return this.promptQueue=d.then(()=>{},()=>{}),d}async cancel(e){let t=this.sessions.get(e.sessionId);this.events.emit({type:"cancel_requested",sessionId:e.sessionId,active:!!t?.activeController}),t?.activeController?.abort()}requireSession(e){let t=this.sessions.get(e);if(!t)throw h.resourceNotFound(e);return t}buildKodaXOptions(e,t){return{provider:this.provider,model:this.model,thinking:this.thinking,reasoningMode:this.reasoningMode,abortSignal:t,extensionRuntime:e.extensionRuntime??this.extensionRuntime,session:{id:e.sessionId,storage:this.storage},context:{gitRoot:e.cwd,executionCwd:e.cwd,contextTokenSnapshot:e.contextTokenSnapshot},events:{onTextDelta:r(s=>{this.dispatchNotification("assistant text chunk",e.sessionId,this.sendTextChunk(e.sessionId,s))},"onTextDelta"),onThinkingDelta:r(s=>{this.dispatchNotification("thinking chunk",e.sessionId,this.sendSessionUpdate({sessionId:e.sessionId,update:{sessionUpdate:"agent_thought_chunk",content:{type:"text",text:s}}}))},"onThinkingDelta"),onToolUseStart:r(s=>{this.dispatchNotification("tool call start",e.sessionId,this.sendSessionUpdate({sessionId:e.sessionId,update:{sessionUpdate:"tool_call",toolCallId:s.id,title:s.name,kind:$(s.name),rawInput:s.input,locations:z(s.name,s.input??{}),status:"pending"}}))},"onToolUseStart"),onToolResult:r(s=>{this.dispatchNotification("tool call update",e.sessionId,this.sendSessionUpdate({sessionId:e.sessionId,update:{sessionUpdate:"tool_call_update",toolCallId:s.id,title:s.name,status:Ee(s.content)?"failed":"completed",rawOutput:s.content}}))},"onToolResult"),onRepoIntelligenceTrace:r(s=>{this.events.emit({type:"repo_intelligence_trace",sessionId:e.sessionId,stage:s.stage,summary:s.summary,mode:s.capability?.mode,engine:s.capability?.engine,bridge:s.capability?.bridge,status:s.capability?.status,daemonLatencyMs:s.trace?.daemonLatencyMs,cliLatencyMs:s.trace?.cliLatencyMs,cacheHit:s.trace?.cacheHit,capsuleEstimatedTokens:s.trace?.capsuleEstimatedTokens})},"onRepoIntelligenceTrace"),onError:r(s=>{this.dispatchNotification("error text chunk",e.sessionId,this.sendTextChunk(e.sessionId,`
|
|
8
|
+
[Error] ${s.message}
|
|
9
|
+
`))},"onError"),beforeToolExecute:r(async(s,n,i)=>{let a=await this.evaluateToolPermission(e,s,n,i?.toolId);return a.allowed?!0:a.override??!1},"beforeToolExecute")}}}async evaluateToolPermission(e,t,s,n){if(this.events.emit({type:"tool_permission_evaluated",sessionId:e.sessionId,tool:t,toolId:n??null,permissionMode:e.permissionMode}),t==="bash"){let l=typeof s.command=="string"?s.command:"";if(E(l))return this.events.emit({type:"tool_permission_resolved",sessionId:e.sessionId,tool:t,toolId:n??null,outcome:"auto_allowed_read_only_bash"}),{allowed:!0};if(await L(t,s,e.alwaysAllowTools,this.bashPrefixExtractor))return this.events.emit({type:"tool_permission_resolved",sessionId:e.sessionId,tool:t,toolId:n??null,outcome:"auto_allowed_remembered"}),{allowed:!0}}if(e.permissionMode==="plan"){let l=D(t,s,e.cwd);return l?(this.events.emit({type:"tool_permission_resolved",sessionId:e.sessionId,tool:t,toolId:n??null,outcome:"blocked_plan_mode"}),{allowed:!1,override:`${l} Do not try to modify files while planning. Finish the plan first, then hand off to a writable mode.`}):(this.events.emit({type:"tool_permission_resolved",sessionId:e.sessionId,tool:t,toolId:n??null,outcome:"auto_allowed_plan_mode"}),{allowed:!0})}let i=C.has(t)&&typeof s.path=="string"&&O(f.resolve(e.cwd,s.path),e.cwd),a=x(e.permissionMode).has(t),d=e.permissionMode==="auto-in-project"&&(C.has(t)&&typeof s.path=="string"&&!q(s.path,e.cwd)||t==="bash"&&typeof s.command=="string"&&K(s.command,e.cwd).dangerous);return!i&&!a&&!d?(this.events.emit({type:"tool_permission_resolved",sessionId:e.sessionId,tool:t,toolId:n??null,outcome:"auto_allowed_policy"}),{allowed:!0}):await this.requestPermissionFromClient(e,t,s,n)}async requestPermissionFromClient(e,t,s,n){if(!this.connection)return this.events.emit({type:"tool_permission_resolved",sessionId:e.sessionId,tool:t,toolId:n??null,outcome:"request_failed_disconnected"}),{allowed:!1,override:"[Cancelled] ACP client is disconnected, so the permission request could not be completed."};let i=[{optionId:"allow_once",kind:"allow_once",name:"Allow once"},{optionId:"allow_always",kind:"allow_always",name:"Always allow"},{optionId:"reject_once",kind:"reject_once",name:"Reject"}],a={toolCallId:n??U(),title:t,kind:$(t),rawInput:s,locations:z(t,s),status:"pending"},d;this.events.emit({type:"permission_requested",sessionId:e.sessionId,tool:t,toolId:a.toolCallId});try{d=await this.connection.requestPermission({sessionId:e.sessionId,toolCall:a,options:i})}catch{return this.events.emit({type:"tool_permission_resolved",sessionId:e.sessionId,tool:t,toolId:a.toolCallId,outcome:"request_failed_incomplete"}),{allowed:!1,override:"[Cancelled] ACP client did not complete the permission request. Operation failed closed."}}return d.outcome.outcome!=="selected"?(this.events.emit({type:"tool_permission_resolved",sessionId:e.sessionId,tool:t,toolId:a.toolCallId,outcome:"request_dismissed"}),{allowed:!1,override:"[Cancelled] Operation cancelled by user"}):(d.outcome.optionId==="allow_always"&&t==="bash"&&(e.alwaysAllowTools=Array.from(new Set([...e.alwaysAllowTools,T(t,s,!1)])).filter(Boolean)),d.outcome.optionId==="reject_once"?(this.events.emit({type:"tool_permission_resolved",sessionId:e.sessionId,tool:t,toolId:a.toolCallId,outcome:"request_rejected"}),{allowed:!1,override:"[Cancelled] Operation cancelled by user"}):(this.events.emit({type:"tool_permission_resolved",sessionId:e.sessionId,tool:t,toolId:a.toolCallId,outcome:"request_granted",remember:d.outcome.optionId==="allow_always"}),{allowed:!0}))}async sendTextChunk(e,t){await this.sendSessionUpdate({sessionId:e,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:t}}})}async sendSessionUpdate(e){!this.connection||this.connection.signal.aborted||await this.connection.sessionUpdate(e)}dispatchNotification(e,t,s){s.catch(n=>{if(!this.connection||this.connection.signal.aborted)return;let i=n instanceof Error?n.message:String(n);this.events.emit({type:"notification_failed",sessionId:t,label:e,error:i})})}};async function Te(o={}){let e=new y(o),t=Ie.toWeb(v.stdin),s=Ae.toWeb(v.stdout);e.attach(t,s),await e.waitForClose()}r(Te,"runAcpServer");export{j as ACP_LOG_LEVELS,Ar as AUTO_MODE_DENIAL_CONSECUTIVE_THRESHOLD,wr as AUTO_MODE_DENIAL_CUMULATIVE_THRESHOLD,g as AcpEventEmitter,m as AcpLogger,Vr as BASH_POLICY_SPEC,kr as BREAKER_ERROR_THRESHOLD,Mr as BREAKER_WINDOW_MS,ae as BUILTIN_COMMANDS,Xt as CANCELLED_TOOL_RESULT_MESSAGE,Dt as CANCELLED_TOOL_RESULT_PREFIX,pr as CODING_AGENTS,rr as CODING_AGENT_MARKER,gi as CODING_INVARIANTS,ii as CODING_SUMMARY_PROMPT,ri as CODING_UPDATE_SUMMARY_PROMPT,Zs as CapabilityDeniedError,hi as Client,eo as ConstructionManifestError,ai as DEFAULT_CODING_AGENT_NAME,Yi as DEFAULT_DANGEROUS_PATTERNS,Js as DEFAULT_HANDLER_TIMEOUT_MS,Fn as DEFAULT_RESILIENCE_CONFIG,Ji as DEFAULT_SAFE_PATTERNS,So as DEFAULT_SELF_MODIFY_BUDGET,Dr as DEFAULT_SPECULATIVE_WINDOW_MS,Ut as DEFAULT_TOOL_OUTPUT_MAX_BYTES,jt as DEFAULT_TOOL_OUTPUT_MAX_LINES,Tt as DefaultSummaryCompaction,bi as EMIT_CONTRACT_TOOL_NAME,ki as EMIT_HANDOFF_TOOL_NAME,Pi as EMIT_SCOUT_VERDICT_TOOL_NAME,Mi as EMIT_VERDICT_TOOL_NAME,no as EVALUATOR_AGENT_NAME,vt as ErrorCategory,w as FileSessionStorage,oo as GENERATOR_AGENT_NAME,bt as KODAX_API_MIN_INTERVAL,Q as KODAX_CONFIG_FILE,b as KODAX_DEFAULT_PROVIDER,It as KODAX_DEFAULT_TIMEOUT,W as KODAX_DIR,At as KODAX_HARD_TIMEOUT,Ct as KODAX_MAX_INCOMPLETE_RETRIES,wt as KODAX_MAX_RETRIES,_t as KODAX_MAX_TOKENS,Ge as KODAX_PROVIDERS,We as KODAX_PROVIDER_SNAPSHOTS,Ke as KODAX_REASONING_MODE_SEQUENCE,St as KODAX_RETRY_BASE_DELAY,G as KODAX_SESSIONS_DIR,Pt as KODAX_STAGGER_DELAY,Vo as KODAX_TOOLS,Z as KODAX_VERSION,y as KodaXAcpServer,Be as KodaXAnthropicCompatProvider,ze as KodaXBaseProvider,hi as KodaXClient,Oe as KodaXError,si as KodaXExtensionRuntime,Ne as KodaXOpenAICompatProvider,qe as KodaXProviderError,Fe as KodaXRateLimitError,ft as KodaXSessionError,ht as KodaXTerminalError,gt as KodaXToolError,un as LINEAGE_ENTRY_TYPES,gn as LineageCompaction,mn as LineageExtension,zi as McpCapabilityProvider,$i as McpServerRuntime,so as PLANNER_AGENT_NAME,kt as PROMISE_PATTERN,on as PROMPT_SECTION_REGISTRY,Ti as PROTOCOL_EMITTER_TOOLS,Un as ProviderRecoveryCoordinator,Vt as READ_DEFAULT_LIMIT,zt as READ_MAX_LINE_CHARS,$t as READ_PREFLIGHT_SIZE_BYTES,Is as REPOINTEL_DEFAULT_ENDPOINT,qt as Runner,to as SCOUT_AGENT_NAME,sn as SYSTEM_PROMPT,Xn as StableBoundaryTracker,co as TASK_ENGINE_ROLE_AGENTS,Oi as TOOL_RESULT_TRUNCATION_GUARDRAIL_NAME,xo as _resetRuntimeForTesting,To as activate,ps as analyzeChangedScope,Ao as appendAuditEntry,wn as appendSessionLineageLabel,Ai as applyFanoutBranchTransition,Sn as applySessionCompaction,Ks as applyToolResultGuardrail,Rn as archiveOldIslands,wi as assignFanoutBranchWorker,br as autoModeDenialShouldFallback,qr as bashSignalCollector,li as boundedRevise,Er as breakerShouldFallback,ci as budgetCeiling,Hn as buildAmaControllerDecision,ln as buildCapabilityContextSections,ur as buildClassifierPrompt,Gn as buildFallbackRoutingDecision,yi as buildFanoutSchedulerPlan,yo as buildLlmReviewPrompt,Tn as buildPromptMessageContent,Jn as buildPromptOverlay,dn as buildPromptSnapshot,Vn as buildProviderCapabilitySnapshot,Qn as buildProviderPolicyHintsForDecision,$n as buildProviderPolicyPromptNotes,je as buildReasoningOverrideKey,cs as buildRepoIntelligenceContext,Ps as buildRepoIntelligenceIndex,as as buildRepoOverview,kn as buildSessionTree,pn as buildSystemPrompt,cn as buildSystemPromptSnapshot,Or as checkAbsoluteDeny,Ln as checkIncompleteToolCalls,Zn as checkPromiseSignal,gr as classify,er as classifyBashCommand,yt as classifyError,Dn as classifyResilienceError,Kt as cleanupIncompleteToolCalls,$e as clearReasoningOverride,pt as clearRuntimeModelProviders,Kr as collectAllSignals,sr as computeInputSignature,fr as computeRulesFingerprint,Ro as configureRuntime,Us as convertCapabilityReadResult,js as convertProviderSearchResults,Ii as countActiveFanoutBranches,Mn as countActiveLineageMessages,Rt as countTokens,xt as createAgent,Sr as createAutoModeDenialTracker,Ur as createAutoModeToolGuardrail,Zi as createBashClassifierConfig,R as createBashPrefixExtractor,Ho as createBuiltinToolDefinition,Rr as createCircuitBreaker,go as createCtxProxy,et as createCustomProvider,di as createDefaultCodingAgent,tr as createDenialTracker,_ as createExtensionRuntime,vi as createFanoutSchedulerInput,Et as createHandoff,Lt as createInMemorySession,ce as createInteractiveContext,Wi as createKodaXTaskRunner,Di as createMcpCapabilityId,Vi as createMcpTransport,nn as createPromptSection,Yn as createReasoningPlan,vn as createSessionLineage,qi as createToolResultTruncationGuardrail,Ki as defaultMcpCacheDir,Ys as defaultPolicy,Mo as disableSelfModify,mo as drainPendingSwaps,xi as emitContract,Ei as emitHandoff,Ri as emitScoutVerdict,Li as emitVerdict,Mt as estimateTokens,zn as evaluateProviderPolicy,lo as evaluatorAgent,cr as evaluatorCodingAgent,ei as exec,le as executeCommand,tn as executeTool,xn as extractArtifactLedger,$r as extractCommandPrefix,qn as extractComparableUserMessageText,Xs as extractHtmlTitle,On as extractPromptComparableText,hn as extractTitleFromMessages,Fr as fileSignalCollector,$s as finalizeRetrievalResult,Xo as findByVersion,Cn as findPreviousUserEntryId,bn as forkSessionLineage,Hs as formatAgentsForPrompt,Qi as formatParallelDispatchResult,Bt as formatSize,fn as generateSessionId,ao as generatorAgent,lr as generatorCodingAgent,ni as getActiveExtensionRuntime,mt as getAvailableProviderNames,Qo as getBuiltinRegisteredToolDefinition,Go as getBuiltinToolDefinition,st as getCustomProvider,it as getCustomProviderList,rt as getCustomProviderModels,nt as getCustomProviderNames,ir as getDenialContext,_i as getFanoutBranch,ie as getGitRoot,xs as getImpactEstimate,Gs as getKodaxGlobalDir,Ui as getMcpCachePaths,ks as getModuleContext,Rs as getProcessContext,Qe as getProvider,Je as getProviderConfiguredCapabilityProfile,He as getProviderConfiguredReasoningCapability,te as getProviderList,ee as getProviderModel,Ye as getProviderModels,No as getRegisteredToolDefinition,bs as getRepoIntelligenceIndex,ds as getRepoOverview,Es as getRepoRoutingSignals,Yo as getRequiredToolParams,dt as getRuntimeModelProvider,ct as getRuntimeModelProviderNames,yn as getSessionLineagePath,_n as getSessionMessagesFromLineage,Ms as getSymbolContext,zo as getTool,Bo as getToolDefinition,Wo as getToolRegistrations,Fs as getToolResultPolicy,Y as getVersion,uo as hasPendingSwap,H as hydrateProcessEnvFromShell,pi as independentReview,Wn as inferTaskType,es as inspectEditFailure,Ss as inspectRepoIntelligenceRuntime,ot as isCustomProviderName,nr as isDeniedRecently,ut as isKnownProvider,Gi as isParallelDispatchDirective,se as isProviderConfigured,Ze as isProviderName,lt as isRuntimeModelProviderName,jo as listAll,Fo as listArtifacts,Jo as listBuiltinToolDefinitions,Do as listConstructed,en as listToolDefinitions,Zo as listTools,Qs as loadAgentsFiles,_r as loadAutoRules,oe as loadConfig,fo as loadHandler,Ue as loadReasoningOverride,Ci as markFanoutBranchCancelled,Si as markFanoutBranchCompleted,En as mergeArtifactLedger,rn as orderPromptSections,yr as parseAutoRules,mr as parseClassifierOutput,de as parseCommand,Zt as parseEditToolError,_o as parseLlmReviewVerdict,Xi as parseMcpCapabilityId,Lr as parseModelSpec,Qt as persistToolOutput,ro as plannerAgent,dr as plannerCodingAgent,A as prepareRuntimeConfig,ge as processSpecialSyntax,re as rateLimitedCall,Ko as readArtifact,wo as readAuditEntries,Co as readBudget,ko as readDisableState,Xr as readSpeculativeWindowFromEnv,hr as readTrustState,De as reasoningCapabilityToOverride,Nn as reasoningModeToDepth,Xe as reasoningOverrideToCapability,jn as reconstructMessagesWithToolGuard,Pr as recordAutoModeAllow,Cr as recordAutoModeBlock,xr as recordBreakerError,or as recordDenial,fi as registerCodingInvariants,J as registerConfiguredCustomProviders,I as registerConfiguredMcpCapabilityProvider,tt as registerCustomProviders,at as registerModelProvider,Bi as registerOfficialSandboxExtension,Ot as registerPresetDispatcher,$o as registerTool,Oo as rehydrateActiveArtifacts,Po as remainingSelfModifyBudget,us as renderChangedScope,_s as renderImpactEstimate,hs as renderModuleContext,ys as renderProcessContext,an as renderPromptSections,ls as renderRepoOverview,Vs as renderRetrievalResult,vs as renderSymbolContext,bo as resetBudget,S as resolveAcpLogLevel,Tr as resolveClassifierModel,po as resolveConstructedAgent,k as resolveProvider,Bn as resolveReasoningMode,ws as resolveRepoIntelligenceMode,As as resolveRepoIntelligenceRuntimeConfig,Kn as resolveResilienceConfig,In as resolveSessionLineageTarget,ui as resolveToolCapability,qo as revoke,Pn as rewindSessionLineage,Uo as rollbackSelfModify,Te as runAcpServer,ho as runAstRules,ue as runInkInteractiveMode,me as runInteractiveMode,M as runKodaX,Io as runLlmReview,Fi as runManagedTask,Ni as runOrchestration,ne as saveConfig,Ve as saveReasoningOverride,io as scoutAgent,ar as scoutCodingAgent,ji as searchMcpCatalog,oi as setActiveExtensionRuntime,An as setSessionLineageActiveEntry,jr as speculativeRace,Eo as stage,Ir as stripAssistantText,Ds as stripHtmlToText,Lo as testArtifact,rs as toolAskUserQuestion,ss as toolBash,fs as toolChangedDiff,gs as toolChangedScope,Ns as toolCodeSearch,Yt as toolEdit,os as toolGlob,ns as toolGrep,qs as toolImpactEstimate,ts as toolInsertAfterAnchor,Ls as toolModuleContext,mi as toolPermission,Os as toolProcessContext,Ht as toolRead,ms as toolRepoOverview,Ws as toolSemanticLookup,Ts as toolSymbolContext,is as toolUndo,Bs as toolWebFetch,zs as toolWebSearch,Jt as toolWrite,pe as touchContext,Nt as truncateHead,Gt as truncateLine,Wt as truncateTail,vr as trustProjectRules,Ft as validateAndFixToolHistory,Hi as validateSubtaskIndependence,vo as validateToolSchemaForProvider,Cs as warmRepoIntelligenceRuntime,ti as webhook};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { getDefaultCommandDir, KODAX_COMMANDS_DIR, loadCommands, parseCommandCall, processCommandCall, type KodaXCommand, type KodaXCommandContext } from './cli_commands.js';
|
|
3
|
+
import { ACP_PERMISSION_MODES, parseAgentModeOption, parsePermissionModeOption, resolveCliAgentMode } from './cli_option_helpers.js';
|
|
4
|
+
export { ACP_PERMISSION_MODES, getDefaultCommandDir, KODAX_COMMANDS_DIR, loadCommands, parseCommandCall, parseAgentModeOption, parsePermissionModeOption, processCommandCall, resolveCliAgentMode, };
|
|
5
|
+
export type { KodaXCommand, KodaXCommandContext };
|
|
6
|
+
declare function main(): Promise<void>;
|
|
7
|
+
export { main };
|