qlogicagent 1.1.1 → 1.2.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/dist/agent.js +8 -6
- package/dist/cli.js +258 -214
- package/dist/index.js +258 -214
- package/dist/orchestration.js +12 -9
- package/dist/types/agent/tool-loop.d.ts +22 -0
- package/dist/types/agent/types.d.ts +32 -0
- package/dist/types/cli/stdio-server.d.ts +96 -1
- package/dist/types/cli/tool-bootstrap.d.ts +8 -1
- package/dist/types/llm/gemini-schema-utils.d.ts +17 -0
- package/dist/types/llm/index.d.ts +11 -2
- package/dist/types/llm/media-transport.d.ts +28 -3
- package/dist/types/llm/model-detection.d.ts +22 -0
- package/dist/types/llm/provider-def.d.ts +17 -4
- package/dist/types/llm/transport.d.ts +60 -2
- package/dist/types/llm/transports/gemini-cache-api.d.ts +86 -0
- package/dist/types/llm/transports/gemini-file-api.d.ts +90 -0
- package/dist/types/llm/transports/gemini-generatecontent.d.ts +52 -0
- package/dist/types/llm/transports/gemini-lyria-realtime.d.ts +117 -0
- package/dist/types/llm/transports/gemini-media.d.ts +40 -8
- package/dist/types/llm/transports/minimax-media.d.ts +34 -5
- package/dist/types/llm/transports/openai-responses.d.ts +60 -0
- package/dist/types/llm/transports/qwen-media.d.ts +32 -7
- package/dist/types/llm/transports/realtime-transport.d.ts +1 -1
- package/dist/types/llm/transports/volcengine-media.d.ts +10 -2
- package/dist/types/llm/transports/zhipu-media.d.ts +24 -2
- package/dist/types/orchestration/agent-instance.d.ts +58 -0
- package/dist/types/orchestration/dag-scheduler.d.ts +72 -0
- package/dist/types/orchestration/product-budget.d.ts +56 -0
- package/dist/types/orchestration/product-checkpoint.d.ts +46 -0
- package/dist/types/orchestration/product-persistence.d.ts +40 -0
- package/dist/types/orchestration/product-worktree.d.ts +13 -0
- package/dist/types/orchestration/solo-evaluator.d.ts +59 -0
- package/dist/types/orchestration/subagent/fork-subagent.d.ts +2 -0
- package/dist/types/orchestration/subagent/task-types.d.ts +4 -0
- package/dist/types/orchestration/tool-cascade.d.ts +2 -2
- package/dist/types/protocol/methods.d.ts +92 -0
- package/dist/types/protocol/notifications.d.ts +162 -0
- package/dist/types/runtime/infra/acp-detector.d.ts +36 -0
- package/dist/types/runtime/infra/acp-detector.test.d.ts +1 -0
- package/dist/types/runtime/infra/acp-protocol-adapter.d.ts +73 -0
- package/dist/types/runtime/infra/acp-protocol-adapter.test.d.ts +1 -0
- package/dist/types/runtime/infra/acp-types.d.ts +397 -0
- package/dist/types/runtime/infra/acp-usage-tracker.d.ts +46 -0
- package/dist/types/runtime/infra/acp-usage-tracker.test.d.ts +1 -0
- package/dist/types/runtime/infra/agent-config-store.d.ts +30 -0
- package/dist/types/runtime/infra/agent-config-store.test.d.ts +1 -0
- package/dist/types/runtime/infra/agent-paths.d.ts +8 -0
- package/dist/types/runtime/infra/agent-process.d.ts +280 -0
- package/dist/types/runtime/infra/agent-process.test.d.ts +1 -0
- package/dist/types/runtime/infra/index.d.ts +10 -0
- package/dist/types/runtime/infra/mcp-bridge.d.ts +166 -0
- package/dist/types/runtime/infra/mcp-bridge.test.d.ts +1 -0
- package/dist/types/runtime/infra/model-id-translator.d.ts +22 -0
- package/dist/types/runtime/infra/model-id-translator.test.d.ts +1 -0
- package/dist/types/runtime/infra/skill-injector.d.ts +51 -0
- package/dist/types/runtime/infra/skill-injector.test.d.ts +1 -0
- package/dist/types/runtime/infra/worktree-backend.d.ts +1 -0
- package/dist/types/runtime/prompt/environment-context.d.ts +6 -0
- package/dist/types/runtime/session/session-persistence.d.ts +9 -8
- package/dist/types/runtime/session/session-state.d.ts +3 -31
- package/dist/types/skills/index.d.ts +2 -10
- package/dist/types/skills/tools/skill-tool.d.ts +101 -0
- package/dist/types/skills/tools/team-tool.d.ts +23 -1
- package/package.json +1 -1
- package/dist/types/runtime/session/session-memory.d.ts +0 -90
- package/dist/types/skills/memory/memory-extractor.d.ts +0 -64
package/dist/orchestration.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
function ce(e,t,n,o){return{role:"assistant",content:t||null,tool_calls:e,...n&&n.length>0?{thinkingBlocks:n}:{},...o?{reasoning_content:o}:{}}}function ue(e,t){let n=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:n}}var pe=/\b(?:daily|weekly|monthly)(?:\/(?:daily|weekly|monthly))* (?:usage )?limit(?:s)?(?: (?:exhausted|reached|exceeded))?\b/i,h={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]},de=/^(?:error[:\s-]+)?billing(?:\s+error)?(?:[:\s-]+|$)|^(?:error[:\s-]+)?(?:credit balance|insufficient credits?|payment required|http\s*402\b)/i,me=/["']?(?:status|code)["']?\s*[:=]\s*402\b|\bhttp\s*402\b|\berror(?:\s+code)?\s*[:=]?\s*402\b|^\s*402\s+payment/i,fe=512,ge=/^(?:http\s*)?(\d{3})(?:\s+([\s\S]+))?$/i;var ye=new Set([500,502,503,504,521,522,523,524,529]),he=["insufficient credits","insufficient quota","credit balance","insufficient balance","plans & billing","add more credits","top up"],Ce=["upgrade your plan","upgrade plan","current plan","subscription"],Te=["daily","weekly","monthly"],be=["try again","retry","temporary","cooldown"],ke=["usage limit","rate limit","organization usage"],_e=["organization","workspace"],Re=["billing period","exceeded","reached","exhausted"],xe=/["']?(?: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,
|
|
1
|
+
function ce(e,t,n,o){return{role:"assistant",content:t||null,tool_calls:e,...n&&n.length>0?{thinkingBlocks:n}:{},...o?{reasoning_content:o}:{}}}function ue(e,t){let n=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:n}}var pe=/\b(?:daily|weekly|monthly)(?:\/(?:daily|weekly|monthly))* (?:usage )?limit(?:s)?(?: (?:exhausted|reached|exceeded))?\b/i,h={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]},de=/^(?:error[:\s-]+)?billing(?:\s+error)?(?:[:\s-]+|$)|^(?:error[:\s-]+)?(?:credit balance|insufficient credits?|payment required|http\s*402\b)/i,me=/["']?(?:status|code)["']?\s*[:=]\s*402\b|\bhttp\s*402\b|\berror(?:\s+code)?\s*[:=]?\s*402\b|^\s*402\s+payment/i,fe=512,ge=/^(?:http\s*)?(\d{3})(?:\s+([\s\S]+))?$/i;var ye=new Set([500,502,503,504,521,522,523,524,529]),he=["insufficient credits","insufficient quota","credit balance","insufficient balance","plans & billing","add more credits","top up"],Ce=["upgrade your plan","upgrade plan","current plan","subscription"],Te=["daily","weekly","monthly"],be=["try again","retry","temporary","cooldown"],ke=["usage limit","rate limit","organization usage"],_e=["organization","workspace"],Re=["billing period","exceeded","reached","exhausted"],xe=/["']?(?: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,Ae=/^(?:error[:\s-]+)?(?:(?:http\s*)?402(?:\s+payment required)?|payment required)(?:[:\s-]+|$)/i;function C(e,t){if(!e)return!1;let n=e.toLowerCase();return t.some(o=>o instanceof RegExp?o.test(n):n.includes(o))}function Se(e){return C(e,h.format)}function U(e){return C(e,h.rateLimit)}function ve(e){return C(e,h.timeout)}function we(e){return pe.test(e)}function v(e){let t=e.toLowerCase();return t?e.length>fe?me.test(t):C(t,h.billing)?!0:de.test(e)?t.includes("upgrade")||t.includes("credits")||t.includes("payment")||t.includes("plan"):!1:!1}function Y(e){return C(e,h.authPermanent)}function Me(e){return C(e,h.auth)}function W(e){return C(e,h.overloaded)}function y(e,t){return t.some(n=>e.includes(n))}function Ee(e){return y(e,he)||y(e,Ce)&&e.includes("limit")||e.includes("billing hard limit")||e.includes("hard limit reached")||e.includes("maximum allowed")&&e.includes("limit")}function Ie(e){let t=y(e,Te),n=e.includes("spend limit")||e.includes("spending limit"),o=y(e,_e);return y(e,be)&&y(e,ke)||t&&(e.includes("usage limit")||n)||t&&e.includes("limit")&&e.includes("reset")||o&&e.includes("limit")&&(n||y(e,Re))}function Le(e){return e.trim().toLowerCase().replace(Ae,"").trim()}function K(e){let t=Le(e);return!t||Ee(t)?"billing":U(t)||Ie(t)?"rate_limit":"billing"}function Oe(e){return xe.test(e)?K(e):null}function J(e){let t=e.match(ge);if(!t)return null;let n=Number(t[1]);return Number.isFinite(n)?{code:n,rest:(t[2]??"").trim()}:null}function Pe(e){if(!e)return!1;let t=e.toLowerCase();return t.includes('"type":"api_error"')&&t.includes("internal server error")}function Fe(e){let t=e.trim();if(!t)return!1;let n=J(t);return n?ye.has(n.code):!1}function V(e,t){return typeof e!="number"||!Number.isFinite(e)?null:e===402?t?K(t):"billing":e===429?"rate_limit":e===401||e===403?t&&Y(t)?"auth_permanent":"auth":e===408?"timeout":e===503?t&&W(t)?"overloaded":"timeout":e===502||e===504?"timeout":e===529?"overloaded":e===400?t&&v(t)?"billing":"format":null}function Ne(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 Be(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 X(e){if(Be(e))return"session_expired";if(Ne(e))return"model_not_found";let t=Oe(e);return t||(we(e)?v(e)?"billing":"rate_limit":U(e)?"rate_limit":W(e)?"overloaded":Fe(e)?J(e.trim())?.code===529?"overloaded":"timeout":Pe(e)?"timeout":Se(e)?"format":v(e)?"billing":ve(e)?"timeout":Y(e)?"auth_permanent":Me(e)?"auth":null)}var De={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"},je=new Set(["RETRYABLE_TRANSIENT","RETRYABLE_DEGRADED","TOOL_EXECUTION_FAILED"]);function $e(e,t){let n=V(e,t)??(t?X(t):null);return n?De[n]:typeof e=="number"&&e>=400&&e<500?"NON_RETRYABLE_CONTENT":"RETRYABLE_TRANSIENT"}function qe(e){return je.has(e)}function B(e){return typeof e.compressAsync=="function"}var Q=4,w=class{constructor(t){this.estimateTokens=t}estimateTokens;compress(t,n){let o=[],r=[];for(let c of t)c.role==="system"?o.push(c):r.push(c);let a=n;for(let c of o)a-=this.estimateTokens(c);let i;for(let c of r)if(c.role==="user"){i=c;break}if(i&&(a-=this.estimateTokens(i)),a<=0)return{messages:i?[...o,i]:o,droppedCount:r.length-(i?1:0),strategy:"sliding-window"};let s=[],l=0;for(let c=r.length-1;c>=0;c--){let d=r[c];if(d===i)continue;let p=this.estimateTokens(d);if(a-p<0&&l>=Q)break;if(a-p<0&&l<Q){s.unshift(d),l++;continue}a-=p,s.unshift(d),l++}let u=[...o];return i&&!s.includes(i)&&u.push(i),u.push(...s),{messages:u,droppedCount:r.length-(s.length+(i&&!s.includes(i)?1:0)),strategy:"sliding-window"}}},M=class{constructor(t,n){this.recentCount=t;this.summarize=n}recentCount;summarize;compress(t,n){let o=t.filter(l=>l.role==="system"),r=t.filter(l=>l.role!=="system");if(r.length<=this.recentCount)return{messages:t,droppedCount:0,strategy:"summarize-old"};let a=r.slice(0,r.length-this.recentCount),i=r.slice(r.length-this.recentCount),s=this.summarize(a);return{messages:[...o,{role:"system",content:`[Conversation summary]
|
|
2
2
|
${s}`},...i],droppedCount:a.length,strategy:"summarize-old"}}},E=class{constructor(t=8e3){this.maxToolResultChars=t}maxToolResultChars;compress(t,n){let o=0;return{messages:t.map(a=>a.role!=="tool"||typeof a.content!="string"||a.content.length<=this.maxToolResultChars?a:(o++,{...a,content:Ge(a.content,this.maxToolResultChars)})),droppedCount:o,strategy:"tool-result-trim"}}};function Ge(e,t){if(e.length<=t)return e;let n=e.slice(0,t);if(e.trimStart().startsWith("{")||e.trimStart().startsWith("[")){let a=Math.max(n.lastIndexOf("},"),n.lastIndexOf("],"),n.lastIndexOf(`}
|
|
3
3
|
`),n.lastIndexOf(`]
|
|
4
4
|
`));if(a>t*.5)return n.slice(0,a+1)+`
|
|
@@ -6,21 +6,24 @@ ${s}`},...i],droppedCount:a.length,strategy:"summarize-old"}}},E=class{construct
|
|
|
6
6
|
`);return r>t*.7?n.slice(0,r)+`
|
|
7
7
|
[...truncated: ${e.length-r} chars omitted]`:n+`
|
|
8
8
|
[...truncated: ${e.length-t} chars omitted]`}function ze(...e){return{compress(t,n){let o=t,r=0,a=[];for(let i of e){let s=i.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"}}}}function He(...e){return{compress(t,n){let o=t,r=0,a=[];for(let i of e){let s=i.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"}},async compressAsync(t,n){let o=t,r=0,a=[],i=0,s=!1,l=!1;for(let u of e){let c=B(u)?await u.compressAsync(o,n):u.compress(o,n);o=c.messages,r+=c.droppedCount,c.droppedCount>0&&a.push(c.strategy),c.metrics&&(i+=c.metrics.latencyMs,s=s||c.metrics.usedLlm,l=l||!!c.metrics.cacheInvalidated)}return{messages:o,droppedCount:r,strategy:a.length>0?a.join("+"):"none",metrics:i>0||s?{tokensBefore:0,tokensAfter:0,compressionRatio:0,latencyMs:i,usedLlm:s,cacheInvalidated:l}:void 0}}}}function D(e,t){let n=e.filter(i=>i.role==="user"),o=e.filter(i=>i.tool_calls!=null),r=e.filter(i=>i.role==="tool"),a=["You are a conversation summarizer. Produce a structured summary of the conversation history below.","","## Instructions","Analyze the conversation and produce a summary with these sections:","","### 1. Primary Objective","What is the user's main goal or task? State it in one sentence.","","### 2. Key Decisions Made","List the important decisions, choices, or conclusions reached during the conversation.","","### 3. Current Progress",`Describe the current state. ${o.length>0?`${o.length} tool calls and ${r.length} tool results were exchanged.`:"No tools were used."}`,"","### 4. Pending Tasks","List any tasks that are in-progress or planned but not yet completed.","","### 5. Important Context","Note any critical facts, constraints, or preferences the user mentioned that must be preserved.","","### 6. Error & Recovery History","Summarize any errors encountered and how they were resolved.","","### 7. User Preferences Expressed",`The user sent ${n.length} messages. Note any stated preferences about style, approach, or constraints.`,"","### 8. Technical State","Note file paths, variable names, API endpoints, or configuration values that were discussed.","","### 9. Conversation Flow","Briefly describe the overall flow: what happened first, what changed, where we are now."];return t?.taskContext&&a.push("","## Additional Context",t.taskContext),a.push("","## Conversation to Summarize","",...e.map(i=>{let s=typeof i.content=="string"?i.content:JSON.stringify(i.content??""),l=i.role==="user"?s:s.length>2e3?s.slice(0,2e3)+"...":s;return`[${i.role}]: ${l}`}),"","## Output Format","Respond with a concise summary covering all 9 sections above. Use markdown headers.","Keep the total summary under 800 words. Focus on actionable information."),a.join(`
|
|
9
|
-
`)}var I=class{config;constructor(t){this.config={protectedHeadExchanges:t.protectedHeadExchanges,protectedTailMessages:t.protectedTailMessages,summarize:t.summarize,estimateTokens:t.estimateTokens??x,taskContext:t.taskContext}}compress(t,n){return{messages:t,droppedCount:0,strategy:"head-tail-protected"}}async compressAsync(t,n){let o=Date.now(),{system:r,nonSystem:a}=ee(t),i=t.reduce((f,g)=>f+this.config.estimateTokens(g),0);if(i<=n)return{messages:t,droppedCount:0,strategy:"head-tail-protected"};let s=0,l=0;for(let f=0;f<a.length&&(a[f].role==="user"&&l++,!(l>this.config.protectedHeadExchanges));f++)s=f+1;let u=Math.max(s,a.length-this.config.protectedTailMessages);if(u<=s)return{messages:t,droppedCount:0,strategy:"head-tail-protected"};let c=a.slice(0,s),d=a.slice(s,u),p=a.slice(u),m=D(d,{taskContext:this.config.taskContext}),T=await this.config.summarize(d,m),
|
|
9
|
+
`)}var I=class{config;constructor(t){this.config={protectedHeadExchanges:t.protectedHeadExchanges,protectedTailMessages:t.protectedTailMessages,summarize:t.summarize,estimateTokens:t.estimateTokens??x,taskContext:t.taskContext}}compress(t,n){return{messages:t,droppedCount:0,strategy:"head-tail-protected"}}async compressAsync(t,n){let o=Date.now(),{system:r,nonSystem:a}=ee(t),i=t.reduce((f,g)=>f+this.config.estimateTokens(g),0);if(i<=n)return{messages:t,droppedCount:0,strategy:"head-tail-protected"};let s=0,l=0;for(let f=0;f<a.length&&(a[f].role==="user"&&l++,!(l>this.config.protectedHeadExchanges));f++)s=f+1;let u=Math.max(s,a.length-this.config.protectedTailMessages);if(u<=s)return{messages:t,droppedCount:0,strategy:"head-tail-protected"};let c=a.slice(0,s),d=a.slice(s,u),p=a.slice(u),m=D(d,{taskContext:this.config.taskContext}),T=await this.config.summarize(d,m),A={role:"system",content:`[Conversation summary \u2014 ${d.length} messages compressed]
|
|
10
10
|
|
|
11
|
-
${T}`},b=[...r,...c,
|
|
11
|
+
${T}`},b=[...r,...c,A,...p],k=Date.now()-o,_=b.reduce((f,g)=>f+this.config.estimateTokens(g),0);return{messages:b,droppedCount:d.length,strategy:"head-tail-protected",metrics:{tokensBefore:i,tokensAfter:_,compressionRatio:i>0?_/i:1,latencyMs:k,usedLlm:!0,cacheInvalidated:!0}}}},L=class{config;constructor(t){this.config={preserveRecentCount:t.preserveRecentCount,summarize:t.summarize,estimateTokens:t.estimateTokens??x}}compress(t,n){return{messages:t,droppedCount:0,strategy:"incremental-compact"}}async compressAsync(t,n){let o=Date.now(),{system:r,nonSystem:a}=ee(t),i=r.findIndex(g=>typeof g.content=="string"&&g.content.startsWith("[Conversation summary")),s=i>=0?r[i]:void 0,l=i>=0?[...r.slice(0,i),...r.slice(i+1)]:r,u=Math.max(0,a.length-this.config.preserveRecentCount);if(u<=0)return{messages:t,droppedCount:0,strategy:"incremental-compact"};let c=t.reduce((g,S)=>g+this.config.estimateTokens(S),0);if(c<=n)return{messages:t,droppedCount:0,strategy:"incremental-compact"};let d=a.slice(0,u),p=a.slice(u),m=s&&typeof s.content=="string"?`Previous summary:
|
|
12
12
|
${s.content}
|
|
13
13
|
|
|
14
|
-
New messages to integrate:`:void 0,T=D(d,{taskContext:m}),
|
|
14
|
+
New messages to integrate:`:void 0,T=D(d,{taskContext:m}),A=await this.config.summarize(d,T),b={role:"system",content:`[Conversation summary \u2014 ${d.length} messages compressed]
|
|
15
15
|
|
|
16
|
-
${
|
|
16
|
+
${A}`},k=[...l,b,...p],_=Date.now()-o,f=k.reduce((g,S)=>g+this.config.estimateTokens(S),0);return{messages:k,droppedCount:d.length,strategy:"incremental-compact",metrics:{tokensBefore:c,tokensAfter:f,compressionRatio:c>0?f/c:1,latencyMs:_,usedLlm:!0,cacheInvalidated:!0}}}},O=class{config;constructor(t){this.config=t}compress(t,n){let o=R(t),r=this.config.inner.compress(t,n),a=R(r.messages),i=o!==a&&r.droppedCount>0;return i&&this.config.onCacheInvalidated?.({droppedCount:r.droppedCount,strategy:r.strategy}),{...r,metrics:{...r.metrics??{tokensBefore:0,tokensAfter:0,compressionRatio:0,latencyMs:0,usedLlm:!1},cacheInvalidated:i}}}async compressAsync(t,n){let o=R(t),r=B(this.config.inner)?await this.config.inner.compressAsync(t,n):this.config.inner.compress(t,n),a=R(r.messages),i=o!==a&&r.droppedCount>0;return i&&this.config.onCacheInvalidated?.({droppedCount:r.droppedCount,strategy:r.strategy}),{...r,metrics:{...r.metrics??{tokensBefore:0,tokensAfter:0,compressionRatio:0,latencyMs:0,usedLlm:!1},cacheInvalidated:i}}}},Z={modelContextWindow:128e3,targetUsageRatio:.75,minBudget:16e3,maxBudget:12e4};function Ue(e={}){let t={...Z,...e},n=Math.floor(t.modelContextWindow*t.targetUsageRatio);return Math.max(t.minBudget,Math.min(n,t.maxBudget))}function Ye(e,t){let n=e/t;return n<=.8?"none":n<=1?"trim-only":n<=1.5?"sliding-window":"llm-summarize"}var P=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,i=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&&i++;return{totalCompressions:t,totalLlmCalls:a,totalCacheInvalidations:i,averageCompressionRatio:n/t,averageLatencyMs:o/t,totalTokensSaved:r,recentEvents:this.events.slice(-10)}}reset(){this.events.length=0}},F=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 ee(e){let t=[],n=[];for(let o of e)o.role==="system"?t.push(o):n.push(o);return{system:t,nonSystem:n}}function x(e){let t=typeof e.content=="string"?e.content:e.content!=null?JSON.stringify(e.content):"";return Math.ceil(t.length/4)}function R(e){let t=Math.min(e.length,5),n=[];for(let o=0;o<t;o++){let r=e[o],a=typeof r.content=="string"?r.content.slice(0,200):"";n.push(`${r.role}:${a}`)}return n.join("|")}var We=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"]),N=class{constructor(t=20,n=x){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,l)=>{if(l>=o||s.role!=="tool"||typeof s.content!="string"||!s.name||!We.has(s.name)||s.content.length<=200)return s;let u=this.estimateTokens(s);return a+=u,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 Ke(e){let t=new Map;for(let n=0;n<e.length;n++){let o=e[n];if(o.tool_calls&&Array.isArray(o.tool_calls))for(let r of o.tool_calls){let a=r.function?.name??"";if(/read|edit|write|file/i.test(a)&&r.function?.arguments)try{let i=JSON.parse(r.function.arguments),s=i.path??i.filePath??i.file_path??i.file;s&&typeof s=="string"&&t.set(s,n)}catch{}}o.role==="tool"&&o.name&&/read|edit|write|file/i.test(o.name)}return[...t.entries()].sort((n,o)=>o[1]-n[1]).map(([n])=>n)}async function Je(e,t,n){let o=n.estimateTokens??(p=>Math.ceil(p.length/4)),r=Ke(t);if(r.length===0)return e;let a=e.map(p=>typeof p.content=="string"?p.content:"").join(`
|
|
17
17
|
`),i=r.filter(p=>!a.includes(p));if(i.length===0)return e;let s=n.maxTokenBudget,l=[],u=0;for(let p of i){if(u>=n.maxFiles||s<=0)break;let m=await n.readFile(p);if(!m)continue;let T=o(m);T>s||(s-=T,u++,l.push({role:"system",content:`[Post-compact file recovery: ${p}]
|
|
18
18
|
|
|
19
|
-
${m}`}))}if(l.length===0)return e;let c=[...e],d=-1;for(let p=0;p<c.length;p++)c[p].role==="system"&&(d=p);return c.splice(d+1,0,...l),c}function Ve(e,t,n=x){if(t.size===0)return{messages:e,tokensFreed:0,removedCount:0};let o=0,r=0,a=[];for(let s of e){let l=s.tool_call_id??"";if(l&&t.has(l)){o+=n(s),r++,t.delete(l);continue}a.push(s)}let i=r>0?{role:"system",content:`[${r} messages removed by snip]`}:void 0;return{messages:a,tokensFreed:o,removedCount:r,boundaryMessage:i}}function Xe(){return{stages:[]}}function Qe(e,t,n){let o=n?.thresholdMessages??40;if(e.filter(s=>s.role!=="system").length<=o)return{messages:e,stagedCount:0};let a=te(e,t),i=et(a,t,o);if(i.length===0)return{messages:a,stagedCount:0};for(let s of i)t.stages.push(s);return a=te(e,t),{messages:a,stagedCount:i.length}}function Ze(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:ne(e,t),committed:n}}function te(e,t){return t.stages.filter(o=>o.committed).length===0?e:ne(e,t)}function ne(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,i]=r.range;if(a>=o.length)continue;let s=Math.min(i,o.length),l={role:"system",content:r.summary};o.splice(a,s-a,l)}return o}function et(e,t,n){let o=Math.max(0,e.length-Math.floor(n/2)),r=[],a=new Set(t.stages.map(l=>`${l.range[0]}-${l.range[1]}`)),i=-1,s=0;for(let l=0;l<o;l++){let u=e[l];if(u.role==="tool"||u.role==="assistant"&&typeof u.content=="string"&&u.content==="")i<0&&(i=l),s++;else{if(s>=3){let d=`${i}-${i+s}`;a.has(d)||r.push({id:`collapse_${i}_${i+s}`,range:[i,i+s],summary:`[${s} tool results collapsed]`,committed:!1})}i=-1,s=0}}if(s>=3){let l=`${i}-${i+s}`;a.has(l)||r.push({id:`collapse_${i}_${i+s}`,range:[i,i+s],summary:`[${s} tool results collapsed]`,committed:!1})}return r}function tt(e){return!(!e.ok||e.existingSkillName||!e.multiStep||e.toolCallCount<3||e.distinctToolCount<2)}function nt(e){return e.existingSkillName?e.feedback==="negative":!1}function ot(e,t){return nt(e)?{type:"skill.improve",skillName:e.existingSkillName,reason:"negative user feedback on existing skill execution"}:tt(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 oe(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 rt(e){return e==="enabled-eligible"||e==="installed-awaiting-approval"}function st(e){return new Map((e??[]).map(t=>[t.toolName,t]))}function it(e){if(!e.eligibility?.length)return[...e.tools];let t=st(e.eligibility);return e.tools.filter(n=>{let o=oe(n);if(!o)return!1;let r=t.get(o);return!r||rt(r.status)})}function at(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 lt(e){let t=at({toolChoice:e.toolChoice,thinkingEnabled:e.thinkingEnabled,compatibility:e.compatibility}),n=t.normalizedToolChoice,o=[...t.warnings],r=it({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,i=typeof a?.name=="string"?a.name.trim():"";if(!i)throw new Error("tool_choice.function.name is required");let s=r.filter(l=>oe(l)===i);if(s.length===0)throw new Error(`tool_choice requested unknown tool: ${i}`);return{tools:s,normalizedToolChoice:{type:"function",function:{name:i}},extraSystemPrompt:`You must call the ${i} tool before responding.`,warnings:o}}return{tools:r,normalizedToolChoice:n,warnings:o}}var ct=["stop","aborted","timeout","cancelled","interrupted","error"],ut=["tool_calls","toolCalls","function_call","functionCall","raw_tool_calls","rawToolCalls"];function re(e){return e==null?[]:typeof e=="string"?e.length>0?[{type:"text",text:e}]:[]:Array.isArray(e)?e:[{type:"text",text:String(e)}]}function pt(e,t){return{...e,content:[...re(e.content),...re(t.content)]}}function dt(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 mt(e){return new Set((e??ct).map(t=>t.trim().toLowerCase()))}function se(e,t){return e?mt(t).has(e.trim().toLowerCase()):!1}function ft(e){let t=e.indexOf("|");return t<=0||t>=e.length-1?{callId:e}:{callId:e.slice(0,t),itemId:e.slice(t+1)}}function j(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 l=s.tool_calls.filter(u=>dt(u));return{...s,...l.length>0?{tool_calls:l}:{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 l of s.tool_calls)typeof l.id=="string"&&l.id&&n.add(l.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 l=s.tool_calls.filter(u=>typeof u.id=="string"&&r.has(u.id));if(l.length===0){let{tool_calls:u,...c}=s;c.content!=null&&c.content!==""&&a.push(c);continue}if(l.length<s.tool_calls.length){a.push({...s,tool_calls:l});continue}}a.push(s)}let i=[];for(let s of a){let l=i.length>0?i[i.length-1]:void 0;if(s.role==="user"&&l?.role==="user"){i[i.length-1]=pt(l,s);continue}i.push(s)}return i}function $(e,t){return se(t?.stopReason,t?.forcedStopReasons)?e.map(n=>{if(n.role!=="assistant")return{...n};let o={...n};for(let r of ut)delete o[r];return o}):[...e]}function q(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 i of a.tool_calls)typeof i.id!="string"||!i.id||o.has(i.id)||(o.add(i.id),r.push({role:"tool",tool_call_id:i.id,content:n}));return r}function gt(e,t){let n=j(e),o=$(n,t);return q(o,t)}function ie(e,t){let n=t?.placeholderFunctionCallOutput??"Error: Tool loop interrupted before function_call_output was provided.",o=se(t?.stopReason,t?.forcedStopReasons),r=[];for(let u=0;u<e.length;u+=1){let c=e[u];if(!c||typeof c!="object"){r.push(c);continue}if(c.type==="reasoning"&&typeof c.id=="string"&&c.id.startsWith("rs_")&&!e.slice(u+1).some(m=>m&&typeof m=="object"&&m.type!=="reasoning"))continue;if(c.type!=="function_call"){r.push({...c});continue}let d={...c};if(typeof d.id=="string"){let p=ft(d.id);p.itemId?.startsWith("fc_")&&(d.id=p.callId)}r.push(d)}let a=new Set,i=new Map;for(let u of r){if(u.type!=="function_call")continue;let c=typeof u.call_id=="string"&&u.call_id?u.call_id:typeof u.id=="string"?u.id:void 0;c&&(a.add(c),i.set(c,u))}let s=new Set,l=[];for(let u of r)if(!(o&&u.type==="function_call")){if(u.type==="function_call_output"){let c=typeof u.call_id=="string"?u.call_id:"";if(!c||!a.has(c))continue;s.add(c)}l.push(u)}for(let[u]of i)s.has(u)||o||l.push({type:"function_call_output",call_id:u,output:n});return l}function yt(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 ht(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 Ct(e){let t=new Set,n=new Set;for(let o of e){if(o.type==="function_call"){let r=typeof o.call_id=="string"&&o.call_id?o.call_id:typeof o.id=="string"?o.id:"";r&&t.add(r)}o.type==="function_call_output"&&typeof o.call_id=="string"&&o.call_id&&n.add(o.call_id)}return[...t].filter(o=>!n.has(o))}function Tt(e){let t=new Set;for(let n of e)n.type==="function_call_output"&&typeof n.call_id=="string"&&n.call_id&&t.add(n.call_id);return[...t]}function ae(e){return{round:e.round??0,maxRounds:e.maxRounds,pendingToolCallIds:[...e.pendingToolCallIds??[]],completedToolCallIds:[...e.completedToolCallIds??[]],lastStopReason:e.lastStopReason,replayMessages:[...e.replayMessages??[]]}}function bt(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 kt(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 _t(e){let t=[],n=j(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=$(n,e.options);o.some((a,i)=>a!==n[i])&&t.push({kind:"strip-forced-stop-tool-metadata",detail:"Removed assistant tool-call metadata after forced stop."});let r=q(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:ae({maxRounds:e.maxRounds,round:e.round,lastStopReason:e.lastStopReason,replayMessages:r,pendingToolCallIds:yt(r),completedToolCallIds:ht(r)}),recoveryActions:t}}function Rt(e){let t=ie(e.replayItems,e.options),n=[];return t.length!==e.replayItems.length&&n.push({kind:"drop-trailing-reasoning",detail:"Dropped dangling reasoning blocks or injected missing function_call_output items."}),t.some((o,r)=>o!==e.replayItems[r]&&o.type==="function_call")&&n.push({kind:"rewrite-openai-function-call-pair",detail:"Rewrote OpenAI function_call pairing ids for replay compatibility."}),{state:ae({maxRounds:e.maxRounds,round:e.round,lastStopReason:e.lastStopReason,replayMessages:t,pendingToolCallIds:Ct(t),completedToolCallIds:Tt(t)}),recoveryActions:n}}var xt=new Set(["main","sdk","agent","compact","hook","verification","side_question"]);function St(e){return e?xt.has(e):!0}function At(e){return e===429||e===529}function vt(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 yn={maxBackoffMs:300*1e3,resetCapMs:360*60*1e3,heartbeatIntervalMs:3e4};function Mt(){let e=process.env.QLOGICAGENT_PERSISTENT_RETRY;return e==="1"||e==="true"}var G=class extends Error{constructor(n,o){super(`Model fallback triggered: ${n} -> ${o}`);this.originalModel=n;this.fallbackModel=o;this.name="FallbackTriggeredError"}originalModel;fallbackModel};var z="<fork-child-context>",le="Fork started \u2014 processing in background",wt=4;function Et(e){return JSON.stringify(e).includes(z)}function It(e){return e<4}function Lt(e,t){let n=[...e.parentMessages],o={role:"user",content:[{type:"text",text:`${z}
|
|
19
|
+
${m}`}))}if(l.length===0)return e;let c=[...e],d=-1;for(let p=0;p<c.length;p++)c[p].role==="system"&&(d=p);return c.splice(d+1,0,...l),c}function Ve(e,t,n=x){if(t.size===0)return{messages:e,tokensFreed:0,removedCount:0};let o=0,r=0,a=[];for(let s of e){let l=s.tool_call_id??"";if(l&&t.has(l)){o+=n(s),r++,t.delete(l);continue}a.push(s)}let i=r>0?{role:"system",content:`[${r} messages removed by snip]`}:void 0;return{messages:a,tokensFreed:o,removedCount:r,boundaryMessage:i}}function Xe(){return{stages:[]}}function Qe(e,t,n){let o=n?.thresholdMessages??40;if(e.filter(s=>s.role!=="system").length<=o)return{messages:e,stagedCount:0};let a=te(e,t),i=et(a,t,o);if(i.length===0)return{messages:a,stagedCount:0};for(let s of i)t.stages.push(s);return a=te(e,t),{messages:a,stagedCount:i.length}}function Ze(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:ne(e,t),committed:n}}function te(e,t){return t.stages.filter(o=>o.committed).length===0?e:ne(e,t)}function ne(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,i]=r.range;if(a>=o.length)continue;let s=Math.min(i,o.length),l={role:"system",content:r.summary};o.splice(a,s-a,l)}return o}function et(e,t,n){let o=Math.max(0,e.length-Math.floor(n/2)),r=[],a=new Set(t.stages.map(l=>`${l.range[0]}-${l.range[1]}`)),i=-1,s=0;for(let l=0;l<o;l++){let u=e[l];if(u.role==="tool"||u.role==="assistant"&&typeof u.content=="string"&&u.content==="")i<0&&(i=l),s++;else{if(s>=3){let d=`${i}-${i+s}`;a.has(d)||r.push({id:`collapse_${i}_${i+s}`,range:[i,i+s],summary:`[${s} tool results collapsed]`,committed:!1})}i=-1,s=0}}if(s>=3){let l=`${i}-${i+s}`;a.has(l)||r.push({id:`collapse_${i}_${i+s}`,range:[i,i+s],summary:`[${s} tool results collapsed]`,committed:!1})}return r}function tt(e){return!(!e.ok||e.existingSkillName||!e.multiStep||e.toolCallCount<3||e.distinctToolCount<2)}function nt(e){return e.existingSkillName?e.feedback==="negative":!1}function ot(e,t){return nt(e)?{type:"skill.improve",skillName:e.existingSkillName,reason:"negative user feedback on existing skill execution"}:tt(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 oe(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 rt(e){return e==="enabled-eligible"||e==="installed-awaiting-approval"}function st(e){return new Map((e??[]).map(t=>[t.toolName,t]))}function it(e){if(!e.eligibility?.length)return[...e.tools];let t=st(e.eligibility);return e.tools.filter(n=>{let o=oe(n);if(!o)return!1;let r=t.get(o);return!r||rt(r.status)})}function at(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 lt(e){let t=at({toolChoice:e.toolChoice,thinkingEnabled:e.thinkingEnabled,compatibility:e.compatibility}),n=t.normalizedToolChoice,o=[...t.warnings],r=it({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,i=typeof a?.name=="string"?a.name.trim():"";if(!i)throw new Error("tool_choice.function.name is required");let s=r.filter(l=>oe(l)===i);if(s.length===0)throw new Error(`tool_choice requested unknown tool: ${i}`);return{tools:s,normalizedToolChoice:{type:"function",function:{name:i}},extraSystemPrompt:`You must call the ${i} tool before responding.`,warnings:o}}return{tools:r,normalizedToolChoice:n,warnings:o}}var ct=["stop","aborted","timeout","cancelled","interrupted","error"],ut=["tool_calls","toolCalls","function_call","functionCall","raw_tool_calls","rawToolCalls"];function re(e){return e==null?[]:typeof e=="string"?e.length>0?[{type:"text",text:e}]:[]:Array.isArray(e)?e:[{type:"text",text:String(e)}]}function pt(e,t){return{...e,content:[...re(e.content),...re(t.content)]}}function dt(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 mt(e){return new Set((e??ct).map(t=>t.trim().toLowerCase()))}function se(e,t){return e?mt(t).has(e.trim().toLowerCase()):!1}function ft(e){let t=e.indexOf("|");return t<=0||t>=e.length-1?{callId:e}:{callId:e.slice(0,t),itemId:e.slice(t+1)}}function j(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 l=s.tool_calls.filter(u=>dt(u));return{...s,...l.length>0?{tool_calls:l}:{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 l of s.tool_calls)typeof l.id=="string"&&l.id&&n.add(l.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 l=s.tool_calls.filter(u=>typeof u.id=="string"&&r.has(u.id));if(l.length===0){let{tool_calls:u,...c}=s;c.content!=null&&c.content!==""&&a.push(c);continue}if(l.length<s.tool_calls.length){a.push({...s,tool_calls:l});continue}}a.push(s)}let i=[];for(let s of a){let l=i.length>0?i[i.length-1]:void 0;if(s.role==="user"&&l?.role==="user"){i[i.length-1]=pt(l,s);continue}i.push(s)}return i}function $(e,t){return se(t?.stopReason,t?.forcedStopReasons)?e.map(n=>{if(n.role!=="assistant")return{...n};let o={...n};for(let r of ut)delete o[r];return o}):[...e]}function q(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 i of a.tool_calls)typeof i.id!="string"||!i.id||o.has(i.id)||(o.add(i.id),r.push({role:"tool",tool_call_id:i.id,content:n}));return r}function gt(e,t){let n=j(e),o=$(n,t);return q(o,t)}function ie(e,t){let n=t?.placeholderFunctionCallOutput??"Error: Tool loop interrupted before function_call_output was provided.",o=se(t?.stopReason,t?.forcedStopReasons),r=[];for(let u=0;u<e.length;u+=1){let c=e[u];if(!c||typeof c!="object"){r.push(c);continue}if(c.type==="reasoning"&&typeof c.id=="string"&&c.id.startsWith("rs_")&&!e.slice(u+1).some(m=>m&&typeof m=="object"&&m.type!=="reasoning"))continue;if(c.type!=="function_call"){r.push({...c});continue}let d={...c};if(typeof d.id=="string"){let p=ft(d.id);p.itemId?.startsWith("fc_")&&(d.id=p.callId)}r.push(d)}let a=new Set,i=new Map;for(let u of r){if(u.type!=="function_call")continue;let c=typeof u.call_id=="string"&&u.call_id?u.call_id:typeof u.id=="string"?u.id:void 0;c&&(a.add(c),i.set(c,u))}let s=new Set,l=[];for(let u of r)if(!(o&&u.type==="function_call")){if(u.type==="function_call_output"){let c=typeof u.call_id=="string"?u.call_id:"";if(!c||!a.has(c))continue;s.add(c)}l.push(u)}for(let[u]of i)s.has(u)||o||l.push({type:"function_call_output",call_id:u,output:n});return l}function yt(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 ht(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 Ct(e){let t=new Set,n=new Set;for(let o of e){if(o.type==="function_call"){let r=typeof o.call_id=="string"&&o.call_id?o.call_id:typeof o.id=="string"?o.id:"";r&&t.add(r)}o.type==="function_call_output"&&typeof o.call_id=="string"&&o.call_id&&n.add(o.call_id)}return[...t].filter(o=>!n.has(o))}function Tt(e){let t=new Set;for(let n of e)n.type==="function_call_output"&&typeof n.call_id=="string"&&n.call_id&&t.add(n.call_id);return[...t]}function ae(e){return{round:e.round??0,maxRounds:e.maxRounds,pendingToolCallIds:[...e.pendingToolCallIds??[]],completedToolCallIds:[...e.completedToolCallIds??[]],lastStopReason:e.lastStopReason,replayMessages:[...e.replayMessages??[]]}}function bt(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 kt(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 _t(e){let t=[],n=j(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=$(n,e.options);o.some((a,i)=>a!==n[i])&&t.push({kind:"strip-forced-stop-tool-metadata",detail:"Removed assistant tool-call metadata after forced stop."});let r=q(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:ae({maxRounds:e.maxRounds,round:e.round,lastStopReason:e.lastStopReason,replayMessages:r,pendingToolCallIds:yt(r),completedToolCallIds:ht(r)}),recoveryActions:t}}function Rt(e){let t=ie(e.replayItems,e.options),n=[];return t.length!==e.replayItems.length&&n.push({kind:"drop-trailing-reasoning",detail:"Dropped dangling reasoning blocks or injected missing function_call_output items."}),t.some((o,r)=>o!==e.replayItems[r]&&o.type==="function_call")&&n.push({kind:"rewrite-openai-function-call-pair",detail:"Rewrote OpenAI function_call pairing ids for replay compatibility."}),{state:ae({maxRounds:e.maxRounds,round:e.round,lastStopReason:e.lastStopReason,replayMessages:t,pendingToolCallIds:Ct(t),completedToolCallIds:Tt(t)}),recoveryActions:n}}var xt=new Set(["main","sdk","agent","compact","hook","verification","side_question"]);function At(e){return e?xt.has(e):!0}function St(e){return e===429||e===529}function vt(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 Tn={maxBackoffMs:300*1e3,resetCapMs:360*60*1e3,heartbeatIntervalMs:3e4};function wt(){let e=process.env.QLOGICAGENT_PERSISTENT_RETRY;return e==="1"||e==="true"}var G=class extends Error{constructor(n,o){super(`Model fallback triggered: ${n} -> ${o}`);this.originalModel=n;this.fallbackModel=o;this.name="FallbackTriggeredError"}originalModel;fallbackModel};var z="<fork-child-context>",le="Fork started \u2014 processing in background",Mt=4;function Et(e){return JSON.stringify(e).includes(z)}function It(e){return e<4}function Lt(e,t){let n=[...e.parentMessages],o=e.worktreePath?`
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
Your working directory is: ${e.worktreePath}
|
|
22
|
+
All file paths should be relative to this directory.`:"",r={role:"user",content:[{type:"text",text:`${z}
|
|
22
23
|
|
|
23
|
-
|
|
24
|
+
You are the "${t.agent.name}" agent.${o}
|
|
25
|
+
|
|
26
|
+
${t.taskPrompt}`}]};return n.push(r),n}function Ot(e){return e.map(t=>({role:"tool",tool_call_id:t,content:le}))}function Pt(e,t){if(t.allowedTools&&t.allowedTools.length>0){let n=new Set(t.allowedTools);return e.filter(o=>n.has(o))}if(t.toolAccessMode==="none")return[];if(t.toolAccessMode==="read-only"){let n=new Set(["file_edit","create_file","write_file","replace_string_in_file","multi_replace_string_in_file","create_directory","delete_file","rename_file","move_file","exec","run_in_terminal","run_command","git_commit","git_push","patch"]);return e.filter(o=>!n.has(o))}return t.canFork?[...e]:e.filter(n=>n!=="agent")}function Ft(e,t,n){let o=Date.now().toString(36);return`${e}:fork:${t}:d${n}:${o}`}var Nt={name:"general",label:"General Purpose",description:"A general-purpose sub-agent that can perform any task with full tool access.",maxTurns:200,toolAccessMode:"full",canFork:!1},Bt={name:"explore",label:"Explore",description:"Fast read-only codebase exploration. Search files, read code, analyze structure. Cannot write or execute.",maxTurns:50,toolAccessMode:"read-only",allowedTools:["read_file","search","web_search","web_fetch","think","memory","tool_search"],canFork:!1},Dt={name:"plan",label:"Plan",description:"Planning mode. Explore, analyze, and produce a structured plan. Cannot write files or execute commands.",maxTurns:80,toolAccessMode:"read-only",allowedTools:["read_file","search","web_search","web_fetch","think","memory","todo","tool_search"],canFork:!1},jt={name:"code",label:"Code",description:"A coding sub-agent with full tool access for implementation tasks.",maxTurns:200,toolAccessMode:"full",canFork:!0},$t={name:"research",label:"Research",description:"Web research and information gathering. Searches the web, fetches pages, and synthesizes findings.",maxTurns:30,toolAccessMode:"read-only",allowedTools:["web_search","web_fetch","read_file","search","think","memory"],canFork:!1},qt={name:"verify",label:"Verify",description:"Verification agent. Runs tests, checks build output, validates changes are correct.",maxTurns:40,toolAccessMode:"full",allowedTools:["exec","read_file","search","think"],canFork:!1},H=[Nt,Bt,Dt,jt,$t,qt];function Gt(){return[...H]}function zt(e){return H.find(t=>t.name===e)}function Ht(e){return H.some(t=>t.name===e)}function Ut(e,t){if(e.allowedTools&&e.allowedTools.length>0){let n=new Set(e.allowedTools);return t.filter(o=>n.has(o))}if(e.toolAccessMode==="none")return[];if(e.toolAccessMode==="read-only"){let n=new Set(["file_edit","create_file","write_file","replace_string_in_file","multi_replace_string_in_file","create_directory","delete_file","rename_file","move_file","exec","run_in_terminal","run_command","git_commit","git_push","patch"]);return t.filter(o=>!n.has(o))}return e.canFork?[...t]:t.filter(n=>n!=="agent_tool"&&n!=="team_create")}var Yt=new Set(["agent_tool","team_create","fork_agent","send_message"]);function Wt(e,t){switch(e){case"worker":return t.filter(n=>!Yt.has(n));case"coordinator":return[...t];default:return[...t]}}function Kt(e){return{permissionRole:"worker",isolation:"shared",lifecycle:"pending",depth:0,maxTurns:200,tokenBudget:0,startedAt:Date.now(),...e}}function Jt(e){return{promptTokens:0,hasAttemptedReactiveCompact:!1,currentMaxOutputTokens:e.maxOutputTokens,consecutiveTruncations:0,aborted:e.abortSignal?.aborted??!1}}function Vt(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 Xt(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 Qt(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 Zt(e,t){return e.aborted?!0:t.abortSignal?.aborted?(e.aborted=!0,!0):!1}var en={maxConsecutiveFailures:3,minMessagesAfterCompact:4,targetUsagePercent:50};function tn(e){let t=[];if(e.todoList&&e.todoList.length>0){let n=e.todoList.map(o=>` ${o.status==="completed"?"[x]":o.status==="in-progress"?"[~]":"[ ]"} #${o.id}: ${o.title}`);t.push(`## Active Todo List
|
|
24
27
|
${n.join(`
|
|
25
28
|
`)}`)}if(e.activeSkillContext&&t.push(`## Active Skill: ${e.activeSkillContext.name}
|
|
26
29
|
Step ${e.activeSkillContext.step}:
|
|
@@ -31,4 +34,4 @@ ${n.content}`);return t.length===0?null:`[Context was compressed. The following
|
|
|
31
34
|
|
|
32
35
|
${t.join(`
|
|
33
36
|
|
|
34
|
-
`)}`}function nn(){return{consecutiveFailures:0,attemptedThisTurn:!1,lastCompactAt:null,toolsAtLastCompact:[]}}function on(e,t=en){return!(e.attemptedThisTurn||e.consecutiveFailures>=t.maxConsecutiveFailures)}export{O as CacheAwareCompressionStrategy,P as CompressionMetricsCollector,F as ContextEngineRegistry,Z as DEFAULT_ADAPTIVE_BUDGET_CONFIG,le as FORK_PLACEHOLDER_RESULT,z as FORK_SENTINEL_TAG,G as FallbackTriggeredError,I as HeadTailProtectedStrategy,L as IncrementalCompactStrategy,
|
|
37
|
+
`)}`}function nn(){return{consecutiveFailures:0,attemptedThisTurn:!1,lastCompactAt:null,toolsAtLastCompact:[]}}function on(e,t=en){return!(e.attemptedThisTurn||e.consecutiveFailures>=t.maxConsecutiveFailures)}export{O as CacheAwareCompressionStrategy,P as CompressionMetricsCollector,F as ContextEngineRegistry,Z as DEFAULT_ADAPTIVE_BUDGET_CONFIG,le as FORK_PLACEHOLDER_RESULT,z as FORK_SENTINEL_TAG,G as FallbackTriggeredError,I as HeadTailProtectedStrategy,L as IncrementalCompactStrategy,Mt as MAX_FORK_DEPTH,N as MicroCompactStrategy,w as SlidingWindowStrategy,M as SummarizeOldStrategy,E as ToolResultTrimStrategy,bt as advanceToolLoopState,Qe as applyContextCollapsesIfNeeded,lt as applyToolChoicePolicy,ce as buildAssistantToolCallMessage,Ot as buildForkPlaceholderResults,Lt as buildForkedMessages,tn as buildPostCompactRestorationMessage,ot as buildSkillInstruction,D as buildStructuredSummaryPrompt,ue as buildToolResultMessage,Vt as calculateTokenWarningState,It as canForkAtDepth,$e as classifyError,He as composeAsyncStrategies,ze as composeStrategies,Ue as computeAdaptiveBudget,vt as computeRetryBackoff,Xe as createCollapseStore,nn as createReactiveCompactState,Kt as createTaskState,Jt as createTurnLoopGuardState,Wt as filterToolsByRole,Ft as generateForkChildAgentId,zt as getBuiltInAgent,Gt as getBuiltInAgents,B as isAsyncCompressionStrategy,Ht as isBuiltInAgent,At as isForegroundSource,Et as isInForkChild,wt as isPersistentRetryEnabled,qe as isRetryableCategory,St as isTransientCapacityError,Je as postCompactFileRecovery,Ze as recoverContextCollapseFromOverflow,_t as recoverToolLoopStateFromChatConversation,Rt as recoverToolLoopStateFromResponsesItems,gt as repairOpenAiChatConversation,Ut as resolveAgentToolSet,Xt as resolveApiErrorRecovery,Pt as resolveForkChildTools,Qt as resolveOutputTokenEscalation,Ye as selectCompressionTier,kt as settleToolLoopState,Zt as shouldAbortTurn,on as shouldAttemptReactiveCompact,Ve as snipCompactIfNeeded};
|
|
@@ -80,6 +80,28 @@ export interface ToolLoopParams {
|
|
|
80
80
|
maxConcurrentTools?: number;
|
|
81
81
|
/** Model requires streaming — disable non-streaming fallback. */
|
|
82
82
|
streamRequired?: boolean;
|
|
83
|
+
/** Reasoning effort for models that support it. */
|
|
84
|
+
reasoning?: {
|
|
85
|
+
effort: "minimal" | "low" | "medium" | "high" | "xhigh";
|
|
86
|
+
includeEncryptedReasoning?: boolean;
|
|
87
|
+
};
|
|
88
|
+
/** Prompt cache bucketing key. */
|
|
89
|
+
promptCacheKey?: string;
|
|
90
|
+
/** Prompt cache retention policy. */
|
|
91
|
+
promptCacheRetention?: "in_memory" | "24h";
|
|
92
|
+
/** Service tier scheduling. */
|
|
93
|
+
serviceTier?: "auto" | "default" | "flex" | "priority";
|
|
94
|
+
/** OpenAI Responses API built-in tools. */
|
|
95
|
+
openaiBuiltinTools?: Array<{
|
|
96
|
+
type: "web_search_preview" | "file_search" | "code_interpreter" | "computer_use_preview";
|
|
97
|
+
[key: string]: unknown;
|
|
98
|
+
}>;
|
|
99
|
+
/** Max builtin tool calls per turn. */
|
|
100
|
+
maxToolCalls?: number;
|
|
101
|
+
/** Disable parallel tool calling. */
|
|
102
|
+
parallelToolCalls?: boolean;
|
|
103
|
+
/** Text output verbosity hint. */
|
|
104
|
+
textVerbosity?: "low" | "medium" | "high";
|
|
83
105
|
signal?: AbortSignal;
|
|
84
106
|
}
|
|
85
107
|
/**
|
|
@@ -195,6 +195,28 @@ export interface TurnConfig {
|
|
|
195
195
|
maxConcurrentTools?: number;
|
|
196
196
|
/** Model requires streaming — disable non-streaming fallback. */
|
|
197
197
|
streamRequired?: boolean;
|
|
198
|
+
/** Reasoning effort for models that support it (GPT-5.x, o-series). */
|
|
199
|
+
reasoning?: {
|
|
200
|
+
effort: "minimal" | "low" | "medium" | "high" | "xhigh";
|
|
201
|
+
includeEncryptedReasoning?: boolean;
|
|
202
|
+
};
|
|
203
|
+
/** Prompt cache bucketing key (replaces deprecated `user` field). */
|
|
204
|
+
promptCacheKey?: string;
|
|
205
|
+
/** Prompt cache retention: "in_memory" (5-10min) or "24h". */
|
|
206
|
+
promptCacheRetention?: "in_memory" | "24h";
|
|
207
|
+
/** Service tier: "auto", "default", "flex" (50% cheaper), "priority". */
|
|
208
|
+
serviceTier?: "auto" | "default" | "flex" | "priority";
|
|
209
|
+
/** OpenAI Responses API built-in tools to inject. */
|
|
210
|
+
openaiBuiltinTools?: Array<{
|
|
211
|
+
type: "web_search_preview" | "file_search" | "code_interpreter" | "computer_use_preview";
|
|
212
|
+
[key: string]: unknown;
|
|
213
|
+
}>;
|
|
214
|
+
/** Max builtin tool calls per turn (shared across all builtin tools). */
|
|
215
|
+
maxToolCalls?: number;
|
|
216
|
+
/** Disable parallel tool calling (force sequential). */
|
|
217
|
+
parallelToolCalls?: boolean;
|
|
218
|
+
/** Text output verbosity hint: "low", "medium", "high". */
|
|
219
|
+
textVerbosity?: "low" | "medium" | "high";
|
|
198
220
|
/**
|
|
199
221
|
* User-designated provider+model per media category.
|
|
200
222
|
* Each entry maps a media type (image/video/music/tts/3d/...) to
|
|
@@ -293,6 +315,7 @@ export type TurnEvent = {
|
|
|
293
315
|
mimeType?: string;
|
|
294
316
|
billingUnit?: string;
|
|
295
317
|
billingQuantity?: number;
|
|
318
|
+
taskId?: string;
|
|
296
319
|
} | {
|
|
297
320
|
type: "artifact";
|
|
298
321
|
turnId: string;
|
|
@@ -303,6 +326,15 @@ export type TurnEvent = {
|
|
|
303
326
|
language?: string;
|
|
304
327
|
content?: string;
|
|
305
328
|
mimeType?: string;
|
|
329
|
+
} | {
|
|
330
|
+
type: "annotations";
|
|
331
|
+
turnId: string;
|
|
332
|
+
annotations: Array<{
|
|
333
|
+
type: string;
|
|
334
|
+
url?: string;
|
|
335
|
+
title?: string;
|
|
336
|
+
[key: string]: unknown;
|
|
337
|
+
}>;
|
|
306
338
|
} | {
|
|
307
339
|
type: "subagent_started";
|
|
308
340
|
turnId: string;
|
|
@@ -23,16 +23,19 @@ export declare class StdioServer {
|
|
|
23
23
|
private agent;
|
|
24
24
|
private lastLlmConfigKey;
|
|
25
25
|
private currentSessionId;
|
|
26
|
+
/** Project root for project-local session/memory persistence. */
|
|
27
|
+
private currentProjectRoot;
|
|
26
28
|
private currentHooks;
|
|
27
29
|
private mcpManager;
|
|
28
30
|
private pluginLoader;
|
|
29
31
|
private permissionChecker;
|
|
30
32
|
private permissionUnregister;
|
|
31
|
-
/** Cached LLM transport for sub-agent forks (dream
|
|
33
|
+
/** Cached LLM transport for sub-agent forks (dream) */
|
|
32
34
|
private currentTransport;
|
|
33
35
|
private currentApiKey;
|
|
34
36
|
private currentModel;
|
|
35
37
|
private sessionState;
|
|
38
|
+
private currentMediaApiKeys;
|
|
36
39
|
private taskStore;
|
|
37
40
|
/** Session-scoped memory prefetch state (LRU dedup + byte limit). */
|
|
38
41
|
private memoryPrefetchState;
|
|
@@ -40,6 +43,19 @@ export declare class StdioServer {
|
|
|
40
43
|
private qmemoryAdapter;
|
|
41
44
|
private qmemoryUserId;
|
|
42
45
|
private fileWatcher;
|
|
46
|
+
/** Pending ask_user requests waiting for host response */
|
|
47
|
+
private pendingAskUser;
|
|
48
|
+
/** ACP agent detector (scans for installed ACP agent CLIs). */
|
|
49
|
+
private acpDetector;
|
|
50
|
+
/** Persistent per-agent configuration store. */
|
|
51
|
+
private agentConfigStore;
|
|
52
|
+
/** Solo Mode evaluator (lazily created). */
|
|
53
|
+
private soloEvaluator;
|
|
54
|
+
/** Product Mode orchestrator (lazily created). */
|
|
55
|
+
private productOrchestrator;
|
|
56
|
+
/** Process managers for solo/product (stored for agents.processes/kill). */
|
|
57
|
+
private soloProcessManager;
|
|
58
|
+
private productProcessManager;
|
|
43
59
|
constructor(config: StdioServerConfig);
|
|
44
60
|
start(): void;
|
|
45
61
|
stop(): void;
|
|
@@ -63,6 +79,7 @@ export declare class StdioServer {
|
|
|
63
79
|
private handlePing;
|
|
64
80
|
private handleAbort;
|
|
65
81
|
private handleApprovalResponse;
|
|
82
|
+
private handleUserResponse;
|
|
66
83
|
private handleSessionResume;
|
|
67
84
|
private handleTurn;
|
|
68
85
|
private static readonly SUGGESTION_PROMPT;
|
|
@@ -105,6 +122,18 @@ export declare class StdioServer {
|
|
|
105
122
|
* Desktop app uses this to populate the model selector per category.
|
|
106
123
|
*/
|
|
107
124
|
private handleMediaListModels;
|
|
125
|
+
/**
|
|
126
|
+
* `media.cancel` — Cancel an in-progress media generation task.
|
|
127
|
+
* Delegates to the provider's native cancellation API (e.g. Volcengine DELETE task).
|
|
128
|
+
*/
|
|
129
|
+
private handleMediaCancel;
|
|
130
|
+
/**
|
|
131
|
+
* `media.status` — Query the status of a media generation task.
|
|
132
|
+
* Returns provider-specific task status (e.g. queuing, running, succeeded, failed).
|
|
133
|
+
*/
|
|
134
|
+
private handleMediaStatus;
|
|
135
|
+
/** Resolve media API key for a provider from the current session config. */
|
|
136
|
+
private resolveMediaApiKey;
|
|
108
137
|
/**
|
|
109
138
|
* `provider.list` — List all available LLM providers grouped by logical family.
|
|
110
139
|
* Returns protocol variants so callers can pick which transport to use.
|
|
@@ -141,6 +170,72 @@ export declare class StdioServer {
|
|
|
141
170
|
* `tasks.cancel` — Cancel a running task by ID.
|
|
142
171
|
*/
|
|
143
172
|
private handleTasksCancel;
|
|
173
|
+
/** Map process handle state → agents.status notification status. */
|
|
174
|
+
private static readonly STATE_TO_STATUS;
|
|
175
|
+
/** Emit an `agents.status` notification when a child process state changes. */
|
|
176
|
+
private emitAgentStatus;
|
|
177
|
+
/**
|
|
178
|
+
* Handle an MCP tool call proxied from an external ACP agent via the
|
|
179
|
+
* named-pipe bridge. Dispatches the tool through the host's own tool
|
|
180
|
+
* system and returns the text result.
|
|
181
|
+
*/
|
|
182
|
+
private handleMcpToolCall;
|
|
183
|
+
/** Ensure agent config store is loaded. */
|
|
184
|
+
private ensureAgentConfigStore;
|
|
185
|
+
/** `agents.scan` — Scan for installed ACP agent CLIs. */
|
|
186
|
+
private handleAgentsScan;
|
|
187
|
+
/** `agents.list` — Return cached agent descriptors. */
|
|
188
|
+
private handleAgentsList;
|
|
189
|
+
/** `agents.config` — Register / unregister / update custom agents. */
|
|
190
|
+
private handleAgentsConfig;
|
|
191
|
+
/** `agents.setConfig` — Set per-agent LLM / environment / model ID config. */
|
|
192
|
+
private handleAgentsSetConfig;
|
|
193
|
+
/** `agents.getConfig` — Get per-agent configuration. */
|
|
194
|
+
private handleAgentsGetConfig;
|
|
195
|
+
/** `agents.removeConfig` — Remove per-agent configuration. */
|
|
196
|
+
private handleAgentsRemoveConfig;
|
|
197
|
+
/** `agents.setGateway` — Set global gateway proxy URL. */
|
|
198
|
+
private handleAgentsSetGateway;
|
|
199
|
+
private ensureSoloEvaluator;
|
|
200
|
+
/** `solo.start` — Start a Solo Mode PK session. */
|
|
201
|
+
private handleSoloStart;
|
|
202
|
+
/** `solo.status` — Query solo session status. */
|
|
203
|
+
private handleSoloStatus;
|
|
204
|
+
/** `solo.cancel` — Cancel a running solo session. */
|
|
205
|
+
private handleSoloCancel;
|
|
206
|
+
/** `solo.select` — Select winner and merge worktree. */
|
|
207
|
+
private handleSoloSelect;
|
|
208
|
+
private ensureProductOrchestrator;
|
|
209
|
+
/** `product.create` — Create a new Product Mode session. */
|
|
210
|
+
private handleProductCreate;
|
|
211
|
+
/** `product.resume` — Resume a paused product. */
|
|
212
|
+
private handleProductResume;
|
|
213
|
+
/** `product.pause` — Pause a running product. */
|
|
214
|
+
private handleProductPause;
|
|
215
|
+
/** `product.checkpoint` — Manual checkpoint. */
|
|
216
|
+
private handleProductCheckpoint;
|
|
217
|
+
/** `product.status` — Query product status. */
|
|
218
|
+
private handleProductStatus;
|
|
219
|
+
/** `product.list` — List all products. */
|
|
220
|
+
private handleProductList;
|
|
221
|
+
/** `agents.getGateway` — Get the current global gateway proxy URL. */
|
|
222
|
+
private handleAgentsGetGateway;
|
|
223
|
+
/** `agents.listConfigured` — List agents that have persisted configuration. */
|
|
224
|
+
private handleAgentsListConfigured;
|
|
225
|
+
/** `agents.processes` — List all active child agent processes from solo/product PMs. */
|
|
226
|
+
private handleAgentsProcesses;
|
|
227
|
+
/** `agents.kill` — Kill a child agent process by memberId. */
|
|
228
|
+
private handleAgentsKill;
|
|
229
|
+
/** `agents.getLog` — Read stderr log for a specific agent. */
|
|
230
|
+
private handleAgentsGetLog;
|
|
231
|
+
/** `agents.testConnection` — Spawn an agent with a short timeout to verify connectivity. */
|
|
232
|
+
private handleAgentsTestConnection;
|
|
233
|
+
/** `solo.list` — List all solo sessions. */
|
|
234
|
+
private handleSoloList;
|
|
235
|
+
/** `solo.delete` — Delete a solo session and clean up resources. */
|
|
236
|
+
private handleSoloDelete;
|
|
237
|
+
/** `product.delete` — Delete a product session and clean up resources. */
|
|
238
|
+
private handleProductDelete;
|
|
144
239
|
private sendResponse;
|
|
145
240
|
private sendNotification;
|
|
146
241
|
private writeStdout;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { PortableTool } from "../skills/portable-tool.js";
|
|
2
2
|
import { type ExecProgress } from "../skills/tools/exec-tool.js";
|
|
3
3
|
import type { AgentLogger } from "../agent/types.js";
|
|
4
|
+
import { type AskUserQuestion } from "../skills/tools/ask-user-tool.js";
|
|
4
5
|
import type { MediaClient } from "../llm/media-client.js";
|
|
5
6
|
import type { MediaCapability } from "../llm/provider-def.js";
|
|
6
7
|
import type { ProviderToolAPI } from "../llm/provider-tool-api.js";
|
|
@@ -10,6 +11,12 @@ import type { ProviderToolAPI } from "../llm/provider-tool-api.js";
|
|
|
10
11
|
* falling back to SearXNG. Called from stdio-server per session.
|
|
11
12
|
*/
|
|
12
13
|
export declare function setProviderToolAPI(api: ProviderToolAPI | undefined): void;
|
|
14
|
+
/**
|
|
15
|
+
* Set the ask_user callback. The host (Electron / test harness) provides
|
|
16
|
+
* an implementation that presents questions to the user and returns answers.
|
|
17
|
+
* If null, ask_user returns "user declined" to the LLM.
|
|
18
|
+
*/
|
|
19
|
+
export declare function setAskUserCallback(callback: ((questions: AskUserQuestion[]) => Promise<Record<string, string> | null>) | null): void;
|
|
13
20
|
/**
|
|
14
21
|
* Set the media client + API keys for generation tools.
|
|
15
22
|
* Tools will call vendor APIs directly through MediaTransport.
|
|
@@ -19,7 +26,7 @@ export declare function setProviderToolAPI(api: ProviderToolAPI | undefined): vo
|
|
|
19
26
|
export declare function setMediaClientConfig(client: MediaClient | undefined, apiKeys?: Record<string, string>, onMediaUsage?: (model: string, billingUnit: string, quantity: number) => void, providers?: Partial<Record<MediaCapability, {
|
|
20
27
|
provider: string;
|
|
21
28
|
model: string;
|
|
22
|
-
}
|
|
29
|
+
}>>, onMediaProgress?: (taskId: string, mediaType: string, percent: number, status: string, provider?: string) => void): void;
|
|
23
30
|
export interface BootstrapConfig {
|
|
24
31
|
workdir?: string;
|
|
25
32
|
log?: AgentLogger;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gemini JSON Schema cleaning utilities.
|
|
3
|
+
*
|
|
4
|
+
* Gemini's generateContent API rejects several standard JSON Schema keywords.
|
|
5
|
+
* This module provides a shared recursive cleaner used by:
|
|
6
|
+
* - GeminiGenerateContentTransport (tool declarations in request body)
|
|
7
|
+
* - tool-schema.ts (provider-aware schema normalization at orchestration level)
|
|
8
|
+
*
|
|
9
|
+
* Keeping a single source of truth avoids drift between the two consumers.
|
|
10
|
+
*/
|
|
11
|
+
/** Keywords that Gemini's generateContent API does not accept in tool schemas. */
|
|
12
|
+
export declare const GEMINI_UNSUPPORTED_SCHEMA_KEYWORDS: Set<string>;
|
|
13
|
+
/**
|
|
14
|
+
* Recursively strip unsupported JSON Schema keywords from a schema object.
|
|
15
|
+
* Safe to call multiple times (idempotent).
|
|
16
|
+
*/
|
|
17
|
+
export declare function cleanSchemaForGemini(schema: unknown): unknown;
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Provides: ProviderDef + LLMTransport + ProviderRegistry + LLMClient factory
|
|
5
5
|
*/
|
|
6
|
-
export type { ProviderDef, ModelInfo, TransportType, AuthType, MediaCapability, MediaCapabilities, VideoCapabilities, ImageCapabilities, MusicCapabilities, TtsCapabilities, ThreeDCapabilities, SttCapabilities, EmbeddingCapabilities, VideoUnderstandingCapabilities, ImageUnderstandingCapabilities, VoiceCloneCapabilities, RerankCapabilities, DocumentParsingCapabilities, VideoOperation, ImageOperation, MusicOperation, TtsOperation, ThreeDOperation } from "./provider-def.js";
|
|
6
|
+
export type { ProviderDef, ModelInfo, TransportType, AuthType, MediaCapability, MediaCapabilities, VideoCapabilities, ImageCapabilities, MusicCapabilities, TtsCapabilities, ThreeDCapabilities, SttCapabilities, EmbeddingCapabilities, VideoUnderstandingCapabilities, ImageUnderstandingCapabilities, VoiceCloneCapabilities, RerankCapabilities, DocumentParsingCapabilities, RealtimeAudioCapabilities, VideoOperation, ImageOperation, MusicOperation, TtsOperation, ThreeDOperation } from "./provider-def.js";
|
|
7
7
|
export type { LLMTransport, LLMRequest, LLMChunk, AccumulatedToolCall, } from "./transport.js";
|
|
8
8
|
export { accumulateToolCalls } from "./transport.js";
|
|
9
9
|
export type { MediaTransport, MediaRequest, MediaResult, MediaType } from "./media-transport.js";
|
|
@@ -15,8 +15,17 @@ export type { LLMClientConfig, LLMClient } from "./llm-client.js";
|
|
|
15
15
|
export { createLLMClient, autoDetectProvider } from "./llm-client.js";
|
|
16
16
|
export { OpenAIChatTransport } from "./transports/openai-chat.js";
|
|
17
17
|
export { AnthropicMessagesTransport } from "./transports/anthropic-messages.js";
|
|
18
|
+
export { GeminiGenerateContentTransport } from "./transports/gemini-generatecontent.js";
|
|
18
19
|
export { VolcengineMediaTransport } from "./transports/volcengine-media.js";
|
|
19
20
|
export { OpenAIMediaTransport } from "./transports/openai-media.js";
|
|
20
21
|
export { MiniMaxMediaTransport } from "./transports/minimax-media.js";
|
|
21
|
-
export { GeminiMediaTransport } from "./transports/gemini-media.js";
|
|
22
|
+
export { GeminiMediaTransport, type GeminiMediaConfig } from "./transports/gemini-media.js";
|
|
23
|
+
export { GeminiLyriaRealtimeSession, generateRealtimeMusic } from "./transports/gemini-lyria-realtime.js";
|
|
24
|
+
export type { WeightedPrompt, MusicGenerationConfig, MusicScale, MusicGenerationMode, LyriaRealtimeConfig, LyriaRealtimeSessionOptions, AudioChunk } from "./transports/gemini-lyria-realtime.js";
|
|
25
|
+
export { RealtimeTransport } from "./transports/realtime-transport.js";
|
|
26
|
+
export type { RealtimeConfig, RealtimeTool, RealtimeEvent, RealtimeUsage } from "./transports/realtime-transport.js";
|
|
27
|
+
export { GeminiCacheAPI } from "./transports/gemini-cache-api.js";
|
|
28
|
+
export type { GeminiCachedContent, GeminiCacheCreateOptions } from "./transports/gemini-cache-api.js";
|
|
29
|
+
export { GeminiFileAPI } from "./transports/gemini-file-api.js";
|
|
30
|
+
export type { GeminiFileInfo } from "./transports/gemini-file-api.js";
|
|
22
31
|
export { isDebugTransportEnabled, createDebugTransport } from "./debug-transport.js";
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* Each provider adapter implements this interface and hides vendor-specific
|
|
10
10
|
* auth, endpoint paths, request shapes, and polling logic.
|
|
11
11
|
*/
|
|
12
|
-
export type MediaType = "image" | "video" | "music" | "tts" | "3d" | "stt" | "embedding" | "video_understanding" | "image_understanding" | "voice_clone" | "rerank" | "document_parsing";
|
|
12
|
+
export type MediaType = "image" | "video" | "music" | "music_realtime" | "tts" | "3d" | "stt" | "embedding" | "video_understanding" | "image_understanding" | "voice_clone" | "rerank" | "document_parsing" | "realtime_audio";
|
|
13
13
|
export interface MediaRequest {
|
|
14
14
|
/** Generation model id, e.g. "doubao-seedream-5-0-260128", "gpt-image-2" */
|
|
15
15
|
model: string;
|
|
@@ -85,9 +85,10 @@ export interface MediaRequest {
|
|
|
85
85
|
enhancePrompt?: boolean;
|
|
86
86
|
/**
|
|
87
87
|
* Progress callback for async polling operations (video gen, 3D gen, etc.).
|
|
88
|
-
* Called periodically with estimated progress percentage
|
|
88
|
+
* Called periodically with estimated progress percentage, status text, and
|
|
89
|
+
* the provider-specific task ID (available once the task is submitted).
|
|
89
90
|
*/
|
|
90
|
-
onProgress?: (percent: number, status: string) => void;
|
|
91
|
+
onProgress?: (percent: number, status: string, taskId?: string) => void;
|
|
91
92
|
/** Enable progressive/streaming image generation (Volcengine Seedream stream:true) */
|
|
92
93
|
streamImage?: boolean;
|
|
93
94
|
/** Lock camera position (Seedance 1.0/1.5, not Seedance 2.0) */
|
|
@@ -149,3 +150,27 @@ export interface MediaTransport {
|
|
|
149
150
|
*/
|
|
150
151
|
readonly supportedTypes: readonly MediaType[];
|
|
151
152
|
}
|
|
153
|
+
/**
|
|
154
|
+
* Extended transport for providers that support async task management
|
|
155
|
+
* (submit → poll → cancel/query). Volcengine Seedance, MiniMax async, etc.
|
|
156
|
+
*/
|
|
157
|
+
export interface AsyncMediaTransport extends MediaTransport {
|
|
158
|
+
/** Cancel / delete an async task. */
|
|
159
|
+
deleteVideoTask(taskId: string, apiKey: string, signal?: AbortSignal): Promise<void>;
|
|
160
|
+
/** List recent tasks for status queries. */
|
|
161
|
+
listVideoTasks(apiKey: string, options?: {
|
|
162
|
+
after?: string;
|
|
163
|
+
limit?: number;
|
|
164
|
+
status?: string;
|
|
165
|
+
}, signal?: AbortSignal): Promise<Record<string, unknown>>;
|
|
166
|
+
/**
|
|
167
|
+
* Query a single task by ID — preferred over listVideoTasks for direct lookups.
|
|
168
|
+
* Not all providers support listing; all async providers support single-task queries.
|
|
169
|
+
*/
|
|
170
|
+
getTaskStatus?(taskId: string, apiKey: string, signal?: AbortSignal): Promise<{
|
|
171
|
+
status: string;
|
|
172
|
+
task: Record<string, unknown>;
|
|
173
|
+
}>;
|
|
174
|
+
}
|
|
175
|
+
/** Type guard for transports that support async task management. */
|
|
176
|
+
export declare function isAsyncMediaTransport(t: MediaTransport): t is AsyncMediaTransport;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model detection helpers shared between OpenAI transport implementations.
|
|
3
|
+
*
|
|
4
|
+
* These are used by both openai-chat.ts and openai-responses.ts to detect
|
|
5
|
+
* model families and apply family-specific constraints:
|
|
6
|
+
* - GPT-5.x: unified reasoning, temperature allowed, reasoning object format
|
|
7
|
+
* - GPT-5.4-nano: reasoning effort capped at medium
|
|
8
|
+
* - o-series (legacy): reasoning_effort flat string, temperature suppressed
|
|
9
|
+
*/
|
|
10
|
+
/** GPT-5.x models (new generation with unified reasoning). */
|
|
11
|
+
export declare function isGPT5xModel(model: string): boolean;
|
|
12
|
+
/**
|
|
13
|
+
* GPT-5.4-nano models — reasoning effort capped at medium.
|
|
14
|
+
* openai-ProviderMax §3: gpt-5.4-nano only supports none/low/medium effort.
|
|
15
|
+
*/
|
|
16
|
+
export declare function isGPT5NanoModel(model: string): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* OpenAI o-series reasoning models (legacy, kept for 3rd-party provider compat).
|
|
19
|
+
* These suppress temperature/top_p and use reasoning_effort as flat string.
|
|
20
|
+
* Matches: o1, o1-mini, o1-pro, o3, o3-mini, o3-pro, o4-mini, etc.
|
|
21
|
+
*/
|
|
22
|
+
export declare function isOpenAIReasoningModel(model: string): boolean;
|