@cjhyy/code-shell 0.1.7 → 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.
Files changed (144) hide show
  1. package/CHANGELOG.md +108 -0
  2. package/README.md +35 -2
  3. package/dist/anthropic-DJXVKFMJ.js +1 -0
  4. package/dist/arena/index.js +1 -1
  5. package/dist/arena-MRBATZFD.js +3 -0
  6. package/dist/chunk-2OD6VR4N.js +2 -0
  7. package/dist/{chunk-RP26WO4R.js → chunk-5QIVXFCT.js} +1 -1
  8. package/dist/{chunk-NFH3UQ3E.js → chunk-AFMP73YP.js} +1 -1
  9. package/dist/{chunk-XDOWC7EG.js → chunk-D3TVASD2.js} +2 -2
  10. package/dist/chunk-DI26OUIU.js +2 -0
  11. package/dist/chunk-FZXY554D.js +2 -0
  12. package/dist/chunk-GGVAOPI7.js +1 -0
  13. package/dist/chunk-GKAQH2DG.js +2 -0
  14. package/dist/chunk-GYNO4R7R.js +2 -0
  15. package/dist/{chunk-Q4O2HGWS.js → chunk-K4HILJ6G.js} +3 -3
  16. package/dist/chunk-M7VU4YVY.js +49 -0
  17. package/dist/chunk-MLCTC53I.js +1 -0
  18. package/dist/{chunk-HIJ2XXGX.js → chunk-OWBYLMDD.js} +1 -1
  19. package/dist/chunk-SKIX2M5Z.js +4 -0
  20. package/dist/chunk-SV7H4FKT.js +3 -0
  21. package/dist/{chunk-Y2NS6HPO.js → chunk-WONQHE4P.js} +41 -41
  22. package/dist/{chunk-WOP6MJKW.js → chunk-X2S7ASQ2.js} +1 -1
  23. package/dist/chunk-Z5HKHAO7.js +336 -0
  24. package/dist/cli/commands/builtin/plugin-commands-registration.d.ts +12 -0
  25. package/dist/cli/commands/builtin/plugin-handler.d.ts +6 -0
  26. package/dist/cli/commands/registry.d.ts +9 -2
  27. package/dist/cli/main.js +140 -124
  28. package/dist/cli/onboarding.d.ts +7 -2
  29. package/dist/client-base-GSFXPP2Y.js +1 -0
  30. package/dist/compaction-L3Y6NG4N.js +1 -0
  31. package/dist/context/compaction.d.ts +2 -1
  32. package/dist/data/static-catalogs.d.ts +25 -0
  33. package/dist/devtools-FBX4HVVY.js +1 -0
  34. package/dist/engine/engine.d.ts +45 -0
  35. package/dist/engine/turn-loop.d.ts +45 -0
  36. package/dist/hooks/events.d.ts +84 -5
  37. package/dist/hooks/inject.d.ts +19 -0
  38. package/dist/hooks/shell-runner.d.ts +45 -0
  39. package/dist/index.d.ts +4 -3
  40. package/dist/index.js +1 -1
  41. package/dist/llm/api-key-sanitize.d.ts +22 -0
  42. package/dist/llm/capabilities/index.d.ts +20 -0
  43. package/dist/llm/capabilities/rules.d.ts +26 -0
  44. package/dist/llm/capabilities/types.d.ts +108 -0
  45. package/dist/llm/model-pool.d.ts +7 -0
  46. package/dist/llm/provider-catalog.d.ts +2 -0
  47. package/dist/llm/provider-kinds.d.ts +1 -1
  48. package/dist/llm/providers/openai.d.ts +45 -0
  49. package/dist/llm/retry.d.ts +12 -0
  50. package/dist/llm/stream-watchdog.d.ts +42 -0
  51. package/dist/llm/types.d.ts +8 -0
  52. package/dist/logging/logger.d.ts +24 -2
  53. package/dist/logging/session-recorder.d.ts +16 -3
  54. package/dist/manager-4XKLZHKE.js +1 -0
  55. package/dist/mcp-manager-3JGHEJO3.js +1 -0
  56. package/dist/model-fetcher-X5W5EASG.js +1 -0
  57. package/dist/openai-OQ6LLN5J.js +1 -0
  58. package/dist/{openrouter-models-AM6M52D6.js → openrouter-models-ZT4R2AE3.js} +1 -1
  59. package/dist/openrouter-sync-ARMVWY7S.js +1 -0
  60. package/dist/plugin-handler-GJISMH5Q.js +11 -0
  61. package/dist/plugins/gitOps.d.ts +23 -0
  62. package/dist/plugins/installedPlugins.d.ts +15 -0
  63. package/dist/plugins/knownMarketplaces.d.ts +10 -0
  64. package/dist/plugins/loadPluginHooks.d.ts +52 -0
  65. package/dist/plugins/marketplaceManager.d.ts +49 -0
  66. package/dist/plugins/parseMarketplaceInput.d.ts +16 -0
  67. package/dist/plugins/pluginCommandHook.d.ts +54 -0
  68. package/dist/plugins/pluginCommandsLoader.d.ts +25 -0
  69. package/dist/plugins/pluginInstaller.d.ts +36 -0
  70. package/dist/plugins/schemas.d.ts +9 -0
  71. package/dist/plugins/types.d.ts +73 -2
  72. package/dist/plugins/varRewrite.d.ts +42 -0
  73. package/dist/product/index.js +1 -1
  74. package/dist/protocol/client.d.ts +1 -1
  75. package/dist/protocol/helpers.d.ts +42 -0
  76. package/dist/render/clearTerminal.d.ts +9 -3
  77. package/dist/render/components/App.d.ts +1 -0
  78. package/dist/render/components/Static.d.ts +23 -0
  79. package/dist/render/devtools.d.ts +8 -4
  80. package/dist/render/dom.d.ts +2 -1
  81. package/dist/render/frame.d.ts +1 -0
  82. package/dist/render/index.d.ts +10 -0
  83. package/dist/render/ink.d.ts +24 -2
  84. package/dist/render/log-update.d.ts +12 -1
  85. package/dist/render/selection.d.ts +1 -1
  86. package/dist/run/index.js +1 -1
  87. package/dist/{seatbelt-WBYROQT6.js → seatbelt-L54CNI2Y.js} +5 -5
  88. package/dist/services/index.d.ts +1 -0
  89. package/dist/services/memory-orchestrator.d.ts +39 -0
  90. package/dist/settings/schema.d.ts +168 -21
  91. package/dist/skills/frontmatter.d.ts +13 -0
  92. package/dist/skills/index.d.ts +4 -4
  93. package/dist/skills/scanner.d.ts +11 -21
  94. package/dist/tool-summary-HJX6RHG4.js +2 -0
  95. package/dist/tool-system/builtin/agent-notifications.d.ts +55 -0
  96. package/dist/tool-system/builtin/agent-registry.d.ts +35 -4
  97. package/dist/tool-system/builtin/agent-transcript-translator.d.ts +22 -0
  98. package/dist/tool-system/builtin/skill-prompt.d.ts +7 -0
  99. package/dist/tool-system/builtin/skill.d.ts +3 -1
  100. package/dist/tool-system/context.d.ts +23 -0
  101. package/dist/tool-system/executor.d.ts +5 -1
  102. package/dist/tool-system/permission.d.ts +1 -1
  103. package/dist/tool-system/sandbox/index.d.ts +7 -0
  104. package/dist/tool-system/task-guard.d.ts +30 -0
  105. package/dist/types.d.ts +48 -0
  106. package/dist/ui/components/AgentBlock.d.ts +5 -2
  107. package/dist/ui/components/AgentDock.d.ts +36 -0
  108. package/dist/ui/components/CommandInput.d.ts +12 -1
  109. package/dist/ui/components/MessageRow.d.ts +54 -0
  110. package/dist/ui/components/SpinnerWithVerb.d.ts +7 -1
  111. package/dist/ui/components/StatusLine.d.ts +5 -1
  112. package/dist/ui/components/TextInput.d.ts +9 -1
  113. package/dist/ui/components/VirtualMessageList.d.ts +30 -11
  114. package/dist/ui/dev-seed.d.ts +1 -0
  115. package/dist/ui/fullscreen-mode.d.ts +9 -0
  116. package/dist/ui/hooks/useVirtualScroll.d.ts +101 -0
  117. package/dist/ui/perf-probes.d.ts +22 -0
  118. package/dist/ui/query-guard.d.ts +35 -0
  119. package/dist/ui/slice-anchor.d.ts +44 -0
  120. package/dist/ui/store.d.ts +26 -1
  121. package/package.json +5 -3
  122. package/dist/anthropic-UBSB5AQH.js +0 -1
  123. package/dist/arena-OW55ZCHT.js +0 -3
  124. package/dist/chunk-2NS3JMNK.js +0 -1
  125. package/dist/chunk-B7K2OWKC.js +0 -2
  126. package/dist/chunk-EWWK56K6.js +0 -2
  127. package/dist/chunk-KCXSARAA.js +0 -1
  128. package/dist/chunk-NMBYBGC7.js +0 -250
  129. package/dist/chunk-NVAZJ5XS.js +0 -2
  130. package/dist/chunk-PGANL6F2.js +0 -3
  131. package/dist/chunk-UDPUTFQT.js +0 -2
  132. package/dist/chunk-W47Z7MGS.js +0 -33
  133. package/dist/client-base-6ZZJJYDY.js +0 -1
  134. package/dist/compaction-ECVQVOCT.js +0 -1
  135. package/dist/devtools-SGDUOOM4.js +0 -1
  136. package/dist/manager-C3TDN6MS.js +0 -1
  137. package/dist/mcp-manager-OP4XYV53.js +0 -1
  138. package/dist/model-fetcher-BJ64META.js +0 -1
  139. package/dist/openai-KEWQ54TM.js +0 -1
  140. package/dist/openrouter-sync-5JNBL3Z6.js +0 -1
  141. package/dist/plugins/loader.d.ts +0 -72
  142. package/dist/skills/matcher.d.ts +0 -21
  143. package/dist/tool-summary-5UE62VU4.js +0 -2
  144. package/skills-builtin/codeshell-help.md +0 -135
