@cjhyy/code-shell 0.2.0 → 0.3.0
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 +108 -0
- package/README.md +35 -2
- package/dist/anthropic-DJXVKFMJ.js +1 -0
- package/dist/arena/index.js +1 -1
- package/dist/arena-MRBATZFD.js +3 -0
- package/dist/{chunk-EU3J7TBP.js → chunk-5QIVXFCT.js} +1 -1
- package/dist/{chunk-XXCZE2U2.js → chunk-AFMP73YP.js} +1 -1
- package/dist/{chunk-L7B2ORID.js → chunk-D3TVASD2.js} +2 -2
- package/dist/chunk-DI26OUIU.js +2 -0
- package/dist/chunk-FZXY554D.js +2 -0
- package/dist/chunk-GGVAOPI7.js +1 -0
- package/dist/chunk-GKAQH2DG.js +2 -0
- package/dist/chunk-GYNO4R7R.js +2 -0
- package/dist/{chunk-RERBX75D.js → chunk-K4HILJ6G.js} +3 -3
- package/dist/{chunk-2EUIMKJA.js → chunk-OWBYLMDD.js} +1 -1
- package/dist/chunk-SKIX2M5Z.js +4 -0
- package/dist/chunk-SV7H4FKT.js +3 -0
- package/dist/{chunk-2GJ7H5NC.js → chunk-WONQHE4P.js} +40 -40
- package/dist/{chunk-DEYFK6FP.js → chunk-X2S7ASQ2.js} +1 -1
- package/dist/chunk-Z5HKHAO7.js +336 -0
- package/dist/cli/commands/builtin/plugin-commands-registration.d.ts +12 -0
- package/dist/cli/commands/builtin/plugin-handler.d.ts +6 -0
- package/dist/cli/commands/registry.d.ts +9 -2
- package/dist/cli/main.js +138 -122
- package/dist/client-base-GSFXPP2Y.js +1 -0
- package/dist/devtools-FBX4HVVY.js +1 -0
- package/dist/engine/engine.d.ts +29 -0
- package/dist/engine/turn-loop.d.ts +25 -0
- package/dist/hooks/events.d.ts +84 -5
- package/dist/hooks/inject.d.ts +19 -0
- package/dist/hooks/shell-runner.d.ts +45 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.js +1 -1
- package/dist/llm/api-key-sanitize.d.ts +22 -0
- package/dist/llm/providers/openai.d.ts +23 -0
- package/dist/llm/retry.d.ts +12 -0
- package/dist/llm/stream-watchdog.d.ts +42 -0
- package/dist/logging/logger.d.ts +14 -0
- package/dist/manager-4XKLZHKE.js +1 -0
- package/dist/mcp-manager-3JGHEJO3.js +1 -0
- package/dist/openai-OQ6LLN5J.js +1 -0
- package/dist/{openrouter-models-GZVCRWD2.js → openrouter-models-ZT4R2AE3.js} +1 -1
- package/dist/openrouter-sync-ARMVWY7S.js +1 -0
- package/dist/plugin-handler-GJISMH5Q.js +11 -0
- package/dist/plugins/gitOps.d.ts +23 -0
- package/dist/plugins/installedPlugins.d.ts +15 -0
- package/dist/plugins/knownMarketplaces.d.ts +10 -0
- package/dist/plugins/loadPluginHooks.d.ts +52 -0
- package/dist/plugins/marketplaceManager.d.ts +49 -0
- package/dist/plugins/parseMarketplaceInput.d.ts +16 -0
- package/dist/plugins/pluginCommandHook.d.ts +54 -0
- package/dist/plugins/pluginCommandsLoader.d.ts +25 -0
- package/dist/plugins/pluginInstaller.d.ts +36 -0
- package/dist/plugins/schemas.d.ts +9 -0
- package/dist/plugins/types.d.ts +73 -2
- package/dist/plugins/varRewrite.d.ts +42 -0
- package/dist/product/index.js +1 -1
- package/dist/protocol/helpers.d.ts +42 -0
- package/dist/render/clearTerminal.d.ts +9 -3
- package/dist/render/components/App.d.ts +1 -0
- package/dist/render/components/Static.d.ts +23 -0
- package/dist/render/devtools.d.ts +8 -4
- package/dist/render/dom.d.ts +2 -1
- package/dist/render/frame.d.ts +1 -0
- package/dist/render/index.d.ts +10 -0
- package/dist/render/ink.d.ts +24 -2
- package/dist/render/log-update.d.ts +12 -1
- package/dist/render/selection.d.ts +1 -1
- package/dist/run/index.js +1 -1
- package/dist/services/index.d.ts +1 -0
- package/dist/services/memory-orchestrator.d.ts +39 -0
- package/dist/settings/schema.d.ts +93 -6
- package/dist/skills/frontmatter.d.ts +13 -0
- package/dist/skills/index.d.ts +4 -4
- package/dist/skills/scanner.d.ts +11 -21
- package/dist/tool-summary-HJX6RHG4.js +2 -0
- package/dist/tool-system/builtin/agent-notifications.d.ts +55 -0
- package/dist/tool-system/builtin/agent-registry.d.ts +35 -4
- package/dist/tool-system/builtin/agent-transcript-translator.d.ts +22 -0
- package/dist/tool-system/builtin/skill-prompt.d.ts +7 -0
- package/dist/tool-system/builtin/skill.d.ts +3 -1
- package/dist/tool-system/context.d.ts +23 -0
- package/dist/tool-system/executor.d.ts +1 -1
- package/dist/tool-system/permission.d.ts +1 -1
- package/dist/types.d.ts +35 -0
- package/dist/ui/components/AgentBlock.d.ts +5 -2
- package/dist/ui/components/AgentDock.d.ts +36 -0
- package/dist/ui/components/CommandInput.d.ts +12 -1
- package/dist/ui/components/MessageRow.d.ts +54 -0
- package/dist/ui/components/SpinnerWithVerb.d.ts +2 -1
- package/dist/ui/components/TextInput.d.ts +9 -1
- package/dist/ui/components/VirtualMessageList.d.ts +30 -11
- package/dist/ui/dev-seed.d.ts +1 -0
- package/dist/ui/fullscreen-mode.d.ts +9 -0
- package/dist/ui/hooks/useVirtualScroll.d.ts +101 -0
- package/dist/ui/perf-probes.d.ts +22 -0
- package/dist/ui/query-guard.d.ts +35 -0
- package/dist/ui/slice-anchor.d.ts +44 -0
- package/dist/ui/store.d.ts +26 -1
- package/package.json +5 -3
- package/dist/anthropic-OVRWAZRD.js +0 -1
- package/dist/arena-64T2EQD4.js +0 -3
- package/dist/chunk-A4M2Y42L.js +0 -2
- package/dist/chunk-DTPABBSV.js +0 -2
- package/dist/chunk-MGP35GKD.js +0 -254
- package/dist/chunk-Q3RSX66I.js +0 -1
- package/dist/chunk-VKKU4LOM.js +0 -3
- package/dist/chunk-ZSAONDT6.js +0 -2
- package/dist/client-base-F5FCRSB3.js +0 -1
- package/dist/devtools-SGDUOOM4.js +0 -1
- package/dist/manager-J6FXEUEK.js +0 -1
- package/dist/mcp-manager-27EVBKRT.js +0 -1
- package/dist/openai-3QEADSYL.js +0 -1
- package/dist/openrouter-sync-WG4AG5NC.js +0 -1
- package/dist/plugins/loader.d.ts +0 -72
- package/dist/skills/matcher.d.ts +0 -21
- package/dist/tool-summary-V2B3MD5N.js +0 -2
- package/skills-builtin/codeshell-help.md +0 -135
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import {h as h$1,a}from'./chunk-3QP5BQ3L.js';import {existsSync,readFileSync,mkdirSync,writeFileSync,realpathSync,readdirSync,statSync}from'fs';import {join,dirname}from'path';import {homedir}from'os';import q from'lodash-es/memoize.js';import {parse}from'yaml';h$1();h$1();var A=/^---\s*\n([\s\S]*?)---\s*\n?/,M=/[{}[\]*&#!|>%@`]|: /;function I(n){let t=n.match(A);if(!t)return {frontmatter:{},body:n};let r=t[1]??"",s=n.slice(t[0].length),i;try{i=parse(r);}catch{try{i=parse(T(r));}catch{return {frontmatter:{},body:s}}}return i&&typeof i=="object"&&!Array.isArray(i)?{frontmatter:i,body:s}:{frontmatter:{},body:s}}a(I,"parseFrontmatter");function T(n){let t=n.split(`
|
|
2
|
+
`),r=[];for(let s of t){let i=s.match(/^([a-zA-Z_-]+):\s+(.+)$/);if(!i){r.push(s);continue}let a=i[1],o=i[2];if(!a||!o){r.push(s);continue}if(o.startsWith('"')&&o.endsWith('"')||o.startsWith("'")&&o.endsWith("'")){r.push(s);continue}if(M.test(o)){let l=o.replace(/\\/g,"\\\\").replace(/"/g,'\\"');r.push(`${a}: "${l}"`);continue}r.push(s);}return r.join(`
|
|
3
|
+
`)}a(T,"quoteProblematicValues");function $(n){return n==null?"":typeof n=="string"?n.trim():typeof n=="number"||typeof n=="boolean"?String(n):""}a($,"coerceDescription");h$1();function W(){return process.env.HOME??homedir()}a(W,"userHome");function m(){return join(W(),".code-shell","plugins","installed_plugins.json")}a(m,"installedPluginsPath");function y(){let n=m();if(!existsSync(n))return {version:2,plugins:{}};try{let t=JSON.parse(readFileSync(n,"utf-8"));if(t&&typeof t=="object"&&t.version===2&&t.plugins&&typeof t.plugins=="object")return t}catch{}return {version:2,plugins:{}}}a(y,"readInstalledPlugins");function x(n){let t=m();mkdirSync(dirname(t),{recursive:true}),writeFileSync(t,JSON.stringify(n,null,2)+`
|
|
4
|
+
`,"utf-8");}a(x,"writeInstalledPlugins");function an(n,t){let r=y(),s=r.plugins[n]??[];s.push(t),r.plugins[n]=s,x(r);}a(an,"appendInstallEntry");function un(n){let t=y();return n in t.plugins?(delete t.plugins[n],x(t),true):false}a(un,"removeInstallEntries");function fn(n,t){return `${n}@${t}`}a(fn,"pluginInstallKey");function F(){return process.env.HOME??homedir()}a(F,"userHome");function G(n){return [{dir:join(n,".code-shell","skills"),source:"project"},{dir:join(F(),".code-shell","skills"),source:"user"}]}a(G,"bases");function X(n){return typeof n=="object"&&n!==null&&"code"in n&&n.code==="ENOENT"}a(X,"isENOENT");function h(n){if(typeof n!="object"||n===null||!("code"in n))return false;let t=n.code;return t==="EACCES"||t==="EPERM"||t==="EIO"}a(h,"isInaccessible");function O(n){try{return readFileSync(n,"utf-8")}catch(t){if(X(t))return null;if(h(t))return console.warn(`[skills] cannot read ${n}: ${t.message}`),null;throw t}}a(O,"readSkillFile");function v(n,t,r,s,i){let{frontmatter:a,body:o}=I(s),l=typeof a.name=="string"?a.name:void 0;l!==void 0&&l!==t&&console.warn(`[skills] frontmatter.name "${l}" in ${n} does not match directory name "${t}"; using directory name`);let c=$(a.description);return {name:i?`${i}:${t}`:t,description:c,content:o,filePath:n,source:r}}a(v,"buildSkillFromFile");function Z(n,t,r,s){for(let{dir:i,source:a}of n){if(!existsSync(i))continue;let o;try{o=realpathSync(i);}catch{continue}if(s.has(o))continue;s.add(o);let l;try{l=readdirSync(i,{withFileTypes:!0});}catch(c){if(h(c)){console.warn(`[skills] cannot read ${i}: ${c.message}`);continue}throw c}for(let c of l){if(!c.isDirectory()&&!c.isSymbolicLink()||r.has(c.name))continue;let f=join(i,c.name,"SKILL.md"),g=O(f);g!==null&&(t.push(v(f,c.name,a,g)),r.add(c.name));}}}a(Z,"scanDirBases");function Q(n){let t=y(),r=new Set,s=Object.keys(t.plugins).sort();for(let i of s){let a=t.plugins[i]??[],o=i.lastIndexOf("@"),l=o>0?i.slice(0,o):i;for(let c of a){let f=join(c.installPath,"skills");if(!existsSync(f))continue;let g;try{g=readdirSync(f,{withFileTypes:!0});}catch(u){if(h(u)){console.warn(`[skills] cannot read ${f}: ${u.message}`);continue}throw u}for(let u of g){if(!u.isDirectory()&&!u.isSymbolicLink())continue;let S=`${l}:${u.name}`;if(r.has(S))continue;let k=join(f,u.name,"SKILL.md"),b=O(k);b!==null&&(n.push(v(k,u.name,"plugin",b,l)),r.add(S));}}}}a(Q,"scanInstalledPlugins");function U(n){let t=[],r=new Set,s=new Set;return Z(G(n),t,r,s),Q(t),t}a(U,"scanOnce");function nn(){let n=m();try{return statSync(n).mtimeMs.toString()}catch{return "0"}}a(nn,"installedPluginsMtime");var L=q(U,n=>`${n}\0${F()}\0${nn()}`);function En(n){return L(n)}a(En,"scanSkills");function Pn(){L.cache.clear?.();}a(Pn,"invalidateSkillCache");export{I as a,$ as b,m as c,y as d,an as e,un as f,fn as g,En as h,Pn as i};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import {a as a$2}from'./chunk-O5HFCH2U.js';import {a as a$1}from'./chunk-OWBYLMDD.js';import {b,c,d as d$1}from'./chunk-FU7AHZNN.js';import {d}from'./chunk-DI26OUIU.js';import {h,a}from'./chunk-3QP5BQ3L.js';import N from'openai';h();h();h();var U=[{kind:"openai",match:/^(?:o[1-9]\d*|gpt-[5-9])(?:[-.]|$)/i,capability:{tokenLimitField:"max_completion_tokens",rejectedParams:new Set(["temperature","top_p","presence_penalty","frequency_penalty","logit_bias","logprobs","top_logprobs"]),reasoning:{kind:"openai-effort"},echoReasoning:"optional"},why:"OpenAI o-series + gpt-5+ reject classic sampling params; use max_completion_tokens + reasoning_effort."},{kind:"deepseek",match:/^deepseek-v4(?:[-.]|$)/i,capability:{reasoning:{kind:"deepseek-thinking"},echoReasoning:"when-tools"},why:"DeepSeek V4 thinking mode \u2014 top-level thinking:{type}; echo reasoning_content when tools are present."},{kind:"deepseek",match:/^deepseek-reasoner(?:[-.]|$)/i,capability:{reasoning:{kind:"none"},echoReasoning:"never"},why:"deepseek-reasoner refuses prior reasoning_content in input; always-on reasoning, no toggle."},{kind:"zai",match:/^glm-[4-9](?:[-.]|$)/i,capability:{reasoning:{kind:"deepseek-thinking"},echoReasoning:"optional"},why:"Z.AI GLM-4.5+ thinking shape is identical to DeepSeek V4; default is enabled."},{kind:"anthropic",match:/^claude-(?:opus|sonnet|haiku)-4-[6-9](?:[-.]|$)/i,capability:{reasoning:{kind:"anthropic-adaptive"},echoReasoning:"when-tools",parallelToolCalls:"anthropic-disable-flag",streamUsage:"auto"},why:"Claude 4.6+ thinking is adaptive \u2014 no opt-in field. Echo thinking blocks on tool turns."},{kind:"anthropic",match:/^claude-(?:opus|sonnet|haiku)-4(?:[-.]|$)/i,capability:{reasoning:{kind:"anthropic-budget",minBudgetTokens:1024},echoReasoning:"when-tools",parallelToolCalls:"anthropic-disable-flag",streamUsage:"auto"},why:"Claude 4.x \u22644.5 supports explicit thinking:{type:enabled, budget_tokens\u22651024}."},{kind:"anthropic",match:/^claude-/i,capability:{parallelToolCalls:"anthropic-disable-flag",streamUsage:"auto"},why:"Pre-Claude-4 \u2014 no extended thinking; keep Anthropic tool_choice/stream shape."},{kind:"google",match:/^gemini-(?:[2-9]\.\d|[2-9])/i,capability:{reasoning:{kind:"openai-effort"},echoReasoning:"optional"},why:"Gemini 2.5+ via OpenAI-compat \u2014 reasoning_effort is auto-mapped to thinking_level."},{kind:"openrouter",match:/./,capability:{reasoning:{kind:"openrouter-reasoning"},echoReasoning:"optional"},why:"OpenRouter exposes a unified reasoning:{effort,max_tokens,exclude,enabled} field for every backend."},{kind:"xai",match:/^grok-4\.3(?:[-.]|$)/i,capability:{reasoning:{kind:"openai-effort",disabledEffort:"low"}},why:"xAI grok-4.3 supports reasoning_effort none|low|medium|high \u2014 no `minimal`."},{kind:"mistral",match:/^magistral/i,capability:{reasoning:{kind:"openai-effort",disabledEffort:"none"}},why:"Mistral magistral models accept only reasoning_effort `high` or `none`."},{kind:"groq",match:/^(?:gpt-oss-(?:20b|120b)|qwen3-)/i,capability:{reasoning:{kind:"openai-effort"},tokenLimitField:"max_completion_tokens"},why:"Groq reasoning-capable models use max_completion_tokens + reasoning_effort."}];h();var C={tokenLimitField:"max_tokens",rejectedParams:new Set,reasoning:{kind:"none"},echoReasoning:"optional",parallelToolCalls:"openai-flag",streamUsage:"include-usage-flag"};function j(h,e){for(let t of U)if(t.kind===h&&t.match.test(e))return {...C,...t.capability,rejectedParams:t.capability.rejectedParams?new Set(t.capability.rejectedParams):new Set(C.rejectedParams)};return {...C,rejectedParams:new Set(C.rejectedParams)}}a(j,"capabilitiesFor");h();var v=class extends Error{constructor(t,c){super(`Stream idle for ${t}ms \u2014 aborted`);this.idleMs=t;this.requestId=c;this.name="StreamIdleTimeoutError";}static{a(this,"StreamIdleTimeoutError");}kind="stream-idle-timeout"};var T={enabled:process.env.CODESHELL_ENABLE_STREAM_WATCHDOG==="1",idleTimeoutMs:parseInt(process.env.CODESHELL_STREAM_IDLE_TIMEOUT_MS||"",10)||9e4,retries:parseInt(process.env.CODESHELL_STREAM_WATCHDOG_RETRIES||"",10)||2};async function W(h,e={}){let t=T.enabled||e.idleTimeoutMs!==void 0,c=e.idleTimeoutMs??T.idleTimeoutMs,o="";if(!t){for await(let n of h)e.onChunk?o+=e.onChunk(n)??"":o+=n?.choices?.[0]?.delta?.content??"";return o}let i=h[Symbol.asyncIterator]();try{for(;;){let n=i.next(),p=null,f=new Promise((r,l)=>{p=setTimeout(()=>{l(new v(c,e.requestId));},c);}),a;try{a=await Promise.race([n,f]);}finally{p!==null&&clearTimeout(p);}if(a.done)break;let s=a.value;e.onChunk?o+=e.onChunk(s)??"":o+=s?.choices?.[0]?.delta?.content??"";}}finally{i.return?.();}return o}a(W,"runStreamWithWatchdog");var D=class extends a$1{static{a(this,"OpenAIClient");}_client=null;_forceMaxCompletionTokens=false;constructor(e){super(e);}initClient(){}get client(){return this._client||(this._client=new N({apiKey:this.config.apiKey??process.env.OPENAI_API_KEY,...this.config.baseUrl?{baseURL:this.config.baseUrl}:{},timeout:this.timeout})),this._client}_capability=null;get capability(){if(!this._capability){let e=this.config.providerKind??"openai";this._capability=j(e,this.model);}return this._capability}async createMessage(e){return this.withRetry(async()=>{let t=e.thinking??this.config.thinking,c=this.buildMessages(e.systemPrompt,e.messages,t),o=e.tools?.length?this.convertTools(e.tools):void 0,i=d.span("llm.request",{cat:"llm",provider:this.provider,model:this.model,stream:!!(e.stream&&e.onChunk),messageCount:c.length,toolCount:o?.length??0});try{let n=e.stream&&e.onChunk?await this.streamMessage(e,c,o,t):await this.nonStreamMessage(e,c,o,t);return i.end({stopReason:n.stopReason,promptTokens:n.usage?.promptTokens,completionTokens:n.usage?.completionTokens,cacheReadTokens:n.usage?.cacheReadTokens,cacheCreationTokens:n.usage?.cacheCreationTokens}),n}catch(n){throw i.fail(n),n}})}buildRequestBody(e,t,c,o,i){let n=this.capability,p=e.maxTokens??this.maxTokens,a=this._forceMaxCompletionTokens||n.tokenLimitField==="max_completion_tokens"?{max_completion_tokens:p}:{max_tokens:p},s={};n.rejectedParams.has("temperature")||(s.temperature=e.temperature!==void 0?e.temperature:this.temperature);let r={};if(o)switch(n.reasoning.kind){case "deepseek-thinking":r.thinking={type:o};break;case "openai-effort":r.reasoning_effort=o==="disabled"?n.reasoning.disabledEffort??"minimal":"medium";break;case "openrouter-reasoning":r.reasoning=o==="disabled"?{effort:"minimal",exclude:true}:{effort:"medium"};break;}return {model:this.model,messages:t,...a,...s,...r,...c?{tools:c}:{},...i?{stream:true,stream_options:{include_usage:true}}:{}}}async nonStreamMessage(e,t,c,o){try{let i=await this.client.chat.completions.create(this.buildRequestBody(e,t,c,o,!1),{signal:e.signal}),n=i.choices[0];if(!n)throw new b("No response from OpenAI","openai");let p={promptTokens:i.usage?.prompt_tokens??0,completionTokens:i.usage?.completion_tokens??0,totalTokens:i.usage?.total_tokens??0};return this.recordUsage(p,e),this.processChoice(n,p)}catch(i){throw this.handleApiError(i),i}}async streamMessage(e,t,c,o){try{let i=await this.client.chat.completions.create(this.buildRequestBody(e,t,c,o,!0),{signal:e.signal}),n="",p="",f=new Map,a$1,s=Date.now(),r=!1,l=i.request_id,b=a(k=>{k.usage&&(a$1=k.usage);let m=k.choices[0]?.delta;if(!m)return "";let M=m.reasoning_content;if(typeof M=="string"&&M.length>0&&(p+=M),m.content&&(r||(r=!0,d.debug("llm.first_byte",{cat:"llm",provider:this.provider,model:this.model,ttft_ms:Date.now()-s})),n+=m.content,e.onChunk?.({type:"text",text:m.content,tokens:a$2(m.content)})),m.tool_calls)for(let u of m.tool_calls){let A=u.index;f.has(A)||(f.set(A,{id:u.id??"",name:u.function?.name??"",args:""}),e.onChunk?.({type:"tool_use_start",toolCall:{id:u.id,toolName:u.function?.name}}));let _=f.get(A);if(u.id&&(_.id=u.id),u.function?.name&&(_.name=u.function.name),u.function?.arguments&&(_.args+=u.function.arguments,_.id))try{let q=JSON.parse(_.args||"{}");e.onChunk?.({type:"tool_use_delta",toolCall:{id:_.id,toolName:_.name,args:q}});}catch{}}return k.choices[0]?.finish_reason&&e.onChunk?.({type:"stop",stopReason:k.choices[0].finish_reason}),m.content??""},"handleChunk");await W(i,{idleTimeoutMs:T.enabled?T.idleTimeoutMs:void 0,requestId:l,onChunk:b});let d$1=[];for(let[,k]of f){let m={};try{m=JSON.parse(k.args||"{}");}catch{}d$1.push({id:k.id,toolName:k.name,args:m});}let I={promptTokens:a$1?.prompt_tokens??0,completionTokens:a$1?.completion_tokens??0,totalTokens:a$1?.total_tokens??0};return this.recordUsage(I,e),{text:n,toolCalls:d$1,usage:I,stopReason:"stop",...p?{reasoningContent:p}:{}}}catch(i){throw this.handleApiError(i),i}}processChoice(e,t){let c=e.message.content??"",o=[];if(e.message.tool_calls)for(let n of e.message.tool_calls){let p={};try{p=JSON.parse(n.function.arguments||"{}");}catch{}o.push({id:n.id,toolName:n.function.name,args:p});}let i=B(e.message);return {text:c,toolCalls:o,usage:t,stopReason:e.finish_reason??void 0,...i?{reasoningContent:i}:{}}}buildMessages(e,t,c){let o=[{role:"system",content:e}],i=this.capability,n=t.some(a=>Array.isArray(a.content)&&a.content.some(s=>s.type==="tool_use"||s.type==="tool_result")),p=c!=="disabled"&&i.echoReasoning==="when-tools"&&n,f=i.echoReasoning==="never";for(let a of t)if(a.role!=="system")if(a.role==="assistant"){let s={role:"assistant"},r;if(typeof a.content=="string")s.content=a.content;else {let l=[],b=[];for(let d of a.content)d.type==="text"&&d.text?l.push(d.text):d.type==="tool_use"&&d.id&&d.name?b.push({id:d.id,type:"function",function:{name:d.name,arguments:JSON.stringify(d.input??{})}}):d.type==="reasoning"&&d.reasoningContent&&(r=d.reasoningContent),!r&&d.reasoningContent&&(r=d.reasoningContent);l.length&&(s.content=l.join(`
|
|
2
|
+
`)),b.length&&(s.tool_calls=b);}f?r=void 0:!r&&p&&(r=""),r!==void 0&&(s.reasoning_content=r),o.push(s);}else if(a.role==="tool")o.push({role:"tool",tool_call_id:a.tool_call_id??"",content:typeof a.content=="string"?a.content:""});else if(typeof a.content=="string")o.push({role:"user",content:a.content});else {let s=[],r=[];for(let l of a.content)l.type==="tool_result"&&l.tool_use_id?r.push({tool_use_id:l.tool_use_id,content:typeof l.content=="string"?l.content:""}):l.type==="text"&&l.text&&s.push(l.text);for(let l of r)o.push({role:"tool",tool_call_id:l.tool_use_id,content:l.content});s.length>0&&o.push({role:"user",content:s.join(`
|
|
3
|
+
`)});}return o}convertTools(e){return e.map(t=>({type:"function",function:{name:t.name,description:t.description,parameters:t.inputSchema}}))}handleApiError(e){if(e instanceof N.APIError){if(e.status===429)throw new c("openai");let t=(e.message??"").toLowerCase();throw e.status===400&&t.includes("max_tokens")&&t.includes("max_completion_tokens")&&(this._forceMaxCompletionTokens=true),t.includes("context_length_exceeded")||t.includes("maximum context length")||t.includes("too many tokens")||t.includes("prompt is too long")?new d$1("openai"):e.status===401&&t.includes("provider returned error")?new b(`OpenAI-compatible endpoint returned 401 "Provider returned error". Two likely causes: (1) the API key is invalid/revoked, or (2) the upstream provider rejects tool calls for this model (common on OpenRouter's gpt-4o-mini route). Verify the key, then try a tool-capable model such as openai/gpt-4.1-mini or anthropic/claude-3.5-haiku.`,"openai",{status:e.status}):new b(`OpenAI API error: ${e.message}`,"openai",{status:e.status})}throw e}};function B(h){let e=h.reasoning_content??h.reasoning;return typeof e=="string"&&e.length>0?e:void 0}a(B,"extractReasoningContent");export{W as a,D as b};
|