qlogicagent 1.2.1 → 2.0.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/README.md +27 -0
- package/dist/agent.js +14 -14
- package/dist/cli.js +217 -203
- package/dist/index.js +216 -203
- package/dist/orchestration.js +10 -10
- package/dist/qlogicagent.cmd +2 -0
- package/dist/types/agent/constants.d.ts +12 -2
- package/dist/types/agent/types.d.ts +3 -0
- package/dist/types/cli/main.d.ts +5 -1
- package/dist/types/cli/stdio-server.d.ts +58 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/types/llm/index.d.ts +1 -1
- package/dist/types/llm/transports/volcengine-media.d.ts +2 -1
- package/dist/types/orchestration/tool-loop/tool-schema.d.ts +1 -0
- package/dist/types/protocol/notifications.d.ts +1 -1
- package/dist/types/runtime/infra/acp-protocol-adapter.d.ts +72 -18
- package/dist/types/runtime/infra/acp-types.d.ts +30 -17
- package/dist/types/runtime/infra/agent-paths.d.ts +1 -1
- package/dist/types/runtime/infra/index.d.ts +2 -2
- package/dist/types/runtime/prompt/environment-context.d.ts +9 -1
- package/dist/types/runtime/prompt/index.d.ts +2 -1
- package/dist/types/runtime/prompt/task-domain.d.ts +82 -0
- package/dist/types/skills/index.d.ts +1 -1
- package/dist/types/skills/tools/media-cancel-tool.d.ts +30 -0
- package/dist/types/skills/tools/shell/index.d.ts +1 -0
- package/dist/types/skills/tools/shell/subprocess-env.d.ts +6 -0
- package/dist/types/skills/tools/three-d-generate-tool.d.ts +1 -0
- package/dist/types/skills/tools.d.ts +15 -0
- package/dist/types/transport/acp-event-emitter.d.ts +21 -0
- package/dist/types/transport/acp-server.d.ts +130 -0
- package/dist/types/transport/index.d.ts +6 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -278,6 +278,33 @@ qlogicagent 通过 HTTP 连接本地 QMemory 服务实现语义长期记忆。
|
|
|
278
278
|
| `QMEMORY_BASE_URL` | QMemory 服务地址 | 不设则禁用 |
|
|
279
279
|
| `QMEMORY_API_KEY` | QMemory 认证 Key | — |
|
|
280
280
|
| `QLOGICAGENT_QMEMORY_BASE_URL` | QMemory 地址 (备选变量名) | — |
|
|
281
|
+
| `QLOGICAGENT_HOME` | Agent 数据根目录(覆盖默认 `~/.qlogicagent/`)| `~/.qlogicagent/` |
|
|
282
|
+
| `QLOGICAGENT_IDLE_DREAM_MS` | 空闲多久后自动触发 Dream 整合(毫秒)| `300000` (5 min) |
|
|
283
|
+
| `QLOGICAGENT_DREAM_COOLDOWN_MS` | 两次 Dream 之间的最短间隔(毫秒)| `1800000` (30 min) |
|
|
284
|
+
|
|
285
|
+
#### QLOGICAGENT_HOME
|
|
286
|
+
|
|
287
|
+
设置后,所有 Agent 数据(sessions、memory、settings、plugins 等)存储到指定目录而非 `~/.qlogicagent/`。
|
|
288
|
+
|
|
289
|
+
典型场景:
|
|
290
|
+
- **测试隔离**:每个测试用例使用独立 `QLOGICAGENT_HOME` 避免互相污染
|
|
291
|
+
- **多实例部署**:同一机器运行多个 agent 实例时各自独立数据目录
|
|
292
|
+
|
|
293
|
+
```bash
|
|
294
|
+
# 测试隔离示例
|
|
295
|
+
QLOGICAGENT_HOME=/tmp/test-agent-1 node dist/cli.js
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
#### Idle Dream(空闲记忆整合)
|
|
299
|
+
|
|
300
|
+
qlogicagent 内置 idle dream 机制:当用户空闲超过 `QLOGICAGENT_IDLE_DREAM_MS` 毫秒后,自动触发 Dream 记忆整合流程(Orient → Gather → Consolidate → Prune)。
|
|
301
|
+
|
|
302
|
+
特性:
|
|
303
|
+
- **自治管理**:不依赖外部调度器,agent 进程内部自动计时
|
|
304
|
+
- **冷却保护**:两次 Dream 之间必须间隔 `QLOGICAGENT_DREAM_COOLDOWN_MS`,防止频繁触发
|
|
305
|
+
- **用户活动中止**:Dream 执行中如果收到新的 `thread.turn`,自动中止 Dream
|
|
306
|
+
- **最大时长限制**:单次 Dream 最长 120 秒,超时自动终止
|
|
307
|
+
- **触发门控**:需满足记忆数据充足、QMemory 可用等前置条件才会真正执行
|
|
281
308
|
|
|
282
309
|
### 用户级配置(`~/.qlogicagent/`)
|
|
283
310
|
|
package/dist/agent.js
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
var
|
|
2
|
-
`),
|
|
3
|
-
`));if(a>t*.5)return
|
|
4
|
-
[...truncated: ${e.length-a-1} chars omitted]`}let r=
|
|
5
|
-
`);return r>t*.7?
|
|
6
|
-
[...truncated: ${e.length-r} chars omitted]`:
|
|
7
|
-
[...truncated: ${e.length-t} chars omitted]`}function be(...e){return{compress(t,n){let o=t,r=0,a=[];for(let l of e){let s=l.compress(o,n);o=s.messages,r+=s.droppedCount,s.droppedCount>0&&a.push(s.strategy)}return{messages:o,droppedCount:r,strategy:a.length>0?a.join("+"):"none"}}}}var dt={modelContextWindow:128e3,targetUsageRatio:.75,minBudget:16e3,maxBudget:12e4};function ke(e={}){let t={...dt,...e},n=Math.floor(t.modelContextWindow*t.targetUsageRatio);return Math.max(t.minBudget,Math.min(n,t.maxBudget))}function _e(e,t){let n=e/t;return n<=.8?"none":n<=1?"trim-only":n<=1.5?"sliding-window":"llm-summarize"}var te=class{events=[];maxEvents;constructor(t=100){this.maxEvents=t}record(t){this.events.push(t),this.events.length>this.maxEvents&&this.events.shift()}snapshot(){let t=this.events.length;if(t===0)return{totalCompressions:0,totalLlmCalls:0,totalCacheInvalidations:0,averageCompressionRatio:1,averageLatencyMs:0,totalTokensSaved:0,recentEvents:[]};let n=0,o=0,r=0,a=0,l=0;for(let s of this.events)n+=s.tokensBefore>0?s.tokensAfter/s.tokensBefore:1,o+=s.latencyMs,r+=Math.max(0,s.tokensBefore-s.tokensAfter),s.usedLlm&&a++,s.cacheInvalidated&&l++;return{totalCompressions:t,totalLlmCalls:a,totalCacheInvalidations:l,averageCompressionRatio:n/t,averageLatencyMs:o/t,totalTokensSaved:r,recentEvents:this.events.slice(-10)}}reset(){this.events.length=0}},oe=class{engines=new Map;activeId;register(t){this.engines.set(t.id,t)}activate(t){return this.engines.has(t)?(this.activeId=t,!0):!1}getActive(){return this.activeId?this.engines.get(this.activeId):void 0}listEngines(){return Array.from(this.engines.values()).map(t=>({id:t.id,label:t.label,active:t.id===this.activeId}))}};function pt(e){let t=typeof e.content=="string"?e.content:e.content!=null?JSON.stringify(e.content):"";return Math.ceil(t.length/4)}var Io=new Set(["file_read","read","Read","bash","shell","Bash","grep","search","Grep","grep_search","glob","Glob","file_search","web_search","WebSearch","web_fetch","WebFetch","file_edit","edit","Edit","file_write","write","Write"]),q=class{constructor(t=20,n=pt){this.preserveRecentCount=t;this.estimateTokens=n}preserveRecentCount;estimateTokens;compress(t,n){if(t.length<=this.preserveRecentCount)return{messages:t,droppedCount:0,strategy:"micro-compact"};let o=t.length-this.preserveRecentCount,r=0,a=0;return{messages:t.map((s,p)=>{if(p>=o||s.role!=="tool"||typeof s.content!="string"||!s.name||!Io.has(s.name)||s.content.length<=200)return s;let f=this.estimateTokens(s);return a+=f,r++,{...s,content:`[result cleared \u2014 ${s.content.length} chars]`}}),droppedCount:r,strategy:"micro-compact",metrics:r>0?{tokensBefore:0,tokensAfter:0,compressionRatio:0,latencyMs:0,usedLlm:!1,cacheInvalidated:!1}:void 0}}};function Re(e,t,n=pt){if(t.size===0)return{messages:e,tokensFreed:0,removedCount:0};let o=0,r=0,a=[];for(let s of e){let p=s.tool_call_id??"";if(p&&t.has(p)){o+=n(s),r++,t.delete(p);continue}a.push(s)}let l=r>0?{role:"system",content:`[${r} messages removed by snip]`}:void 0;return{messages:a,tokensFreed:o,removedCount:r,boundaryMessage:l}}function xe(){return{stages:[]}}function ve(e,t,n){let o=n?.thresholdMessages??40;if(e.filter(s=>s.role!=="system").length<=o)return{messages:e,stagedCount:0};let a=mt(e,t),l=Lo(a,t,o);if(l.length===0)return{messages:a,stagedCount:0};for(let s of l)t.stages.push(s);return a=mt(e,t),{messages:a,stagedCount:l.length}}function Se(e,t){let n=0;for(let o of t.stages)o.committed||(o.committed=!0,n++);return n===0?{messages:e,committed:0}:{messages:gt(e,t),committed:n}}function mt(e,t){return t.stages.filter(o=>o.committed).length===0?e:gt(e,t)}function gt(e,t){let n=t.stages.filter(r=>r.committed).sort((r,a)=>a.range[0]-r.range[0]),o=[...e];for(let r of n){let[a,l]=r.range;if(a>=o.length)continue;let s=Math.min(l,o.length),p={role:"system",content:r.summary};o.splice(a,s-a,p)}return o}function Lo(e,t,n){let o=Math.max(0,e.length-Math.floor(n/2)),r=[],a=new Set(t.stages.map(p=>`${p.range[0]}-${p.range[1]}`)),l=-1,s=0;for(let p=0;p<o;p++){let f=e[p];if(f.role==="tool"||f.role==="assistant"&&typeof f.content=="string"&&f.content==="")l<0&&(l=p),s++;else{if(s>=3){let g=`${l}-${l+s}`;a.has(g)||r.push({id:`collapse_${l}_${l+s}`,range:[l,l+s],summary:`[${s} tool results collapsed]`,committed:!1})}l=-1,s=0}}if(s>=3){let p=`${l}-${l+s}`;a.has(p)||r.push({id:`collapse_${l}_${l+s}`,range:[l,l+s],summary:`[${s} tool results collapsed]`,committed:!1})}return r}function Oo(e){return!(!e.ok||e.existingSkillName||!e.multiStep||e.toolCallCount<3||e.distinctToolCount<2)}function Po(e){return e.existingSkillName?e.feedback==="negative":!1}function ue(e,t){return Po(e)?{type:"skill.improve",skillName:e.existingSkillName,reason:"negative user feedback on existing skill execution"}:Oo(e)?{type:"skill.create",suggestedName:t.suggestedName??`auto-skill-${t.tools.slice(0,3).join("-")}`,description:`Multi-step orchestration using ${t.tools.join(", ")}`,tools:t.tools,stepCount:e.toolCallCount}:null}function ft(e){return e.function&&typeof e.function=="object"&&typeof e.function.name=="string"?e.function.name.trim():typeof e.name=="string"?e.name.trim():""}function No(e){return e==="enabled-eligible"||e==="installed-awaiting-approval"}function Fo(e){return new Map((e??[]).map(t=>[t.toolName,t]))}function Bo(e){if(!e.eligibility?.length)return[...e.tools];let t=Fo(e.eligibility);return e.tools.filter(n=>{let o=ft(n);if(!o)return!1;let r=t.get(o);return!r||No(r.status)})}function Do(e){let t=[],n=e.compatibility??{},o=e.toolChoice;if(e.thinkingEnabled&&n.requireAutoWhenThinking){let r=typeof o=="object"&&o&&!Array.isArray(o)?String(o.type??""):o;r&&r!=="auto"&&r!=="none"&&(t.push("tool_choice downgraded to auto because thinking mode requires auto/none compatibility."),o="auto")}if(o==="required"&&n.allowRequiredToolChoice===!1){let r=n.requiredFallback??"auto";t.push(`tool_choice=required is not supported by this provider; downgraded to ${r}.`),o=r}if(o&&typeof o=="object"&&!Array.isArray(o)&&o.type==="function"&&n.allowNamedToolChoice===!1){let r=n.namedFallback??"required";t.push(`named tool_choice is not supported by this provider; downgraded to ${r}.`),o=r}return{normalizedToolChoice:o,warnings:t}}function Ae(e){let t=Do({toolChoice:e.toolChoice,thinkingEnabled:e.thinkingEnabled,compatibility:e.compatibility}),n=t.normalizedToolChoice,o=[...t.warnings],r=Bo({tools:e.tools,eligibility:e.eligibility});if(!n||n==="auto")return{tools:r,normalizedToolChoice:n,warnings:o};if(n==="none")return{tools:[],normalizedToolChoice:"none",warnings:o};if(n==="required"){if(r.length===0)throw new Error("tool_choice=required but no tools were provided");return{tools:r,normalizedToolChoice:"required",extraSystemPrompt:"You must call one of the available tools before responding.",warnings:o}}if(typeof n=="object"&&!Array.isArray(n)&&n.type==="function"){let a=n.function??void 0,l=typeof a?.name=="string"?a.name.trim():"";if(!l)throw new Error("tool_choice.function.name is required");let s=r.filter(p=>ft(p)===l);if(s.length===0)throw new Error(`tool_choice requested unknown tool: ${l}`);return{tools:s,normalizedToolChoice:{type:"function",function:{name:l}},extraSystemPrompt:`You must call the ${l} tool before responding.`,warnings:o}}return{tools:r,normalizedToolChoice:n,warnings:o}}var Uo=["stop","aborted","timeout","cancelled","interrupted","error"],$o=["tool_calls","toolCalls","function_call","functionCall","raw_tool_calls","rawToolCalls"];function yt(e){return e==null?[]:typeof e=="string"?e.length>0?[{type:"text",text:e}]:[]:Array.isArray(e)?e:[{type:"text",text:String(e)}]}function jo(e,t){return{...e,content:[...yt(e.content),...yt(t.content)]}}function zo(e){if(!e||typeof e!="object")return!1;if(e.function&&typeof e.function=="object"){let t=e.function.name;if(typeof t=="string"&&t.length>0)return!0}return typeof e.name=="string"&&e.name.length>0}function qo(e){return new Set((e??Uo).map(t=>t.trim().toLowerCase()))}function Go(e,t){return e?qo(t).has(e.trim().toLowerCase()):!1}function Ee(e){if(!Array.isArray(e)||e.length===0)return[...e];let t=e.map(s=>{if(s.role==="assistant"&&Array.isArray(s.tool_calls)){let p=s.tool_calls.filter(f=>zo(f));return{...s,...p.length>0?{tool_calls:p}:{tool_calls:void 0}}}return{...s}}),n=new Set;for(let s of t)if(!(s.role!=="assistant"||!Array.isArray(s.tool_calls)))for(let p of s.tool_calls)typeof p.id=="string"&&p.id&&n.add(p.id);let o=t.filter(s=>s.role!=="tool"?!0:!!(s.tool_call_id&&n.has(s.tool_call_id))),r=new Set;for(let s of o)s.role==="tool"&&typeof s.tool_call_id=="string"&&s.tool_call_id&&r.add(s.tool_call_id);let a=[];for(let s of o){if(s.role==="assistant"&&Array.isArray(s.tool_calls)&&s.tool_calls.length>0){let p=s.tool_calls.filter(f=>typeof f.id=="string"&&r.has(f.id));if(p.length===0){let{tool_calls:f,...d}=s;d.content!=null&&d.content!==""&&a.push(d);continue}if(p.length<s.tool_calls.length){a.push({...s,tool_calls:p});continue}}a.push(s)}let l=[];for(let s of a){let p=l.length>0?l[l.length-1]:void 0;if(s.role==="user"&&p?.role==="user"){l[l.length-1]=jo(p,s);continue}l.push(s)}return l}function we(e,t){return Go(t?.stopReason,t?.forcedStopReasons)?e.map(n=>{if(n.role!=="assistant")return{...n};let o={...n};for(let r of $o)delete o[r];return o}):[...e]}function Me(e,t){let n=t?.placeholderToolResult??"Error: Tool loop interrupted before the tool result was replayed.",o=new Set;for(let a of e)a.role==="tool"&&typeof a.tool_call_id=="string"&&a.tool_call_id&&o.add(a.tool_call_id);let r=[];for(let a of e)if(r.push({...a}),!(a.role!=="assistant"||!Array.isArray(a.tool_calls)||a.tool_calls.length===0))for(let l of a.tool_calls)typeof l.id!="string"||!l.id||o.has(l.id)||(o.add(l.id),r.push({role:"tool",tool_call_id:l.id,content:n}));return r}function Ie(e,t){let n=Ee(e),o=we(n,t);return Me(o,t)}function Ho(e){let t=new Set,n=new Set;for(let o of e){if(o.role==="assistant"&&Array.isArray(o.tool_calls))for(let r of o.tool_calls)typeof r.id=="string"&&r.id&&t.add(r.id);o.role==="tool"&&typeof o.tool_call_id=="string"&&o.tool_call_id&&n.add(o.tool_call_id)}return[...t].filter(o=>!n.has(o))}function Wo(e){let t=new Set;for(let n of e)n.role==="tool"&&typeof n.tool_call_id=="string"&&n.tool_call_id&&t.add(n.tool_call_id);return[...t]}function Ko(e){return{round:e.round??0,maxRounds:e.maxRounds,pendingToolCallIds:[...e.pendingToolCallIds??[]],completedToolCallIds:[...e.completedToolCallIds??[]],lastStopReason:e.lastStopReason,replayMessages:[...e.replayMessages??[]]}}function Le(e,t){return{round:e.round+1,maxRounds:e.maxRounds,pendingToolCallIds:[...t.pendingToolCallIds??e.pendingToolCallIds],completedToolCallIds:[...t.completedToolCallIds??e.completedToolCallIds],lastStopReason:t.lastStopReason??e.lastStopReason,replayMessages:[...t.replayMessages??e.replayMessages]}}function de(e,t){return{round:e.round,maxRounds:e.maxRounds,pendingToolCallIds:[],completedToolCallIds:[...t.completedToolCallIds??e.completedToolCallIds],lastStopReason:t.lastStopReason??e.lastStopReason,replayMessages:[...t.replayMessages??e.replayMessages]}}function pe(e){let t=[],n=Ee(e.replayMessages);n.length!==e.replayMessages.length&&t.push({kind:"drop-orphan-tool-result",detail:"Removed orphan tool results or invalid assistant tool calls."});let o=we(n,e.options);o.some((a,l)=>a!==n[l])&&t.push({kind:"strip-forced-stop-tool-metadata",detail:"Removed assistant tool-call metadata after forced stop."});let r=Me(o,e.options);return r.length>o.length&&t.push({kind:"inject-placeholder-tool-result",detail:"Injected placeholder tool result for pending tool calls."}),{state:Ko({maxRounds:e.maxRounds,round:e.round,lastStopReason:e.lastStopReason,replayMessages:r,pendingToolCallIds:Ho(r),completedToolCallIds:Wo(r)}),recoveryActions:t}}var Xo=new Set(["main","sdk","agent","compact","hook","verification","side_question"]);function Oe(e){return e?Xo.has(e):!0}function Pe(e){return e===429||e===529}function me(e,t=500,n=32e3){let o=Math.min(t*Math.pow(2,e-1),n);return o+Math.floor(Math.random()*o*.25)}var tr={maxBackoffMs:300*1e3,resetCapMs:360*60*1e3,heartbeatIntervalMs:3e4};function Ne(){let e=process.env.QLOGICAGENT_PERSISTENT_RETRY;return e==="1"||e==="true"}var ne=class extends Error{constructor(n,o){super(`Model fallback triggered: ${n} -> ${o}`);this.originalModel=n;this.fallbackModel=o;this.name="FallbackTriggeredError"}originalModel;fallbackModel};function Fe(e){return{promptTokens:0,hasAttemptedReactiveCompact:!1,currentMaxOutputTokens:e.maxOutputTokens,consecutiveTruncations:0,aborted:e.abortSignal?.aborted??!1}}function Be(e,t){if(e.aborted)return{level:"blocking",usagePercent:100,reason:"budget_exhausted"};let n=t.contextWindowTokens-t.responseBufferTokens-e.currentMaxOutputTokens,o=n>0?e.promptTokens/n*100:100;return e.promptTokens>=n?e.hasAttemptedReactiveCompact||!t.reactiveCompactEnabled?{level:"blocking",usagePercent:o,reason:"prompt_too_long"}:{level:"blocking",usagePercent:o,reason:"prompt_too_long"}:o>=85?{level:"warning",usagePercent:o,remainingTokens:n-e.promptTokens}:{level:"ok"}}function De(e,t,n){let o=e.message?.toLowerCase()??"",r=e.status??0;return r===413||o.includes("prompt_too_long")||o.includes("context_length_exceeded")?!t.hasAttemptedReactiveCompact&&n.reactiveCompactEnabled?{action:"reactive_compact"}:{action:"abort",reason:"prompt_too_long_unrecoverable"}:r>=500&&r<600?{action:"retry",reason:`server_error_${r}`}:r===429?{action:"retry",reason:"rate_limited"}:r===401||r===403?{action:"abort",reason:"auth_error"}:r===404?{action:"abort",reason:"model_not_found"}:{action:"abort",reason:o||"unknown_error"}}function Ue(e,t,n){if(!t.outputEscalationEnabled)return{shouldEscalate:!1,newMax:e.currentMaxOutputTokens};if(e.consecutiveTruncations>=3)return{shouldEscalate:!1,newMax:e.currentMaxOutputTokens};let o=Math.min(e.currentMaxOutputTokens*2,n);return o<=e.currentMaxOutputTokens?{shouldEscalate:!1,newMax:e.currentMaxOutputTokens}:{shouldEscalate:!0,newMax:o}}function $e(e,t){return e.aborted?!0:t.abortSignal?.aborted?(e.aborted=!0,!0):!1}var Yo={maxConsecutiveFailures:3,minMessagesAfterCompact:4,targetUsagePercent:50};function je(){return{consecutiveFailures:0,attemptedThisTurn:!1,lastCompactAt:null,toolsAtLastCompact:[]}}function H(e,t=Yo){return!(e.attemptedThisTurn||e.consecutiveFailures>=t.maxConsecutiveFailures)}function ht(e,t){let n=e.get(t.index);n||(n={id:"",name:"",arguments:""},e.set(t.index,n)),t.id&&(n.id=t.id),t.name&&(n.name+=t.name),n.arguments+=t.arguments}import{mkdir as on,writeFile as nn}from"fs/promises";import{join as Mt}from"path";import{tmpdir as rn}from"os";var Tt=Math.min(Math.max(1,Number(process.env.TOOL_LOOP_DEFAULT_BUDGET)||25),100),Ct=3,bt=128e3,kt=13e3,_t=16384,Rt=65536,xt=3,vt=65536,St=3e4,At=3,re=5,Et=5e4,wt=2e5,ze=2e3;var sn="tool-results",It="<persisted-output>",an="</persisted-output>";function Lt(){return{seenIds:new Set,replacements:new Map}}function Ot(e){return Mt(rn(),"qlogicagent-sessions",e,sn)}async function ln(e){try{await on(Ot(e),{recursive:!0})}catch{}}function cn(e,t){let n=t.replace(/[^a-zA-Z0-9_-]/g,"_");return Mt(Ot(e),`${n}.txt`)}function un(e,t){if(e.length<=t)return{preview:e,hasMore:!1};let o=e.slice(0,t).lastIndexOf(`
|
|
8
|
-
`),r=
|
|
1
|
+
var en=Object.defineProperty;var tn=(e,t)=>()=>(e&&(t=e(e=0)),t);var nn=(e,t)=>{for(var o in t)en(e,o,{get:t[o],enumerable:!0})};var qt={};nn(qt,{resolveToolEligibility:()=>Mo});function So(e,t){if(vo.some(o=>o.test(e)))return!0;if(t)for(let o of t)try{if(new RegExp(o,"i").test(e))return!0}catch{}return!1}function Ao(e,t){let o=e.function.name,n=e.meta,r=[];return t.blockedToolNames?.includes(o)?(r.push("policy_blocked"),{level:5,reasons:r}):n?.isReadOnly?(r.push("always_allowed"),{level:1,reasons:r}):n?.requiresApproval?(r.push("approval_required"),{level:4,reasons:r}):n?.isDangerous||So(o,t.dangerousPatterns)?(r.push("dangerous_tool"),{level:3,reasons:r}):{level:2,reasons:r}}function Eo(e){switch(e){case 1:return"eligible";case 2:return"eligible";case 3:return"dangerous-notify";case 4:return"approval-required";case 5:return"blocked-by-policy"}}function Mo(e,t={}){let o=new Map,n=[],r=[],a=[];for(let l of e){let s=l.function.name,{level:d,reasons:y}=Ao(l,t),u=Eo(d),g={toolName:s,status:u,permissionLevel:d,approvalRequired:d===4,reasonCodes:y};o.set(s,g),d===5?r.push(g):(n.push(l),d===4&&a.push(g))}return{eligibleTools:n,blockedTools:r,approvalRequiredTools:a,eligibilityByName:o}}var vo,Ht=tn(()=>{"use strict";vo=[/^(?:bash|shell|exec|terminal|run_command)$/i,/^(?:write_file|delete_file|move_file|create_directory)$/i,/^(?:git_push|git_reset|git_force)$/i]});function Ce(e,t,o,n){return{role:"assistant",content:t||null,tool_calls:e,...o&&o.length>0?{thinkingBlocks:o}:{},...n?{reasoning_content:n}:{}}}function Q(e,t){let o=t.ok?typeof t.payload=="string"?t.payload:JSON.stringify(t.payload??""):`Error: ${t.error??"Tool execution failed"}`;return{role:"tool",tool_call_id:e,content:o,...t.toolReferences?.length?{toolReferences:t.toolReferences}:{}}}var on=/\b(?:daily|weekly|monthly)(?:\/(?:daily|weekly|monthly))* (?:usage )?limit(?:s)?(?: (?:exhausted|reached|exceeded))?\b/i,j={rateLimit:[/rate[_ ]limit|too many requests|429/,"model_cooldown","exceeded your current quota","resource has been exhausted","quota exceeded","resource_exhausted","usage limit",/\btpm\b/i,"tokens per minute","tokens per day"],overloaded:[/overloaded_error|"type"\s*:\s*"overloaded_error"/i,"overloaded",/service[_ ]unavailable.*(?:overload|capacity|high[_ ]demand)|(?:overload|capacity|high[_ ]demand).*service[_ ]unavailable/i,"high demand"],timeout:["timeout","timed out","service unavailable","deadline exceeded","context deadline exceeded","connection error","network error","network request failed","fetch failed","socket hang up",/\beconn(?:refused|reset|aborted)\b/i,/\benotfound\b/i,/\beai_again\b/i,/without sending (?:any )?chunks?/i,/\bstop reason:\s*(?:abort|error|network_error)\b/i,/\breason:\s*(?:abort|error|network_error)\b/i,/\bunhandled stop reason:\s*(?:abort|error|network_error)\b/i],billing:[/["']?(?:status|code)["']?\s*[:=]\s*402\b|\bhttp\s*402\b|\berror(?:\s+code)?\s*[:=]?\s*402\b|\b(?:got|returned|received)\s+(?:a\s+)?402\b|^\s*402\s+payment/i,"payment required","insufficient credits",/insufficient[_ ]quota/i,"credit balance","plans & billing","insufficient balance"],authPermanent:[/api[_ ]?key[_ ]?(?:revoked|invalid|deactivated|deleted)/i,"invalid_api_key","key has been disabled","key has been revoked","account has been deactivated",/could not (?:authenticate|validate).*(?:api[_ ]?key|credentials)/i,"permission_error","not allowed for this organization"],auth:[/invalid[_ ]?api[_ ]?key/,"incorrect api key","invalid token","authentication","re-authenticate","oauth token refresh failed","unauthorized","forbidden","access denied","insufficient permissions","insufficient permission",/missing scopes?:/i,"expired","token has expired",/\b401\b/,/\b403\b/,"no credentials found","no api key found"],format:["string should match pattern","tool_use.id","tool_use_id","messages.1.content.1.tool_use.id","invalid request format",/tool call id was.*must be/i]},rn=/^(?:error[:\s-]+)?billing(?:\s+error)?(?:[:\s-]+|$)|^(?:error[:\s-]+)?(?:credit balance|insufficient credits?|payment required|http\s*402\b)/i,sn=/["']?(?:status|code)["']?\s*[:=]\s*402\b|\bhttp\s*402\b|\berror(?:\s+code)?\s*[:=]?\s*402\b|^\s*402\s+payment/i,an=512,ln=/^(?:http\s*)?(\d{3})(?:\s+([\s\S]+))?$/i;var cn=new Set([500,502,503,504,521,522,523,524,529]),un=["insufficient credits","insufficient quota","credit balance","insufficient balance","plans & billing","add more credits","top up"],dn=["upgrade your plan","upgrade plan","current plan","subscription"],pn=["daily","weekly","monthly"],mn=["try again","retry","temporary","cooldown"],gn=["usage limit","rate limit","organization usage"],fn=["organization","workspace"],yn=["billing period","exceeded","reached","exhausted"],hn=/["']?(?:status|code)["']?\s*[:=]\s*402\b|\bhttp\s*402\b|\berror(?:\s+code)?\s*[:=]?\s*402\b|\b(?:got|returned|received)\s+(?:a\s+)?402\b|^\s*402\s+payment required\b/i,Tn=/^(?:error[:\s-]+)?(?:(?:http\s*)?402(?:\s+payment required)?|payment required)(?:[:\s-]+|$)/i;function z(e,t){if(!e)return!1;let o=e.toLowerCase();return t.some(n=>n instanceof RegExp?n.test(o):o.includes(n))}function Cn(e){return z(e,j.format)}function st(e){return z(e,j.rateLimit)}function bn(e){return z(e,j.timeout)}function kn(e){return on.test(e)}function be(e){let t=e.toLowerCase();return t?e.length>an?sn.test(t):z(t,j.billing)?!0:rn.test(e)?t.includes("upgrade")||t.includes("credits")||t.includes("payment")||t.includes("plan"):!1:!1}function it(e){return z(e,j.authPermanent)}function _n(e){return z(e,j.auth)}function at(e){return z(e,j.overloaded)}function $(e,t){return t.some(o=>e.includes(o))}function Rn(e){return $(e,un)||$(e,dn)&&e.includes("limit")||e.includes("billing hard limit")||e.includes("hard limit reached")||e.includes("maximum allowed")&&e.includes("limit")}function xn(e){let t=$(e,pn),o=e.includes("spend limit")||e.includes("spending limit"),n=$(e,fn);return $(e,mn)&&$(e,gn)||t&&(e.includes("usage limit")||o)||t&&e.includes("limit")&&e.includes("reset")||n&&e.includes("limit")&&(o||$(e,yn))}function vn(e){return e.trim().toLowerCase().replace(Tn,"").trim()}function lt(e){let t=vn(e);return!t||Rn(t)?"billing":st(t)||xn(t)?"rate_limit":"billing"}function Sn(e){return hn.test(e)?lt(e):null}function ct(e){let t=e.match(ln);if(!t)return null;let o=Number(t[1]);return Number.isFinite(o)?{code:o,rest:(t[2]??"").trim()}:null}function An(e){if(!e)return!1;let t=e.toLowerCase();return t.includes('"type":"api_error"')&&t.includes("internal server error")}function En(e){let t=e.trim();if(!t)return!1;let o=ct(t);return o?cn.has(o.code):!1}function ut(e,t){return typeof e!="number"||!Number.isFinite(e)?null:e===402?t?lt(t):"billing":e===429?"rate_limit":e===401||e===403?t&&it(t)?"auth_permanent":"auth":e===408?"timeout":e===503?t&&at(t)?"overloaded":"timeout":e===502||e===504?"timeout":e===529?"overloaded":e===400?t&&be(t)?"billing":"format":null}function Mn(e){if(!e)return!1;let t=e.toLowerCase();return!!(t.includes("unknown model")||t.includes("model not found")||t.includes("model_not_found")||t.includes("not_found_error")||t.includes("does not exist")&&t.includes("model")||t.includes("invalid model")&&!t.includes("invalid model reference")||/models\/[^\s]+ is not found/i.test(e)||/\b404\b/.test(e)&&/not[-_ ]?found/i.test(e))}function wn(e){if(!e)return!1;let t=e.toLowerCase();return t.includes("session not found")||t.includes("session does not exist")||t.includes("session expired")||t.includes("session invalid")||t.includes("conversation not found")||t.includes("conversation does not exist")||t.includes("conversation expired")||t.includes("conversation invalid")||t.includes("no such session")||t.includes("invalid session")||t.includes("session id not found")||t.includes("conversation id not found")}function dt(e){if(wn(e))return"session_expired";if(Mn(e))return"model_not_found";let t=Sn(e);return t||(kn(e)?be(e)?"billing":"rate_limit":st(e)?"rate_limit":at(e)?"overloaded":En(e)?ct(e.trim())?.code===529?"overloaded":"timeout":An(e)?"timeout":Cn(e)?"format":be(e)?"billing":bn(e)?"timeout":it(e)?"auth_permanent":_n(e)?"auth":null)}var In={timeout:"RETRYABLE_TRANSIENT",overloaded:"RETRYABLE_TRANSIENT",rate_limit:"RETRYABLE_DEGRADED",auth:"NON_RETRYABLE_AUTH",auth_permanent:"NON_RETRYABLE_AUTH",billing:"NON_RETRYABLE_QUOTA",format:"NON_RETRYABLE_CONTENT",model_not_found:"NON_RETRYABLE_CONTENT",session_expired:"NON_RETRYABLE_CONTENT",unknown:"RETRYABLE_TRANSIENT"},Ln=new Set(["RETRYABLE_TRANSIENT","RETRYABLE_DEGRADED","TOOL_EXECUTION_FAILED"]);function q(e,t){let o=ut(e,t)??(t?dt(t):null);return o?In[o]:typeof e=="number"&&e>=400&&e<500?"NON_RETRYABLE_CONTENT":"RETRYABLE_TRANSIENT"}function ke(e){return Ln.has(e)}var pt=4,Z=class{constructor(t){this.estimateTokens=t}estimateTokens;compress(t,o){let n=[],r=[];for(let u of t)u.role==="system"?n.push(u):r.push(u);let a=o;for(let u of n)a-=this.estimateTokens(u);let l;for(let u of r)if(u.role==="user"){l=u;break}if(l&&(a-=this.estimateTokens(l)),a<=0)return{messages:l?[...n,l]:n,droppedCount:r.length-(l?1:0),strategy:"sliding-window"};let s=[],d=0;for(let u=r.length-1;u>=0;u--){let g=r[u];if(g===l)continue;let x=this.estimateTokens(g);if(a-x<0&&d>=pt)break;if(a-x<0&&d<pt){s.unshift(g),d++;continue}a-=x,s.unshift(g),d++}let y=[...n];return l&&!s.includes(l)&&y.push(l),y.push(...s),{messages:y,droppedCount:r.length-(s.length+(l&&!s.includes(l)?1:0)),strategy:"sliding-window"}}};var ee=class{constructor(t=8e3){this.maxToolResultChars=t}maxToolResultChars;compress(t,o){let n=0;return{messages:t.map(a=>a.role!=="tool"||typeof a.content!="string"||a.content.length<=this.maxToolResultChars?a:(n++,{...a,content:On(a.content,this.maxToolResultChars)})),droppedCount:n,strategy:"tool-result-trim"}}};function On(e,t){if(e.length<=t)return e;let o=e.slice(0,t);if(e.trimStart().startsWith("{")||e.trimStart().startsWith("[")){let a=Math.max(o.lastIndexOf("},"),o.lastIndexOf("],"),o.lastIndexOf(`}
|
|
2
|
+
`),o.lastIndexOf(`]
|
|
3
|
+
`));if(a>t*.5)return o.slice(0,a+1)+`
|
|
4
|
+
[...truncated: ${e.length-a-1} chars omitted]`}let r=o.lastIndexOf(`
|
|
5
|
+
`);return r>t*.7?o.slice(0,r)+`
|
|
6
|
+
[...truncated: ${e.length-r} chars omitted]`:o+`
|
|
7
|
+
[...truncated: ${e.length-t} chars omitted]`}function _e(...e){return{compress(t,o){let n=t,r=0,a=[];for(let l of e){let s=l.compress(n,o);n=s.messages,r+=s.droppedCount,s.droppedCount>0&&a.push(s.strategy)}return{messages:n,droppedCount:r,strategy:a.length>0?a.join("+"):"none"}}}}var mt={modelContextWindow:128e3,targetUsageRatio:.75,minBudget:16e3,maxBudget:12e4};function Re(e={}){let t={...mt,...e},o=Math.floor(t.modelContextWindow*t.targetUsageRatio);return Math.max(t.minBudget,Math.min(o,t.maxBudget))}function xe(e,t){let o=e/t;return o<=.8?"none":o<=1?"trim-only":o<=1.5?"sliding-window":"llm-summarize"}var te=class{events=[];maxEvents;constructor(t=100){this.maxEvents=t}record(t){this.events.push(t),this.events.length>this.maxEvents&&this.events.shift()}snapshot(){let t=this.events.length;if(t===0)return{totalCompressions:0,totalLlmCalls:0,totalCacheInvalidations:0,averageCompressionRatio:1,averageLatencyMs:0,totalTokensSaved:0,recentEvents:[]};let o=0,n=0,r=0,a=0,l=0;for(let s of this.events)o+=s.tokensBefore>0?s.tokensAfter/s.tokensBefore:1,n+=s.latencyMs,r+=Math.max(0,s.tokensBefore-s.tokensAfter),s.usedLlm&&a++,s.cacheInvalidated&&l++;return{totalCompressions:t,totalLlmCalls:a,totalCacheInvalidations:l,averageCompressionRatio:o/t,averageLatencyMs:n/t,totalTokensSaved:r,recentEvents:this.events.slice(-10)}}reset(){this.events.length=0}},ne=class{engines=new Map;activeId;register(t){this.engines.set(t.id,t)}activate(t){return this.engines.has(t)?(this.activeId=t,!0):!1}getActive(){return this.activeId?this.engines.get(this.activeId):void 0}listEngines(){return Array.from(this.engines.values()).map(t=>({id:t.id,label:t.label,active:t.id===this.activeId}))}};function gt(e){let t=typeof e.content=="string"?e.content:e.content!=null?JSON.stringify(e.content):"";return Math.ceil(t.length/4)}var Pn=new Set(["file_read","read","Read","bash","shell","Bash","grep","search","Grep","grep_search","glob","Glob","file_search","web_search","WebSearch","web_fetch","WebFetch","file_edit","edit","Edit","file_write","write","Write"]),G=class{constructor(t=20,o=gt){this.preserveRecentCount=t;this.estimateTokens=o}preserveRecentCount;estimateTokens;compress(t,o){if(t.length<=this.preserveRecentCount)return{messages:t,droppedCount:0,strategy:"micro-compact"};let n=t.length-this.preserveRecentCount,r=0,a=0;return{messages:t.map((s,d)=>{if(d>=n||s.role!=="tool"||typeof s.content!="string"||!s.name||!Pn.has(s.name)||s.content.length<=200)return s;let y=this.estimateTokens(s);return a+=y,r++,{...s,content:`[result cleared \u2014 ${s.content.length} chars]`}}),droppedCount:r,strategy:"micro-compact",metrics:r>0?{tokensBefore:0,tokensAfter:0,compressionRatio:0,latencyMs:0,usedLlm:!1,cacheInvalidated:!1}:void 0}}};function ve(e,t,o=gt){if(t.size===0)return{messages:e,tokensFreed:0,removedCount:0};let n=0,r=0,a=[];for(let s of e){let d=s.tool_call_id??"";if(d&&t.has(d)){n+=o(s),r++,t.delete(d);continue}a.push(s)}let l=r>0?{role:"system",content:`[${r} messages removed by snip]`}:void 0;return{messages:a,tokensFreed:n,removedCount:r,boundaryMessage:l}}function Se(){return{stages:[]}}function Ae(e,t,o){let n=o?.thresholdMessages??40;if(e.filter(s=>s.role!=="system").length<=n)return{messages:e,stagedCount:0};let a=ft(e,t),l=Nn(a,t,n);if(l.length===0)return{messages:a,stagedCount:0};for(let s of l)t.stages.push(s);return a=ft(e,t),{messages:a,stagedCount:l.length}}function Ee(e,t){let o=0;for(let n of t.stages)n.committed||(n.committed=!0,o++);return o===0?{messages:e,committed:0}:{messages:yt(e,t),committed:o}}function ft(e,t){return t.stages.filter(n=>n.committed).length===0?e:yt(e,t)}function yt(e,t){let o=t.stages.filter(r=>r.committed).sort((r,a)=>a.range[0]-r.range[0]),n=[...e];for(let r of o){let[a,l]=r.range;if(a>=n.length)continue;let s=Math.min(l,n.length),d={role:"system",content:r.summary};n.splice(a,s-a,d)}return n}function Nn(e,t,o){let n=Math.max(0,e.length-Math.floor(o/2)),r=[],a=new Set(t.stages.map(d=>`${d.range[0]}-${d.range[1]}`)),l=-1,s=0;for(let d=0;d<n;d++){let y=e[d];if(y.role==="tool"||y.role==="assistant"&&typeof y.content=="string"&&y.content==="")l<0&&(l=d),s++;else{if(s>=3){let g=`${l}-${l+s}`;a.has(g)||r.push({id:`collapse_${l}_${l+s}`,range:[l,l+s],summary:`[${s} tool results collapsed]`,committed:!1})}l=-1,s=0}}if(s>=3){let d=`${l}-${l+s}`;a.has(d)||r.push({id:`collapse_${l}_${l+s}`,range:[l,l+s],summary:`[${s} tool results collapsed]`,committed:!1})}return r}function Fn(e){return!(!e.ok||e.existingSkillName||!e.multiStep||e.toolCallCount<3||e.distinctToolCount<2)}function Bn(e){return e.existingSkillName?e.feedback==="negative":!1}function de(e,t){return Bn(e)?{type:"skill.improve",skillName:e.existingSkillName,reason:"negative user feedback on existing skill execution"}:Fn(e)?{type:"skill.create",suggestedName:t.suggestedName??`auto-skill-${t.tools.slice(0,3).join("-")}`,description:`Multi-step orchestration using ${t.tools.join(", ")}`,tools:t.tools,stepCount:e.toolCallCount}:null}function ht(e){return e.function&&typeof e.function=="object"&&typeof e.function.name=="string"?e.function.name.trim():typeof e.name=="string"?e.name.trim():""}function Dn(e){return e==="enabled-eligible"||e==="installed-awaiting-approval"}function Un(e){return new Map((e??[]).map(t=>[t.toolName,t]))}function $n(e){if(!e.eligibility?.length)return[...e.tools];let t=Un(e.eligibility);return e.tools.filter(o=>{let n=ht(o);if(!n)return!1;let r=t.get(n);return!r||Dn(r.status)})}function jn(e){let t=[],o=e.compatibility??{},n=e.toolChoice;if(e.thinkingEnabled&&o.requireAutoWhenThinking){let r=typeof n=="object"&&n&&!Array.isArray(n)?String(n.type??""):n;r&&r!=="auto"&&r!=="none"&&(t.push("tool_choice downgraded to auto because thinking mode requires auto/none compatibility."),n="auto")}if(n==="required"&&o.allowRequiredToolChoice===!1){let r=o.requiredFallback??"auto";t.push(`tool_choice=required is not supported by this provider; downgraded to ${r}.`),n=r}if(n&&typeof n=="object"&&!Array.isArray(n)&&n.type==="function"&&o.allowNamedToolChoice===!1){let r=o.namedFallback??"required";t.push(`named tool_choice is not supported by this provider; downgraded to ${r}.`),n=r}return{normalizedToolChoice:n,warnings:t}}function Me(e){let t=jn({toolChoice:e.toolChoice,thinkingEnabled:e.thinkingEnabled,compatibility:e.compatibility}),o=t.normalizedToolChoice,n=[...t.warnings],r=$n({tools:e.tools,eligibility:e.eligibility});if(!o||o==="auto")return{tools:r,normalizedToolChoice:o,warnings:n};if(o==="none")return{tools:[],normalizedToolChoice:"none",warnings:n};if(o==="required"){if(r.length===0)throw new Error("tool_choice=required but no tools were provided");return{tools:r,normalizedToolChoice:"required",extraSystemPrompt:"You must call one of the available tools before responding.",warnings:n}}if(typeof o=="object"&&!Array.isArray(o)&&o.type==="function"){let a=o.function??void 0,l=typeof a?.name=="string"?a.name.trim():"";if(!l)throw new Error("tool_choice.function.name is required");let s=r.filter(d=>ht(d)===l);if(s.length===0)throw new Error(`tool_choice requested unknown tool: ${l}`);return{tools:s,normalizedToolChoice:{type:"function",function:{name:l}},extraSystemPrompt:`You must call the ${l} tool before responding.`,warnings:n}}return{tools:r,normalizedToolChoice:o,warnings:n}}var zn=["stop","aborted","timeout","cancelled","interrupted","error"],Gn=["tool_calls","toolCalls","function_call","functionCall","raw_tool_calls","rawToolCalls"];function Tt(e){return e==null?[]:typeof e=="string"?e.length>0?[{type:"text",text:e}]:[]:Array.isArray(e)?e:[{type:"text",text:String(e)}]}function qn(e,t){return{...e,content:[...Tt(e.content),...Tt(t.content)]}}function Hn(e){if(!e||typeof e!="object")return!1;if(e.function&&typeof e.function=="object"){let t=e.function.name;if(typeof t=="string"&&t.length>0)return!0}return typeof e.name=="string"&&e.name.length>0}function Wn(e){return new Set((e??zn).map(t=>t.trim().toLowerCase()))}function Kn(e,t){return e?Wn(t).has(e.trim().toLowerCase()):!1}function we(e){if(!Array.isArray(e)||e.length===0)return[...e];let t=e.map(s=>{if(s.role==="assistant"&&Array.isArray(s.tool_calls)){let d=s.tool_calls.filter(y=>Hn(y));return{...s,...d.length>0?{tool_calls:d}:{tool_calls:void 0}}}return{...s}}),o=new Set;for(let s of t)if(!(s.role!=="assistant"||!Array.isArray(s.tool_calls)))for(let d of s.tool_calls)typeof d.id=="string"&&d.id&&o.add(d.id);let n=t.filter(s=>s.role!=="tool"?!0:!!(s.tool_call_id&&o.has(s.tool_call_id))),r=new Set;for(let s of n)s.role==="tool"&&typeof s.tool_call_id=="string"&&s.tool_call_id&&r.add(s.tool_call_id);let a=[];for(let s of n){if(s.role==="assistant"&&Array.isArray(s.tool_calls)&&s.tool_calls.length>0){let d=s.tool_calls.filter(y=>typeof y.id=="string"&&r.has(y.id));if(d.length===0){let{tool_calls:y,...u}=s;u.content!=null&&u.content!==""&&a.push(u);continue}if(d.length<s.tool_calls.length){a.push({...s,tool_calls:d});continue}}a.push(s)}let l=[];for(let s of a){let d=l.length>0?l[l.length-1]:void 0;if(s.role==="user"&&d?.role==="user"){l[l.length-1]=qn(d,s);continue}l.push(s)}return l}function Ie(e,t){return Kn(t?.stopReason,t?.forcedStopReasons)?e.map(o=>{if(o.role!=="assistant")return{...o};let n={...o};for(let r of Gn)delete n[r];return n}):[...e]}function Le(e,t){let o=t?.placeholderToolResult??"Error: Tool loop interrupted before the tool result was replayed.",n=new Set;for(let a of e)a.role==="tool"&&typeof a.tool_call_id=="string"&&a.tool_call_id&&n.add(a.tool_call_id);let r=[];for(let a of e)if(r.push({...a}),!(a.role!=="assistant"||!Array.isArray(a.tool_calls)||a.tool_calls.length===0))for(let l of a.tool_calls)typeof l.id!="string"||!l.id||n.has(l.id)||(n.add(l.id),r.push({role:"tool",tool_call_id:l.id,content:o}));return r}function Oe(e,t){let o=we(e),n=Ie(o,t);return Le(n,t)}function Xn(e){let t=new Set,o=new Set;for(let n of e){if(n.role==="assistant"&&Array.isArray(n.tool_calls))for(let r of n.tool_calls)typeof r.id=="string"&&r.id&&t.add(r.id);n.role==="tool"&&typeof n.tool_call_id=="string"&&n.tool_call_id&&o.add(n.tool_call_id)}return[...t].filter(n=>!o.has(n))}function Yn(e){let t=new Set;for(let o of e)o.role==="tool"&&typeof o.tool_call_id=="string"&&o.tool_call_id&&t.add(o.tool_call_id);return[...t]}function Vn(e){return{round:e.round??0,maxRounds:e.maxRounds,pendingToolCallIds:[...e.pendingToolCallIds??[]],completedToolCallIds:[...e.completedToolCallIds??[]],lastStopReason:e.lastStopReason,replayMessages:[...e.replayMessages??[]]}}function Pe(e,t){return{round:e.round+1,maxRounds:e.maxRounds,pendingToolCallIds:[...t.pendingToolCallIds??e.pendingToolCallIds],completedToolCallIds:[...t.completedToolCallIds??e.completedToolCallIds],lastStopReason:t.lastStopReason??e.lastStopReason,replayMessages:[...t.replayMessages??e.replayMessages]}}function pe(e,t){return{round:e.round,maxRounds:e.maxRounds,pendingToolCallIds:[],completedToolCallIds:[...t.completedToolCallIds??e.completedToolCallIds],lastStopReason:t.lastStopReason??e.lastStopReason,replayMessages:[...t.replayMessages??e.replayMessages]}}function me(e){let t=[],o=we(e.replayMessages);o.length!==e.replayMessages.length&&t.push({kind:"drop-orphan-tool-result",detail:"Removed orphan tool results or invalid assistant tool calls."});let n=Ie(o,e.options);n.some((a,l)=>a!==o[l])&&t.push({kind:"strip-forced-stop-tool-metadata",detail:"Removed assistant tool-call metadata after forced stop."});let r=Le(n,e.options);return r.length>n.length&&t.push({kind:"inject-placeholder-tool-result",detail:"Injected placeholder tool result for pending tool calls."}),{state:Vn({maxRounds:e.maxRounds,round:e.round,lastStopReason:e.lastStopReason,replayMessages:r,pendingToolCallIds:Xn(r),completedToolCallIds:Yn(r)}),recoveryActions:t}}var Jn=new Set(["main","sdk","agent","compact","hook","verification","side_question"]);function Ne(e){return e?Jn.has(e):!0}function Fe(e){return e===429||e===529}function ge(e,t=500,o=32e3){let n=Math.min(t*Math.pow(2,e-1),o);return n+Math.floor(Math.random()*n*.25)}var sr={maxBackoffMs:300*1e3,resetCapMs:360*60*1e3,heartbeatIntervalMs:3e4};function Be(){let e=process.env.QLOGICAGENT_PERSISTENT_RETRY;return e==="1"||e==="true"}var oe=class extends Error{constructor(o,n){super(`Model fallback triggered: ${o} -> ${n}`);this.originalModel=o;this.fallbackModel=n;this.name="FallbackTriggeredError"}originalModel;fallbackModel};function De(e){return{promptTokens:0,hasAttemptedReactiveCompact:!1,currentMaxOutputTokens:e.maxOutputTokens,consecutiveTruncations:0,aborted:e.abortSignal?.aborted??!1}}function Ue(e,t){if(e.aborted)return{level:"blocking",usagePercent:100,reason:"budget_exhausted"};let o=t.contextWindowTokens-t.responseBufferTokens-e.currentMaxOutputTokens,n=o>0?e.promptTokens/o*100:100;return e.promptTokens>=o?e.hasAttemptedReactiveCompact||!t.reactiveCompactEnabled?{level:"blocking",usagePercent:n,reason:"prompt_too_long"}:{level:"blocking",usagePercent:n,reason:"prompt_too_long"}:n>=85?{level:"warning",usagePercent:n,remainingTokens:o-e.promptTokens}:{level:"ok"}}function $e(e,t,o){let n=e.message?.toLowerCase()??"",r=e.status??0;return r===413||n.includes("prompt_too_long")||n.includes("context_length_exceeded")?!t.hasAttemptedReactiveCompact&&o.reactiveCompactEnabled?{action:"reactive_compact"}:{action:"abort",reason:"prompt_too_long_unrecoverable"}:r>=500&&r<600?{action:"retry",reason:`server_error_${r}`}:r===429?{action:"retry",reason:"rate_limited"}:r===401||r===403?{action:"abort",reason:"auth_error"}:r===404?{action:"abort",reason:"model_not_found"}:{action:"abort",reason:n||"unknown_error"}}function je(e,t,o){if(!t.outputEscalationEnabled)return{shouldEscalate:!1,newMax:e.currentMaxOutputTokens};if(e.consecutiveTruncations>=3)return{shouldEscalate:!1,newMax:e.currentMaxOutputTokens};let n=Math.min(e.currentMaxOutputTokens*2,o);return n<=e.currentMaxOutputTokens?{shouldEscalate:!1,newMax:e.currentMaxOutputTokens}:{shouldEscalate:!0,newMax:n}}function ze(e,t){return e.aborted?!0:t.abortSignal?.aborted?(e.aborted=!0,!0):!1}var Qn={maxConsecutiveFailures:3,minMessagesAfterCompact:4,targetUsagePercent:50};function Ge(){return{consecutiveFailures:0,attemptedThisTurn:!1,lastCompactAt:null,toolsAtLastCompact:[]}}function H(e,t=Qn){return!(e.attemptedThisTurn||e.consecutiveFailures>=t.maxConsecutiveFailures)}function Ct(e,t){let o=e.get(t.index);o||(o={id:"",name:"",arguments:""},e.set(t.index,o)),t.id&&(o.id=t.id),t.name&&(o.name+=t.name),o.arguments+=t.arguments}import{mkdir as so,writeFile as io}from"fs/promises";import{join as Ot}from"path";import{tmpdir as ao}from"os";var bt=Math.min(Math.max(1,Number(process.env.TOOL_LOOP_DEFAULT_BUDGET)||25),100),kt=3,_t=128e3,Rt=13e3,xt=16384,vt=65536,St=3,At=65536,Et=3e4,Mt=3,re=10,qe=500,wt=3,It=5e4,Lt=2e5,He=2e3;var lo="tool-results",Pt="<persisted-output>",co="</persisted-output>";function Nt(){return{seenIds:new Set,replacements:new Map}}function Ft(e){return Ot(ao(),"qlogicagent-sessions",e,lo)}async function uo(e){try{await so(Ft(e),{recursive:!0})}catch{}}function po(e,t){let o=t.replace(/[^a-zA-Z0-9_-]/g,"_");return Ot(Ft(e),`${o}.txt`)}function mo(e,t){if(e.length<=t)return{preview:e,hasMore:!1};let n=e.slice(0,t).lastIndexOf(`
|
|
8
|
+
`),r=n>t*.5?n:t;return{preview:e.slice(0,r),hasMore:!0}}function Bt(e){return e.includes(Pt)}async function Dt(e,t,o){await uo(o);let n=po(o,t);try{await io(n,e,{encoding:"utf-8",flag:"wx"})}catch(l){if(l.code!=="EEXIST")return null}let{preview:r,hasMore:a}=mo(e,He);return{filepath:n,originalSize:e.length,preview:r,hasMore:a}}function Ut(e){let t=`${Pt}
|
|
9
9
|
`;return t+=`Output too large (${e.originalSize} chars). Full output saved to: ${e.filepath}
|
|
10
10
|
|
|
11
|
-
`,t+=`Preview (first ${
|
|
11
|
+
`,t+=`Preview (first ${He} bytes):
|
|
12
12
|
`,t+=e.preview,t+=e.hasMore?`
|
|
13
13
|
...
|
|
14
14
|
`:`
|
|
15
|
-
`,t+=
|
|
16
|
-
...[truncated ${e.length-o} chars]`}function dn(e){let t=[],n=[];for(let o of e)o.role==="tool"&&typeof o.content=="string"&&o.tool_call_id?Pt(o.content)||n.push({toolCallId:o.tool_call_id,content:o.content,size:o.content.length}):o.role==="assistant"&&n.length>0&&(t.push(n),n=[]);return n.length>0&&t.push(n),t}function pn(e,t){let n=[],o=[],r=[];for(let a of e){let l=t.replacements.get(a.toolCallId);l!==void 0?n.push({...a,replacement:l}):t.seenIds.has(a.toolCallId)?o.push(a):r.push(a)}return{mustReapply:n,frozen:o,fresh:r}}function mn(e,t,n){let o=[...e].sort((l,s)=>s.size-l.size),r=[],a=t+e.reduce((l,s)=>l+s.size,0);for(let l of o){if(a<=n)break;r.push(l),a-=l.size}return r}async function Dt(e,t,n,o=wt){let r=dn(e);if(r.length===0)return{messages:e,newlyReplacedCount:0};let a=new Map,l=[];for(let d of r){let{mustReapply:g,frozen:R,fresh:h}=pn(d,t);for(let T of g)a.set(T.toolCallId,T.replacement);if(h.length===0){for(let T of d)t.seenIds.add(T.toolCallId);continue}let x=R.reduce((T,S)=>T+S.size,0),k=h.reduce((T,S)=>T+S.size,0),C=x+k>o?mn(h,x,o):[],P=new Set(C.map(T=>T.toolCallId));for(let T of d)P.has(T.toolCallId)||t.seenIds.add(T.toolCallId);C.length>0&&l.push(...C)}if(a.size===0&&l.length===0)return{messages:e,newlyReplacedCount:0};let s=await Promise.all(l.map(async d=>{let g=await Nt(d.content,d.toolCallId,n);return{candidate:d,result:g}})),p=0;for(let{candidate:d,result:g}of s){if(t.seenIds.add(d.toolCallId),!g)continue;let R=Ft(g);a.set(d.toolCallId,R),t.replacements.set(d.toolCallId,R),p++}return a.size===0?{messages:e,newlyReplacedCount:0}:{messages:e.map(d=>{if(d.role!=="tool"||!d.tool_call_id)return d;let g=a.get(d.tool_call_id);return g===void 0?d:{...d,content:g}}),newlyReplacedCount:p}}var gn=new Set(["read_file","file_read","FileRead","grep","Grep","glob","Glob","search","list_dir","find_files","web_fetch","web_search","WebFetch","WebSearch"]),fn=new Set(["bash","execute_command","Bash","shell"]),ge=class{tools=[];hasErrored=!1;erroredToolDescription="";discarded=!1;siblingAbortController;progressResolve;config;concurrencySafe;constructor(t){this.config=t,this.concurrencySafe=t.concurrencySafeTools??gn,this.siblingAbortController=new AbortController,t.signal&&t.signal.addEventListener("abort",()=>{this.siblingAbortController.abort("parent_abort")},{once:!0})}discard(){this.discarded=!0}addTool(t){let n=this.concurrencySafe.has(t.function.name);this.tools.push({id:t.id,toolCall:t,status:"queued",isConcurrencySafe:n,results:[],pendingProgress:[]}),this.processQueue()}canExecuteTool(t){let n=this.tools.filter(r=>r.status==="executing"),o=this.config.maxConcurrentTools;return o&&o>0&&n.length>=o?!1:n.length===0||t&&n.every(r=>r.isConcurrencySafe)}async processQueue(){for(let t of this.tools)if(t.status==="queued"){if(this.canExecuteTool(t.isConcurrencySafe))await this.executeTool(t);else if(!t.isConcurrencySafe)break}}getAbortReason(){return this.discarded?"discarded":this.hasErrored?"sibling_error":this.config.signal?.aborted?"user_interrupted":null}getToolDescription(t){let n;try{n=JSON.parse(t.toolCall.function.arguments)}catch{}let o=n?.command??n?.file_path??n?.pattern??"";if(typeof o=="string"&&o.length>0){let r=o.length>40?o.slice(0,40)+"\u2026":o;return`${t.toolCall.function.name}(${r})`}return t.toolCall.function.name}createSyntheticError(t,n){let o=this.erroredToolDescription,r=n==="user_interrupted"?"User rejected tool use":n==="discarded"?"Streaming fallback - tool execution discarded":o?`Cancelled: parallel tool call ${o} errored`:"Cancelled: parallel tool call errored";return{callId:t.id,toolName:t.toolCall.function.name,ok:!1,error:r,message:Q(t.id,{ok:!1,error:r})}}async executeTool(t){t.status="executing";let o=(async()=>{let r=this.getAbortReason();if(r){t.results.push(this.createSyntheticError(t,r)),t.status="completed";return}let{toolInvoker:a,hooks:l,sessionId:s,turnId:p,log:f}=this.config,d=t.toolCall.function.name,g=!1,R=t.toolCall.function.arguments;if(l)try{let T=await l.invoke("tool.before_invoke",{sessionId:s,turnId:p,callId:t.id,toolName:d,arguments:yn(R)});if(T.action==="abort"){let S=T.reason??"blocked by policy";f.info(`tool ${d} blocked: ${S}`),t.results.push({callId:t.id,toolName:d,ok:!1,error:S,blocked:!0,blockReason:S,message:Q(t.id,{ok:!1,error:S})}),t.status="completed";return}T.action==="continue"&&T.context?.arguments&&(R=JSON.stringify(T.context.arguments))}catch{}let h=await a.invoke(p,d,R,this.siblingAbortController.signal),x=this.getAbortReason();if(x&&!g){t.results.push(this.createSyntheticError(t,x)),t.status="completed";return}let k=!h.error,C=h.result;k&&C&&C.length>5e4&&(C=await Bt(C,t.id,s));let P=Q(t.id,{ok:k,payload:C,error:h.error});k||(g=!0,fn.has(d)&&(this.hasErrored=!0,this.erroredToolDescription=this.getToolDescription(t),this.siblingAbortController.abort("sibling_error"))),l?.invoke(k?"tool.after_invoke":"tool.invoke_failed",{sessionId:s,turnId:p,callId:t.id,toolName:d,ok:k,...h.error?{error:h.error}:{}}).catch(()=>{}),t.results.push({callId:t.id,toolName:d,ok:k,error:h.error,message:P}),t.status="completed"})();t.promise=o,o.finally(()=>{this.processQueue()})}*getCompletedResults(){if(!this.discarded){for(let t of this.tools)if(t.status!=="yielded"){if(t.status==="completed"&&t.results.length>0){t.status="yielded";for(let n of t.results)yield n}else if(t.status==="executing"&&!t.isConcurrencySafe)break}}}async*getRemainingResults(){if(!this.discarded){for(;this.hasUnfinishedTools();){await this.processQueue();for(let t of this.getCompletedResults())yield t;if(this.hasExecutingTools()&&!this.hasCompletedResults()){let t=this.tools.filter(o=>o.status==="executing"&&o.promise).map(o=>o.promise),n=new Promise(o=>{this.progressResolve=o});t.length>0&&await Promise.race([...t,n])}}for(let t of this.getCompletedResults())yield t}}hasCompletedResults(){return this.tools.some(t=>t.status==="completed")}hasExecutingTools(){return this.tools.some(t=>t.status==="executing")}hasUnfinishedTools(){return this.tools.some(t=>t.status!=="yielded")}};function yn(e){try{return JSON.parse(e)}catch{return}}import{readFile as ts}from"node:fs/promises";function He(e){let t=typeof e.content=="string"?e.content:e.content!=null?JSON.stringify(e.content):"";return Math.ceil(t.length/4)}function qe(e){let t=0;for(let n of e)t+=He(n);return t}var Ge={"deepseek-v4-flash":1e6,"deepseek-v4-pro":1e6,"deepseek-chat":1e6,"deepseek-reasoner":1e6,"gpt-4o":128e3,"gpt-4o-mini":128e3,"claude-sonnet-4-20250514":2e5,"claude-3-5-haiku-20241022":2e5,"gemini-3.1-pro-preview":1e6,"gemini-3-flash-preview":1e6,"gemini-3.1-flash-lite":1e6};function hn(e){if(!e)return 128e3;if(e in Ge)return Ge[e];let t=e.toLowerCase();for(let[n,o]of Object.entries(Ge))if(t.startsWith(n.toLowerCase()))return o;return 128e3}var Tn=8e3;var Cn=new te(200);var os=new oe;function bn(){return be(new ee(Tn),new q(20,He),new Z(He))}var kn=null;function Ut(e,t){let n=t?.budget??ke({modelContextWindow:hn(t?.model)}),r=(t?.pipeline??bn()).compress(e,n);if(r.droppedCount>0){let a=qe(e),l=qe(r.messages);Cn.record({timestamp:Date.now(),strategy:r.strategy,tokensBefore:a,tokensAfter:l,droppedCount:r.droppedCount,latencyMs:r.metrics?.latencyMs??0,usedLlm:!1,cacheInvalidated:r.metrics?.cacheInvalidated??!1,tier:_e(a,n)})}return r.droppedCount>0&&kn?.(r.droppedCount,qe(r.messages)),r}function $t(e,t,n){let o=n-t;return`[Budget] ${Math.round(e)}% used (${t.toLocaleString()} / ${n.toLocaleString()} tokens). ${o.toLocaleString()} tokens remaining. `+(e>=90?"Wrap up your current task \u2014 you are near the token limit.":"Continue working \u2014 do not summarize prematurely.")}var En=new Set(["write","edit","patch","apply_patch"]);function wn(e){let t=e.split(".").pop()?.toLowerCase()??"";return["png","jpg","jpeg","gif","webp","svg","bmp","ico"].includes(t)?"image":["md","txt","pdf","doc","docx","rtf","html"].includes(t)?"document":["mermaid","mmd","dot","puml","plantuml"].includes(t)?"diagram":["csv","tsv","xlsx","xls"].includes(t)?"table":["ts","tsx","js","jsx","py","rs","go","java","c","cpp","h","cs","rb","sh","sql","json","yaml","yml","toml","xml","css","scss","vue","svelte"].includes(t)?"code":"file"}function Mn(e){let t=e.split(".").pop()?.toLowerCase()??"";return{ts:"typescript",tsx:"typescriptreact",js:"javascript",jsx:"javascriptreact",py:"python",rs:"rust",go:"go",java:"java",c:"c",cpp:"cpp",h:"c",cs:"csharp",rb:"ruby",sh:"shellscript",sql:"sql",json:"json",yaml:"yaml",yml:"yaml",toml:"toml",xml:"xml",html:"html",css:"css",scss:"scss",vue:"vue",svelte:"svelte",md:"markdown"}[t]}function In(e){return typeof e=="number"&&Number.isFinite(e)&&e>=1?Math.min(Math.round(e),100):Tt}function qt(e){let t=e.message.toLowerCase();return e.status===413||t.includes("prompt_too_long")||t.includes("context_length_exceeded")||t.includes("maximum context length")}function Ln(e){return e==="length"||e==="max_tokens"}function Gt(e){let t=e.message.toLowerCase();return(t.includes("image")||t.includes("media")||t.includes("file too large")||t.includes("payload too large"))&&(e.status===413||t.includes("too large")||t.includes("size"))}function On(e){let t=e.headers;if(!t)return null;let n=t["retry-after"]??t["Retry-After"];if(!n)return null;let o=parseInt(n,10);return!isNaN(o)&&o>0?o*1e3:null}function Pn(e){if(e.status!==400)return null;let t=e.message.match(/input length and `max_tokens` exceed context limit: (\d+) \+ (\d+) > (\d+)/);if(!t?.[1]||!t?.[3])return null;let n=parseInt(t[1],10),o=parseInt(t[3],10);if(isNaN(n)||isNaN(o))return null;let r=o-n-1e3;return r>=3e3?r:null}function Nn(e){return e.filter(t=>t.role!=="assistant"?!0:!(typeof t.content=="string"&&t.content.trim()===""))}async function*Ht(e,t,n,o){let{turnId:r,sessionId:a,messages:l,tools:s,model:p,apiKey:f,temperature:d,hooks:g,signal:R}=e,h={sessionId:a,turnId:r},x=e.maxTurns??0,k=e.querySource,{resolveToolEligibility:C}=await Promise.resolve().then(()=>(zt(),jt)),P=C(s,e.toolEligibilityContext),T=P.eligibleTools;for(let E of P.blockedTools)yield{type:"tool_blocked",turnId:r,callId:"",name:E.toolName,reason:"blocked-by-policy"};if(!T.length){yield*Fn(r,p,l,f,d,R,t,o);return}let S=In(e.maxRounds),I={contextWindowTokens:e.contextWindowTokens??bt,responseBufferTokens:kt,maxOutputTokens:e.maxOutputTokens??_t,abortSignal:R,reactiveCompactEnabled:!0,outputEscalationEnabled:!0},W=new Set,D=0,se=T,ie,i={messages:[...l],maxOutputTokensRecoveryCount:0,hasAttemptedReactiveCompact:!1,maxOutputTokensOverride:void 0,turnCount:1,transition:void 0,guardState:Fe(I),reactiveCompactState:je(),toolLoopState:pe({maxRounds:S,replayMessages:[...l]}).state,consecutiveFailedRounds:0,finalText:"",totalUsage:{prompt:0,completion:0},collapseStore:xe(),currentModel:p,consecutive529Errors:0,consecutiveApiRetries:0,stopHookActive:void 0,lastResponseId:void 0,snipRemovedIds:new Set,contentReplacementState:Lt(),budgetContinuationCount:0},Ke=Math.max(x*5,200),Xe=0;for(;;){if(Xe++,Xe>Ke){o.info(`hard iteration cap reached (${Ke}), forcing completion`);let c=i.finalText||We(i.messages,o);yield{type:"end",turnId:r,content:c,usage:i.totalUsage,model:i.currentModel};return}let{messages:E,maxOutputTokensRecoveryCount:K,hasAttemptedReactiveCompact:Dn,maxOutputTokensOverride:Ye,turnCount:X,guardState:A,reactiveCompactState:F,collapseStore:fe}=i,{toolLoopState:L}=i;if(ie){try{let c=await ie;c&&(yield{type:"tool_use_summary",turnId:r,summary:c})}catch{}ie=void 0}if(e.refreshTools&&X>1){let c=e.refreshTools();c!==se&&(se=c,o.debug(`tools refreshed: ${c.length} tools`))}if($e(A,I)){o.info(`turn aborted by guard at turn ${X}`),yield{type:"error",turnId:r,error:"Turn aborted",code:"ABORTED",usage:i.totalUsage};return}let U=Be(A,I);if(U.level==="blocking"){U.reason==="prompt_too_long"&&H(F)&&(F.attemptedThisTurn=!0,A.hasAttemptedReactiveCompact=!0,o.info(`token budget blocking (${U.reason}), reactive compact needed`),yield{type:"recovery",turnId:r,action:"reactive_compact",detail:"token budget pre-check"}),o.info(`token budget blocking (${U.reason}), ending tool loop`);break}U.level==="warning"&&o.info(`token budget warning: ${U.usagePercent}% used, ${U.remainingTokens} remaining`);let w;{let c=await Dt(E,i.contentReplacementState,a);w=c.messages,c.newlyReplacedCount>0&&(o.info(`tool-result-budget: persisted ${c.newlyReplacedCount} oversized tool results`),yield{type:"recovery",turnId:r,action:"tool_result_budget",detail:`${c.newlyReplacedCount} persisted`})}{let c=Re(w,i.snipRemovedIds);w=c.messages,c.removedCount>0&&(o.info(`snip: removed ${c.removedCount} messages, freed ~${c.tokensFreed} tokens`),yield{type:"recovery",turnId:r,action:"snip",detail:`${c.removedCount} messages`})}{let u=new q().compress(w,0);u.droppedCount>0&&(w=u.messages,o.info(`microcompact: cleared ${u.droppedCount} old tool results`))}if(w=ve(w,fe).messages,A.promptTokens>0){let c=Ut(w,{budget:I.contextWindowTokens*.75,model:i.currentModel});c.droppedCount>0&&(w=c.messages,o.info(`autocompact: ${c.strategy}, dropped ${c.droppedCount}`),yield{type:"recovery",turnId:r,action:"autocompact",detail:`${c.strategy}: ${c.droppedCount} dropped`},i.hasAttemptedReactiveCompact=!1,g?.invoke("context.after_compact",{...h,removedCount:c.droppedCount}).catch(()=>{}))}w=Nn(w);let ae=Ae({tools:se,toolChoice:e.toolChoice??"auto"}),Y=pe({maxRounds:S,replayMessages:w,lastStopReason:L.lastStopReason,options:{stopReason:L.lastStopReason}}),Ve=ae.extraSystemPrompt?[{role:"system",content:ae.extraSystemPrompt},...Y.state.replayMessages]:Y.state.replayMessages;L=Y.state,Y.recoveryActions.length>0&&o.debug(`tool loop recovery: ${Y.recoveryActions.map(c=>c.detail??c.kind).join("; ")}`),o.debug(`turn ${X}, messages: ${Ve.length}`),g?.invoke("turn.before_inference",{...h,model:i.currentModel}).catch(()=>{});let le=!1,Je=[],Qe=new Map,Ze="stop",O,y=null,ce=!1,V=[],N=[];try{for await(let c of t.stream({model:i.currentModel,messages:Ve,tools:ae.tools,toolChoice:ae.normalizedToolChoice??"auto",temperature:d,maxTokens:(Ye??A.currentMaxOutputTokens)||void 0,streamRequired:e.streamRequired,previousResponseId:i.lastResponseId,reasoning:e.reasoning,promptCacheKey:e.promptCacheKey,promptCacheRetention:e.promptCacheRetention,serviceTier:e.serviceTier,openaiBuiltinTools:e.openaiBuiltinTools,maxToolCalls:e.maxToolCalls,parallelToolCalls:e.parallelToolCalls,textVerbosity:e.textVerbosity},f,R))switch(c.type){case"delta":Je.push(c.text),le||(yield{type:"delta",turnId:r,text:c.text});break;case"tool_call_delta":le=!0,ht(Qe,c);break;case"reasoning_delta":V.push(c.text);break;case"reasoning_block_complete":c.signature&&N.push({thinking:V.join(""),signature:c.signature}),V.length=0;break;case"usage":O={prompt:c.promptTokens,completion:c.completionTokens,reasoning:c.reasoningTokens,cacheRead:c.cacheReadTokens,cacheCreation:c.cacheCreationTokens};break;case"response_id":i.lastResponseId=c.id;break;case"annotations":yield{type:"annotations",turnId:r,annotations:c.annotations};break;case"builtin_tool_status":yield{type:"heartbeat",turnId:r,message:`${c.toolType}: ${c.event}`};break;case"done":Ze=c.finishReason;break}if(le||g?.invoke("turn.after_inference",{...h,model:i.currentModel}).catch(()=>{}),e.postSamplingHooks&&e.postSamplingHooks.length>0){let c=i.currentModel;for(let u of e.postSamplingHooks)try{u({messages:[...w],model:c,sessionId:a})}catch{}}}catch(c){if(c instanceof ne&&e.fallbackModel){o.info(`model fallback triggered: ${c.originalModel} \u2192 ${c.fallbackModel}`),yield{type:"recovery",turnId:r,action:"model_fallback",detail:`${c.originalModel} \u2192 ${c.fallbackModel}`},i={...i,currentModel:c.fallbackModel,consecutive529Errors:0,consecutiveApiRetries:0,transition:void 0};continue}let u=c instanceof Error?c.message:String(c),m=typeof c?.status=="number"?c.status:void 0;if(!m&&u&&(u.includes("ECONNRESET")||u.includes("EPIPE"))){let v=(i.consecutiveApiRetries??0)+1;if(v>re){o.info(`stale connection retry limit reached (${re}), aborting`),yield{type:"error",turnId:r,error:u,code:"RETRIES_EXHAUSTED",usage:i.totalUsage};return}o.info(`stale connection (${u.includes("ECONNRESET")?"ECONNRESET":"EPIPE"}): retrying`),yield{type:"recovery",turnId:r,action:"stale_connection_retry",detail:u.slice(0,80)},i={...i,consecutiveApiRetries:v,transition:void 0};continue}let _=Pn({status:m,message:u});if(_!==null){o.info(`max_tokens overflow: adjusting to ${_}`),A.currentMaxOutputTokens=_,i={...i,maxOutputTokensOverride:_,transition:void 0};continue}if(Pe(m)){if(i.consecutive529Errors++,i.consecutive529Errors>=At&&e.fallbackModel&&i.currentModel!==e.fallbackModel){o.info(`529 \xD7 ${i.consecutive529Errors}: triggering fallback to ${e.fallbackModel}`),yield{type:"recovery",turnId:r,action:"model_fallback",detail:`529 \xD7 ${i.consecutive529Errors}`},i={...i,currentModel:e.fallbackModel,consecutive529Errors:0,transition:void 0};continue}if(Ne()){let v=me(i.consecutive529Errors);o.info(`persistent retry: waiting ${v}ms (attempt ${i.consecutive529Errors})`);let b=v;for(;b>0;){if(R?.aborted){yield{type:"error",turnId:r,error:"Aborted during retry wait",code:"ABORTED",usage:i.totalUsage};return}yield{type:"heartbeat",turnId:r,message:`Retrying in ${Math.ceil(b/1e3)}s (${m})`};let M=Math.min(b,St);await new Promise(Vt=>setTimeout(Vt,M)),b-=M}i={...i,transition:void 0};continue}if(Oe(k)){let b=On({status:m,message:u})??me(i.consecutive529Errors);o.info(`transient ${m}: retry in ${b}ms`),yield{type:"recovery",turnId:r,action:"retry",detail:`${m} retry in ${b}ms`},await new Promise(M=>setTimeout(M,b)),i={...i,transition:void 0};continue}o.info(`background source ${k}: not retrying ${m}`)}y={status:m,message:u}}if(y&&g?.invoke("turn.after_inference",{...h,model:i.currentModel,response:{error:y.message}}).catch(()=>{}),y)if(qt(y))ce=!0,o.info(`withheld prompt_too_long error (status=${y.status})`);else if(Gt(y))ce=!0,o.info(`withheld media_size error (status=${y.status})`);else{let c=De({status:y.status??500,message:y.message},A,I);if(c.action==="reactive_compact"&&H(F)&&(F.attemptedThisTurn=!0,A.hasAttemptedReactiveCompact=!0,yield{type:"recovery",turnId:r,action:"reactive_compact",detail:`API ${y.status??500}: ${y.message}`}),c.action==="retry"){let m=(i.consecutiveApiRetries??0)+1;if(m>re){o.info(`API retry limit reached (${re}), aborting`);let _=G(y.status,y.message);yield{type:"error",turnId:r,error:y.message,code:_,usage:i.totalUsage};return}yield{type:"recovery",turnId:r,action:"retry",detail:c.reason},i={...i,consecutiveApiRetries:m,transition:void 0};continue}let u=G(y.status,y.message);g?.invoke("stop.failure",{sessionId:a,reason:u,error:y.message}).catch(()=>{}),yield{type:"error",turnId:r,error:y.message,code:u,usage:i.totalUsage};return}O&&(i.totalUsage.prompt+=O.prompt,i.totalUsage.completion+=O.completion,O.reasoning&&(i.totalUsage.reasoning=(i.totalUsage.reasoning??0)+O.reasoning),O.cacheRead&&(i.totalUsage.cacheRead=(i.totalUsage.cacheRead??0)+O.cacheRead),O.cacheCreation&&(i.totalUsage.cacheCreation=(i.totalUsage.cacheCreation??0)+O.cacheCreation)),O?.prompt&&(A.promptTokens=O.prompt);let et=Je.join("");et&&(i.finalText=et);let B=[...Qe.values()].map(c=>({id:c.id||`tc_${r}_${X}_${Math.random().toString(36).slice(2,8)}`,type:"function",function:{name:c.name,arguments:c.arguments}}));if(B.length===0&&!le){if(ce&&y&&qt(y)){if(i.transition?.reason!=="collapse_drain_retry"){let u=Se(w,fe);if(u.committed>0){o.info(`collapse drain: committed ${u.committed} stages`),yield{type:"recovery",turnId:r,action:"collapse_drain",detail:`${u.committed} stages committed`},i={...i,messages:u.messages,transition:{reason:"collapse_drain_retry",committed:u.committed}};continue}}if(H(F)){F.attemptedThisTurn=!0,A.hasAttemptedReactiveCompact=!0,o.info("withheld 413: reactive compact attempt"),yield{type:"recovery",turnId:r,action:"reactive_compact",detail:"withheld prompt_too_long"},i={...i,hasAttemptedReactiveCompact:!0,transition:{reason:"reactive_compact_retry"}};continue}o.info("withheld 413: recovery exhausted, surfacing error"),g?.invoke("stop.failure",{sessionId:a,reason:"prompt_too_long",error:y.message}).catch(()=>{}),yield{type:"error",turnId:r,error:y.message,code:"PROMPT_TOO_LONG",usage:i.totalUsage};return}if(ce&&y&&Gt(y)){if(H(F)){F.attemptedThisTurn=!0,A.hasAttemptedReactiveCompact=!0,o.info("withheld media error: reactive compact strip-retry"),yield{type:"recovery",turnId:r,action:"reactive_compact",detail:"media error strip-retry"},i={...i,hasAttemptedReactiveCompact:!0,transition:{reason:"reactive_compact_retry"}};continue}o.info("withheld media error: recovery exhausted"),g?.invoke("stop.failure",{sessionId:a,reason:"media_error",error:y.message}).catch(()=>{}),yield{type:"error",turnId:r,error:y.message,code:"IMAGE_ERROR",usage:i.totalUsage};return}if(Ln(Ze)){A.consecutiveTruncations+=1;let u=e.modelMaxOutputTokens??Rt,m=Ue(A,I,u);if(m.shouldEscalate&&Ye===void 0){A.currentMaxOutputTokens=m.newMax,o.info(`max_output_tokens escalate: ${m.newMax} tokens`),yield{type:"recovery",turnId:r,action:"output_escalation",detail:`${m.newMax} tokens`},i={...i,maxOutputTokensOverride:vt,transition:{reason:"max_output_tokens_escalate"}};continue}if(K<xt){let _={role:"user",content:"Output token limit hit. Resume directly \u2014 no apology, no recap of what you were doing. Pick up mid-thought if that is where the cut happened. Break remaining work into smaller pieces."};o.info(`max_output_tokens recovery #${K+1}`),yield{type:"recovery",turnId:r,action:"max_output_tokens_recovery",detail:`attempt ${K+1}`},i={...i,messages:[...w,_],maxOutputTokensRecoveryCount:K+1,maxOutputTokensOverride:void 0,transition:{reason:"max_output_tokens_recovery",attempt:K+1}};continue}o.info("max_output_tokens recovery exhausted, completing with partial content")}else A.consecutiveTruncations=0;if(L=de(L,{replayMessages:E,lastStopReason:"completed"}),g){let u=await g.invoke("stop",{sessionId:a,reason:"completed"});if(u.action==="prevent"){o.info(`stop hook prevented continuation: ${u.reason??"no reason"}`),yield{type:"end",turnId:r,content:i.finalText,usage:i.totalUsage,model:i.currentModel};return}if(u.action==="abort"){let m=u.reason??"Stop hook requested continuation";o.info(`stop hook blocking: ${m}`);let _={role:"user",content:m},v={role:"assistant",content:i.finalText,...N.length>0&&{thinkingBlocks:[...N]}};i={...i,messages:[...E,v,_],stopHookActive:!0,transition:{reason:"stop_hook_blocking"}};continue}}if(e.tokenBudget&&e.tokenBudget>0&&i.budgetContinuationCount<5){let u=i.totalUsage.prompt+i.totalUsage.completion+(i.totalUsage.reasoning??0),m=u/e.tokenBudget*100;if(m<90){let _=i.budgetContinuationCount+1,v={role:"user",content:$t(m,u,e.tokenBudget)};o.info(`token budget continuation #${_}: ${Math.round(m)}% used`),yield{type:"recovery",turnId:r,action:"budget_continuation",detail:`${Math.round(m)}% used (#${_})`};let b={role:"assistant",content:i.finalText,...N.length>0&&{thinkingBlocks:[...N]}};i={...i,messages:[...E,b,v],budgetContinuationCount:_,transition:{reason:"token_budget_continuation"}};continue}}if(D>0){let u={ok:!0,toolCallCount:D,distinctToolCount:W.size,multiStep:D>=2,hasSubAgent:!1,feedback:null,existingSkillName:null},m=ue(u,{tools:[...W]});m&&(yield{type:"skill_instruction",turnId:r,instruction:m})}yield{type:"end",turnId:r,content:i.finalText,usage:i.totalUsage,model:i.currentModel};return}for(let c of B){let u=c.function.arguments,m=se.find(_=>_.function.name===c.function.name);if(m?.backfillObservableInput)try{let _=JSON.parse(c.function.arguments),v={..._};m.backfillObservableInput(v),Object.keys(v).some(M=>!(M in _))&&(u=JSON.stringify(v))}catch{}yield{type:"tool_call",turnId:r,callId:c.id,name:c.function.name,arguments:u}}let Xt=N.length===0&&V.length>0?V.join(""):void 0;E.push(he(B,i.finalText||void 0,N.length>0?N:void 0,Xt)),L=Le(L,{replayMessages:E,pendingToolCallIds:B.map(c=>c.id),completedToolCallIds:L.completedToolCallIds,lastStopReason:"tool_calls"});let tt=[];try{let c=new ge({toolInvoker:n,hooks:g,sessionId:a,turnId:r,log:o,signal:R,maxConcurrentTools:e?.maxConcurrentTools});for(let u of B)c.addTool(u);for await(let u of c.getRemainingResults()){u.blocked&&(yield{type:"tool_blocked",turnId:r,callId:u.callId,name:u.toolName,reason:u.blockReason??"blocked"}),E.push(u.message),tt.push(u.callId),W.add(u.toolName),D++;let m=typeof u.message?.content=="string"?u.message.content:"",_=u.ok&&m?m.slice(0,2e3):void 0;if(yield{type:"tool_result",turnId:r,callId:u.callId,name:u.toolName,ok:u.ok,error:u.error,outputPreview:_},u.ok){let v=B.find(b=>b.id===u.callId);if(v){if(u.toolName==="plan_mode")try{let b=JSON.parse(v.function.arguments);b.action==="exit"&&typeof b.plan=="string"&&b.plan.length>0&&(yield{type:"plan_update",turnId:r,slug:"approved-plan",content:b.plan})}catch{}if(En.has(u.toolName))try{let b=JSON.parse(v.function.arguments),M=typeof b.file_path=="string"?b.file_path:typeof b.filePath=="string"?b.filePath:typeof b.path=="string"?b.path:void 0;M&&(yield{type:"artifact",turnId:r,artifactId:`artifact-${u.callId}`,artifactType:wn(M),title:M.split(/[\\/]/).pop()||M,filePath:M,language:Mn(M)})}catch{}}}}}catch(c){let u=c instanceof Error?c.message:String(c);yield{type:"error",turnId:r,error:u,code:"TOOL_EXECUTION_ERROR",usage:i.totalUsage};return}if(L=de(L,{replayMessages:E,completedToolCallIds:[...L.completedToolCallIds,...tt],lastStopReason:"tool_calls"}),e.generateToolUseSummary&&B.length>0){let c=B.map(u=>({name:u.function.name,arguments:u.function.arguments}));ie=e.generateToolUseSummary(c).catch(()=>null)}let ot=E.slice(-B.length),Yt=ot.length>0&&ot.every(c=>{let u=c?.content;return typeof u!="string"?!1:u.startsWith("Error: ")}),J=i.consecutiveFailedRounds;if(Yt){if(J+=1,J>=Ct&&i.finalText){o.info(`early exit: ${J} consecutive failed rounds, returning partial response`),yield{type:"end",turnId:r,content:i.finalText,usage:i.totalUsage,model:i.currentModel};return}}else J=0;let ye=X+1;if(x>0&&ye>x){if(o.info(`max turns reached (${x}), completing`),g){let u=await g.invoke("stop",{sessionId:a,reason:"max_turns"});if(u.action==="abort"){let m=u.reason??"Stop hook requested continuation after max_turns",_={role:"assistant",content:i.finalText,...N.length>0&&{thinkingBlocks:[...N]}};i={...i,messages:[...E,_,{role:"user",content:m}],stopHookActive:!0,transition:{reason:"stop_hook_blocking"}};continue}}let c=i.finalText||We(E,o);yield{type:"end",turnId:r,content:c,usage:i.totalUsage,model:i.currentModel};return}if(ye>S){if(o.info(`tool loop budget exhausted (${S} rounds), returning`),D>0){let u={ok:!0,toolCallCount:D,distinctToolCount:W.size,multiStep:D>=2,hasSubAgent:!1,feedback:null,existingSkillName:null},m=ue(u,{tools:[...W]});m&&(yield{type:"skill_instruction",turnId:r,instruction:m})}let c=i.finalText||We(E,o);yield{type:"end",turnId:r,content:c,usage:i.totalUsage,model:i.currentModel};return}i={messages:E,maxOutputTokensRecoveryCount:0,hasAttemptedReactiveCompact:!1,maxOutputTokensOverride:void 0,turnCount:ye,transition:{reason:"next_turn"},guardState:A,reactiveCompactState:F,toolLoopState:L,consecutiveFailedRounds:J,finalText:i.finalText,totalUsage:i.totalUsage,collapseStore:fe,currentModel:i.currentModel,consecutive529Errors:0,consecutiveApiRetries:0,stopHookActive:i.stopHookActive,lastResponseId:i.lastResponseId,snipRemovedIds:i.snipRemovedIds,contentReplacementState:i.contentReplacementState,budgetContinuationCount:0}}}function We(e,t){let n=[];for(let o=e.length-1;o>=0;o--){let r=e[o];if(r.role==="tool"&&typeof r.content=="string")n.unshift(r.content.slice(0,500));else if(r.role==="assistant"){if(typeof r.content=="string"&&r.content.trim())return t.info("synthesizeFallbackContent: found assistant text, using it"),r.content;break}else break}return n.length>0?(t.info(`synthesizeFallbackContent: synthesized from ${n.length} tool result(s)`),n.join(`
|
|
15
|
+
`,t+=co,t}async function $t(e,t,o,n=It){if(e.length<=n||Bt(e))return e;let r=await Dt(e,t,o);return r?Ut(r):e.slice(0,n)+`
|
|
16
|
+
...[truncated ${e.length-n} chars]`}function go(e){let t=[],o=[];for(let n of e)n.role==="tool"&&typeof n.content=="string"&&n.tool_call_id?Bt(n.content)||o.push({toolCallId:n.tool_call_id,content:n.content,size:n.content.length}):n.role==="assistant"&&o.length>0&&(t.push(o),o=[]);return o.length>0&&t.push(o),t}function fo(e,t){let o=[],n=[],r=[];for(let a of e){let l=t.replacements.get(a.toolCallId);l!==void 0?o.push({...a,replacement:l}):t.seenIds.has(a.toolCallId)?n.push(a):r.push(a)}return{mustReapply:o,frozen:n,fresh:r}}function yo(e,t,o){let n=[...e].sort((l,s)=>s.size-l.size),r=[],a=t+e.reduce((l,s)=>l+s.size,0);for(let l of n){if(a<=o)break;r.push(l),a-=l.size}return r}async function jt(e,t,o,n=Lt){let r=go(e);if(r.length===0)return{messages:e,newlyReplacedCount:0};let a=new Map,l=[];for(let u of r){let{mustReapply:g,frozen:x,fresh:T}=fo(u,t);for(let b of g)a.set(b.toolCallId,b.replacement);if(T.length===0){for(let b of u)t.seenIds.add(b.toolCallId);continue}let v=x.reduce((b,E)=>b+E.size,0),_=T.reduce((b,E)=>b+E.size,0),k=v+_>n?yo(T,v,n):[],P=new Set(k.map(b=>b.toolCallId));for(let b of u)P.has(b.toolCallId)||t.seenIds.add(b.toolCallId);k.length>0&&l.push(...k)}if(a.size===0&&l.length===0)return{messages:e,newlyReplacedCount:0};let s=await Promise.all(l.map(async u=>{let g=await Dt(u.content,u.toolCallId,o);return{candidate:u,result:g}})),d=0;for(let{candidate:u,result:g}of s){if(t.seenIds.add(u.toolCallId),!g)continue;let x=Ut(g);a.set(u.toolCallId,x),t.replacements.set(u.toolCallId,x),d++}return a.size===0?{messages:e,newlyReplacedCount:0}:{messages:e.map(u=>{if(u.role!=="tool"||!u.tool_call_id)return u;let g=a.get(u.tool_call_id);return g===void 0?u:{...u,content:g}}),newlyReplacedCount:d}}var ho=new Set(["read_file","file_read","FileRead","grep","Grep","glob","Glob","search","list_dir","find_files","web_fetch","web_search","WebFetch","WebSearch"]),To=new Set(["bash","execute_command","Bash","shell"]),fe=class{tools=[];hasErrored=!1;erroredToolDescription="";discarded=!1;siblingAbortController;progressResolve;config;concurrencySafe;constructor(t){this.config=t,this.concurrencySafe=t.concurrencySafeTools??ho,this.siblingAbortController=new AbortController,t.signal&&t.signal.addEventListener("abort",()=>{this.siblingAbortController.abort("parent_abort")},{once:!0})}discard(){this.discarded=!0}addTool(t){let o=this.concurrencySafe.has(t.function.name);this.tools.push({id:t.id,toolCall:t,status:"queued",isConcurrencySafe:o,results:[],pendingProgress:[]}),this.processQueue()}canExecuteTool(t){let o=this.tools.filter(r=>r.status==="executing"),n=this.config.maxConcurrentTools;return n&&n>0&&o.length>=n?!1:o.length===0||t&&o.every(r=>r.isConcurrencySafe)}async processQueue(){for(let t of this.tools)if(t.status==="queued"){if(this.canExecuteTool(t.isConcurrencySafe))await this.executeTool(t);else if(!t.isConcurrencySafe)break}}getAbortReason(){return this.discarded?"discarded":this.hasErrored?"sibling_error":this.config.signal?.aborted?"user_interrupted":null}getToolDescription(t){let o;try{o=JSON.parse(t.toolCall.function.arguments)}catch{}let n=o?.command??o?.file_path??o?.pattern??"";if(typeof n=="string"&&n.length>0){let r=n.length>40?n.slice(0,40)+"\u2026":n;return`${t.toolCall.function.name}(${r})`}return t.toolCall.function.name}createSyntheticError(t,o){let n=this.erroredToolDescription,r=o==="user_interrupted"?"User rejected tool use":o==="discarded"?"Streaming fallback - tool execution discarded":n?`Cancelled: parallel tool call ${n} errored`:"Cancelled: parallel tool call errored";return{callId:t.id,toolName:t.toolCall.function.name,ok:!1,error:r,message:Q(t.id,{ok:!1,error:r})}}async executeTool(t){t.status="executing";let n=(async()=>{let r=this.getAbortReason();if(r){t.results.push(this.createSyntheticError(t,r)),t.status="completed";return}let{toolInvoker:a,hooks:l,sessionId:s,turnId:d,log:y}=this.config,u=t.toolCall.function.name,g=!1,x=t.toolCall.function.arguments;if(l)try{let b=await l.invoke("tool.before_invoke",{sessionId:s,turnId:d,callId:t.id,toolName:u,arguments:Co(x)});if(b.action==="abort"){let E=b.reason??"blocked by policy";y.info(`tool ${u} blocked: ${E}`),t.results.push({callId:t.id,toolName:u,ok:!1,error:E,blocked:!0,blockReason:E,message:Q(t.id,{ok:!1,error:E})}),t.status="completed";return}b.action==="continue"&&b.context?.arguments&&(x=JSON.stringify(b.context.arguments))}catch{}let T=await a.invoke(d,u,x,this.siblingAbortController.signal),v=this.getAbortReason();if(v&&!g){t.results.push(this.createSyntheticError(t,v)),t.status="completed";return}let _=!T.error,k=T.result;_&&k&&k.length>5e4&&(k=await $t(k,t.id,s));let P=Q(t.id,{ok:_,payload:k,error:T.error,toolReferences:T.toolReferences});_||(g=!0,To.has(u)&&(this.hasErrored=!0,this.erroredToolDescription=this.getToolDescription(t),this.siblingAbortController.abort("sibling_error"))),l?.invoke(_?"tool.after_invoke":"tool.invoke_failed",{sessionId:s,turnId:d,callId:t.id,toolName:u,ok:_,...T.error?{error:T.error}:{}}).catch(()=>{}),t.results.push({callId:t.id,toolName:u,ok:_,error:T.error,message:P}),t.status="completed"})();t.promise=n,n.finally(()=>{this.processQueue()})}*getCompletedResults(){if(!this.discarded){for(let t of this.tools)if(t.status!=="yielded"){if(t.status==="completed"&&t.results.length>0){t.status="yielded";for(let o of t.results)yield o}else if(t.status==="executing"&&!t.isConcurrencySafe)break}}}async*getRemainingResults(){if(!this.discarded){for(;this.hasUnfinishedTools();){await this.processQueue();for(let t of this.getCompletedResults())yield t;if(this.hasExecutingTools()&&!this.hasCompletedResults()){let t=this.tools.filter(n=>n.status==="executing"&&n.promise).map(n=>n.promise),o=new Promise(n=>{this.progressResolve=n});t.length>0&&await Promise.race([...t,o])}}for(let t of this.getCompletedResults())yield t}}hasCompletedResults(){return this.tools.some(t=>t.status==="completed")}hasExecutingTools(){return this.tools.some(t=>t.status==="executing")}hasUnfinishedTools(){return this.tools.some(t=>t.status!=="yielded")}};function Co(e){try{return JSON.parse(e)}catch{return}}import{readFile as ss}from"node:fs/promises";function Xe(e){let t=typeof e.content=="string"?e.content:e.content!=null?JSON.stringify(e.content):"";return Math.ceil(t.length/4)}function We(e){let t=0;for(let o of e)t+=Xe(o);return t}var Ke={"deepseek-v4-flash":1e6,"deepseek-v4-pro":1e6,"deepseek-chat":1e6,"deepseek-reasoner":1e6,"gpt-4o":128e3,"gpt-4o-mini":128e3,"claude-sonnet-4-20250514":2e5,"claude-3-5-haiku-20241022":2e5,"gemini-3.1-pro-preview":1e6,"gemini-3-flash-preview":1e6,"gemini-3.1-flash-lite":1e6};function bo(e){if(!e)return 128e3;if(e in Ke)return Ke[e];let t=e.toLowerCase();for(let[o,n]of Object.entries(Ke))if(t.startsWith(o.toLowerCase()))return n;return 128e3}var ko=8e3;var _o=new te(200);var is=new ne;function Ro(){return _e(new ee(ko),new G(20,Xe),new Z(Xe))}var xo=null;function zt(e,t){let o=t?.budget??Re({modelContextWindow:bo(t?.model)}),r=(t?.pipeline??Ro()).compress(e,o);if(r.droppedCount>0){let a=We(e),l=We(r.messages);_o.record({timestamp:Date.now(),strategy:r.strategy,tokensBefore:a,tokensAfter:l,droppedCount:r.droppedCount,latencyMs:r.metrics?.latencyMs??0,usedLlm:!1,cacheInvalidated:r.metrics?.cacheInvalidated??!1,tier:xe(a,o)})}return r.droppedCount>0&&xo?.(r.droppedCount,We(r.messages)),r}function Gt(e,t,o){let n=o-t;return`[Budget] ${Math.round(e)}% used (${t.toLocaleString()} / ${o.toLocaleString()} tokens). ${n.toLocaleString()} tokens remaining. `+(e>=90?"Wrap up your current task \u2014 you are near the token limit.":"Continue working \u2014 do not summarize prematurely.")}var Lo=new Set(["write","edit","patch","apply_patch"]);function Oo(e){let t=e.split(".").pop()?.toLowerCase()??"";return["png","jpg","jpeg","gif","webp","svg","bmp","ico"].includes(t)?"image":["md","txt","pdf","doc","docx","rtf","html"].includes(t)?"document":["mermaid","mmd","dot","puml","plantuml"].includes(t)?"diagram":["csv","tsv","xlsx","xls"].includes(t)?"table":["ts","tsx","js","jsx","py","rs","go","java","c","cpp","h","cs","rb","sh","sql","json","yaml","yml","toml","xml","css","scss","vue","svelte"].includes(t)?"code":"file"}function Po(e){let t=e.split(".").pop()?.toLowerCase()??"";return{ts:"typescript",tsx:"typescriptreact",js:"javascript",jsx:"javascriptreact",py:"python",rs:"rust",go:"go",java:"java",c:"c",cpp:"cpp",h:"c",cs:"csharp",rb:"ruby",sh:"shellscript",sql:"sql",json:"json",yaml:"yaml",yml:"yaml",toml:"toml",xml:"xml",html:"html",css:"css",scss:"scss",vue:"vue",svelte:"svelte",md:"markdown"}[t]}function No(e){return typeof e=="number"&&Number.isFinite(e)&&e>=1?Math.min(Math.round(e),100):bt}function Wt(e){let t=e.message.toLowerCase();return e.status===413||t.includes("prompt_too_long")||t.includes("context_length_exceeded")||t.includes("maximum context length")}function Fo(e){return e==="length"||e==="max_tokens"}function Kt(e){let t=e.message.toLowerCase();return(t.includes("image")||t.includes("media")||t.includes("file too large")||t.includes("payload too large"))&&(e.status===413||t.includes("too large")||t.includes("size"))}function Bo(e){let t=e.headers;if(!t)return null;let o=t["retry-after"]??t["Retry-After"];if(!o)return null;let n=parseInt(o,10);return!isNaN(n)&&n>0?n*1e3:null}function Do(e){if(e.status!==400)return null;let t=e.message.match(/input length and `max_tokens` exceed context limit: (\d+) \+ (\d+) > (\d+)/);if(!t?.[1]||!t?.[3])return null;let o=parseInt(t[1],10),n=parseInt(t[3],10);if(isNaN(o)||isNaN(n))return null;let r=n-o-1e3;return r>=3e3?r:null}function Uo(e){return e.filter(t=>t.role!=="assistant"?!0:!(typeof t.content=="string"&&t.content.trim()===""))}async function*Xt(e,t,o,n){let{turnId:r,sessionId:a,messages:l,tools:s,model:d,apiKey:y,temperature:u=0,hooks:g,signal:x}=e,T={sessionId:a,turnId:r},v=e.maxTurns??0,_=e.querySource,{resolveToolEligibility:k}=await Promise.resolve().then(()=>(Ht(),qt)),P=k(s,e.toolEligibilityContext),b=P.eligibleTools;for(let S of P.blockedTools)yield{type:"tool_blocked",turnId:r,callId:"",name:S.toolName,reason:"blocked-by-policy"};if(!b.length){yield*$o(r,d,l,y,u,x,t,n);return}let E=No(e.maxRounds),I={contextWindowTokens:e.contextWindowTokens??_t,responseBufferTokens:Rt,maxOutputTokens:e.maxOutputTokens??xt,abortSignal:x,reactiveCompactEnabled:!0,outputEscalationEnabled:!0},W=new Set,D=0,ie=b,ae,i={messages:[...l],maxOutputTokensRecoveryCount:0,hasAttemptedReactiveCompact:!1,maxOutputTokensOverride:void 0,turnCount:1,transition:void 0,guardState:De(I),reactiveCompactState:Ge(),toolLoopState:me({maxRounds:E,replayMessages:[...l]}).state,consecutiveFailedRounds:0,finalText:"",totalUsage:{prompt:0,completion:0},collapseStore:Se(),currentModel:d,consecutive529Errors:0,consecutiveApiRetries:0,stopHookActive:void 0,lastResponseId:void 0,snipRemovedIds:new Set,contentReplacementState:Nt(),budgetContinuationCount:0,lastBudgetDeltaTokens:0,lastBudgetGlobalTokens:0},Ye=Math.max(v*5,200),Ve=0;for(;;){if(Ve++,Ve>Ye){n.info(`hard iteration cap reached (${Ye}), forcing completion`);let c=i.finalText||se(i.messages,n);yield{type:"end",turnId:r,content:c,usage:i.totalUsage,model:i.currentModel};return}let{messages:S,maxOutputTokensRecoveryCount:K,hasAttemptedReactiveCompact:zo,maxOutputTokensOverride:Je,turnCount:X,guardState:M,reactiveCompactState:F,collapseStore:ye}=i,{toolLoopState:L}=i;if(ae){try{let c=await ae;c&&(yield{type:"tool_use_summary",turnId:r,summary:c})}catch{}ae=void 0}if(e.refreshTools&&X>1){let c=e.refreshTools();c!==ie&&(ie=c,n.debug(`tools refreshed: ${c.length} tools`))}if(ze(M,I)){n.info(`turn aborted by guard at turn ${X}`),yield{type:"error",turnId:r,error:"Turn aborted",code:"ABORTED",usage:i.totalUsage};return}let U=Ue(M,I);if(U.level==="blocking"){U.reason==="prompt_too_long"&&H(F)&&(F.attemptedThisTurn=!0,M.hasAttemptedReactiveCompact=!0,n.info(`token budget blocking (${U.reason}), reactive compact needed`),yield{type:"recovery",turnId:r,action:"reactive_compact",detail:"token budget pre-check"}),n.info(`token budget blocking (${U.reason}), ending tool loop`);break}U.level==="warning"&&n.info(`token budget warning: ${U.usagePercent}% used, ${U.remainingTokens} remaining`);let w;{let c=await jt(S,i.contentReplacementState,a);w=c.messages,c.newlyReplacedCount>0&&(n.info(`tool-result-budget: persisted ${c.newlyReplacedCount} oversized tool results`),yield{type:"recovery",turnId:r,action:"tool_result_budget",detail:`${c.newlyReplacedCount} persisted`})}{let c=ve(w,i.snipRemovedIds);w=c.messages,c.removedCount>0&&(n.info(`snip: removed ${c.removedCount} messages, freed ~${c.tokensFreed} tokens`),yield{type:"recovery",turnId:r,action:"snip",detail:`${c.removedCount} messages`})}{let p=new G().compress(w,0);p.droppedCount>0&&(w=p.messages,n.info(`microcompact: cleared ${p.droppedCount} old tool results`))}if(w=Ae(w,ye).messages,M.promptTokens>0){let c=zt(w,{budget:I.contextWindowTokens*.75,model:i.currentModel});c.droppedCount>0&&(w=c.messages,n.info(`autocompact: ${c.strategy}, dropped ${c.droppedCount}`),yield{type:"recovery",turnId:r,action:"autocompact",detail:`${c.strategy}: ${c.droppedCount} dropped`},i.hasAttemptedReactiveCompact=!1,g?.invoke("context.after_compact",{...T,removedCount:c.droppedCount}).catch(()=>{}))}w=Uo(w);let le=Me({tools:ie,toolChoice:e.toolChoice??"auto"}),Y=me({maxRounds:E,replayMessages:w,lastStopReason:L.lastStopReason,options:{stopReason:L.lastStopReason}}),Qe=le.extraSystemPrompt?[{role:"system",content:le.extraSystemPrompt},...Y.state.replayMessages]:Y.state.replayMessages;L=Y.state,Y.recoveryActions.length>0&&n.debug(`tool loop recovery: ${Y.recoveryActions.map(c=>c.detail??c.kind).join("; ")}`),n.debug(`turn ${X}, messages: ${Qe.length}`),g?.invoke("turn.before_inference",{...T,model:i.currentModel}).catch(()=>{});let ce=!1,Ze=[],et=new Map,tt="stop",O,C=null,ue=!1,V=[],N=[];try{for await(let c of t.stream({model:i.currentModel,messages:Qe,tools:le.tools,toolChoice:le.normalizedToolChoice??"auto",temperature:u,maxTokens:(Je??M.currentMaxOutputTokens)||void 0,streamRequired:e.streamRequired,previousResponseId:i.lastResponseId,reasoning:e.reasoning,promptCacheKey:e.promptCacheKey,promptCacheRetention:e.promptCacheRetention,serviceTier:e.serviceTier,openaiBuiltinTools:e.openaiBuiltinTools,maxToolCalls:e.maxToolCalls,parallelToolCalls:e.parallelToolCalls,textVerbosity:e.textVerbosity},y,x))switch(c.type){case"delta":Ze.push(c.text),ce||(yield{type:"delta",turnId:r,text:c.text});break;case"tool_call_delta":ce=!0,Ct(et,c);break;case"reasoning_delta":V.push(c.text);break;case"reasoning_block_complete":c.signature&&N.push({thinking:V.join(""),signature:c.signature}),V.length=0;break;case"usage":O={prompt:c.promptTokens,completion:c.completionTokens,reasoning:c.reasoningTokens,cacheRead:c.cacheReadTokens,cacheCreation:c.cacheCreationTokens};break;case"response_id":i.lastResponseId=c.id;break;case"annotations":yield{type:"annotations",turnId:r,annotations:c.annotations};break;case"builtin_tool_status":yield{type:"heartbeat",turnId:r,message:`${c.toolType}: ${c.event}`};break;case"done":tt=c.finishReason;break}if(ce||g?.invoke("turn.after_inference",{...T,model:i.currentModel}).catch(()=>{}),e.postSamplingHooks&&e.postSamplingHooks.length>0){let c=i.currentModel;for(let p of e.postSamplingHooks)try{p({messages:[...w],model:c,sessionId:a})}catch{}}}catch(c){if(c instanceof oe&&e.fallbackModel){n.info(`model fallback triggered: ${c.originalModel} \u2192 ${c.fallbackModel}`),yield{type:"recovery",turnId:r,action:"model_fallback",detail:`${c.originalModel} \u2192 ${c.fallbackModel}`},i={...i,currentModel:c.fallbackModel,consecutive529Errors:0,consecutiveApiRetries:0,transition:void 0};continue}let p=c instanceof Error?c.message:String(c),m=typeof c?.status=="number"?c.status:void 0;if(!m&&p&&(p.includes("ECONNRESET")||p.includes("EPIPE"))){let R=(i.consecutiveApiRetries??0)+1;if(R>re){n.info(`stale connection retry limit reached (${re}), aborting`),yield{type:"error",turnId:r,error:p,code:"RETRIES_EXHAUSTED",usage:i.totalUsage};return}n.info(`stale connection (${p.includes("ECONNRESET")?"ECONNRESET":"EPIPE"}): retrying`),yield{type:"recovery",turnId:r,action:"stale_connection_retry",detail:p.slice(0,80)},i={...i,consecutiveApiRetries:R,transition:void 0};continue}let f=Do({status:m,message:p});if(f!==null){n.info(`max_tokens overflow: adjusting to ${f}`),M.currentMaxOutputTokens=f,i={...i,maxOutputTokensOverride:f,transition:void 0};continue}if(Fe(m)){if(i.consecutive529Errors++,i.consecutive529Errors>=Mt&&e.fallbackModel&&i.currentModel!==e.fallbackModel){n.info(`529 \xD7 ${i.consecutive529Errors}: triggering fallback to ${e.fallbackModel}`),yield{type:"recovery",turnId:r,action:"model_fallback",detail:`529 \xD7 ${i.consecutive529Errors}`},i={...i,currentModel:e.fallbackModel,consecutive529Errors:0,transition:void 0};continue}if(Be()){let R=ge(i.consecutive529Errors);n.info(`persistent retry: waiting ${R}ms (attempt ${i.consecutive529Errors})`);let h=R;for(;h>0;){if(x?.aborted){yield{type:"error",turnId:r,error:"Aborted during retry wait",code:"ABORTED",usage:i.totalUsage};return}yield{type:"heartbeat",turnId:r,message:`Retrying in ${Math.ceil(h/1e3)}s (${m})`};let A=Math.min(h,Et);await new Promise(Te=>setTimeout(Te,A)),h-=A}i={...i,transition:void 0};continue}if(Ne(_)){let h=Bo({status:m,message:p})??ge(i.consecutive529Errors);n.info(`transient ${m}: retry in ${h}ms`),yield{type:"recovery",turnId:r,action:"retry",detail:`${m} retry in ${h}ms`},await new Promise(A=>setTimeout(A,h)),i={...i,transition:void 0};continue}n.info(`background source ${_}: not retrying ${m}`)}C={status:m,message:p}}if(C&&g?.invoke("turn.after_inference",{...T,model:i.currentModel,response:{error:C.message}}).catch(()=>{}),C)if(Wt(C))ue=!0,n.info(`withheld prompt_too_long error (status=${C.status})`);else if(Kt(C))ue=!0,n.info(`withheld media_size error (status=${C.status})`);else{let c=$e({status:C.status??500,message:C.message},M,I);if(c.action==="reactive_compact"&&H(F)&&(F.attemptedThisTurn=!0,M.hasAttemptedReactiveCompact=!0,yield{type:"recovery",turnId:r,action:"reactive_compact",detail:`API ${C.status??500}: ${C.message}`}),c.action==="retry"){let m=(i.consecutiveApiRetries??0)+1;if(m>re){n.info(`API retry limit reached (${re}), aborting`);let f=q(C.status,C.message);yield{type:"error",turnId:r,error:C.message,code:f,usage:i.totalUsage};return}yield{type:"recovery",turnId:r,action:"retry",detail:c.reason},i={...i,consecutiveApiRetries:m,transition:void 0};continue}let p=q(C.status,C.message);g?.invoke("stop.failure",{sessionId:a,reason:p,error:C.message}).catch(()=>{}),yield{type:"error",turnId:r,error:C.message,code:p,usage:i.totalUsage};return}O&&(i.totalUsage.prompt+=O.prompt,i.totalUsage.completion+=O.completion,O.reasoning&&(i.totalUsage.reasoning=(i.totalUsage.reasoning??0)+O.reasoning),O.cacheRead&&(i.totalUsage.cacheRead=(i.totalUsage.cacheRead??0)+O.cacheRead),O.cacheCreation&&(i.totalUsage.cacheCreation=(i.totalUsage.cacheCreation??0)+O.cacheCreation)),O?.prompt&&(M.promptTokens=O.prompt);let nt=Ze.join("");nt&&(i.finalText=nt);let B=[...et.values()].map(c=>({id:c.id||`tc_${r}_${X}_${Math.random().toString(36).slice(2,8)}`,type:"function",function:{name:c.name,arguments:c.arguments}}));if(B.length===0&&!ce){if(ue&&C&&Wt(C)){if(i.transition?.reason!=="collapse_drain_retry"){let m=Ee(w,ye);if(m.committed>0){n.info(`collapse drain: committed ${m.committed} stages`),yield{type:"recovery",turnId:r,action:"collapse_drain",detail:`${m.committed} stages committed`},i={...i,messages:m.messages,transition:{reason:"collapse_drain_retry",committed:m.committed}};continue}}if(H(F)){F.attemptedThisTurn=!0,M.hasAttemptedReactiveCompact=!0,n.info("withheld 413: reactive compact attempt"),yield{type:"recovery",turnId:r,action:"reactive_compact",detail:"withheld prompt_too_long"},i={...i,hasAttemptedReactiveCompact:!0,transition:{reason:"reactive_compact_retry"}};continue}n.info("withheld 413: recovery exhausted, surfacing error"),g?.invoke("stop.failure",{sessionId:a,reason:"prompt_too_long",error:C.message}).catch(()=>{}),yield{type:"error",turnId:r,error:C.message,code:"PROMPT_TOO_LONG",usage:i.totalUsage};return}if(ue&&C&&Kt(C)){if(H(F)){F.attemptedThisTurn=!0,M.hasAttemptedReactiveCompact=!0,n.info("withheld media error: reactive compact strip-retry"),yield{type:"recovery",turnId:r,action:"reactive_compact",detail:"media error strip-retry"},i={...i,hasAttemptedReactiveCompact:!0,transition:{reason:"reactive_compact_retry"}};continue}n.info("withheld media error: recovery exhausted"),g?.invoke("stop.failure",{sessionId:a,reason:"media_error",error:C.message}).catch(()=>{}),yield{type:"error",turnId:r,error:C.message,code:"IMAGE_ERROR",usage:i.totalUsage};return}if(Fo(tt)){M.consecutiveTruncations+=1;let m=e.modelMaxOutputTokens??vt,f=je(M,I,m);if(f.shouldEscalate&&Je===void 0){M.currentMaxOutputTokens=f.newMax,n.info(`max_output_tokens escalate: ${f.newMax} tokens`),yield{type:"recovery",turnId:r,action:"output_escalation",detail:`${f.newMax} tokens`},i={...i,maxOutputTokensOverride:At,transition:{reason:"max_output_tokens_escalate"}};continue}if(K<St){let R={role:"user",content:"Output token limit hit. Resume directly \u2014 no apology, no recap of what you were doing. Pick up mid-thought if that is where the cut happened. Break remaining work into smaller pieces."};n.info(`max_output_tokens recovery #${K+1}`),yield{type:"recovery",turnId:r,action:"max_output_tokens_recovery",detail:`attempt ${K+1}`},i={...i,messages:[...w,R],maxOutputTokensRecoveryCount:K+1,maxOutputTokensOverride:void 0,transition:{reason:"max_output_tokens_recovery",attempt:K+1}};continue}n.info("max_output_tokens recovery exhausted, completing with partial content")}else M.consecutiveTruncations=0;if(L=pe(L,{replayMessages:S,lastStopReason:"completed"}),g){let m=await g.invoke("stop",{sessionId:a,reason:"completed"});if(m.action==="prevent"){n.info(`stop hook prevented continuation: ${m.reason??"no reason"}`),yield{type:"end",turnId:r,content:i.finalText,usage:i.totalUsage,model:i.currentModel};return}if(m.action==="abort"){let f=m.reason??"Stop hook requested continuation";n.info(`stop hook blocking: ${f}`);let R={role:"user",content:f},h={role:"assistant",content:i.finalText,...N.length>0&&{thinkingBlocks:[...N]}};i={...i,messages:[...S,h,R],stopHookActive:!0,transition:{reason:"stop_hook_blocking"}};continue}}if(e.tokenBudget&&e.tokenBudget>0&&i.budgetContinuationCount<5){let m=i.totalUsage.prompt+i.totalUsage.completion+(i.totalUsage.reasoning??0),f=m/e.tokenBudget*100,R=m-i.lastBudgetGlobalTokens,h=i.budgetContinuationCount>=wt&&R<qe&&i.lastBudgetDeltaTokens<qe;if(h&&n.info(`token budget early stop: diminishing returns at ${Math.round(f)}% (delta=${R})`),!h&&f<90){let A=i.budgetContinuationCount+1,Te={role:"user",content:Gt(f,m,e.tokenBudget)};n.info(`token budget continuation #${A}: ${Math.round(f)}% used`),yield{type:"recovery",turnId:r,action:"budget_continuation",detail:`${Math.round(f)}% used (#${A})`};let Zt={role:"assistant",content:i.finalText,...N.length>0&&{thinkingBlocks:[...N]}};i={...i,messages:[...S,Zt,Te],budgetContinuationCount:A,lastBudgetDeltaTokens:R,lastBudgetGlobalTokens:m,transition:{reason:"token_budget_continuation"}};continue}}if(D>0){let m={ok:!0,toolCallCount:D,distinctToolCount:W.size,multiStep:D>=2,hasSubAgent:!1,feedback:null,existingSkillName:null},f=de(m,{tools:[...W]});f&&(yield{type:"skill_instruction",turnId:r,instruction:f})}let p=i.finalText||se(S,n);yield{type:"end",turnId:r,content:p,usage:i.totalUsage,model:i.currentModel};return}for(let c of B){let p=c.function.arguments,m=ie.find(f=>f.function.name===c.function.name);if(m?.backfillObservableInput)try{let f=JSON.parse(c.function.arguments),R={...f};m.backfillObservableInput(R),Object.keys(R).some(A=>!(A in f))&&(p=JSON.stringify(R))}catch{}yield{type:"tool_call",turnId:r,callId:c.id,name:c.function.name,arguments:p}}let Jt=N.length===0&&V.length>0?V.join(""):void 0;S.push(Ce(B,i.finalText||void 0,N.length>0?N:void 0,Jt)),L=Pe(L,{replayMessages:S,pendingToolCallIds:B.map(c=>c.id),completedToolCallIds:L.completedToolCallIds,lastStopReason:"tool_calls"});let ot=[];try{let c=new fe({toolInvoker:o,hooks:g,sessionId:a,turnId:r,log:n,signal:x,maxConcurrentTools:e?.maxConcurrentTools});for(let p of B)c.addTool(p);for await(let p of c.getRemainingResults()){p.blocked&&(yield{type:"tool_blocked",turnId:r,callId:p.callId,name:p.toolName,reason:p.blockReason??"blocked"}),S.push(p.message),ot.push(p.callId),W.add(p.toolName),D++;let m=typeof p.message?.content=="string"?p.message.content:"",f=p.ok&&m?m.slice(0,2e3):void 0;if(yield{type:"tool_result",turnId:r,callId:p.callId,name:p.toolName,ok:p.ok,error:p.error,outputPreview:f},p.ok){let R=B.find(h=>h.id===p.callId);if(R){if(p.toolName==="plan_mode")try{let h=JSON.parse(R.function.arguments);h.action==="exit"&&typeof h.plan=="string"&&h.plan.length>0&&(yield{type:"plan_update",turnId:r,slug:"approved-plan",content:h.plan})}catch{}if(Lo.has(p.toolName))try{let h=JSON.parse(R.function.arguments),A=typeof h.file_path=="string"?h.file_path:typeof h.filePath=="string"?h.filePath:typeof h.path=="string"?h.path:void 0;A&&(yield{type:"artifact",turnId:r,artifactId:`artifact-${p.callId}`,artifactType:Oo(A),title:A.split(/[\\/]/).pop()||A,filePath:A,language:Po(A)})}catch{}}}}}catch(c){let p=c instanceof Error?c.message:String(c);yield{type:"error",turnId:r,error:p,code:"TOOL_EXECUTION_ERROR",usage:i.totalUsage};return}if(L=pe(L,{replayMessages:S,completedToolCallIds:[...L.completedToolCallIds,...ot],lastStopReason:"tool_calls"}),e.generateToolUseSummary&&B.length>0){let c=B.map(p=>({name:p.function.name,arguments:p.function.arguments}));ae=e.generateToolUseSummary(c).catch(()=>null)}let rt=S.slice(-B.length),Qt=rt.length>0&&rt.every(c=>{let p=c?.content;return typeof p!="string"?!1:p.startsWith("Error: ")}),J=i.consecutiveFailedRounds;if(Qt){if(J+=1,J>=kt){let c=i.finalText||se(S,n);n.info(`early exit: ${J} consecutive failed rounds, returning ${i.finalText?"partial":"fallback"} response`),yield{type:"end",turnId:r,content:c,usage:i.totalUsage,model:i.currentModel};return}}else J=0;let he=X+1;if(v>0&&he>v){if(n.info(`max turns reached (${v}), completing`),g){let p=await g.invoke("stop",{sessionId:a,reason:"max_turns"});if(p.action==="abort"){let m=p.reason??"Stop hook requested continuation after max_turns",f={role:"assistant",content:i.finalText,...N.length>0&&{thinkingBlocks:[...N]}};i={...i,messages:[...S,f,{role:"user",content:m}],stopHookActive:!0,transition:{reason:"stop_hook_blocking"}};continue}}let c=i.finalText||se(S,n);yield{type:"end",turnId:r,content:c,usage:i.totalUsage,model:i.currentModel};return}if(he>E){if(n.info(`tool loop budget exhausted (${E} rounds), returning`),D>0){let p={ok:!0,toolCallCount:D,distinctToolCount:W.size,multiStep:D>=2,hasSubAgent:!1,feedback:null,existingSkillName:null},m=de(p,{tools:[...W]});m&&(yield{type:"skill_instruction",turnId:r,instruction:m})}let c=i.finalText||se(S,n);yield{type:"end",turnId:r,content:c,usage:i.totalUsage,model:i.currentModel};return}i={messages:S,maxOutputTokensRecoveryCount:0,hasAttemptedReactiveCompact:!1,maxOutputTokensOverride:void 0,turnCount:he,transition:{reason:"next_turn"},guardState:M,reactiveCompactState:F,toolLoopState:L,consecutiveFailedRounds:J,finalText:i.finalText,totalUsage:i.totalUsage,collapseStore:ye,currentModel:i.currentModel,consecutive529Errors:0,consecutiveApiRetries:0,stopHookActive:i.stopHookActive,lastResponseId:i.lastResponseId,snipRemovedIds:i.snipRemovedIds,contentReplacementState:i.contentReplacementState,budgetContinuationCount:0,lastBudgetDeltaTokens:0,lastBudgetGlobalTokens:0}}}function se(e,t){let o=[];for(let n=e.length-1;n>=0;n--){let r=e[n];if(r.role==="tool"&&typeof r.content=="string")o.unshift(r.content.slice(0,500));else if(r.role==="assistant"){if(typeof r.content=="string"&&r.content.trim())return t.info("synthesizeFallbackContent: found assistant text, using it"),r.content;break}else break}return o.length>0?(t.info(`synthesizeFallbackContent: synthesized from ${o.length} tool result(s)`),o.join(`
|
|
17
17
|
|
|
18
|
-
`)):""}async function
|
|
19
|
-
`);
|
|
20
|
-
${P}`})}this.hooks.invoke("memory.after_recall",{sessionId:t.sessionId,turnId:
|
|
18
|
+
`)):""}async function*$o(e,t,o,n,r,a,l,s){let d=[],y;s.debug(`single LLM round, messages: ${o.length}`);for await(let u of l.stream({model:t,messages:o,temperature:r},n,a))switch(u.type){case"delta":d.push(u.text),yield{type:"delta",turnId:e,text:u.text};break;case"usage":y={prompt:u.promptTokens,completion:u.completionTokens,reasoning:u.reasoningTokens,cacheRead:u.cacheReadTokens,cacheCreation:u.cacheCreationTokens};break;case"done":break}yield{type:"end",turnId:e,content:d.join(""),usage:y??{prompt:0,completion:0},model:t}}var Vt=class{transport;apiKey;toolInvoker;log;hooks;maxRounds;constructor(t){this.transport=t.llmTransport,this.apiKey=t.apiKey,this.toolInvoker=t.toolInvoker,this.log=t.log,this.hooks=t.hooks,this.maxRounds=Math.min(t.maxRounds??25,100)}async*run(t,o){let{turnId:n,messages:r,tools:a,systemPrompt:l,config:s}=t,d={sessionId:t.sessionId,turnId:n};yield{type:"start",turnId:n},this.hooks?.invoke("turn.submitted",{...d,prompt:r[r.length-1]?.content??void 0}).catch(()=>{});let y=Oe(r),u=[];if(l&&u.push({role:"system",content:l}),u.push(...y),this.hooks){let T=y.filter(_=>_.role==="user").pop(),v=typeof T?.content=="string"?T.content.slice(0,500):void 0;if(v)try{let _=await this.hooks.invoke("memory.before_recall",{sessionId:t.sessionId,turnId:n,query:v}),k=_?.context?.recalledMemories;if(k&&k.length>0){let P=k.map(b=>`- ${b.text}`).join(`
|
|
19
|
+
`);u.splice(l?1:0,0,{role:"system",content:`[Recalled from long-term memory]
|
|
20
|
+
${P}`})}this.hooks.invoke("memory.after_recall",{sessionId:t.sessionId,turnId:n,blockCount:_?.context?.recalledMemories?.length??0}).catch(()=>{})}catch{}}let g=s?.model??"",x=Math.min(s?.maxRounds??this.maxRounds,100);try{let T=s?.summaryModel?async k=>{try{let P=k.map(I=>`${I.name}(${I.arguments.slice(0,200)})`).join(", "),b=this.transport.stream({model:s.summaryModel,messages:[{role:"system",content:"Summarize the tool usage in ~30 chars, git-commit-subject style. Reply with ONLY the summary, nothing else."},{role:"user",content:P}],tools:[],maxTokens:60},s.apiKey??this.apiKey),E="";for await(let I of b)I.type==="delta"&&(E+=I.text);return E.trim()||null}catch{return null}}:void 0,v={turnId:n,sessionId:t.sessionId,messages:u,tools:a,model:g,apiKey:s?.apiKey??this.apiKey,temperature:s?.temperature,maxRounds:x,contextWindowTokens:s?.contextWindowTokens,maxOutputTokens:s?.maxOutputTokens,modelMaxOutputTokens:s?.modelMaxOutputTokens,toolChoice:s?.toolChoice,parentDepth:s?.parentDepth,hooks:this.hooks,fallbackModel:s?.fallbackModel,maxTurns:s?.maxTurns,tokenBudget:s?.tokenBudget,maxConcurrentTools:s?.maxConcurrentTools,streamRequired:s?.streamRequired,reasoning:s?.reasoning,promptCacheKey:s?.promptCacheKey,promptCacheRetention:s?.promptCacheRetention,serviceTier:s?.serviceTier,openaiBuiltinTools:s?.openaiBuiltinTools,maxToolCalls:s?.maxToolCalls,parallelToolCalls:s?.parallelToolCalls,textVerbosity:s?.textVerbosity,generateToolUseSummary:T,signal:o},_;for await(let k of Xt(v,this.transport,this.toolInvoker,this.log))_=k,yield k;_?.type==="end"?this.hooks?.invoke("turn.completed",{...d}).catch(()=>{}):_?.type==="error"&&this.hooks?.invoke("turn.failed",{...d,code:_.code,error:_.error}).catch(()=>{})}catch(T){if(o?.aborted)this.hooks?.invoke("turn.failed",{...d,code:"ABORTED",error:"Turn aborted"}).catch(()=>{}),yield{type:"error",turnId:n,error:"Turn aborted",code:"ABORTED"};else{let v=T instanceof Error?T.message:String(T),_=typeof T?.status=="number"?T.status:void 0,k=q(_,v);this.log.error(`turn ${n} error [${k}, retryable=${ke(k)}]: ${v}`),this.hooks?.invoke("turn.failed",{...d,code:k,error:v}).catch(()=>{}),yield{type:"error",turnId:n,error:v,code:k}}}}};export{Vt as Agent};
|