@@ -1,4 +1,4 @@
1
- import {b as b$1}from'./chunk-Y2NS6HPO.js';import {b}from'./chunk-B7K2OWKC.js';import {h,a}from'./chunk-3QP5BQ3L.js';h();h();h();h();function x(n,e){if(n===e)return 0;if(!n||!e)return 1;let t=a(c=>{let u=new Set;for(let l=0;l<c.length-2;l++)u.add(c.slice(l,l+3));return u},"trigrams"),r=t(n),i=t(e),o=0;for(let c of r)i.has(c)&&o++;let a$1=r.size+i.size-o;return a$1===0?0:1-o/a$1}a(x,"diffRatio");function C(n){let{round:e,critiques:t,draft:r,previousDraft:i}=n,o=t.filter(u=>u.severity==="blocker").length,a=t.filter(u=>u.severity==="major").length,s=t.length,c=i?x(i.content,r.content):1;return e===1?{blockerCount:o,majorCount:a,totalCritiques:s,diffFromPrevious:c,shouldStop:false,reason:"running"}:s===0?{blockerCount:o,majorCount:a,totalCritiques:s,diffFromPrevious:c,shouldStop:false,reason:"running"}:o===0&&a===0&&s>=3?{blockerCount:o,majorCount:a,totalCritiques:s,diffFromPrevious:c,shouldStop:true,reason:"all_minor_or_praise"}:o===0&&c<.05?{blockerCount:o,majorCount:a,totalCritiques:s,diffFromPrevious:c,shouldStop:true,reason:"blockers_zero_and_stable"}:{blockerCount:o,majorCount:a,totalCritiques:s,diffFromPrevious:c,shouldStop:false,reason:"running"}}a(C,"defaultConvergence");h();var q=`
1
+ import {b}from'./chunk-WONQHE4P.js';import {d}from'./chunk-DI26OUIU.js';import {h,a}from'./chunk-3QP5BQ3L.js';h();h();h();h();function x(n,e){if(n===e)return 0;if(!n||!e)return 1;let t=a(c=>{let u=new Set;for(let l=0;l<c.length-2;l++)u.add(c.slice(l,l+3));return u},"trigrams"),r=t(n),i=t(e),o=0;for(let c of r)i.has(c)&&o++;let a$1=r.size+i.size-o;return a$1===0?0:1-o/a$1}a(x,"diffRatio");function C(n){let{round:e,critiques:t,draft:r,previousDraft:i}=n,o=t.filter(u=>u.severity==="blocker").length,a=t.filter(u=>u.severity==="major").length,s=t.length,c=i?x(i.content,r.content):1;return e===1?{blockerCount:o,majorCount:a,totalCritiques:s,diffFromPrevious:c,shouldStop:false,reason:"running"}:s===0?{blockerCount:o,majorCount:a,totalCritiques:s,diffFromPrevious:c,shouldStop:false,reason:"running"}:o===0&&a===0&&s>=3?{blockerCount:o,majorCount:a,totalCritiques:s,diffFromPrevious:c,shouldStop:true,reason:"all_minor_or_praise"}:o===0&&c<.05?{blockerCount:o,majorCount:a,totalCritiques:s,diffFromPrevious:c,shouldStop:true,reason:"blockers_zero_and_stable"}:{blockerCount:o,majorCount:a,totalCritiques:s,diffFromPrevious:c,shouldStop:false,reason:"running"}}a(C,"defaultConvergence");h();var q=`
2
2
  Hard rules:
3
3
  - Output the FULL artifact, not a sketch or outline.
4
4
  - No "...", "(continued)", "see above", "TBD", or placeholders.
@@ -246,6 +246,6 @@ ${t}`};}}return {content:e??n.trim(),meta:r}}a(L,"parseReviseResponse");function
246
246
 
247
247
  `),r&&(e=`# ${r}
248
248
 
249
- ${e}`),e.trim()}a(te,"extractTextFromHTML");function O(n){return n.replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&quot;/g,'"').replace(/&#39;/g,"'").replace(/&apos;/g,"'").replace(/&nbsp;/g," ").replace(/&#(\d+);/g,(e,t)=>String.fromCharCode(Number(t))).replace(/&#x([0-9a-fA-F]+);/g,(e,t)=>String.fromCharCode(parseInt(t,16)))}a(O,"decodeEntities");var re={name:"web_search",description:"Search the web (Google via Serper / Tavily / SearXNG depending on env). Use this to verify any specific number, citation, URL, library version, API name, or external claim made in the draft you are reviewing. If a claim cannot be verified by web_search, mark it as a fabrication critique with severity = blocker.",inputSchema:{type:"object",properties:{query:{type:"string",description:"Search query (English usually works best)."},num_results:{type:"number",description:"Default 5, max 20."}},required:["query"]}},ne={name:"web_fetch",description:"Fetch a URL and return its text content (HTML stripped). Use after web_search to read the actual page content of a search result and confirm a specific claim, version number, or quoted figure.",inputSchema:{type:"object",properties:{url:{type:"string",description:"Full http(s) URL to fetch."},max_length:{type:"number",description:"Default 50000 characters."}},required:["url"]}},j=[re,ne];async function N(n,e){return n==="web_search"?F(e):n==="web_fetch"?M(e):`Error: unknown tool "${n}"`}a(N,"executeIterateWebTool");function E(){return !!(process.env.SERPER_API_KEY||process.env.TAVILY_API_KEY||process.env.SEARXNG_URL)}a(E,"hasWebSearchProvider");var oe=8;async function U(n){let{subject:e,format:t,draft:r,critics:i,round:o,enableWebSearch:a,maxToolRounds:s,signal:c,onProgress:u}=n;u?.({type:"argue_start",round:o,data:{criticCount:i.length}});let l=!!a,p=l&&E();l&&!p&&b.warn("arena.iterate.argue_web_unavailable",{reason:"No SERPER_API_KEY / TAVILY_API_KEY / SEARXNG_URL configured"});let f=`r${o}`,d=i.map(async y=>{c?.throwIfAborted();try{return p?await ie({critic:y,subject:e,format:t,draft:r,idPrefix:f,maxToolRounds:s??oe,signal:c}):await ae({critic:y,subject:e,format:t,draft:r,idPrefix:f,signal:c})}catch(K){return b.warn("arena.iterate.argue_failed",{round:o,critic:y.name,error:K.message}),[]}}),h=(await Promise.all(d)).flat();return u?.({type:"argue_done",round:o,data:{critiqueCount:h.length,webEnabled:p}}),h}a(U,"runArgueRound");async function ae(n){let{critic:e,subject:t,format:r,draft:i,idPrefix:o,signal:a}=n,c=await(await b$1({...e.llm,enableStreaming:false})).createMessage({systemPrompt:r.argueSystem(r.format),messages:[{role:"user",content:r.argueUser(t,i)}],tools:[],signal:a}),u=k(c.text,e.name,o);return b.info("arena.iterate.argue_singleshot",{critic:e.name,critiqueCount:u.length}),u}a(ae,"argueSingleShot");async function ie(n){let{critic:e,subject:t,format:r,draft:i,idPrefix:o,maxToolRounds:a,signal:s}=n,c=await b$1({...e.llm,enableStreaming:false}),u=[{role:"user",content:r.argueUser(t,i)}],l=0,p="";for(;l<a;){s?.throwIfAborted();let d=await c.createMessage({systemPrompt:r.argueSystem(r.format),messages:u,tools:j,signal:s});if(d.text&&(p=d.text),!d.toolCalls||d.toolCalls.length===0)break;u.push({role:"assistant",content:[...d.text?[{type:"text",text:d.text}]:[],...d.toolCalls.map(h=>({type:"tool_use",id:h.id,name:h.toolName,input:h.args}))]});let b=await Promise.all(d.toolCalls.map(async h=>{try{let y=await N(h.toolName,h.args);return {id:h.id,content:y}}catch(y){return {id:h.id,content:`Error: ${y.message}`}}}));u.push({role:"user",content:b.map(h=>({type:"tool_result",tool_use_id:h.id,content:h.content}))}),l++;}!p&&l>=a&&(p=(await c.createMessage({systemPrompt:r.argueSystem(r.format),messages:[...u,{role:"user",content:"You have used the maximum number of tool rounds. Produce your critiques JSON now, based on what you have already gathered. Do not request any more tools."}],tools:[],signal:s})).text);let f=k(p,e.name,o);return b.info("arena.iterate.argue_toolloop",{critic:e.name,critiqueCount:f.length,toolRounds:l}),f}a(ie,"argueWithToolLoop");h();async function Y(n){let{subject:e,format:t,previous:r,critiques:i,author:o,minDraftLength:a,signal:s,onProgress:c}=n;c?.({type:"revise_start",round:r.version+1,participant:o.name});let u=await b$1({...o.llm,enableStreaming:false}),l=t.revisePrompt(e,r,i,a),p=await u.createMessage({systemPrompt:l,messages:[{role:"user",content:`Produce v${r.version+1} now.`}],tools:[],maxTokens:32e3,signal:s}),{content:f,meta:d}=L(p.text),b$2=f,h=r.content.length>0?1-b$2.length/r.content.length:0;h>.3&&b$2.length<a&&(b.warn("arena.iterate.revise_too_short",{version:r.version+1,previousLength:r.content.length,newLength:b$2.length,minDraftLength:a}),d.changelog=`[WARNING: revision is ${Math.round(h*100)}% shorter than v${r.version}; the author may have summarized instead of rewriting]
249
+ ${e}`),e.trim()}a(te,"extractTextFromHTML");function O(n){return n.replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&quot;/g,'"').replace(/&#39;/g,"'").replace(/&apos;/g,"'").replace(/&nbsp;/g," ").replace(/&#(\d+);/g,(e,t)=>String.fromCharCode(Number(t))).replace(/&#x([0-9a-fA-F]+);/g,(e,t)=>String.fromCharCode(parseInt(t,16)))}a(O,"decodeEntities");var re={name:"web_search",description:"Search the web (Google via Serper / Tavily / SearXNG depending on env). Use this to verify any specific number, citation, URL, library version, API name, or external claim made in the draft you are reviewing. If a claim cannot be verified by web_search, mark it as a fabrication critique with severity = blocker.",inputSchema:{type:"object",properties:{query:{type:"string",description:"Search query (English usually works best)."},num_results:{type:"number",description:"Default 5, max 20."}},required:["query"]}},ne={name:"web_fetch",description:"Fetch a URL and return its text content (HTML stripped). Use after web_search to read the actual page content of a search result and confirm a specific claim, version number, or quoted figure.",inputSchema:{type:"object",properties:{url:{type:"string",description:"Full http(s) URL to fetch."},max_length:{type:"number",description:"Default 50000 characters."}},required:["url"]}},j=[re,ne];async function N(n,e){return n==="web_search"?F(e):n==="web_fetch"?M(e):`Error: unknown tool "${n}"`}a(N,"executeIterateWebTool");function E(){return !!(process.env.SERPER_API_KEY||process.env.TAVILY_API_KEY||process.env.SEARXNG_URL)}a(E,"hasWebSearchProvider");var oe=8;async function U(n){let{subject:e,format:t,draft:r,critics:i,round:o,enableWebSearch:a,maxToolRounds:s,signal:c,onProgress:u}=n;u?.({type:"argue_start",round:o,data:{criticCount:i.length}});let l=!!a,p=l&&E();l&&!p&&d.warn("arena.iterate.argue_web_unavailable",{reason:"No SERPER_API_KEY / TAVILY_API_KEY / SEARXNG_URL configured"});let f=`r${o}`,d$1=i.map(async y=>{c?.throwIfAborted();try{return p?await ie({critic:y,subject:e,format:t,draft:r,idPrefix:f,maxToolRounds:s??oe,signal:c}):await ae({critic:y,subject:e,format:t,draft:r,idPrefix:f,signal:c})}catch(K){return d.warn("arena.iterate.argue_failed",{round:o,critic:y.name,error:K.message}),[]}}),h=(await Promise.all(d$1)).flat();return u?.({type:"argue_done",round:o,data:{critiqueCount:h.length,webEnabled:p}}),h}a(U,"runArgueRound");async function ae(n){let{critic:e,subject:t,format:r,draft:i,idPrefix:o,signal:a}=n,c=await(await b({...e.llm,enableStreaming:false})).createMessage({systemPrompt:r.argueSystem(r.format),messages:[{role:"user",content:r.argueUser(t,i)}],tools:[],signal:a}),u=k(c.text,e.name,o);return d.info("arena.iterate.argue_singleshot",{critic:e.name,critiqueCount:u.length}),u}a(ae,"argueSingleShot");async function ie(n){let{critic:e,subject:t,format:r,draft:i,idPrefix:o,maxToolRounds:a,signal:s}=n,c=await b({...e.llm,enableStreaming:false}),u=[{role:"user",content:r.argueUser(t,i)}],l=0,p="";for(;l<a;){s?.throwIfAborted();let d=await c.createMessage({systemPrompt:r.argueSystem(r.format),messages:u,tools:j,signal:s});if(d.text&&(p=d.text),!d.toolCalls||d.toolCalls.length===0)break;u.push({role:"assistant",content:[...d.text?[{type:"text",text:d.text}]:[],...d.toolCalls.map(h=>({type:"tool_use",id:h.id,name:h.toolName,input:h.args}))]});let b=await Promise.all(d.toolCalls.map(async h=>{try{let y=await N(h.toolName,h.args);return {id:h.id,content:y}}catch(y){return {id:h.id,content:`Error: ${y.message}`}}}));u.push({role:"user",content:b.map(h=>({type:"tool_result",tool_use_id:h.id,content:h.content}))}),l++;}!p&&l>=a&&(p=(await c.createMessage({systemPrompt:r.argueSystem(r.format),messages:[...u,{role:"user",content:"You have used the maximum number of tool rounds. Produce your critiques JSON now, based on what you have already gathered. Do not request any more tools."}],tools:[],signal:s})).text);let f=k(p,e.name,o);return d.info("arena.iterate.argue_toolloop",{critic:e.name,critiqueCount:f.length,toolRounds:l}),f}a(ie,"argueWithToolLoop");h();async function Y(n){let{subject:e,format:t,previous:r,critiques:i,author:o,minDraftLength:a,signal:s,onProgress:c}=n;c?.({type:"revise_start",round:r.version+1,participant:o.name});let u=await b({...o.llm,enableStreaming:false}),l=t.revisePrompt(e,r,i,a),p=await u.createMessage({systemPrompt:l,messages:[{role:"user",content:`Produce v${r.version+1} now.`}],tools:[],maxTokens:32e3,signal:s}),{content:f,meta:d$1}=L(p.text),b$1=f,h=r.content.length>0?1-b$1.length/r.content.length:0;h>.3&&b$1.length<a&&(d.warn("arena.iterate.revise_too_short",{version:r.version+1,previousLength:r.content.length,newLength:b$1.length,minDraftLength:a}),d$1.changelog=`[WARNING: revision is ${Math.round(h*100)}% shorter than v${r.version}; the author may have summarized instead of rewriting]
250
250
 
251
- `+(d.changelog??""));let y={version:r.version+1,author:o.name,format:t.format,content:b$2,acceptedCritiques:d.acceptedCritiques,rejectedCritiques:d.rejectedCritiques,changelog:d.changelog};return c?.({type:"revise_done",round:y.version,participant:o.name,data:{length:b$2.length,accepted:d.acceptedCritiques?.length??0}}),b.info("arena.iterate.revise",{version:y.version,author:o.name,length:b$2.length,accepted:d.acceptedCritiques?.length??0,rejected:d.rejectedCritiques?.length??0}),y}a(Y,"runRevise");h();async function W(n){let{subject:e,format:t,participants:r,minDraftLength:i,signal:o,onProgress:a}=n;a?.({type:"v1_tournament_start",data:{count:r.length}});let s=r.map(async(l,p)=>{o?.throwIfAborted();let f=await b$1({...l.llm,enableStreaming:false}),d=t.draftPrompt(e,i),h=(await f.createMessage({systemPrompt:d,messages:[{role:"user",content:"Write your draft now."}],tools:[],maxTokens:32e3,signal:o})).text.trim(),y={author:l.name,anonymousLabel:`Draft ${String.fromCharCode(65+p)}`,content:h};return a?.({type:"v1_candidate_done",participant:l.name,data:{length:h.length,anonymousLabel:y.anonymousLabel}}),b.info("arena.iterate.v1_candidate",{participant:l.name,anonymousLabel:y.anonymousLabel,length:h.length}),y}),c=await Promise.allSettled(s),u=[];for(let l of c)l.status==="fulfilled"?u.push(l.value):b.warn("arena.iterate.v1_candidate_failed",{error:l.reason?.message});if(u.length===0)throw new Error("All v1 tournament candidates failed");for(let l=u.length-1;l>0;l--){let p=Math.floor(Math.random()*(l+1));[u[l],u[p]]=[u[p],u[l]],u[l].anonymousLabel=`Draft ${String.fromCharCode(65+l)}`;}return u[0].anonymousLabel="Draft A",u}a(W,"runTournamentCandidates");async function B(n){let{subject:e,format:t,author:r,candidates:i,minDraftLength:o,signal:a,onProgress:s}=n;s?.({type:"v1_merge_start",participant:r.name});let c=await b$1({...r.llm,enableStreaming:false}),u=t.mergePrompt(e,i,o),l=await c.createMessage({systemPrompt:u,messages:[{role:"user",content:"Produce v1 now."}],tools:[],maxTokens:32e3,signal:a}),{content:p,rationale:f}=$(l.text),d={version:1,author:r.name,format:t.format,content:p,draftCandidates:i,mergeRationale:f};return s?.({type:"v1_merge_done",participant:r.name,data:{length:p.length}}),b.info("arena.iterate.v1_merge",{author:r.name,candidateCount:i.length,length:p.length}),d}a(B,"mergeCandidatesToV1");async function z(n){let{subject:e,format:t,author:r,minDraftLength:i,signal:o}=n,a=await b$1({...r.llm,enableStreaming:false}),s=t.draftPrompt(e,i),c=await a.createMessage({systemPrompt:s,messages:[{role:"user",content:"Write your draft now."}],tools:[],maxTokens:32e3,signal:o});return {version:1,author:r.name,format:t.format,content:c.text.trim()}}a(z,"singleAuthorV1");var se=5,A=class{static{a(this,"IterativeArena");}config;constructor(e){if(!e.author)throw new Error("IterativeArena requires an `author` participant");if(!e.critics||e.critics.length===0)throw new Error("IterativeArena requires at least 1 critic");let t=[e.author.name,...e.critics.map(r=>r.name)];if(new Set(t).size!==t.length)throw new Error("Author and critics must have unique names");this.config=e;}async run(){let e=Date.now(),{config:t}=this,r=R(t.format),i=t.maxRounds??se,o=t.minDraftLength??(t.format==="code"?200:800),a=t.signal,s=[],c;try{if((t.v1Strategy??"tournament")==="tournament"){let f=await W({subject:t.subject,format:r,participants:[t.author,...t.critics],minDraftLength:o,signal:a,onProgress:t.onProgress});c=await B({subject:t.subject,format:r,author:t.author,candidates:f,minDraftLength:o,signal:a,onProgress:t.onProgress});}else c=await z({subject:t.subject,format:r,author:t.author,minDraftLength:o,signal:a});}catch(f){throw b.error("arena.iterate.v1_failed",{error:f.message}),f}let u=t.author,l=[t.author,...t.critics],p;for(let f=1;f<=i;f++){a?.throwIfAborted();let d=await U({subject:t.subject,format:r,draft:c,critics:this.criticsForRound(f),round:f,enableWebSearch:t.enableWebSearch,maxToolRounds:t.maxArgueToolRounds,signal:a,onProgress:t.onProgress}),b=this.checkConvergence({round:f,critiques:d,draft:c,previousDraft:p}),h={round:f,draft:c,critiques:d,convergence:b},y;if(t.humanCheckpoint&&(t.onProgress?.({type:"checkpoint_pause",round:f}),y=await t.humanCheckpoint({round:f,draft:c,critiques:d,convergence:b})),s.push(h),t.onProgress?.({type:"round_done",round:f,data:{critiques:d.length,shouldStop:b.shouldStop,userAction:y}}),y==="stop")return this.finalize(s,"user_stop",e);if(y!=="force-continue"&&b.shouldStop)return this.finalize(s,"converged",e);if(f===i)return this.finalize(s,"max_rounds",e);p=c,u=this.pickNextAuthor(u,d,l,f),c=await Y({subject:t.subject,format:r,previous:p,critiques:d,author:u,minDraftLength:o,signal:a,onProgress:t.onProgress});}return this.finalize(s,"max_rounds",e)}criticsForRound(e){return this.config.critics}checkConvergence(e){if(this.config.convergenceStrategy&&this.config.convergenceStrategy!=="default"){let t=this.config.convergenceStrategy(e),r=e.critiques.filter(a=>a.severity==="blocker").length,i=e.critiques.filter(a=>a.severity==="major").length,o=e.previousDraft?x(e.previousDraft.content,e.draft.content):1;return {blockerCount:r,majorCount:i,totalCritiques:e.critiques.length,diffFromPrevious:o,shouldStop:t,reason:t?"all_minor_or_praise":"running"}}return C(e)}pickNextAuthor(e,t,r,i){let o=this.config.authorRotation??"fixed";if(o==="fixed")return this.config.author;if(o==="round-robin"){let a=i%r.length;return r[a]}if(o==="best-critic"){let a={blocker:5,major:3,minor:1,nit:.5,praise:0},s=new Map;for(let p of t)s.set(p.critic,(s.get(p.critic)??0)+(a[p.severity]??0));let c=e.name,u=-1;for(let[p,f]of s)f>u&&(u=f,c=p);return r.find(p=>p.name===c)??e}return e}finalize(e,t,r){let i=e.at(-1).draft,o={subject:this.config.subject,format:this.config.format,rounds:e,finalDraft:i,stoppedAt:t,durationMs:Date.now()-r};return this.config.onProgress?.({type:"iterate_complete",data:{stoppedAt:t,rounds:e.length,finalLength:i.content.length}}),b.info("arena.iterate.complete",{stoppedAt:t,rounds:e.length,finalVersion:i.version,finalLength:i.content.length}),o}};export{ye as a,F as b,Se as c,M as d,x as e,C as f,T as g,D as h,R as i,A as j};
251
+ `+(d$1.changelog??""));let y={version:r.version+1,author:o.name,format:t.format,content:b$1,acceptedCritiques:d$1.acceptedCritiques,rejectedCritiques:d$1.rejectedCritiques,changelog:d$1.changelog};return c?.({type:"revise_done",round:y.version,participant:o.name,data:{length:b$1.length,accepted:d$1.acceptedCritiques?.length??0}}),d.info("arena.iterate.revise",{version:y.version,author:o.name,length:b$1.length,accepted:d$1.acceptedCritiques?.length??0,rejected:d$1.rejectedCritiques?.length??0}),y}a(Y,"runRevise");h();async function W(n){let{subject:e,format:t,participants:r,minDraftLength:i,signal:o,onProgress:a}=n;a?.({type:"v1_tournament_start",data:{count:r.length}});let s=r.map(async(l,p)=>{o?.throwIfAborted();let f=await b({...l.llm,enableStreaming:false}),d$1=t.draftPrompt(e,i),h=(await f.createMessage({systemPrompt:d$1,messages:[{role:"user",content:"Write your draft now."}],tools:[],maxTokens:32e3,signal:o})).text.trim(),y={author:l.name,anonymousLabel:`Draft ${String.fromCharCode(65+p)}`,content:h};return a?.({type:"v1_candidate_done",participant:l.name,data:{length:h.length,anonymousLabel:y.anonymousLabel}}),d.info("arena.iterate.v1_candidate",{participant:l.name,anonymousLabel:y.anonymousLabel,length:h.length}),y}),c=await Promise.allSettled(s),u=[];for(let l of c)l.status==="fulfilled"?u.push(l.value):d.warn("arena.iterate.v1_candidate_failed",{error:l.reason?.message});if(u.length===0)throw new Error("All v1 tournament candidates failed");for(let l=u.length-1;l>0;l--){let p=Math.floor(Math.random()*(l+1));[u[l],u[p]]=[u[p],u[l]],u[l].anonymousLabel=`Draft ${String.fromCharCode(65+l)}`;}return u[0].anonymousLabel="Draft A",u}a(W,"runTournamentCandidates");async function B(n){let{subject:e,format:t,author:r,candidates:i,minDraftLength:o,signal:a,onProgress:s}=n;s?.({type:"v1_merge_start",participant:r.name});let c=await b({...r.llm,enableStreaming:false}),u=t.mergePrompt(e,i,o),l=await c.createMessage({systemPrompt:u,messages:[{role:"user",content:"Produce v1 now."}],tools:[],maxTokens:32e3,signal:a}),{content:p,rationale:f}=$(l.text),d$1={version:1,author:r.name,format:t.format,content:p,draftCandidates:i,mergeRationale:f};return s?.({type:"v1_merge_done",participant:r.name,data:{length:p.length}}),d.info("arena.iterate.v1_merge",{author:r.name,candidateCount:i.length,length:p.length}),d$1}a(B,"mergeCandidatesToV1");async function z(n){let{subject:e,format:t,author:r,minDraftLength:i,signal:o}=n,a=await b({...r.llm,enableStreaming:false}),s=t.draftPrompt(e,i),c=await a.createMessage({systemPrompt:s,messages:[{role:"user",content:"Write your draft now."}],tools:[],maxTokens:32e3,signal:o});return {version:1,author:r.name,format:t.format,content:c.text.trim()}}a(z,"singleAuthorV1");var se=5,A=class{static{a(this,"IterativeArena");}config;constructor(e){if(!e.author)throw new Error("IterativeArena requires an `author` participant");if(!e.critics||e.critics.length===0)throw new Error("IterativeArena requires at least 1 critic");let t=[e.author.name,...e.critics.map(r=>r.name)];if(new Set(t).size!==t.length)throw new Error("Author and critics must have unique names");this.config=e;}async run(){let e=Date.now(),{config:t}=this,r=R(t.format),i=t.maxRounds??se,o=t.minDraftLength??(t.format==="code"?200:800),a=t.signal,s=[],c;try{if((t.v1Strategy??"tournament")==="tournament"){let f=await W({subject:t.subject,format:r,participants:[t.author,...t.critics],minDraftLength:o,signal:a,onProgress:t.onProgress});c=await B({subject:t.subject,format:r,author:t.author,candidates:f,minDraftLength:o,signal:a,onProgress:t.onProgress});}else c=await z({subject:t.subject,format:r,author:t.author,minDraftLength:o,signal:a});}catch(f){throw d.error("arena.iterate.v1_failed",{error:f.message}),f}let u=t.author,l=[t.author,...t.critics],p;for(let f=1;f<=i;f++){a?.throwIfAborted();let d=await U({subject:t.subject,format:r,draft:c,critics:this.criticsForRound(f),round:f,enableWebSearch:t.enableWebSearch,maxToolRounds:t.maxArgueToolRounds,signal:a,onProgress:t.onProgress}),b=this.checkConvergence({round:f,critiques:d,draft:c,previousDraft:p}),h={round:f,draft:c,critiques:d,convergence:b},y;if(t.humanCheckpoint&&(t.onProgress?.({type:"checkpoint_pause",round:f}),y=await t.humanCheckpoint({round:f,draft:c,critiques:d,convergence:b})),s.push(h),t.onProgress?.({type:"round_done",round:f,data:{critiques:d.length,shouldStop:b.shouldStop,userAction:y}}),y==="stop")return this.finalize(s,"user_stop",e);if(y!=="force-continue"&&b.shouldStop)return this.finalize(s,"converged",e);if(f===i)return this.finalize(s,"max_rounds",e);p=c,u=this.pickNextAuthor(u,d,l,f),c=await Y({subject:t.subject,format:r,previous:p,critiques:d,author:u,minDraftLength:o,signal:a,onProgress:t.onProgress});}return this.finalize(s,"max_rounds",e)}criticsForRound(e){return this.config.critics}checkConvergence(e){if(this.config.convergenceStrategy&&this.config.convergenceStrategy!=="default"){let t=this.config.convergenceStrategy(e),r=e.critiques.filter(a=>a.severity==="blocker").length,i=e.critiques.filter(a=>a.severity==="major").length,o=e.previousDraft?x(e.previousDraft.content,e.draft.content):1;return {blockerCount:r,majorCount:i,totalCritiques:e.critiques.length,diffFromPrevious:o,shouldStop:t,reason:t?"all_minor_or_praise":"running"}}return C(e)}pickNextAuthor(e,t,r,i){let o=this.config.authorRotation??"fixed";if(o==="fixed")return this.config.author;if(o==="round-robin"){let a=i%r.length;return r[a]}if(o==="best-critic"){let a={blocker:5,major:3,minor:1,nit:.5,praise:0},s=new Map;for(let p of t)s.set(p.critic,(s.get(p.critic)??0)+(a[p.severity]??0));let c=e.name,u=-1;for(let[p,f]of s)f>u&&(u=f,c=p);return r.find(p=>p.name===c)??e}return e}finalize(e,t,r){let i=e.at(-1).draft,o={subject:this.config.subject,format:this.config.format,rounds:e,finalDraft:i,stoppedAt:t,durationMs:Date.now()-r};return this.config.onProgress?.({type:"iterate_complete",data:{stoppedAt:t,rounds:e.length,finalLength:i.content.length}}),d.info("arena.iterate.complete",{stoppedAt:t,rounds:e.length,finalVersion:i.version,finalLength:i.content.length}),o}};export{ye as a,F as b,Se as c,M as d,x as e,C as f,T as g,D as h,R as i,A as j};
@@ -0,0 +1,49 @@
1
+ import {c,h,a,d}from'./chunk-3QP5BQ3L.js';function M(e){if(!e)return 0;let n=(e.match(/[\u4e00-\u9fff\u3040-\u309f\u30a0-\u30ff\uac00-\ud7af]/g)??[]).length;if(n/e.length>.3){let s=n/y.cjk,h=(e.length-n)/y.english;return Math.ceil(s+h)}return ["{","}","(",")",";","=>","import ","function ","class ","const "].reduce((s,i)=>s+(e.includes(i)?1:0),0)>=3?Math.ceil(e.length/y.code):e.startsWith("{")||e.startsWith("[")?Math.ceil(e.length/y.json):Math.ceil(e.length/y.english)}function S(e){let n=0;for(let t of e)if(n+=4,typeof t.content=="string")n+=M(t.content);else if(Array.isArray(t.content))for(let o of t.content)n+=j(o);return n}function j(e){let n=2;return e.text&&(n+=M(e.text)),e.content&&typeof e.content=="string"&&(n+=M(e.content)),e.input&&(n+=M(JSON.stringify(e.input))),e.name&&(n+=M(e.name)),n}var y,T=c(()=>{h();y={english:4,code:3.2,json:3.5,mixed:3.6,cjk:1.5};a(M,"estimateStringTokens");a(S,"estimateMessagesTokens");a(j,"estimateBlockTokens");});var K={};d(K,{COMPACTABLE_TOOL_NAMES:()=>R,adjustIndexToPreserveAPIInvariants:()=>w,applySummaryCompaction:()=>D,applyToolResultBudget:()=>L,buildSummarizationPrompt:()=>G,dropOldestRounds:()=>J,estimateTokens:()=>N,extractAnchoredSummary:()=>q,extractReferencedFilePaths:()=>C,groupMessagesByApiRound:()=>k,microcompact:()=>U,snipCompact:()=>z,truncateToolResult:()=>F,windowCompact:()=>I});function N(e){return Math.ceil(S(e)*(4/3))}function w(e,n){let t=n,o=new Set;for(let r=t;r<e.length;r++){let s=e[r];if(Array.isArray(s.content))for(let i of s.content)i.type==="tool_result"&&i.tool_use_id&&o.add(i.tool_use_id);}for(let r=t;r<e.length;r++){let s=e[r];if(Array.isArray(s.content))for(let i of s.content)i.type==="tool_use"&&i.id&&o.delete(i.id);}if(o.size===0)return t;for(let r=t-1;r>=0&&o.size>0;r--){let s=e[r];if(!(s.role!=="assistant"||!Array.isArray(s.content)))for(let i of s.content)i.type==="tool_use"&&i.id&&o.has(i.id)&&(o.delete(i.id),r<t&&(t=r));}return t}function z(e,n=3,t=8){if(e.length<=n+t+1)return e;let o=e.length-t;if(o=w(e,o),o<=n)return e;let s={role:"user",content:`<system-reminder>[${o-n} messages snipped to save context. Use the transcript file to review details if needed.]</system-reminder>`};return [...e.slice(0,n),s,...e.slice(o)]}function I(e,n){if(e.length<=n+1)return e;let t=e.length-n;return t=w(e,t),t<=1?e:[e[0],...e.slice(t)]}function W(e){let n=new Map;for(let t of e)if(Array.isArray(t.content))for(let o of t.content)o.type==="tool_use"&&o.id&&o.name&&n.set(o.id,o.name);return n}function B(e,n){if(!n||typeof n!="object")return "";let t=a(o=>{let r=[];for(let s of o){let i=n[s];typeof i=="string"&&i.length>0&&r.push(`${s}=${i.length>80?i.slice(0,77)+"...":i}`);}return r.join(" ")},"pick");switch(e){case "Read":case "Write":case "Edit":case "NotebookEdit":return t(["file_path","path","notebook_path"]);case "Glob":case "Grep":return t(["pattern","path","glob"]);case "Bash":case "PowerShell":case "REPL":return t(["command"]);case "WebFetch":case "WebSearch":return t(["url","query"]);default:{let o=JSON.stringify(n);return o.length>100?o.slice(0,97)+"...":o}}}function U(e,n={}){let t=n.keepRecentN??5,o=n.compactableTools??R,r=W(e),s=new Map;for(let l of e)if(Array.isArray(l.content))for(let g of l.content)g.type==="tool_use"&&g.id&&s.set(g.id,g.input);let i=0,h=[];for(let l=e.length-1;l>=0;l--){let g=e[l];!Array.isArray(g.content)||!g.content.some(d=>d.type==="tool_result"&&d.tool_use_id!=null&&o.has(r.get(d.tool_use_id)??"")&&typeof d.content=="string"&&!d.content.startsWith("[Old tool result cleared"))||(i++,i>t&&h.push(l));}if(h.length===0)return e;let a=new Set(h),u=new Set,p=0,m=e.map((l,g)=>!a.has(g)||!Array.isArray(l.content)?l:{...l,content:l.content.map(f=>{if(f.type!=="tool_result"||!f.tool_use_id)return f;let d=r.get(f.tool_use_id);if(!d||!o.has(d)||typeof f.content!="string"||f.content.startsWith("[Old tool result cleared"))return f;let A=B(d,s.get(f.tool_use_id)),O=A?`[Old tool result cleared \u2014 ${d} ${A}]`:`[Old tool result cleared \u2014 ${d}]`;return u.add(d),p++,{...f,content:O}})});return p>0&&n.onClear?.({clearedRounds:h.length,toolNames:[...u].sort()}),m}function L(e,n=1e5){return e.map(t=>{if(!Array.isArray(t.content))return t;let o=[],r=0;for(let a=0;a<t.content.length;a++){let u=t.content[a];if(u.type==="tool_result"&&typeof u.content=="string"){let p=u.content.length;o.push({index:a,size:p}),r+=p;}}if(r<=n||o.length===0)return t;o.sort((a,u)=>u.size-a.size);let s=r,i=new Set;for(let a of o){if(s<=n)break;i.add(a.index),s-=a.size,s+=200;}if(i.size===0)return t;let h=t.content.map((a,u)=>{if(!i.has(u))return a;let p=typeof a.content=="string"?a.content.slice(0,500):"",m=(a.content.length/1e3).toFixed(0);return {...a,content:`Output too large (${m}KB) \u2014 truncated to fit the per-message budget. Re-run the originating tool if you need the full output.
2
+
3
+ Preview (first 500 chars):
4
+ ${p}`}});return {...t,content:h}})}function F(e,n=3e4){if(e.length<=n)return e;let t=Math.floor(n*.7),o=Math.floor(n*.2),r=e.slice(0,t),s=e.slice(-o);return r+`
5
+
6
+ ... [${e.length-t-o} characters truncated] ...
7
+
8
+ `+s}function G(e,n){let t=[];for(let r of e)if(typeof r.content=="string")t.push(`[${r.role}]: ${r.content.slice(0,3e3)}`);else for(let s of r.content)if(s.type==="text"&&s.text)t.push(`[${r.role}]: ${s.text.slice(0,3e3)}`);else if(s.type==="tool_use"){let i=JSON.stringify(s.input).slice(0,500);t.push(`[tool_use]: ${s.name}(${i})`);}else if(s.type==="tool_result"){let i=typeof s.content=="string"?s.content:"";t.push(`[tool_result]: ${i.slice(0,1500)}`);}let o=`1. **Primary Request**: What the user originally asked for
9
+ 2. **Key Concepts**: Important technical terms, patterns, file paths
10
+ 3. **Files Referenced**: List of files read/edited with key content
11
+ 4. **Errors & Fixes**: Any errors encountered and how they were resolved
12
+ 5. **Actions Taken**: Tools used and their outcomes
13
+ 6. **User Messages**: All distinct user requests (verbatim if short)
14
+ 7. **Pending Tasks**: Anything started but not finished
15
+ 8. **Current State**: Where things stand right now
16
+ 9. **Next Steps**: What should happen next
17
+ `;return n?`You are updating an anchored conversation summary. A prior summary is shown first, followed by NEW conversation that occurred after that summary was produced. Produce an UPDATED summary that:
18
+ - Preserves every critical fact from the prior summary (file paths, decisions, the user's original intent, errors that were fixed)
19
+ - Merges in new facts from the new conversation
20
+ - Resolves contradictions in favor of the newer information
21
+ - Stays in the same 9-section structure below
22
+ - Is factual; preserves file paths, function names, and error messages exactly
23
+
24
+ `+o+`
25
+ === Prior summary ===
26
+ `+n+`
27
+
28
+ === New conversation ===
29
+
30
+ `+t.join(`
31
+ `):`Summarize the following conversation into these sections. Be factual. Preserve file paths, function names, and error messages exactly.
32
+
33
+ `+o+`
34
+ Conversation:
35
+
36
+ `+t.join(`
37
+ `)}function q(e){for(let n=e.length-1;n>=0;n--){let t=e[n],o=typeof t.content=="string"?t.content:"";if(!o)continue;let r=o.indexOf(x);if(r<0)continue;let s=o.indexOf(v,r+x.length);if(!(s<=r))return o.slice(r+x.length,s).trim()}}function D(e,n,t,o){if(e.length<=t+2)return e;let r=e.length-t;if(r=w(e,r),r<=1)return e;let s=e[0],i=e.slice(1,r),h=e.slice(r),a=C(i),u=`This session is being continued from a previous conversation that ran out of context. The summary below covers the earlier portion of the conversation.
38
+
39
+ ${x}
40
+ ${n}
41
+ ${v}`;o&&(u+=`
42
+
43
+ If you need specific details from before compaction (like exact code snippets, error messages, or content you generated), read the full transcript at: ${o}`),a.length>0&&(u+=`
44
+
45
+ Files referenced before compaction (use Read tool if you need their current content):
46
+ `+a.map(m=>`- ${m}`).join(`
47
+ `)),u+=`
48
+
49
+ Recent messages are preserved verbatim below. Continue from where you left off.`;let p={role:"user",content:`<system-reminder>${u}</system-reminder>`};return [s,p,...h]}function k(e){let n=[],t=[];for(let o of e)o.role==="assistant"&&t.length>0?(n.push(t),t=[o]):t.push(o);return t.length>0&&n.push(t),n}function J(e,n){let t=k(e);if(t.length<=n+1)return t[t.length-1];let o=t.slice(n).flat(),r=w(o,0),s=o.slice(r);return s.length>0&&s[0].role==="assistant"&&s.unshift({role:"user",content:"<system-reminder>Earlier conversation context was removed to fit within the context window. Continue from the assistant's response below.</system-reminder>"}),s}function C(e){let n=new Set,t=new Set(["Read","Edit","Write","Glob","Grep"]);for(let o of e)if(Array.isArray(o.content)){for(let r of o.content)if(r.type==="tool_use"&&r.name&&t.has(r.name)&&r.input){let s=r.input,i=s.file_path??s.path;i&&n.add(i);}}return [...n]}var R,x,v,H=c(()=>{h();T();a(N,"estimateTokens");a(w,"adjustIndexToPreserveAPIInvariants");a(z,"snipCompact");a(I,"windowCompact");R=new Set(["Read","Glob","Grep","Bash","PowerShell","NotebookEdit","WebFetch","WebSearch","REPL"]);a(W,"buildToolUseIdToNameMap");a(B,"summarizeToolCallArgs");a(U,"microcompact");a(L,"applyToolResultBudget");a(F,"truncateToolResult");a(G,"buildSummarizationPrompt");x="<anchored-summary>",v="</anchored-summary>";a(q,"extractAnchoredSummary");a(D,"applySummaryCompaction");a(k,"groupMessagesByApiRound");a(J,"dropOldestRounds");a(C,"extractReferencedFilePaths");});export{N as a,w as b,z as c,I as d,R as e,U as f,L as g,F as h,G as i,q as j,D as k,k as l,J as m,C as n,K as o,H as p};
@@ -0,0 +1 @@
1
+ import {a as a$1}from'./chunk-P6JSTIFM.js';import {h,a}from'./chunk-3QP5BQ3L.js';h();var u=[[/^deepseek-v4(?:-|$)/i,1e6],[/(?:^|\/)deepseek-v4(?:-|$)/i,1e6]];function g(s){for(let[e,i]of u)if(e.test(s))return i}a(g,"lookupBuiltinContextWindow");var l=class{static{a(this,"ModelPool");}models=new Map;activeKey;providerCatalog;cacheDir;setProviderCatalog(e){this.providerCatalog=e;}setCacheDir(e){this.cacheDir=e;}reloadCachedContextWindows(){if(this.cacheDir)for(let[e,i]of this.models){if(i.maxContextTokens!=null||!i.providerKey)continue;let t=a$1(this.cacheDir,i.providerKey);if(!t)continue;let n=t.models.find(r=>r.id===i.model);n?.contextLength&&this.models.set(e,{...i,maxContextTokens:n.contextLength});}}constructor(e,i){if(e)for(let t of e)this.models.set(t.key,this.withBuiltinDefaults(t));i&&this.models.has(i)?this.activeKey=i:e?.length&&(this.activeKey=e[0].key);}register(e){this.models.set(e.key,this.withBuiltinDefaults(e)),this.activeKey||(this.activeKey=e.key);}withBuiltinDefaults(e){if(e.maxContextTokens!=null)return e;let i=g(e.model);return i==null?e:{...e,maxContextTokens:i}}switch(e){let i=this.models.get(e);if(!i){let t=[...this.models.keys()].join(", ");throw new Error(`Model "${e}" not found. Available: ${t}`)}return this.activeKey=e,i}get(e){if(e)return this.models.get(e);if(this.activeKey)return this.models.get(this.activeKey)}getActiveKey(){return this.activeKey}list(){return [...this.models.values()]}get size(){return this.models.size}has(e){return this.models.has(e)}toLLMConfig(e,i){let t=e.providerKey&&this.providerCatalog?this.providerCatalog.get(e.providerKey):void 0,n=a(r=>r&&r==="anthropic"?"anthropic":"openai","kindToClientProvider");return {provider:e.provider||n(t?.kind)||"openai",model:e.model,apiKey:e.apiKey??t?.apiKey??i?.apiKey,baseUrl:e.baseUrl??t?.baseUrl??i?.baseUrl,temperature:i?.temperature??.3,maxTokens:e.maxOutputTokens??i?.maxTokens??8192,enableStreaming:i?.enableStreaming??true,...e.thinking||t?.thinking||i?.thinking?{thinking:e.thinking??t?.thinking??i?.thinking}:{},...t?.kind?{providerKind:t.kind}:{}}}resolveLLMConfig(e,i){let t=this.get(e);if(t)return this.toLLMConfig(t,i)}};export{l as a};
@@ -1 +1 @@
1
- import {d,c as c$1,b as b$1}from'./chunk-FU7AHZNN.js';import {b}from'./chunk-B7K2OWKC.js';import {h,a}from'./chunk-3QP5BQ3L.js';h();var c=class g{constructor(e){this.config=e;this.provider=e.provider,this.model=e.model,this.temperature=e.temperature??.3,this.maxTokens=e.maxTokens??8192,this.timeout=e.timeout??12e4,this.retryMaxAttempts=e.retryMaxAttempts??3,this.enableStreaming=e.enableStreaming??true,this.initClient();}static{a(this,"LLMClientBase");}provider;model;temperature;maxTokens;timeout;retryMaxAttempts;enableStreaming;static onUsage;usage={records:[],totalPromptTokens:0,totalCompletionTokens:0,totalTokens:0,requestCount:0};recordUsage(e,i){i?.recordUsage!==false&&(this.usage.records.push(e),this.usage.totalPromptTokens+=e.promptTokens,this.usage.totalCompletionTokens+=e.completionTokens,this.usage.totalTokens+=e.totalTokens,this.usage.requestCount++,g.onUsage?.(this.model,e));}getUsage(){return {...this.usage}}async withRetry(e,i){let o=i??this.retryMaxAttempts,n;for(let t=1;t<=o;t++)try{return await e()}catch(r){if(n=r,r instanceof d)throw r;if(r instanceof c$1){let s=(r.retryAfter??t*2)*1e3;b.warn("llm.retry",{cat:"llm",provider:this.provider,model:this.model,attempt:t,of:o,reason:"rate_limit",waitMs:s}),await new Promise(T=>setTimeout(T,s));continue}if(t===o){b.error("llm.exhausted",{cat:"llm",provider:this.provider,model:this.model,attempts:o,error:r.message});break}let m=Math.min(1e3*Math.pow(2,t-1),3e4);b.warn("llm.retry",{cat:"llm",provider:this.provider,model:this.model,attempt:t,of:o,reason:"error",error:r.message,backoffMs:m}),await new Promise(s=>setTimeout(s,m));}throw n??new b$1("Unknown LLM error")}};export{c as a};
1
+ import {d,c as c$1,b}from'./chunk-FU7AHZNN.js';import {d as d$1}from'./chunk-DI26OUIU.js';import {h,a}from'./chunk-3QP5BQ3L.js';h();var c=class g{constructor(e){this.config=e;this.provider=e.provider,this.model=e.model,this.temperature=e.temperature??.3,this.maxTokens=e.maxTokens??8192,this.timeout=e.timeout??12e4,this.retryMaxAttempts=e.retryMaxAttempts??3,this.enableStreaming=e.enableStreaming??true,this.initClient();}static{a(this,"LLMClientBase");}provider;model;temperature;maxTokens;timeout;retryMaxAttempts;enableStreaming;static onUsage;usage={records:[],totalPromptTokens:0,totalCompletionTokens:0,totalTokens:0,requestCount:0};recordUsage(e,i){i?.recordUsage!==false&&(this.usage.records.push(e),this.usage.totalPromptTokens+=e.promptTokens,this.usage.totalCompletionTokens+=e.completionTokens,this.usage.totalTokens+=e.totalTokens,this.usage.requestCount++,g.onUsage?.(this.model,e));}getUsage(){return {...this.usage}}async withRetry(e,i){let o=i??this.retryMaxAttempts,n;for(let t=1;t<=o;t++)try{return await e()}catch(r){if(n=r,r instanceof d)throw r;if(r instanceof c$1){let s=(r.retryAfter??t*2)*1e3;d$1.warn("llm.retry",{cat:"llm",provider:this.provider,model:this.model,attempt:t,of:o,reason:"rate_limit",waitMs:s}),await new Promise(T=>setTimeout(T,s));continue}if(t===o){d$1.error("llm.exhausted",{cat:"llm",provider:this.provider,model:this.model,attempts:o,error:r.message});break}let m=Math.min(1e3*Math.pow(2,t-1),3e4);d$1.warn("llm.retry",{cat:"llm",provider:this.provider,model:this.model,attempt:t,of:o,reason:"error",error:r.message,backoffMs:m}),await new Promise(s=>setTimeout(s,m));}throw n??new b("Unknown LLM error")}};export{c as a};
@@ -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};